JPA 연관관계 매핑

choiJaewon·2026년 1월 20일
post-thumbnail

1. 왜 JPA 연관관계 매핑이 필요할까?

-> 테이블 중심 사고의 문제점

예시)

SELECT *
FROM MEMBER m
JOIN TEAM t ON m.TEAM_ID = t.TEAM_ID;

이런식으로 테이블은 외래키를 통해서 매핑하는 한편 객체는 참조를 통해서 매핑하므로 테이블에 맞추어 매핑시에는 협력 관계를 만들기 힘들다.

구분테이블객체
연관관계 표현외래 키(FK)객체 참조
관계 탐색JOIN참조로 접근
사고 방식데이터 중심협력 관계 중심

테이블은 외래 키 하나로 양방향 조회 가능

객체는 참조를 가진 방향으로만 탐색 가능

-> 이 간극을 메워주는 게 JPA 연관관계 매핑


2. 단방향 연관관계 매핑


@Entity
class Team {
	@Id @GeneratedValue
    Long id;
    String name;
}
@Entity
public class Member {

    @Id @GeneratedValue
    private Long id;

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

@JoinColmn을 통해서 다른 테이블의 외래키와 매핑하는것이 가능하다!


3. 양방향 연관관계란?

양방향 매핑 코드 : DB는 애초에 양방향이나 객체는 양방향이라는 개념이 없음! 객체 단방향 2가지가
같이 붙어 있는 형태이다!

@Entity
public class Team {

    @OneToMany(mappedBy = "team")
    private List<Member> members = new ArrayList<>();
}

@Entity
public class Member {

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

4.연관관계의 주인(Owner)이란?

핵심 규칙

외래 키를 관리하는 쪽이 연관관계의 주인이다

테이블 기준: MEMBER.TEAM_ID

따라서 Member.team이 연관관계의 주인

왜일까? 2개중 하나의 테이블만 접근할수 있어야지만이 DB변경을 용이하게 할수 있기 떄문!
한쪽에서만 변경이 되도록 하고 한쪽은 읽기만 될수 있도록!!

@OneToMany(mappedBy = "team") // 주인 아님
private List<Member> members;

mappedBy를 통해서 주인을 표시하여 줄수 있다.


-정리

연관관계의 주인은 무조건 FK 있는 쪽

객체 탐색이 필요할 때만 양방향

기본은 단방향 매핑

양방향이면 항상 양쪽 값 다 세팅


참고(Reference)
https://wale.tistory.com/entry/JPA-%EC%97%B0%EA%B4%80%EA%B4%80%EA%B3%84-%EB%A7%A4%ED%95%91-%EA%B8%B0%EC%B4%881

0개의 댓글