연관관계 중 다대일 단방향 관계를 가장 먼저 이해해야 합니다.
회원과 팀이 있습니다.
회원은 하나의 팀에만 소속할 수 있습니다.
회원과 팀은 다대일 관계입니다.
객체 연관관계
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
데이터 모델링 기본 개념 (1) | 2024.01.23 |
---|---|
대규모 데이터 부하 분산 위한 계측 방법 (병목 현상, Load Average, vmstat) (1) | 2024.01.14 |
기본적인 SQL 튜닝 학습하기 (0) | 2022.02.23 |
RabbitMQ 메시지 브로커 이해하기 (0) | 2021.10.27 |
Kafka 이벤트 스트리밍 이해하기 (0) | 2021.10.24 |
댓글 영역