[JPA] @Embeddable 에서 모든 필드가 null 일 경우 NullPointerException 발생 케이스와 해결 방안
·
JPA
들어가며JPA 사용시 Entity 에서 관련된 데이터들을 하나로 묶을 때 VO 객체로 @Embeddable 을 사용할 수 있다. @Embeddable 사용 시 각각의 컬럼에 대해 null 값을 허용하도록 만들 수 있는데, 이 경우 NullPointerException 이 발생할 가능성이 있다. 이번 글은 해당 문제상황과 해결 방법에 대한 글이다. 문제가 발생한 환경고객 주소 엔티티에서 배달 정보에 대한 관련된 값들을 묶기 위해 아래 VO 를 만들어서 사용하고 있다. 각각 필드는 고객이 입력할 수도 있고, 입력하지 않을 수도 있기 때문에 optional 한 필드로 구성했다.@Column(nullable=false) 명시 X생성시 null 체크 X Repository 에서는 아래처럼 고객 주소 엔티티를 불..
[Hibernate] Hibernate6.2 부터 변경된 @Enumerated(EnumType.STRING) 매핑방식
·
JPA
MySQL 데이터베이스 (8.X) 기준 포스팅입니다. @Enumerated(EnumType.STRING) 매핑 방식enum을 사용할 때 데이터베이스 저장이 필요한 경우 대부분 @Enumerated(EnumType.STRING) 으로 매핑한다. EnumType.ORDINAL을 쓰면 enum의 순서(int)가 저장됨에 따른 중간삽입, 순서변경 등에 의해 잘못된 값 삽입 문제가 발생할 수 있기 때문에 저장공간을 더 차지하더라도 STRING 을 사용하게 된다. 기존 5.X 버전까지는 @Enumerated(EnumType.STRING) 으로 매핑할 경우 VARCHAR 자료형으로 저장되었지만,Hibernate 6.2 부터는 ENUM 데이터타입 매핑이 기본값으로 변경되었다.아래처럼 @Enumerated(EnumTyp..
[JPA] EntityManager 정리
·
JPA
JPA 를 사용하면서, 엔티티 매니저에 대한 개념이 부족한 것 같아, 관련 개념들을 정리한 글이다.EntityManagerFactory엔티티 매니저 팩토리는 엔티티 매니저를 만드는 팩토리로 여러 스레드가 동시에 접근해도 안전하게 사용할 수 있도록 설계되었다. 따라서, 엔티티 매니저 팩토리를 여러 군데에서 @PersistenceUnit 으로 주입 받아도 인스턴스 객체는 항상 같다. EntityManagerFactory 를 인스턴스화 할 때 생성비용이 크기 때문에 한개만 만들어 애플리케이션 전체에서 공유한다. 생성 비용이 크다는 것은 EntityManagerFactory 를 인스턴스화할 때 여러 가지 초기화 작업이 많이 필요하다는 것을 의미한다. 아래와 같은 초기화 작업이 이루어지며, 리소스와 시간이 많이 ..