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