# 연관 관계 설정하기
## 미션
---
댓글 등록 시, 해당 레코드에 연관된 게시글의 정보를 남기시오.

## 개념
---
#### ⭐️ 엔티티간 연관 관계

#### ⭐️ 일대다 관계
하나의 엔티티가 여러개의 자식 엔티티를 가지는 상황. 이를 일대다(one-to-many, 1:N) 관계라 한다.
#### ⭐️ 다대일
하나의 엔티티가 부모 엔티티를 가지며, 여러 형제 엔티티가 있는 경우. 이를 다대일(many-to-one, N:1) 관계라 한다.
## 튜토리얼
---
#### ⭐️ 엔티티 클래스
1) 일대다 관계 설정: "entity/Article"
```
...
public class Article extends BaseTime {
...
// 하나의 Article은 여러개의 Comment를 가질 수 있다!
// fetch: 연결 방법 설정
// mappedBy: comments를 연결할 테이블명 설정!
@OneToMany(fetch = FetchType.LAZY, mappedBy = "article")
private List<Comment> comments;
...
}
```
2) 다대일 관계 설정: "entity/Comment"
```
...
public class Comment extends BaseTime {
...
@ManyToOne // 여러 Comment가 하나의 Article에 포함 됨!
@JoinColumn(name = "article_id") // 포함 대상 정보는 article_id에 기록!
private Article article;
}
```
#### ⭐️ 중간 점검
3) 댓글 작성 후 레코드 확인: 댓글이 소속된 게시글의 정보. article_id가 없음!

#### ⭐️ API 컨트롤러
4) 코드 변경: "api/CommentApiController"
```
...
public class CommentApiController {
private final CommentRepository commentRepository;
private final ArticleRepository articleRepository; // 게시글 리파지터리
@PostMapping("/api/comments/{articleId}")
public Long create(@PathVariable Long articleId,
@RequestBody CommentForm form) {
// 댓글 확인
log.info("form: " + form.toString());
Comment comment = form.toEntity();
log.info("comment: " + comment.toString());
// 댓글이 달릴 게시글을 가져옴!
Article article = articleRepository.findById(articleId)
.orElseThrow(
() -> new IllegalArgumentException("댓글을 작성할 Article이 없습니다.")
);
// 댓글 엔티티에 게시글 엔티티를 등록
comment.stickTo(article);
log.info("written: " + comment.toString());
Comment saved = commentRepository.save(comment);
log.info("saved: " + saved.toString());
return saved.getId();
}
}
```
#### ⭐️ 엔티티 클래스
5) 메소드 추가: "entity/Comment"
```
...
public class Comment extends BaseTime {
...
@ManyToOne // 여러 Comment가 하나의 Article에 포함 됨!
@JoinColumn(name = "article_id") // 포함 대상 정보는 article_id에 기록!
private Article article;
// 해당 댓글이 어느 게시글에 작성된 것인지를 기록!
public void stickTo(Article article) {
this.article = article;
}
}
```
#### ⭐️ 확인하기
6) 댓글 작성

7) 댓글 레코드 확인: article_id가 잘 저장 되었음!

8) 게시글 레코드 확인: id가 1인 게시글

## 훈련하기
---
- DB에서 PK(primary key)와 FK(foreign key)가 무엇인지 조사하여 설명하시오.
- 실습에서 사용된 PK와 FK를 찾으시오.
## 면접 준비
---
- 엔티티와 릴레이션 무엇?
- 일대다 관계, 다대일 관계를 비교하면?