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. 연관관계 매핑 - 양방향 관계
단방향만으로도 충분하지만, 반대 방향에서도 조회하려면 양방향 매핑이 필요합니다.
✅ 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
'개발지식' 카테고리의 다른 글
포트포워딩(port forwarding)으로 내부망 PC 접근하기(포트포워딩 설정방법) (4) | 2025.07.28 |
---|---|
(JPA) mappedBy 완벽 이해! (8) | 2025.07.26 |
(JPA) 영속성 컨텍스트 (4) | 2025.07.23 |
SSL VS TLS 차이점 비교! (1) | 2024.04.19 |
[Vue.js] vue create [파일명] 보안 오류 해결 (2) | 2024.04.16 |