- 이번 시간에는 회원가입 시스템을 테스트 해보기 위해 더미 데이터를 데이터베이스에 INSERT 하는 작업을 수행해보려고 합니다.
- 우선 테스트용 클래스를 생성하여 아래와 같이 구현해주었습니다.
- 위처럼 구현한 후, Postman을 통해 다음과 같이 post 요청을 수행하여 데이터가 잘 전달되는지 확인합니다.
- post 요청을 수행한 뒤, 콘솔창을 살펴보면 다음과 같이 데이터가 잘 전달된 것을 확인할 수 있습니다. 당연스럽게도 user 객체의 id와 role, createDate 데이터로는 널(Null) 값이 저장될 것입니다.
- 다만 위처럼 하지않고, 데이터를 객체로 매핑하여 받아올 수도 있습니다.
- 데이터가 전달되는 것을 확인하였으니 이제부터 데이터베이스에 INSERT 작업을 해볼텐데, 이를 위해 'repository'라는 이름의 패키지를 생성하고 해당 패키지 안에 인터페이스를 생성해준뒤 다음과 같이 구현해주었습니다.
- 이는 해당 JPA repository는 User 테이블을 관리하는 repository이며 해당 테이블의 기본키(Primary Key)는 Integer형이라는 것을 정의한 것입니다.
- 만약 기본적인 CRUD(Create, Replace, Update, Delete) 작업만 수행하고자 한다면 위와 같이 작성만 해놓아도 JpaRepository가 이미 구현해놓은 여러 함수를 가져다 쓸 수 있습니다.
- 또한 이렇게 구현한 인터페이스는 자동으로 IoC 컨테이너에 객체화되어 등록되므로 @Repository 어노테이션을 작성하지 않아도 상관이 없습니다.
- 이제 우리는 다시 테스트 클래스로 돌아와 다음과 같이 DI(Dependency Injection) 작업을 해주고 해당 객체를 사용하여 데이터베이스에 데이터를 저장할 수 있습니다.
- 이후 다시 post 요청을 수행하여 데이터를 전달한 뒤, 데이터베이스에 데이터가 저장되는지 확인합니다.
- 결과를 보면 우리가 분명히 role 열의 기본값을 @ColumnDefault 어노테이션을 통해 "user"로 설정하였으나 기본값이 들어가지 않고 널(Null) 값이 저장된 것을 확인할 수 있습니다.
- 위와 같은 현상이 발생하는 이유는 콘솔창에 출력된 쿼리를 살펴보면 알 수 있습니다.
- 쿼리를 살펴보면 INSERT시 role 값이 등록되는 것을 확인할 수 있는데, 이렇게 될 경우 우리는 role에 대한 데이터를 넘겨주지 않았기 때문에 당연히 role 값에 널(Null) 값이 저장되는 것입니다.
- 따라서 role 값을 생략하고 등록하는 방법을 찾아야하는데 그 방법으로는 여러가지가 있습니다.
- 우선 @DynamicInsert 어노테이션을 활용하는 방법이 있습니다. 이 방법은 단순히 클래스 위에 어노테이션을 작성하는 방식으로 간단하게 해결할 수 있습니다.
- 다음으로는 Setter를 사용하는 방식으로 다음과 같이 Enum과 함께 사용하여 해결하는 방법이 있습니다. Enum을 사용하는 이유는 단순히 개발자의 실수를 방지하기 위함입니다.
- 다만 데이터베이스에는 Enum이라는 자료형이 없기 때문에 위와 같이 @Enumerated 어노테이션을 사용하여 해당 데이터의 타입을 따로 알려주어야 합니다.
- 이제 다시 테스트해보기 위해 post 요청을 하고 데이터베이스를 확인해보면 다음과 같이 role 값까지 잘 저장된 것을 확인할 수 있습니다.
📌 References
'🚗 Backend Toy Project > 스프링 부트 게시판' 카테고리의 다른 글
[스프링부트 게시판] 10. UPDATE 테스트 (0) | 2022.05.03 |
---|---|
[스프링부트 게시판] 9. SELECT 테스트 (0) | 2022.05.03 |
[스프링부트 게시판] 7. 테이블 생성 (0) | 2022.05.02 |
[스프링부트 게시판] 6. yml 설정하기 (0) | 2022.05.01 |
[스프링부트 게시판] 5. lombok 세팅 및 테스트 (0) | 2022.05.01 |