Wanna be Brilliant Full-Stack Developer

SpringBoot Blog만들기 회원가입을 위한 insert 테스트 본문

Back-End/블로그 만들기 With SpringBoot

SpringBoot Blog만들기 회원가입을 위한 insert 테스트

Flashpacker 2023. 2. 23. 03:19


연관관계 만들기에서 ManyToMany를 배우지 않았다.

두개의 테이블에 중간테이블을 만들어주는것이 ManyToMany인데 이걸 사용하면 단점은

두개의 테이블에 primary key로만 중간 테이블을 만들어주기 떄문에!

날짜나 시간 다른테이블들을 추가해서 넣을 수가 중간에 없다.

내가 직접 중간테이블을 만드는것이 아니라

ManyToMany 어노테이션이 중간 테이블을 만드는데 그떄 primary key로만 만들어주기 떄문이다.

그래서 @ManyToMany를 사용하지 않고 @OneToMany , @OneToMany를 사용한다!

 

어떤 페이지로 이동할것이 아니라 데이터만 리턴 해주는 회원가입이 잘됬다 안됬다라는

응답만 해줄 수있도록 @RestController 어노테이션을 붙여준다. 

그리고 회원가입을 할거니까 @PostMapping을 한다.

그리고 회원가입을 할때는 User오브젝트를 보면 

Id 같은경우는 자동으로 들어가고

role도 디폴트값으로 잘들어가고! 

@CreationTimestamp // 시간이 자동으로 입력
private Timestamp createDate;

시간도 자동으로 잘들어간다! 

 

저 세건만 사용자로부터 받으면 된다. 이 세값을 어떻게 받는가?

함수의 파라미터에서 전달을 받을 수 있다.

package com.cos.blog.test;

import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class DummnyControllerTest {

	@PostMapping("/dummy/join")
	public String join(String username, String password, String email) {
		
		return "회원가입이 완료되었습니다";
	}
}

근데 여기에 원래 @RequestParam이라는 어노테이션을 붙이고 여기에다가 파라미터에다가

실제로 받는 키 값을 적어 야한다!

그러면 저 변수를 username이라고 안하고 u라고 해도 상관없다. 근데 내가 보낸 키 값에 맞춰서

username이 변수에 들어오기 떄문이다.

근데 변수명만 정확히 적으면 내가  //http://localhost:800/blog/dummy/join (요청) 이렇게 요청을하고

//http의 body에 username, password, email 데이터를 가지고(요청)하게 되면

이 세값이 join함수와 파라미터에 쏙 들어온다.

이렇게 받아지는지 sysout으로 테스트 해보자! 

애 왜를 쓰는가? 하면 HTML에서 form태그 만들어서 데이터를 전송하면

저 MIME타입으로 데이터가 전송이 된다. 

저 MIME타입으로 데이터가 전송된다는것은 데이터를 key=value&key=value 

이런식으로 정의하는것이 저 방식이다!

결과가 잘나온다! 

그러면 join이라는 함수의 파라미터 3개는  key=value&key=value 의 데이터를 받아준다는것이다

매개변수에 변수명만 적어주면된다.

이건 약속된 규칙이다. 

스프링이 다 제공해주니까 이렇게만 쓰면 x-www-form-urlencoded 전송되는 데이터는

key=value 로 오는데 그건 스프링이 함수의 파라미터에 파싱해서 집어넣어준다는것이다.

이거 말고도 훨씬더 강력한 일을 해주는데

오브젝트로 받게 해준다. 

이렇게 하면 오브젝트로 받아서 처리할 수 있다.

당연히 이 오브젝트가 있을떄 넘어오는 데이터 세건이 username 과 password, email이 넘어오는데

다른것이 넘어 온다면? User오브젝트는 다른것을 가지고 있지 않기 떄문에 파싱이 안된다.

마찬가지로 정상적으로 데이터를 날려도 id 부분과 role 부분과 createDate 부분은 전송받지 않기떄문에

Null값이 나온다.

 

package com.cos.blog.test;

import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;

import com.cos.blog.model.User;

@RestController
public class DummnyControllerTest {

	//http://localhost:8000/blog/dummy/join (요청)
	//http의 body에 username, password, email 데이터를 가지고(요청)
	@PostMapping("/dummy/join")
	public String join(User user) { //key=value (약속된 규칙) 
		System.out.println("id : " + user.getId());
		System.out.println("username : "+user.getUsername());
		System.out.println("password : "+user.getPassword());
		System.out.println("email : "+user.getEmail());
		System.out.println("role: " +user.getRole());
		System.out.println("createDate : " +user.getCreateDate());
		return "회원가입이 완료되었습니다";
	}
}

잘받아진다. 다른 3개의 값은 안받아진다. 

이상태에서 데이터베이스에 Insert를 해볼것인데 인서트를 하기 위해서는 패키지를 만들어야한다.

com.cos.blog.repository 이런 패키지에

인터페이스를 하나 만들자!

user테이블의 repository니까 UserRepository라고 만들고 익스텐즈를 하나 하자!

package com.cos.blog.repository;

import org.springframework.data.jpa.repository.JpaRepository;

import com.cos.blog.model.User;

public interface UserRepository extends JpaRepository<User, Integer> {

}

이게 무슨뜻인가? 해당 JpaRepositry에는 User테이블을 관리하는 레파지토리이다.

그리고 유저테이블의 프라이머리 키는 Integer(숫자)라는것을 정의했다는것이다.

이렇게 만들었다는것은 JpaRepository가 무엇을 가지고 있는가? 

findAll이라는 함수를 가지고 있다. findAll을 user테이블이 가지고 있는 모든 행을 다 리턴하라는것이다.

그리고 위에 올라가면 Sava라는 함수로 회원가입할떄 쓸것이다.

findByid로 id로 행을 찾을 수 있다. id로 행을 삭제하고 , 총 user테이블이 몇개인지라는 함수를 통해서

바로 찾아낼 수 있게 제공을 하고 있다. 우리가 직접 만들지 않아도 된다.

UserRepository는 JpaRepository를 익스텐즈 하고 있기 떄문이다. 
기본적인 CRUD만 하고 싶다고 하면? 아무것도 정의 하지 않아도 이렇게만 하더라도 애가 모든 함수를 다가지고 있다.

JSP라고 치면 DAO (Data Access Object) 라고 할 수 있다.

스프링 레거시 나 스프링부트를 한 사람이라면 의아할 수 있는게 이렇게하면 Bean으로 등록이 되는가?

Bean으로 등록이 된다는것은? 의심이 될 수 있다. Bean으로 등록이 된다는것은 스프링 IOC에서 객체를 가지고있는지

물어보는것인데? 그렇게 해야지 필요한곳에서 인젝션이라는것을 통해서 DI를 할 수 있다

 

근데 이상황에서는 자동으로 Bean으로 등록이 된다.

UserRepository 애는 스프링 메모리에 띄울것이기떄문에 복사를 해서 더미컨트롤러에 와서 

userRepository는 null이다.

언제 null이나면 스프링이 @RestController 어노테이션을 읽어서 더미컨트롤러 테스트를 메모리에

띄어줄때 저거는 null이다.

이떄 Autowired라는 어노테이션을 붙여주면 DummnyControllerTest 애가 메모리에 뜰때 userRepository

애도 메모리에 뜬다.

왜냐하면 @AutoWired라는 애는 userRepository 타입으로 스프링이 관리하고 있는 객체가 있다면

저기(userRepository) 에 쏙 넣으라는것이기 떄문이다.

근데 요 타입으로 UserRepository 메모리에 띄어있다. 

스프링이 컴포넌트 스캔할때 userRepository안에 있는 저 UserRepository 인터페이스 를 메모리에

띄어준다. 그러니까 UserRepository  메모리에 띄어있으니까 사용하기만 하면 된다.

 

요게 의존성 주입이라는것이다. 

 

그러면 userRepository애가 메모리에 떴으니까 사용만 하면 된다.

user객체를 집어넣으면 회원가입이 되는지 테스트 해보자!