[Spring]-JPA Entity 매핑 기초

Mini_me·2022년 2월 4일
0

공부 [Spring]

목록 보기
15/27

다음 글은 김영한 님의 자바 orm 기초의 책을 바탕으로 이해한 내용을 정리한 글입니다.

👊🏻 엔티티들은 대부분 다른 엔티티와 연관관계가 있다.

쇼핑몰을 예를 들면, 주문 엔티티는 다른 엔티티와 아예 상관이 없는게 아니라

주문 엔티티는 고객이 어떤 상품을 주문 했는지 알아야 하기 때문에

연관관계 : 주문 엔티티 - 상품엔티티 의 관계를 가진다.

또한 상품 엔티티는 상품의 재고를 알아야하기 때문에 재고 엔티티와 연관관계를 가진다.

그런데

객체 → 주소(참조)를 사용하여 관계

테이블 → 외래 키 (FK)를 이용해서 관계를 맺는다.

👊🏻 객체의 참조와 테이블의 외래키를 매핑하는 것이 목표

✏️ 연관관계 매핑 핵심 KEYWORDS

방향 : 단방향 - 한쪽만 참조 / 양방향 - 양쪽 모두 서로 참조

🍊 방향은 객체 관계에만 존재 / 테이블은 항상 양방향

다중성

  • 일대다
  • 다대일
  • 다대다

연관관계의 주인

객체를 양방향 연관관계로 만들 경우, 연관관계의 주인을 정해야 한다.

👊🏻 방향 - 단방향 연관관계

예시를 들어서 연관관계를 이해해보자

  • 회원과 팀이 있다.
  • 회원은 하나의 팀에만 소속될 수 있다.
  • 회원과 팀은 다대일 관계다
  • 객체 member 객체는 member.team ( 멤버변수)로 팀 객체와 연관관계를 맺는다. 회원은 member.team을 통해 팀 알 수 있지만 반대는 불가 즉 member에서 team을 조회할 때는 member.getTeam()으로 가능 하지만 team→ member을 접근하는 필드는 존재하지않음
  • 테이블 연관관계 : 회원 테이블 - 팀 테이블 양방향 관게이다. FK키로 회원 → 팀 , 팀 → 회원 조회 둘다 가능

👊🏻 둘의 차이점

참조 통한 연관관계 → 단방향 관계 2개 ( 왜냐면 반대쪽에도 필드를 추가해서 참조 보관해야 하니깐 결국은 단방향 2개가 되어버린다.)

연관된 데이터 조회 시 : a.getB().getC() 사용

테이블을 통한 연관관계 → 외래 키 하나로 양방향 JOIN 가능

연관된 데이터 조회 시 : JOIN 사용 ( A JOIN B)

코드를 통해 이해해보자!

public static void main(String[]args){
Member member1=new Member("member1","회원1");
Member member2=new Member("member2","회원2");
Team team1= new Team("team1" , "팁1");

member1.setTeam(team1);
member2.setTeam(team1);
//회원 1, 2는 팀 1에 소속되어졌다. 

Team findTeam=member1.getTeam();
// 회원1이 속한 팀1을 조회할 수 있다. 
```

테이블 연관관계의 경우

ALTER TABLE MEMBER ADD CONSTRAINT FK_MEMBER_TEAM
	FOREIGN KEY(TEAM_ID)
	REFERENCESE TEAM

// 기본적으로 생성한 MEMBER / TEAM SQL문은 생략하였다.
// ALTHER문을 이용하여 MEMBER TABLE의 외래키(FOREIGN KEY) 제약 조건을 설정하였다.
// 외래키는 TEAM_ID 로, TEAM으로부터 참조하였다.
INSERT INTO TEAM(TEAM_ID,NAME) VALUESE("team1","팀1");
INSERT INTO TEAM(MEMBER_ID,TEAM_ID,USERNAME) VALUESE("members1","team1","회원1");
INSERT INTO TEAM(MEMBER_ID,TEAM_ID,USERNAME) VALUESE("members2","team2","회원2");

SELECT T.*
FORM MEMBER M
	JOIN TEAM T ON M.TEAM_ID = T.ID
	WHERE M.MEMBER_ID='member1'
//멤버의 아이디가 member1이 소속되어있는 팀의 id를 조회

🤖 join? : 두 개 이상의 테이블들을 연결하여 데이터 출력하는것

이제 객체 연관관계와 테이블 연관관계를 매핑해보자

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;
}
}

@ManyToOne : 다대일 매핑정보 / 연관관계 매핑 시 다중성 나타내는 어노테이션 사용

@ JoinColumn : 외래 키 매핑 사용한다 / name은 매핑할 외래 키 지정

매핑을 했으면 이제 매핑한 연관관계를 사용해보자

  1. 저장

    member1.setTeam(team1); //회원에서 팀 참조
    em.persist(member1); //참조한 팀의 회원 저장

    jpa는 참조한 team.id를 외래 키로 사용해서 적절한 등록 쿼리 생성

  1. 조회

    • JPQL (객체지향 쿼리) 사용

    • 객체 그래프 탐색

      member.getTeam() 같이 객체를 통해 연관된 엔티티 조회

  1. 수정

참조하는 대상만 변경하면 JPA가 처리

private static void updateRelation(EntityManager em){
Team team2 = new Team("team2","팀2");
em.persist(team2);

Member member=em.find(Member.class,"member1");
member.setTeam(team2);
}
  1. 제거

연관관계 제거는 null로 설정하여 제거

  1. 삭제

삭제는 기존 연관관계를 null로 설정하여 먼저 제거한 후 삭제해야한다.

0개의 댓글