---
# System prepended metadata

title: study3. 연관관계 1부. 다대일 단방향
tags: [' jpa', github, ' 연관관계', ' 다대일']

---

---
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부. 다대일 양방향 (준비중)` 에서 다루도록 하겠다.



