일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- Transaction Pattern
- 디자인 패턴
- Java
- Parallel Old GC
- saga pattern
- 사가 패턴
- zipkin
- 스프링 배치
- 멀티스레드
- Resilinece4j
- thread
- Spring Boot Actuator
- spring cloud
- The law of Demeter
- MSA
- 키클락
- spring batch
- 체인 패턴
- 배치
- Action Pattern
- JPA
- 알고리즘
- 스레드
- 디자인패턴
- 타입스크립트
- Spring Cloud Netfilx Eureka
- TypeScript
- 생산자 소비자 패턴
- Serial GC
- java 정렬
- Today
- Total
PSD( Private-Self-Development )
JPA의 DB 매핑 본문
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
'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 |