Entity 간의 관계(일대일, 일대다, 다대다)를 정의하고 매핑하는 방법,
연관관계 매핑을 통해 복잡한 데이터 구조를 효과적으로 관리하는 방법에 대해 알아봅시다.
@OneToOne
- 일대일 관계를 나타내는 매핑 정보
- 1:1 관계를 지정하기에 앞서 이것이 꼭 물리적으로 테이블이 분리되어야 하는지에 대해 생각해 봐야 한다.
- 1:1 관계로 구성 한다는 것은 결국 하나의 목적에 부합되는 공통된 데이터를 관리한다고 볼 수 있으며 이것은 하나의 테이블에서 관리 할 수 있는 데이터일 가능성이 높다는 의미이다.
- 즉, 의도적 중복이 아니라면 사용할 일이 없다는 말입니다.
- 의도적 중복 예시) 버블 구독 상품을 사서 채팅방이 생길 경우. 구독 상품과 채팅방은 1:1 관계
@OneToMany
- 일대다 관계를 나타내는 매핑 정보
- @OneToMany가 단방향으로 쓰이면 문제가 발생할 수 있다.
- 속도를 위해 기본적으로 FetchType 설정이 LAZY 로 설정되어있다.
- 속성
- mappedBy : 연관관계의 주인 필드를 선택한다.
- fetch : 글로벌 페치 전략 설정
- cascade : 영속성 전이 기능을 사용한다.
- targetEntity : 연관된 엔티티의 타입 정보를 설정한다.
@ManyToOne
- 다대일 관계를 나타내는 매핑 정보
- 속성
- optional (default true) : false로 설정하면 연관된 엔티티가 반드시 있어야 함.
- fetch : 글로벌 패치 전략 설정
- ✋ 기본이 EGEAR 로 설정되어있으나 실무에서는 기본 LAZY로 설정하는것 추천!
- cascade : 영속성 전이 기능 사용
- targetEntity : 연관된 엔티티의 타입 정보 설정 (targetEntity = Member.class 식으로 사용)
@JoinColumn
- 외래 키 매핑 시 사용 (Join 을 요청하기 위한 매핑정보로 쓰인다.)
- @ManyToOne 어노테이션과 주로 함께 쓰인다. (조인대상 컬럼 지정기능을 안쓸거면 생략해도 됨)
- name 속성은 매핑할 외래키의 이름
- 어노테이션을 생략해도 외래 키가 생성됨
- 생략 시 외래키의 이름이 기본 전략을 활용하여 생성된다.
- 속성
- name : 매핑할 외래 키의 이름
- referencedColumnName : 외래 키가 참조하는 대상 테이블의 컬럼명
- foreignKey : 외래 키 제약조건 지정 (테이블 생성 시에만 적용됨)
- unique/nullable/insertable/updateable/columnDefinition/table : @Column의 속성과 같음
@ManyToMany
- 다대다 관계를 나타내는 매핑 정보 (N:M)
- 다대다 설정을 하게되면 중간 매핑테이블(JoinTable)이 자동으로 생성된다.
- 중간 매핑 테이블은 JPA상에서 숨겨져서(Entity 정의 없이) 관리된다.
- ✋ 매핑 테이블 관리가 불가능하여서 실무에서는 잘 사용하지 않는 기능 입니다.
- 실무에서는 매핑 테이블을 아래와 같은 형태로 직접 정의합니다.
- TableA(@OneToMany) > MappingTable(@ManyToOne, @ManyToOne) > TableB(@OneToMany)
'개발 > 부트캠프' 카테고리의 다른 글
본캠프 : QueryDSL (0) | 2025.03.13 |
---|---|
본캠프 : 테이블 객체끼리 관계만들기 2 (0) | 2025.03.12 |
본캠프 : AOP(Aspect-Oriented Programming) (0) | 2025.03.12 |
본캠프 : JwtFilter - ArgumentResolver 실습 1 (0) | 2025.03.11 |
본캠프 : 향상된 for문, stream 사용법 (0) | 2025.03.08 |