상세 컨텐츠

본문 제목

단방향 연관관계 (객체 참조, 테이블 외래키) 방법

기록 - 프로그래밍/Data

by wjjun 2024. 1. 13. 00:24

본문

 

단방향 연관관계

연관관계 중 다대일 단방향 관계를 가장 먼저 이해해야 합니다.

 

회원과 팀이 있습니다.

회원은 하나의 팀에만 소속할 수 있습니다.

회원과 팀은 다대일 관계입니다.

 

객체 연관관계

Member : id , Team team, username

Team : id, name

 

테이블 연관관계

Member : member_id (PK), team_id (FK), username

Team : team_id (PK), name

 

객체 연관관계

회원 객체는 Member.team 필드로 Team 객체와 연관관계를 맺었습니다.

회원 객체와 팀 객체는 단방향 관계를 갖습니다. 회원은 Member.team 필드를 통해 팀을 확인할 수 있고 반대로 팀은 회원을 알 수 없습니다. Member에서 Team 객체를 접근하지만 Team에서는 Member 객체를 접근할 수 있는 필드가 없습니다.

 

테이블 연관관계

회원 테이블은 team_id 외래 키로 팀 테이블과 연관관계를 맺습니다.

회원 테이블과 팀 테이블은 양방향 관계를 갖습니다.

Member 테이블의 team_id 외래키(FK)로 Member와 Team을 조인할 수도 있고 Team과 Member를 조인할 수도 있습니다.

 

외래키 하나로 양방향 조인이 가능한 이유는

SELECT *

FROM MEMBER M

JOIN TEAM T ON M.team_id = T.team_id

 

SELECT *

FROM TEMA T

JOIN MEMBER M ON T.team_id = M.team_id

 

참조를 이용한 관계는 항상 단방향 연관관계 입니다.

객체간 연관관계를 양방향으로 만들기 위해서는 상대 필드에도 추가하여 참조를 보관하면 됩니다.

정리하면 연관관계를 하나 더 만들어서 서로 참조가 가능하도록 양방향 연관관계를 만들 수 있습니다.

 

하지만, 정확한 의미에서의 양방향 관계는 아닙니다. 서로 다른 단방향 연관관계 2개가 존재하는 것입니다.

 

단방향 연관관계

Class A { B b; }

Class B { }

 

양방향 연관관계

Class A {  B b; }

Class B {  A a; }

 

객체 연관관계는 객체의 참조 주소 값으로 연관관계를 맺습니다.

연관된 데이터를 조회할 때 객체는 참조 a.getB().getC(); 를 사용합니다.

객체는 참조를 이용하여 연관관계를 탐색하는데 이것이 객체 그래프 탐색입니다.

참조를 사용하면 A -> B (a, b) 객체의 연관관계가 단방향입니다.

참조를 사용하여 A -> B (a, b), B -> A (b, a) 양방향으로 단방향 연관관계 2개를 만들 수도 있습니다.

 

테이블 연관관계는 외래 키로 연관관계를 맺습니다.

테이블은 조인(JOIN)을 사용합니다.

외래 키를 사용하면 A JOIN B 반대로 B JOIN A d 둘다 사용이 가능하여 양방향입니다.

 

 

@ManyToOne : 다대일 (N:1) 관계를 표현하는 매핑 정보입니다. 연관관계를 매핑할 때는 이러한 다중성을 나타내는 어노테이션이 필수로 사용되어야 합니다.

속성 기능 기본값
optional false 설정하면 연관된 엔티티가 항상 있어야만 합니다 true
fetch 글로벌 패치 전략을 설정합니다. @ManyToOne = FetchType.EAGER
@OneToMany = FetchType.LAZY
cascade 영속성 전이 기능을 사용합니다  
targetEntity 연관된 엔티티 타입 정보를 설정합니다. 해당 기능은 거의 사용하지 않습니다.  

 

@JoinColumn(name = "TEAM_ID") : 외래키를 매핑할 때 사용해야 합니다.

 

 

연관관계 사용

JPA 엔티티를 저장할 때는 관련된 모든 엔티티가 영속 상태여만 합니다.

member.setTeam(team); 

em.persist(member);

 

Member 객체가 Team 객체를 참조하고 있습니다. JPA는 참조한 팀의 식별자(team_id)를 외래키로 사용해 적절하게 등록 쿼리를 생성합니다. 그리고 실행된 SQL은 아래와 같습니다. Member 테이블의 외래 키 값으로 탐조한 Team 식별자 값인 team이 입력된 것을 확인할 수 있습니다.

INSERT INTO TEAM (TEAM_ID, NAME) VALUES ('team', 't0')
INSERT INTO MEMBER (MEMBER_ID, NAME, TEAM_ID) VALUES ('member', 'm0', 'team0')
INSERT INTO MEMBER (MEMBER_ID, NAME, TEAM_ID) VALUES ('member1', 'm1', 'team1')

 

위 데이터가 잘 입력되는지 확인할 수 있습니다.

SELECT M.MEMBER_ID, M.NAME, M.TEAM_ID, T.NAME
FROM MEMBER M
	JOIN TEAM T ON M.TEAM_ID = T.TEAM_ID

 

관련글 더보기

댓글 영역