2022-05-10 TIL

이창호·2022년 5월 10일
0

Spring Boot Part4 - JPA 영속성컨텍스트, 단일엔티티 매핑, 연관 관계 매핑

용어알아보기

Entity

  • RDB의 Table과 매핑되는 객체다.

EntityManagerFactory

  • Entity를 관리하는 EntityManager를 만들어낸다.
  • Thread safe하다. -> 생산 비용이 크기 때문에 하나만 만들어 두고 여러 thread에서 접근함.

EntityManager

  • Entity를 CRUD등 Entity와 관련된 모든 일을 처리한다.
  • Thread Safe하지 않기 때문에 동시에 접근 할 경우 동시성 이슈가 발생 할 수 있다.
  • 트랜잭션을 시작할 때, 커넥션을 획득한다.

영속성 컨텍스트

  • Entity를 영구 저장하는 환경이란 뜻
  • 엔티티 매니저는 persist() 메서드를 통해 엔티티를 영속성 컨텍스트에 보관하고 관리한다.
  • 관리되는 엔티티들은 식별자 값을 가져야 한다. ( key - value로 관리하기 때문이다. )
  • JPA는 트랜잭션을 커밋하는 순간 영속성 컨텍스트에 새로 저장된 엔티티를 DB에 반영함.
  • 위를 FLUSH라 부르고 영속성 컨텍스트의 변경 내용을 DB에 동기화 하는 작업이다.
  • 1차 캐시, 동일성 보장, 트랜잭션을 지원하는 쓰기 지연, 변경 감지, 지연 로딩이란 이점을 얻을 수 있다.

엔티티 생명 주기

  • 비영속 -> New / Transient, 영속성 컨텍스트와 전혀 관계가 없는 상태, persist()로 엔티티를 영속 시킬 수 있다.
  • 영속 -> Managed, 영속성 컨텍스트에 저장된 상태, flush()로 DB에 동기화 작업을 가능하며 remove()로 삭제를 할 수 있고 detach() clear() close()로 준영속 상태로 만들 수 있다.
  • 준영속 -> Detached, 영속성 컨텍스트에 저장되었다가 분리된 상태, merge()로 다시 영속 상태로 만들 수 있다.
  • 삭제 -> Removed, 삭제된 상태, persist()로 다시 영속 상태로 만들 수 있다.

단일 엔티티 매핑

  • JPA는 엔티티 객체를 생성할 때, 기본 생성자를 사용한다.
  • @Entity 어노테이션으로 엔티티 클래스를 등록하면 엔티티 이름은 기본 적으로 클래스 이름이 된다.
  • @Table로 엔티티에 매핑할 테이블을 지정한다. 기본 값은 엔티티 이름이다.
  • @Column로 필드별로 DDL 설정을 할 수 있다. ( 현업에선 DDL 설정을 validate나 none을 사용해서 쓸 일이 있나 싶지만 명시해두면 다른 개발자들이 엔티티만 보고도 RDB를 추측할 수 있기 때문에 권장하는 편 )
  • @Id로 기본키를 지정한다. strategy값으로 기본키 생성 전략을 설정 할 수 있다.
  • strategy는 DB 시퀀스에서 식별자 값을 가져온 후 영속화를 하는 SEQUENCE, DB 시퀀스용 테이블에서 값을 획득하는 TABLE, DB에 저장해서 식별자 값을 획득 한 후(em.persist()가 수행됨) 영속화 하는 IDENTITY, DB 방언(dialect)에 따라 자동으로 전략을 선택하는 AUTO가 있다. 현업에선 AUTO를 많이쓰고 또는 SEQUENCE를 사용한다.

연관 엔티티 매핑

  • RDB에서 테이블은 외래키를 통해 연관 관계를 맺는다.
  • 객체들 간의 연관 관계는 참주(주소)로 맺는다.
  • @OneToOne, @OneToMany, @ManyToOne으로 객체 간의 연관관계를 설정 할 수 있다.
  • @JoinColumn으로 연관 관계의 주체로 설정하여 외래키를 등록, 수정, 삭제 할 수 있다. ( 아닌 쪽은 읽기만 가능 )
profile
이타적인 기회주의자

0개의 댓글