이 글에서는 JPA의 데이터 타입 중 하나인 값 타입, 그 중에서도 임베디드 타입(embedded type)에 대해서 알아볼 것이다. JPA의 데이터 타입임베디드 타입을 알아보기에 앞서, JPA의 데이터 타입에 대해 알아보자. JPA의 데이터 타입은 크게 두 종류로 분류할 수 있다.엔티티 타입값 타입 엔티티 타입엔티티 타입의 데이터는 기본적으로 @Entity 어노테이션으로 정의한 엔티티 객체를 말하며, 데이터의 변화가 생겨도 식별자를 통해 지속적으로 변경에 대한 추적이 가능하다. 값 타입값 타입은 int, String처럼 단순하게 값을 나타내는 Java의 기본 타입이나 객체를 의미한다. 식별자를 가질 수 없으며, 엔티티 타입의 데이터와 함께 존재하기 때문에 생명 주기도 엔티티 타입의 객체에 의존하게 된..
개요개인 프로젝트에서 데이터 삭제 시 hard delete를 통해 실제로 해당 데이터를 DB에서 지우는 방식을 선택했지만, 해당 방식은 추후 삭제된 데이터를 복구해야 하는 하는 경우에 문제가 될 수 있다 판단했다. 그래서 실제 데이터를 삭제하는 대신, soft delete를 통해 deleted와 같은 필드를 따로 만들어 삭제 여부를 확인할 수 있도록 변경하기로 했다. 이 글에서는 현재 프로젝트에서 해당 기능을 JPA에서 어떻게 적용하였는지 설명한다. Soft Delete 적용하기삭제 여부 필드 추가Soft delete를 적용하기 위해서는 제일 먼저 삭제 여부 필드를 entity에 생성해야 한다. 하지만, 모든 entity에 일일이 해당 필드를 생성하는 것은 매우 불편하다고 생각했기 때문에, 아래와 같이..
Entity의 생성시간/수정시간 자동화 보통 entity에는 차후 유지보수를 위해 해당 데이터의 생성시간과 수정시간을 포함한다. 그래서 매번 DB에 해당 entity 데이터를 삽입/갱신 하기 전에 날짜 데이터를 등록/수정하는 코드가 중복되어 들어가게 된다. public void save() { ... image.setCreationDate(new LocalDateTime()); imageRepository.save(image); ... } 이렇게 단순하고 반복적인 코드를 매번 적용하는 것은 매우 번거롭고 비효율적이다. JPA Auditing을 사용하면 이 문제를 간단하게 해결할 수 있다. JPA Auditing 적용 BaseTimeEntity 생성 @Getter @MappedSuperclass @Enti..
개요 토이 프로젝트를 진행하던 중, 사용자가 저장한 이미지를 조회하는 과정에서 불필요하게 조회 쿼리가 추가로 발생하는 것을 발견했다. 이 현상에 대해 찾아보다 즉시 로딩과 지연 로딩에 관련된 문제임을 알아냈고, 이 내용을 정리하며 어떻게 이 문제의 해결법을 찾아보기로 했다. 문제 발생 Image 와 User entity는 아래와 같이 서로 다대일 단방향 매핑으로 설계되어 있다. @Getter @Entity @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Image { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String prompt; @..
개요 현재, 개인 프로젝트에서 JPA를 사용해 entity 간의 연관 관계를 설정한 상태다. 그런데 프로젝트를 계속 진행하면서 문득, 내가 올바르게 연관 관계를 설정한 것인지 의문이 들기 시작했고, JPA 연관 관계에 대해 다시 한번 정리하면서 이 연관 관계를 수정해야 하는지 판단하기로 했다. JPA 연관 관계 매핑 JPA와 같은 ORM 기술을 사용할 때 중요하게 생각해야 할 사항 중 하나는 "객체(Object) 와 관계형 데이터베이스 (Relational DB) 테이블이 어떻게 매핑 (Mapping) 되는지를 이해하는 것" 이라고 생각한다. 왜냐하면 ORM 기술의 목적은 객체 지향 프로그래밍과 데이터베이스 사이의 패러다임 불일치를 해결하는 것과 직접적으로 연관되어 있기 때문이다. 그래서 entity 객..