목차
개요
프로젝트를 진행하던 도중 JPA를 사용하여 Java 엔티티 클래스를 구성하고 있었는데 그중 @Column 애노테이션을 이용하여 기본값(default value) 설정을 진행하였지만 새 인스턴스를 생성하고 DB 내부를 확인해보니 설정하였던 디폴트값이 적용되지 않았기에 글을 써보게 되었다.
문제 상세분석
'FavoriteDepartment' 라는 클래스에서 회원들이 즐겨찾기한 기관 및 학과를 저장할때 저장 시에 팝업알림의 유무를 특정 필드isAlert을 통해 구현하고자 했다.
따라서 애너테이션을 이용해 기본값으로 `true`를 갖도록 설정하려고 했다.
이러한 설정을 통해 기대했던 동작은 FavoriteDepartment 인스턴스를 생성하면서 isAlert 필드가 자동적으로 true로 설정되는 것이었지만 실제로 엔티티를 생성하고 데이터베이스에 저장하였을 때, isAlert 필드의 값은 false로 설정되었다.
원인 분석
이 문제의 원인은 JPA가 제공하는 기본값 설정이 데이터베이스 스키마에만 적용되며, 실제 Java 객체를 생성할 때는 Java의 boolean 타입의 기본값 설정인 false로 적용된다는 것이다.
따라서 위의 코드는 데이터베이스 스키마 생성 시 isAlert의 기본값을 `true`로 설정하지만, Java 객체를 생성할 때는 isAlert를 `false`로 설정한다.
문제 해결
이 문제를 해결하기 위해서는
1. 기본 생성자나 필드 선언부에서 명시적으로 isAlert를 true로 설정하거나
2. 엔티티 인스턴스를 생성할 때마다 isAlert를 true 로 설정해주어야 한다.
마무리
카테캠을 진행하고 JAVA와 스프링의 기초를 공부하면서 실효성에 의문을 갖지 않았던건 아니지만 이 해프닝의 경우에도 JPA가 제공하는 기능의 범위와 Java 언어의 기본 동작 방식을 통해 문제점을 해결했기에 역시 기본기는 중요하구나 라는 생각을 했다.
'Spring' 카테고리의 다른 글
FetchType.EAGER vs FetchType.LAZY in JPA (0) | 2023.06.23 |
---|---|
SpringBoot+MySQL(JPA) 회원가입,JWT 로그 구현하기 - (2) (1) | 2023.06.23 |
@Transient 어노테이션과 DTO를 사용한 레이어 분리 (0) | 2023.04.22 |
SpringFramework 구성요소 (0) | 2023.04.10 |
SpringBoot+MySQL(JPA) 회원가입,JWT 로그인 구현하기 - (1) (0) | 2023.04.10 |