전체 글 (35) 썸네일형 리스트형 @MappedSuperclass @MappedSuperclass@Getter@MappedSuperclass@EntityListeners(AuditingEntityListener.class)public abstract class BaseTimeEntity { @CreateDate private LocalDateTime createdDate; @LastModifiedDate private LocalDateTime modified;} 위 코드에서 @MappedSuperclass 애노테이션이 사용된 것처럼 엔티티끼리 공통 매핑 정보가 필요할 때 @MappedSuperclass를 사용합니다. 상속관계 매핑과는 전혀 관련 없고, 단순히 엔티티가 공통으로 사용하는 매핑 정보를 모으는 역할을 합니다. 주로 등록일, 수정일.. 상속관계 매핑 상속 관계 매핑 객체를 가지고 개발하다 보면 상속 개념을 자주 사용합니다. 하지만 DB 테이블에는 정확히 객체의 상속 관계와 동일한 상속 개념이 없습니다. 슈퍼타입 서브타입 관계라는 모델링 기법이 객체 상속과 유사한 개념입니다. 따라서 JPA에서 객체의 상속(엔티티 상속)과 테이블의 슈퍼타입 서브타입 관계를 매핑하는 것을 상속 관계 매핑이라 부릅니다. 객체의 상속 관계를 테이블의 슈퍼타입 서브타입 관계로 매핑할 때 JPA는 세 가지 방법을 제공합니다. 각각의 테이블로 변환하는 조인 전략, 통합 테이블로 변환하는 단일 테이블 전략, 그리고 서브타입 테이블로 변환하여 구현 클래스마다 테이블을 만드는 전략 이렇게 세 가지 전략을 제공합니다. 상속 관계 매핑 애노테이션상속 관계 매핑에 사용되는 애노테이션은 @I.. 일대일 연관관계 매핑 엔티티의 연관관계는 다대일, 일대다, 일대일, 그리고 다대다 관계로 나뉩니다. 다대일은 연관관계의 주인을 다쪽에 두었다는 의미이고 그 반대인 일대다는 일쪽에 연관관계의 주인을 두었음을 뜻합니다. 아래 글에서 다대일 연관관계에 대해 자세히 설명했으니 참고하면 좋을 것 같습니다. 다대일 연관관계https://preyhong.tistory.com/63 연관관계 매핑 기초preyhong.tistory.com 일대다 연관관계다대일의 반대인 일대다 관계는 권장하지 않는 연관관계입니다. 일대다 관계에서 일쪽이 연관관계의 주인이 될 경우 엔티티가 관리하는 외래 키가 다른 테이블에 있는 문제가 생깁니다. 또한 연관관계 관리를 위해 추가로 UPDATE 쿼리를 날려야 합니다. 아래와 같은 그림이 일대다 단방향인데 구현이 가.. 연관관계 매핑 기초 JPA를 사용해 엔티티 객체와 DB 테이블을 매핑하기 위해서는 연관관계 매핑이 필수적입니다. 특히 객체의 참조와 테이블의 외래 키를 매핑하는 부분은 굉장히 중요합니다. 객체는 참조를 통해 연관관계를 형성하고 테이블은 외래 키를 통해 연관관계를 형성하는 차이점을 이해하고 이 둘을 매핑해 봅시다. 객체의 참조와 테이블의 외래 키를 매핑할 때는 방향, 다중성, 그리고 연관관계의 주인이 중요한 세 가지 지점입니다. 만약 아래 그림처럼 객체를 설계할 때 참조 대신 외래 키를 그대로 사용해서 테이블에 맞추어 모델링하면 어떨까요? 테이블은 기본 키와 외래 키를 가지고 연관관계를 형성하는 것이 일반적입니다. 하지만 객체에서도 참조가 아닌 키 값을 가지고 연관관계를 형성하게 되면 객체 지향적이지 않을뿐더러 Member .. 기본키 매핑 기본 키는 DB에서 특정 레코드를 유일하게 식별하기 위해 사용됩니다. 기본 키(Primary Key)는 테이블에서 각 레코드를 식별하는 데 사용되고 테이블의 각 레코드에는 기본 키 값이 반드시 존재해야 합니다. 다시 말해 기본 키는 테이블에 존재하는 수많은 데이터들을 구별할 수 있는 유일한 기준이 되는 속성이 됩니다. 기본 키는 null이 아니고 유일해야 하며 변하지 않아야 합니다. 따라서 엔티티를 DB 테이블에 매핑할 때 엔티티 클래스에 필수적으로 기본 키 값을 설정해야 합니다. 기본 키 값을 설정하는 방법은 직접 할당과 자동 생성으로 나뉩니다. @Id 애노테이션만 사용한다면 직접 할당 방식으로 개발자가 엔티티의 기본 키 값을 직접 세팅해야 합니다. 직접 할당과 달리 자동 생성 방식은 @Id와 @Gen.. 영속성 컨텍스트 플러시 플러시는 영속성 컨텍스트의 변경 내용을 DB에 반영합니다. 보통 DB 트랜잭션이 커밋될 때 영속성 컨텍스트에서 플러시가 자동으로 일어납니다. 영속성 컨텍스트에서 플러시가 발생되면 엔티티의 변경을 감지하고 수정된 엔티티가 있다면 UPDATE SQL을 쓰기 지연 SQL 저장소에 저장합니다. 이후에 쓰기 지연 SQL 저장소에 저장된 쿼리(등록, 수정, 삭제 쿼리)를 DB에 전달합니다. 영속성 컨텍스트가 플러시 되었다고 해서 영속성 컨텍스트의 1차 캐시가 지워지지 않습니다. 플러시는 쓰기 지연 SQL 저장소에 있는 쿼리들을 DB에 반영되는 과정입니다. 아래와 같은 방법으로 영속성 컨텍스트를 플러시 할 수 있습니다.em.flush() : 플러시를 직접 호출하는 방법입니다.트랜잭션 커밋 : 플러시가 자동으로 호출.. 영속성 컨텍스트 객체와 관계형 데이터베이스를 매핑하는 것과 영속성 컨텍스트의 개념은 JPA에서 가장 중요한 두 가지입니다. 실제 JPA가 내부에서 어떻게 동작하는지 알기 위해서는 영속성 컨텍스트를 이해해야 합니다. 영속성 컨텍스트는 엔티티를 영구 저장하는 환경이라는 뜻으로 엔티티를 저장하고 관리합니다. 또한 1차 캐시, 동일성 보장, 트랜잭션을 지원하는 쓰기 지연, 변경 감지, 지연 로딩 기능을 제공합니다. 영속성 컨텍스트가 제공하는 기능을 제공하기 전에 영속성 컨텍스트에 접근하도록 도와주는 엔티티 매니저 팩토리와 엔티티 매니저에 대해 살펴봅시다. EntityManagerFactory & EntityManager 엔티티 매니저 팩토리는 DB당 하나만 생성하여 애플리케이션 전체에서 공유합니다. 위 그림처럼 엔티티 매니저 .. JPA가 등장한 배경 보통을 개발을 하면 객체를 만들고 그 객체를 관계형 DB에 보관하는 일이 많습니다. 이 과정에서 SQL 중심적인 개발이 생겨나고 개발자는 객체와 DB 테이블 사이의 SQL 매퍼와 같은 반복적인 CRUD 작업을 해야 했습니다. 심지어 객체와 관계형 DB 테이블 사이에 패러다임 불일치로 반복적인 SQL을 개발자가 직접 작성하여 그 불일치를 해소해야 했습니다. 예를 들어 Album 객체를 DB에 저장하기 위해서는 객체를 생성하고 INSERT 쿼리를 직접 작성해야 합니다. 만약 Album 객체가 Item 객체를 부모 클래스로 두고 있다면, Album 객체와 함께 Item 객체의 INSERT 쿼리도 작성해야 합니다. Album을 조회할 때는 더 복잡합니다. 물론 DB 테이블끼리 상관관계를 가지면 너무 복잡하기 때.. 이전 1 2 3 4 5 다음