이번 강의에서는 글(Post)과 댓글(PostComment)을 생성할 때 작성자(Member)를 함께 저장하도록 구조를 변경했다.
회원 엔티티를 도입한 이후, 실제로 도메인 모델에 작성자 개념을 연결하는 작업이다.
기존에는 다음과 같은 문제가 있었다.
즉, 모든 글과 댓글이 “주인 없는 데이터” 였다.
public interface MemberRepository extends JpaRepository<Member, Integer> {
Optional<Member> findByUsername(String username);
}
select *
from member
where username = ?
limit 1;
public Optional<Member> findByUsername(String username) {
return memberRepository.findByUsername(username);
}
@ManyToOne
private Member author;
@ManyToOne인가?→ Post 기준으로 Many : One
public Post(Member author, String title, String content) {
this.author = author;
this.title = title;
this.content = content;
}
@ManyToOne
private Member author;
@ManyToOne
private Post post;
public PostComment(Member author, Post post, String content) {
this.author = author;
this.post = post;
this.content = content;
}
public Post write(Member author, String title, String content) {
Post post = new Post(author, title, content);
return postRepository.save(post);
}
public PostComment writeComment(Member author, Post post, String content) {
return post.addComment(author, content);
}
아직 인증 기능이 없기 때문에,
컨트롤러에서는 임시로 user1을 작성자로 지정한다.
Member actor = memberService.findByUsername("user1").get();
Post post = postService.write(actor, reqBody.title(), reqBody.content());
Member actor = memberService.findByUsername("user1").get();
PostComment postComment =
postService.writeComment(actor, post, reqBody.content());
Member memberUser1 = memberService.findByUsername("user1").get();
Member memberUser2 = memberService.findByUsername("user2").get();
Member memberUser3 = memberService.findByUsername("user3").get();
Post post1 = postService.write(memberUser1, "제목 1", "내용 1");
Post post2 = postService.write(memberUser1, "제목 2", "내용 2");
Post post3 = postService.write(memberUser2, "제목 3", "내용 3");
post1.addComment(memberUser1, "댓글 1-1");
post1.addComment(memberUser1, "댓글 1-2");
post1.addComment(memberUser2, "댓글 1-3");
post2.addComment(memberUser3, "댓글 2-1");
post2.addComment(memberUser3, "댓글 2-2");
author_id가 nullJpaRepository<Member, Integer>의 Integer는 무엇인가?Long을 더 많이 사용findByUsername는 쿼리를 안 짰는데 왜 동작하나?findBy + 엔티티 필드명 규칙 기반@ManyToOne을 사용하는가?@ManyToOne@JsonIgnore가 없어도 되는 이유는?author_id가 null이었던 이유는?count() > 0 조건으로 재생성되지 않음