JPA

JPA시작(8)_객체 연관관계 / 테이블 연관관계

개발자 배찌 2021. 6. 8. 12:13
728x90

객체 연관관계 vs 테이블 연관관계

  • 객체는 참조(주소)로 연관관계를 맺는다
  • 테이블은 외래키로 연관관계를 맺는다.
  • 연관된 데이터를 조회할때 객체는 참조( a.getB().getC() ) 를 사용하고,
  • 테이블은 join(조인)을 사용한다.
  • 참조를사용하는 객체의 연관관계는 단방향이다
  • A -> B (a,b)
  • 외래키를 사용하는 테이블의 연관관계는 양방향이다.
  • A join B 가 가능하면 B join A도 가능하다

  • 객체를 양방향으로 참조하려면 단방향 연관관계를 2개 만들어야한다.
    A -> B (a,b)
    B -> A (b,a)

1. 객체 연관관계

 

순수한 객체 연관관계

( JPA를 사용하지 않은 순수한 회원클래스, 팀 클래스)

public class Member {
     private String id;
     private String username;
     private Team team;  //팀의 참조를 보관

     public void setTeam(Team team) {
         this.team = team;
     }
     //Getter, Setter...
}
public class Team {
     private String id;
     private String name;

     //Getter, Setter,...
}

 

 

동작코드 : 회원1과 회원2를 팀1에 소속시키자.

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

     Team findTeam = member1.getTeam();  //객체 그래프 탐색
}

 

 

     이처럼 객체는 참조를 사용해서 연관관계를 탐색할 수 있는데

      이것을 "객체 그래프 탐색" 이라고 한다.

 

2. 테이블 연관관계

데이터베이스 테이블은 외래키 제약조건으로 연관관계를 맺는다.

 

데이터베이스 연관관계 테이블 DDL / DML

CREATE TABLE MEMBER (
     MEMBER_ID VARCHAR(255) NOT NULL,
     TEAM_ID VARCHAR(255),
     USERNAME VARCHAR(255),
     PRIMARY KEY (MEMBER_ID)
)
CREATE TABLE TEAM (
     TEAM_ID VARCHAR(255) NOT NULL,
     NAME VARCHAR(255),
     PRIMARY KEY(TEAM_ID)
)
ALTER TABLE MEMBER ADD CONSTRAINT FK_MEMER_TEAM
     FOREIGN KEY (TEAM_ID)
     REFERENCES TEAM

INSERT INTO TEAM(TEAM_ID, NAME) VALUES ('team1','팀1');
INSERT INTO MEMBER(MEMBER_ID, TEAM_ID, USERNAME) VALUES ('member1','team1','회원1');
INSERT INTO MEMBER(MEMBER_ID, TEAM_ID, USERNAME) VALUES ('memeber2','team1','회원2');

 

소속된 팀 조회해보기

SELECT T.*
 FROM MEMBER M
   JOIN TEAM T ON M.TEAM_ID = T.TEAM_ID
WHERE M.MEMBER_ID = 'member1'

      이처럼 데이터베이스는 외래키를 사용해서 연관관계를 탐색할 수 있는데

      이것을 "조인" 이라고 한다.