다양한 연관관계 매핑

2024. 4. 18. 11:16JAVA/스프링 데이터 JPA

엔티티의 연관관계 매핑 시 고려할 사항

1. 다중성

2. 단방향, 양방향

3. 연관관계의 주인

 

1. 다대일

연관관계의 주인 : 다쪽

 

1 - 1) 다대일 단방향 (N : 1)

 

회원 엔티티

@Entity
public class Member {
	...
    
	@ManyToOne
	@JoinColumn(name = "TEAM_ID")
	private Team team;
 	
	...
}

 

※ 팀 엔티티에는 일반적인 필드와 getter, setter 등이 들어가게 된다.

 

1 - 2)  다대일 양방향

 

회원 엔티티

@Entity
public class Member {
	...

	@ManyToOne
	@JoinColumn(name = "TEAM_ID")
	private Team team;
    
	...
}

 

팀 엔티티

@Entity
public class Team {
	...
	
	@OneToMany(mappedBy = "team")
	privat List<Member> members = new ArrayList<Member>();
    
	public void addMember(member) {
		this.members.add(member);
		if (member.getTeam() != this {
			member.setTeam(this);
		}
	}
	
	...
 }

 

- 양방향은 외래 키가 있는 쪽이 연관관계의 주인이다.

- 양방향 연관관계는 항상 서로를 참조해야 한다.

 

2. 일대다

2 - 1) 일대다 단방향

 

일대다 단방향 관계를 매핑할 때는 JoinColumn을 명시해야 한다. 그렇지 않으면 JPA는 연결 테이블을 중간에 두고 연관관계를 관리하는 조인 테이블 전략을 기본으로 사용해서 매핑한다.

 

※ 일대다 단방향 매핑의 단점 : 매핑한 객체가 관리하는 외래 키가 다른 테이블에 있다는 점이다. 따라서 연관관계 처리를 위한 SQL문을 추가로 실행해야 한다.

 

2 - 2) 일대다 양방향

일대 다 양방향 매핑은 존재하지 않는다. 대신 다대일 양방향 매핑을 사용해야 한다. @OneToMany는 연관관계의 주인이 될 수 없다.

 

3. 일대일

대상 테이블 중 어느 곳이나 외래키를 가질 수 있다는 점이 특징이다. 대상 테이블 중 어느 쪽에 외래 키를 줄지를 선택하는 과정은 다음과 같다.

 

3 - 1) 주 테이블에 외래 키

 

객체지향 개발자들은 주 테이블에 외래키가 있는 것을 선호한다. JPA도 주 테이블에 외래키가 있으면 더 편리하게 매핑할 수 있다.

 

단방향 : 

@Entity
public class Member {
	...
	    
	@OneToOne
	@JoinColumn(name = "LOCKER_ID")
	private Locker locker;

	...
}

 

양방향 : 

@Entity
public class Member {
	...
	
	@OneToOne
	@JoinColumn(name = "LOCKER_ID")
	private Locker locker;

	...
}

 

@Entity
public class Locker {
	
	@Id
	@GeneratedValue
	@Column(name = "LOCKER_ID")
	private Long id;

	private String name;

	@OneToOne(mappedBy = "locker")
	private Member member;

	...
}

 

3 - 2) 대상 테이블에 외래 키

일대일 관계 중 대상 테이블에 외래 키가 있는 단방향 관계는 JPA에서 지원하지 않는다. 일대일 매핑에서 대상 테이블에 외래 키를 두고 싶으면 아래와 같이 양방향으로 매핑한다.

 

@Entity
public class Member {
	...

	@OneToOne(mappedBy = "member")
	private Locker locker;

	...
}

 

@Entity
public class Locker {
	...

	@OneToOne
	@JoinColumn(name =  "MEMBER_ID")
	private Member member;

	...
}

 

4. 다대다

관계형 데이터베이스에서는 정규화된 테이블 2개로 다대다 관계를 표현할 수 없어서 다대다 관계를 일대다, 다대일 관계로 풀어낸다. 추천하는 기본 키 생성 전략은 데이터베이스에서 자동으로 생성해주는 대리 키를 Long 값으로 사용하는 것이다. 이렇게 하면 간편하고 거의 영구적이며 비즈니스에 의존하지 않게 된다. 아래 코드 예시를 보자.

 

@Entity
public class Order {
	...
	
	@ManyToOne
	@JoinColumn(name = "MEMBER_ID")
	private Member member;

	@ManyToOne
	@JoinColumn(name = "PRODUCT_ID")
	private Product product;

	...
}

'JAVA > 스프링 데이터 JPA' 카테고리의 다른 글

값 타입  (2) 2024.05.16
프록시와 연관관계 매핑  (0) 2024.05.06
연관관계 매핑 기초  (0) 2024.04.11
엔티티 매핑  (2) 2024.04.04
영속성 관리  (0) 2024.03.27