PSD( Private-Self-Development )

JPA의 DB 매핑 본문

Backend/JPA

JPA의 DB 매핑

chjysm 2022. 10. 6. 17:06

JPA에서 Entitiy 란?

JPA에서 관리하는 클래스이다.

@Entitiy 어노테이션으로 지정할 수 있다.

단,
- 기본 생성자 가 필수이다.
- final 클래스, enum, interface, inner 클래스는 지정 불가능
- 저장할 필드에 final 사용 불가능

 


데이터베이스 스키마 자동 생성

jpa는 persistence.xml 설정 값에 따라
entitiy 설정한 객체에 대한 DDL을 자동으로 실행시켜 주기도 한다.

개발 단계에서 사용하기에 유용할 듯!

운영 단계에서는 절대 사용하지 말자...

<property name="hibernate.hbm2ddl.auto" value="create" /> <!-- 구동 시 Entitiy DDL 자동 적용 여부 -->

 


매핑 어노테이션

@Entitiy

JPA에서 해당 클래스를 관리하도록 설정하는 어노테이션

 

@Table()

속성 값을 설정하여 각 대상에 매핑 가능하다.

 

@Id 

Primary Key 설정

 

@GeneratedValue()

속성 값을 설정하여 키 생성 및 매핑 

GenerationType.IDENTITY 속성만 예외적으로 영속 콘텍스트에 영속 시 DB에 바로 추가 요청이 간다.

EntityManager.persist( entitiy ) // db 에 바로 추가된다.

GenerationType.SEQUENCE 속성은 영속 컨텍스트 에 영속 시 DB에서 시퀀스 값을 가지고 온다.

allocationSize : 시퀀스 한 번 호출 시 한번에 가지고 올 시퀸스 수 (성능 최적화)  

 

@Column()

속성 값을 설정하여 각 칼럼 매핑이 가능하다.

 

@Temporal()

날짜 타입 컬럼 매핑
LocalDate, LocalDateTime 자료형을 사용하는 것이 편하다.

 

@Enumerated()

enum 타입 칼럼 매핑

@Enumerated(EnumType.STRING) 

: 기본값이  EnumType.ORDINAL로 enum의 순서가 들어가기 때문에 STRING 선언을 꼭 해주자

 

@Lob()

BLOB, CLOB 타입 칼럼 매핑

 

@Transient 

특정 필드를 칼럼에 매핑하지 않음

 


엔티티 간의 매핑

JPA에서는

FK를 사용하여 조인으로 연관 관계를 찾아오는 것이 아닌,

엔티티 간의 연관 관계를 맵핑해주어 사용한다( 객체지향적으로 우수 ).

 

단방향 연관 관계

// 기존 방법
@Column(name = "TEAM_ID")
private Long teamId;

=>

// 객체지향적인 jpa 방법
@ManyToOne
@JoinColumn(name = "TEAM_ID")
private Team team;

 

양방향 연관 관계

@OneToMany(mappedBy = "team") // 반대편에서 나는 무엇으로 멥핑 되어 있는 가
private List<Member> members = new ArrayList<>();


// 상대편 객체에도 단방향 연관 관계가 선언되어 있어야 한다.
@ManyToOne
@JoinColumn(name = "TEAM_ID")
private Team team;

양방향 연관 관계 설정 시 
어떤 엔티티의 필드를 실제 테이블의 FK에 맵핑할지 혼란이 생긴다.

때문에 둘 중 어떤 필드를 맵핑할지 정해줘야 한다.

 

연관관계의 주인( Owner )
  • 연관관계의 주인만이 외래 키를 관리( 등록, 수정 )
  • 주인이 아닌 쪽은 읽기만 가능하다.
  • 주인은 mappedBy 속성 사용 X
  • 주인이 아니면 mappedBy 속성 사용 O

 

그렇다면 누구를 주인으로 하는 가?

  • 실제 테이블에 해당 FK 를 가지고 있는 테이블
  • 1:N 관계 라면 N 이 주인

 

주의 사항

  • 항상 양쪽에 값을 설정하자.
  • 한쪽을 세팅할 때 다른 한쪽에도 세팅하도록 함수를 구현하자.
  • 라이브러리( ex. Lombok toString() ) 무한 루프를 조심하자.
  • 가급적 단방향 연관 관계가 좋다.

 

 


참조 : https://www.inflearn.com/course/ORM-JPA-Basic/dashboard

 

자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의

JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., - 강의 소개 | 인프런

www.inflearn.com

'Backend > JPA' 카테고리의 다른 글

JPA 의 프록시, 지연 로딩, 즉시 로딩  (0) 2022.10.12
JPA 의 상속  (0) 2022.10.11
JPA의 영속성 컨텍스트  (0) 2022.10.06
JPA 사용 설정 및 사용  (0) 2022.10.05
JPA 란?  (0) 2022.09.28