⇒ 위 두 조건을 전부 만족시키기 위해서는 “Post : Member = N : 1” 의 다대일 양방향 관계 매핑을 진행해야겠다고 판단하였음.
추가적으로, 해당 글에 작성된 필드와 기술 스택들도 함께 삭제되어야 함
→ 이는 이미 글 삭제 시 해당 엔티티들이 전부 삭제되도록 구성함으로써 해결해둔 상태.
[x] Post 엔티티에서 Member의 FK 관리
[x] Member 엔티티에 cascade=ALL
, orphanRemoval = true
옵션을 줌으로써 Member 엔티티에서 Post 엔티티의 생명 주기를 관리하도록 설정
@Getter
@Entity(name = "post")
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Post extends BaseTimeEntity {
// .. 코드 생략
@JoinColumn(name = "member_id")
@ManyToOne(fetch =LAZY)
private Member member;
@Builder
public Post(String title, RecruitType recruitType, String contact, String recruitIntroduction,
String expectedPeriod, Boolean isCompleted, Member member) {
this.title = title;
this.recruitType = recruitType;
this.contact = contact;
this.recruitIntroduction = recruitIntroduction;
this.expectedPeriod = expectedPeriod;
this.isCompleted = isCompleted;
this.member = member;
// 글 작성 회원의 작성 리스트에 해당 게시글을 저장.
this.member.addPost(this);
}
// .. 코드 생략
}
@Getter
@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Member extends BaseTimeEntity {
@Id @Column(name = "member_id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false, unique = true)
private String authId;
@Column
private String email;
@Column
private String name;
@Column
private String picture;
@Column
@Enumerated(EnumType.STRING)
private RoleType roleType;
@Column
private String refreshToken;
@OneToMany(mappedBy = "member", cascade = ALL, orphanRemoval = true)
private final List<Post> postList = new ArrayList<>();
@Builder
public Member(String authId, String email, String name, String picture, RoleType roleType, String refreshToken) {
this.authId = authId;
this.email = email;
this.name = name;
this.picture = picture;
this.roleType = roleType;
this.refreshToken = refreshToken;
}
public void addPost(Post post) {
postList.add(post);
}
public String getRoleTypeKey() {
return roleType.getKey();
}
public void saveRefreshToken(String refreshToken) {
this.refreshToken = refreshToken;
}
}
@PostMapping("/recruitment")
public PostResponse recruitmentWrite(@Valid @RequestBody CreatePostRequest postDto,
Authentication authentication) {
return postService.createPost(postDto, authentication);
}
PostService.createPost()
메서드에서 현재 인증된 사용자도 파라미터로 받을 수 있도록 수정한다.public PostResponse createPost(CreatePostRequest postDto,
Authentication authentication) {
// 코드 생략
}