본문 바로가기

스터디/JPA

연관관계 매핑 기초 - (2)

728x90
반응형

양방향 연관관계


 

객체의 경우 필드를 추가해 반대 방향으로의 연관관계를 추가해야 한다

데이터베이스의 경우 외래 키 하나로 양방향 조회가 가능하므로 추가할 내용이 없다

양방향 연관관계 매핑

@Entity
public class Member (

	@Id
	@Column(name="MEMBER_ID")
	private String id;
	
	private String username;
	
	//연관관계 매핑
	@ManyToOne
	@JoinColumn(name="TEAM_ID")
	private Team team;
	
	public void setTeam(Team team) {
		this.team = team;
	}
	...
)
@Entity
public class Team {
	
	@Id
	@Column(name="TEAM_ID")
	private String id;
	
	private String name;
	
	@OneToMany(mappedBy="team")
	private List<Member> members = new ArrayList<Member>();
	...
}

팀 엔티티에 회원 엔티티 필드를 추가했다

 

일대다 관계를 매핑하기 위해 @OneToMany 매핑 정보를 사용했다

  -> mappedBy 속성은 양방향 매핑일 때 사용하는 반대쪽 매핑의 필드 이름을 값으로 주면된다

일대다 컬렉션 조회

private static void biDirection(EntityManager em) {
    
    Team team = em.find(Team.class, "team1");
    List<Member> members = team.getMembers();
}

다대일 양방향 연관관계 매핑시 일대다 컬렉션 조회가 가능하다

 

연관관계의 주인


 

객체의 양방향 연관관계는 서로 다른 단방향 연관관계 2개를 잘 묶어 양방향인 것처럼 보이게 한 것이다

데이터베이스는 외래 키 하나로 두 테이블의 연관관계를 관리한다

 

엔티티를 단방향으로 매핑할 때는 참조를 하나만 사용하므로 참조를 사용하는 테이블에서 외래 키를 관리하면 된다

 

엔티티가 양방향 연관관계를 가질 때에는 객체의 참조는 둘인데 외래 키는 하나인 상황이 발생하게 되는데 두 연관관계 중 하나를 정해 외래 키를 관리하게 된다

이때 외래 키를 관리할 연관관계연관관계의 주인이라고 한다

양방향 매핑의 규칙: 연관관계의 주인

연관관계의 주인만이 데이터베이스 연관관계와 매핑되고 외래 키를 관리(등록, 수정, 삭제)할 수 있다

  - 주인이 아닌 쪽은 읽기만 할 수 있다

 

mappedBy 속성을 통해 어떤 연관관계를 주인으로 정할지 결정한다

  - 주인은 mappedBy 속성을 사용하지 않는다

  - 주인이 아니면 mappedBy 속성을 사용해 속성의 값으로 연관관계의 주인을 지정한다

연관관계의 주인은 외래 키가 있는 곳

연관관계의 주인은 테이블에 외래 키가 있는 곳으로 정해야 한다

물리적으로 다른 테이블에서 외래 키를 관리할 수는 없다

 

양방향 연관관계의 주의점


순수한 객체까지 고려한 양방향 연관관계

순수 객체의 입장에서는 한쪽에만 관계를 설정해주면 반대쪽 관계는 기대한 결과가 도출되지 않는다

  예) 회원에게 팀만 설정하고, 팀에 회원을 추가하지 않는 경우 팀의 회원 수를 조회하면 0이 도출된다

 

순수한 객체 상태에서도 동작하고 엔티티인 상태에서도 동작하도록 양쪽 관계 모두를 설정해주는게 좋다

연관관계 편의 메소드

public class Member {
	
	private Team team;
	
	public void setTeam(Team team) {
		this.team = team;
		tea.getMembers().add(this);
	}
}

양방향 연관관계를 설정하는 코드를 각각 호출하다보면 실수를 해 양방향이 깨질 수 있다

이를 방지하기 위해 두 코드를 하나인 것처럼 사용하는 것이 안전한데 이를 연관관계 편의 메소드라고 한다

 

주의점

 

연관관계를 변경할 때 기존의 연관관계를 제거하는 코드를 추가해야한다

public void setTeam(Team team) {
	
	if (this.team != null) {
		this.team.getMembers().remove(this);
	}
	this.team = team;
	team.getMembers().add(this);
}
728x90
반응형

'스터디 > JPA' 카테고리의 다른 글

다양한 연관관계 매핑 - (2)  (0) 2025.02.10
다양한 연관관계 매핑 - (1)  (0) 2025.02.10
연관관계 매핑 기초 - (1)  (0) 2025.02.09
엔티티 매핑 - (2)  (0) 2025.02.08
엔티티 매핑 - (1)  (0) 2025.02.08