스프링 부트, 확장!

준비중..

스프링 부트, 확장!

댓글 기능 및 소셜 로그인!

24 연관 관계 설정하기

# 연관 관계 설정하기 ## 미션 --- 댓글 등록 시, 해당 레코드에 연관된 게시글의 정보를 남기시오. ![클라우드스터딩-스프링부트-댓글-레코드-확인](https://i.imgur.com/R1JEaka.png) ## 개념 --- #### ⭐️ 엔티티간 연관 관계 ![클라우드스터딩-스프링-부트-데이터베이스-엔티티-연관-관계](https://i.imgur.com/FC5IyPy.png) #### ⭐️ 일대다 관계 하나의 엔티티가 여러개의 자식 엔티티를 가지는 상황. 이를 일대다(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가 없음! ![클라우드스터딩-스프링부트-다대일-관계-FK-없음](https://i.imgur.com/OVyYcyt.png) #### ⭐️ 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) 댓글 작성 ![클라우드스터딩-스프링부트-댓글-작성](https://i.imgur.com/CuGyIEt.png) 7) 댓글 레코드 확인: article_id가 잘 저장 되었음! ![클라우드스터딩-스프링부트-댓글-레코드-확인](https://i.imgur.com/R1JEaka.png) 8) 게시글 레코드 확인: id가 1인 게시글 ![클라우드스터딩-스프링부트-게시글-레코드-확인](https://i.imgur.com/onMglWw.png) ## 훈련하기 --- - DB에서 PK(primary key)와 FK(foreign key)가 무엇인지 조사하여 설명하시오. - 실습에서 사용된 PK와 FK를 찾으시오. ## 면접 준비 --- - 엔티티와 릴레이션 무엇? - 일대다 관계, 다대일 관계를 비교하면?