---
tags: github, jpa, 연관관계, 다대일
---
study3. 연관관계 1부. 다대일 단방향
===
## 목표
#### 사전 준비사항
Member 엔티티가 이미 준비되어 있는 코드를 바탕으로 진행 합니다. 아래가 선행 되어 있어야 한다.
- [study2. 값객체와 @Embdedd 를 이용한 city, street, zipcode 리팩토링](/JnnkDa3bTVeQOYrmfQAA-Q)
또한 연관관계의 주인에 대한 지식을 배경으로 하고 있다.
- 연관관계의 주인 (준비중)
## 목차
1. Team 클래스 추가 (POJO)
2. Team 클래스를 Team Entity로 바꾸기
3. 단방향 연관관계 설정 Member->Team (@ManyToOne)
4. 생성된 테이블 확인
5. 후기 (2부. 다대일 양방향 예고)
## 1. Team 클래스 추가 (POJO)
Member 를 여러명 가질수 있는 Team 객체를 만들어 보겠다.
```java=
@EqualsAndHashCode
@ToString
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Team {
private String name;
public Team(String name) {
this.name = name;
}
}
```
## 2. Team 클래스를 Team Entity로 바꾸기
연관관계를 짓기 위해서는 Team 객체도 Entity 가 되어야 한다.
### @Entity, 식별자 추가
식별자와 @Entity는 엔티티를 구성는 최소한의 설정이다.
추가 해 주자.
```java=
@Entity // 추가
public class Team {
@Id @GeneratedValue // 추가
private Long id;
}
```
## 3. 단방향 연관관계 설정 Member->Team (@ManyToOne)
이제 Member 에서 Team 을 참조 할수 있도록 변경 해 보겠다.
@ManyToOne 을 이용한다.
```java=
public class Member {
...
@ManyToOne
private Team team;
// 연관관계 편의 메소드
public void setTeam(Team team) {
this.team = team;
}
}
```
최종적으로 Member 엔티티는 다음과 같을 것이다.
```java=
@Entity
@Getter
@ToString
@EqualsAndHashCode
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Member {
@Id
@GeneratedValue
private Long id;
private String name;
private Address address;
@ManyToOne
private Team team;
public void changeAddress(Address address){
this.address = address;
}
public Member(String name) {
this.name = name;
}
// 연관관계 편의 메소드
public void setTeam(Team team) {
this.team = team;
}
}
```
## 4. 생성된 테이블 확인
이제 RUN 해 보면, 2개의 테이블과 1개의 연관관계 DDL 이 발생 하는것을 볼 수 있다.
1. member 테이블
```
create table member (
id bigint not null auto_increment,
city varchar(255),
street varchar(255),
zipcode varchar(255),
name varchar(255),
team_id bigint,
primary key (id)
) engine=InnoDB
````
2. team 테이블
```
create table team (
id bigint not null auto_increment,
name varchar(255),
primary key (id)
) engine=InnoDB
```
3. member 에 team_id FK 추가
```
alter table member
add constraint FKcjte2jn9pvo9ud2hyfgwcja0k
foreign key (team_id)
references team (id)
```
#### 잘 매핑 되었다!
## 후기 (2부. 다대일 양방향 예고)
아직 양방향 연관관계를 쓰진 않았지만, 비교 해보니 너무나 심플하다. (@ManyToOne 추가 한것밖에 없다)
Team 객체에서 Member 를 객체그래프 탐색을 하지 못한다는 단점만 감수 한다면, 단방향으로 아주 손쉽게 관계를 맺을수 있다.
물론 단점이 너무 크기 때문에 양방향 연관관계를 포기 할 수는 없다.
앞으로 있을 양방향 연관관계는 난이도가 높다.
잠깐 생각해봐도 유의 할 점이 떠오르는데 분량이 꽤 될것같다.
1. 연관관계 편의메소드 복잡해짐
2. Team 엔티티에 List<Member> members 를, new ArrayList(); 로 초기화 해야 하는 이유
3. @OneToMany 에 걸어야 하는 mappedBy
여기서 끊고 나머지는 `2부. 다대일 양방향 (준비중)` 에서 다루도록 하겠다.