[JPA] 자바 ORM 표준 JPA 프로그래밍 5장

xyzw·2023년 6월 26일
0

Spring

목록 보기
13/22

연관관계 매핑 기초

5.1 단방향 연관관계

다대일 N:1

  • 회원과 팀이 있다.
  • 회원은 하나의 팀에만 소속될 수 있다.

객체 연관관계

  • 회원 객체는 Member.team 필드로 팀 객체와 연관관계를 맺는다.
  • 회원 객체와 팀 객체는 단방향 관계다.
    회원은 Member.team 필드를 통해서 팀을 알 수 있지만 반대로 팀은 회원을 알 수 없다.

테이블 연관관계

  • 회원 테이블은 TEAM_ID 외래 키로 테이블과 연관관계를 맺는다.
  • 회원 테이블과 팀 테이블은 양방향 관계다.
    회원 테이블의 TEAM_ID 외래 키를 통해서 회원과 팀을 조인할 수 있고 반대로 팀과 회원도 조인할 수 있다.
# 회원과 팀을 조인하는 SQL
SELECT *
FROM MEMBER M
JOIN TEAM T ON M.TEAM_ID = T.TEAM_ID

# 팀과 회원은 조인하는 SQL
SELECT *
FROM TEAM T
JOIN MEMBER M ON T.TEAM_ID = M.TEAM_ID

객체 연관관계와 테이블 연관관계의 가장 큰 차이

참조를 통한 연관관계는 언제나 단방향이다.
객체 간에 연관관계를 양방향으로 만들고 싶으면 반대쪽에도 필드를 추가해서 참조를 보관해야 한다. 결국 연관관계를 하나 더 만들어야 한다.

이렇게 양쪽에서 서로 참조하는 것을 양방향 연관관계라 한다. 하지만 정확히 이야기하면 이것은 양방향 관계가 아니라 서로 다른 단방향 관계 2개다.

반면에 테이블은 외래 키 하나로 양방향으로 조인할 수 있다.

// 단방향 연관관계
class A {
	B b;
}

// 양방향 연관관계
class A {
	B b;
}
class B {
	A a;
}

객체 연관관계 vs 테이블 연관관계 정리

  • 객체는 참조(주소)로 연관관계를 맺는다.
  • 테이블은 외래 키로 연관관계를 맺는다.

연관된 데이터를 조회할 때
객체는 참조(a.getB().getC())를 사용하지만
테이블은 조인을 사용한다.

  • 참조를 사용하는 객체의 연관관계는 단방향이다.
  • 외래 키를 사용하는 테이블의 연관관계는 양방향이다.
  • 객체를 양방향으로 참조하려면 단방향 연관관계를 2개 만들어야 한다.

객체 관계 매핑

@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;
    }
    
    //Getter, Setter ...
}


@Entity
public class Team {
	
    @Id
    @Column(name = "TEAM_ID")
    private String id;
    
    private String name;
    
    //Getter, Setter ...
}

@JoinColumn

0개의 댓글