개발지식

(JPA) 연관관계 매핑

우루쾅 2025. 7. 25. 07:57
728x90
반응형
SMALL
객체지향 설계의 목표는 자율적인 객체들의 협력 공동체를 만드는 것이다!
- 조영호(객체지향의 사실과 오해)

 

 

JPA는 객체와 데이터베이스 간의 패러다임 불일치를 해결하기 위해 등장는데,

그 중에서도 연관관계 매핑은 객체 간 관계(예: 멤버 ↔ 팀)를 테이블로 연결하는 핵심 기술이다.

 

📌 1. 연관관계란?

예를 들어, 다음과 같은 도메인이 있다고 해봅시다.

  • 하나의 Member는 하나의 Team에 속한다.
  • 하나의 Team은 여러 Member를 가질 수 있다.

즉, Member : Team = N : 1 구조입니다.

 

 

🛠️ 2. 연관관계 매핑 - 단방향 @ManyToOne

✅ Member 엔티티에서 Team을 참조하는 구조

@Entity
public class Member {

    @Id @GeneratedValue
    private Long id;
    private String name;

    @ManyToOne
    @JoinColumn(name = "team_id") // 외래키 매핑
    private Team team;

    // getters and setters
}

 

@Entity
public class Team {

    @Id @GeneratedValue
    private Long id;
    private String name;

}

 

@JoinColumn(name = "team_id") : Member 테이블에 생성될 외래키 컬럼 이름

 

 

🔄 3. 연관관계 매핑 - 양방향 관계

단방향만으로도 충분하지만, 반대 방향에서도 조회하려면 양방향 매핑이 필요합니다.

출처 - 김영한(자바 ORM 표준 JPA 프로그래밍 - 기본편)

✅ Team → Member 로도 참조 가능하게 만들기

@Entity
public class Team {

    @Id @GeneratedValue
    private Long id;
    private String name;

    @OneToMany(mappedBy = "team")
    private List<Member> members = new ArrayList<>();
}
  • mappedBy = "team" : Member 엔티티의 team 필드에 의해 매핑됨을 의미
  • Team이 연관관계의 주인이 아님 (외래 키가 없는 쪽)

 

✍️ 4. 테스트 코드 확인!

public class JpaMain {
    public static void main(String[] args) {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
        EntityManager em = emf.createEntityManager();
        EntityTransaction tx = em.getTransaction();
        tx.begin();

        try {
            // 팀 생성
            Team team = new Team();
            team.setName("TeamA");
            em.persist(team);

            // 멤버 생성
            Member member = new Member();
            member.setName("홍길동");
            member.setTeam(team); // 연관관계 설정
            em.persist(member);

            // 연관관계 조회
            Member findMember = em.find(Member.class, member.getId());
            System.out.println("소속 팀: " + findMember.getTeam().getName());

            // 팀에서 멤버 리스트 조회
            Team findTeam = em.find(Team.class, team.getId());
            // 찾을 때 Member 를 통해 찾음
            List<Member> members = findTeam.getMembers();
            System.out.println("팀 멤버 수: " + members.size());

            tx.commit();
        } catch (Exception e) {
            tx.rollback();
        } finally {
            em.close();
        }
        emf.close();
    }
}

 

 

🧼 정리

 

관계 유형 JPA 어노테이션
단방향 다대일 @ManyToOne
양방향 다대일 @ManyToOne + @OneToMany(mappedBy = "xxx")
단방향 일대일 @OneToOne
다대다 @ManyToMany (잘 안 씀, 중간 테이블 권장)

 

 

✅ 마무리

연관관계 매핑은 JPA의 가장 강력한 기능이자, 실수하기 쉬울 것으로 보인다.
"외래키는 한 곳에만 있어야 한다!"
"양방향 관계는 주인을 명확히 정하자!"

 

 

출처

- 조영호(객체지향의 사실과 오해)

- 김영한(자바 ORM 표준 JPA 프로그래밍 - 기본편)

 

728x90
반응형
LIST