반응형
1. 객체와 테이블 연관관계의 차이를 이해
2. 객체의 참조와 테이블의 외래 키를 매핑
3. 용어 이해
- 방향(Direction): 단방향, 양방향
- 다중성(Multiplicity): 다대일(N:1), 일대다(1:N), 일대일(1:1),
- 다대다(N:M) 이해
- ⭐️연관관계의 주인(Owner)⭐️ : 객체 양방향 연관관계는 관리 주인 이 필요
예제 시나리오
- 회원과 팀이 있다.
- 회원은 하나의 팀에만 소속될 수 있다.
- 회원과 팀은 다대일 관계다
1. 객체를 테이블에 맞추어 모델링(연관관계가 없는 객체)
1. Member 객체
@Id @GeneratedValue
@Column(name="MEMBER_ID")
private Long id;
@Column(name="TEAM_ID")
private Long teamId;
@Column(name="USERNAME")
private String username;
2. Team 객체
@Id
@GeneratedValue
@Column(name="TEAM_ID")
private Long id;
private String name;
3. jpaMain
Team team = new Team();
team.setName("TeamA");
em.persist(team); //PK값이 세팅 되기때문에 -> get을 이용해서 사용가능
Member member = new Member();
member.setUsername("member1");
member.setTeamId(team.getId());
em.persist(member);
=> 이렇게 하면 member.setTeamId(team.getId()); 이부분에서 외래키 식별자를 직접 다루는 방식이므로 권장되지 않는 ㅂ아식
Member findMember = em.find(Member.class,member.getId());
//찾아온 멤버가 어느 팀 소속인지 알고 싶은 경우
Long findTeamId = findMember.getTeamId();
Team findTeam = em.find(Team.class, findTeamId);
객체를 테이블에 맞추어 데이터 중심으로 모델링하면 협력 관계를 만들 수 없다.
왜냐하면 테이블은 JOIN을 사용해서 연관된 테이블을 찾지만,
객체는 참조를 사용해서 연관된 객체를 찾기 때문이다.
2. 단방향 연관관계
위에서 설명한 것을 객체 지향 모델링으로 바꾼다고 한다면
(하나의 팀에는 여러명의 멤버가 소속되어있는 관계 => TEAM : MEMBER 관계는 1: N 관계 )
@Entity
public class Member
{
@Id @GeneratedValue
@Column(name="MEMBER_ID")
private Long id;
@Column(name="USERNAME")
private String username;
// @Column(name="TEAM_ID")
// private Long teamId;
//Team,Member 관계는 1:N 관계
@ManyToOne
@JoinColumn(name="TEAM_ID")
private Team team;
}
public class JpaMain {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
//JPA에서는 트랜잭션 단위가 중요. 꼭 트랜잭션 안에서 작업해야함.
EntityTransaction tx = em.getTransaction();//트랜잭션 얻기
tx.begin();
try{
Team team = new Team();
team.setName("TeamA");
em.persist(team); //PK값이 세팅 되기때문에
Member member = new Member();
member.setUsername("member1");
member.setTeam(team);
em.persist(member);
Member findMember = em.find(Member.class,member.getId());
Team findTeam = findMember.getTeam();
System.out.println("findTeam : "+findTeam.getName());
tx.commit();
}catch (Exception e){
tx.rollback();
}finally {
em.close();
}
emf.close();
}
}
⭐️⭐️양방향 연관관계 와 연관관계의 주인⭐️⭐️
단방향 연관관계
- 한쪽 방향에서만 연관관계 설정
- EX. 단방향 연관관계에서는 Member가 Team을 참조하지만, Team은 Member를 모릅니다.
즉, Team에서는 Member 를 조회 할 수 없음.
양방향 연관관계
- 두 방향에서 서로 연관 관계를 참조
- EX. Member는 자신이 속한 Team을 참조하고,
Team도 자신의 멤버들(Member 리스트)을 참조
반응형
'Study Platform📚 > 김영한👨🏻🏫의 스프링 부트와 JPA 실무 완전 정복 로드맵' 카테고리의 다른 글
엔티티 매핑 - 객체와 관계형 데이터베이스 매핑(설계)하기(Object Relational Mapping) (2) | 2024.11.20 |
---|---|
영속성 관리 - 내부동작 방식 (0) | 2024.11.04 |
Hello JPA - 애플리케이션 개발 (1) | 2024.10.24 |
자바 ORM 표준 JPA 프로그래밍 - JPA 시작하기(맞는 버전 찾기) (1) | 2024.10.23 |