Everyday Dev System

myBlog : 튜터님 피드백 반영 1 본문

내배캠 주요 학습/Spring 숙련

myBlog : 튜터님 피드백 반영 1

chaeyoung- 2023. 7. 11. 19:09

스프링 3,4주차 강의를 다 듣고, Lv2와 Lv3 과제를 마쳤습니다.

해당 과제를 제출하고 받은 피드백을 정리하고자 합니다.

 

 

Question :

회원이 탈퇴할 경우에는
해당 회원이 작성한 댓글, 게시글은 어떻게 삭제되어야 할까요?

현재 댓글과 회원 , 게시글과 회원은 N:1 단방향의 연관관계입니다.

  1. CASCADE 속성을 어느 Entity 어느 필드에 기재해야 하는지 궁금합니다.
  2. 또한, 관계가 단방향, 양방향의 경우 둘다 CASCADE 속성을 줄 수 있는건가요?

 

Answer:

  1. User 엔티티에 게시글의 연관관계를 추가하여 N:1 양방향 연관관계로 만들고 Cascade.Remove속성을 부여 ( 게시글을 삭제하면 게시글과 댓글의 연관관계 Cascade.ALL 설정이 되어 있기 때문에 댓글도 삭제가 됩니다.)
  2. 별도의 서비스 로직으로 댓글과 게시글의 삭제를 처리 (ex. UserService.deleteAccount 함수 정의)

둘중에 선택의 문제로 보이지만, 단순 탈퇴시의 게시글, 댓글 삭제를 위해서 연관관계를 추가하는건

유저 엔티티에 불필요한 복잡성이 늘어날것으로 보여서 2번 방법을 더 추천드립니다.

 

  • 또한, 관계가 단방향, 양방향의 경우 둘다 CASCADE 속성을 줄 수 있는건가요?

네 Cascade 설정의 경우는 단방향, 양방향 둘다 사용할 수 있습니다.
@OneToMany, @manytoone 어노테이션을 들어가보시면 둘다 cascade속성을 부여할 수 있는걸 확인하실수 있어요

 

 

 

 

아래는 어노테이션들은 삭제하고 멤버 필드들의 코드들만 포함한 각각의 Entity 클래스의 코드들 입니다.

게시글을 삭제할 경우 해당 게시글을 참조하는 댓글 데이터도 삭제할 수 있도록

    @OneToMany( mappedBy = "post", cascade = CascadeType.ALL)
    private List<Comment> commentList = new ArrayList<>();

위와 같이 설정하였습니다. 

 

그러나 사용자가 회원을 탈퇴할 경우에는 해당 사용자에 대한 게시글을 삭제하기 위해 Cascade를 설정하여야 합니다.

이때, 게시글과 회원의 연관관계를 살펴보면 N:1 단방향 연관관계를 띄고 있습니다.

 

또한, 회원 Entity 클래스에서는 게시글에 대한 정보를 필요로 하지 않아 게시글 필드가 존재하지 않습니다.

Cascade 속성을 주기 위해 회원 Entity 클래스에 

 

 

User.java

public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false, unique = true)
    private String username;

    @Column(nullable = false)
    private String password;

    @Column(nullable = false)
    @Enumerated(value = EnumType.STRING)
    private UserRoleEnum role;

 

Post.java

public class Post extends Timestamped {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false)
    private String title;

    @ManyToOne
    @JoinColumn(name = "user_id", nullable = false)
    private User user;

    @Column(nullable = false, length = 500)
    private String contents;

    @OneToMany( mappedBy = "post", cascade = CascadeType.ALL)
    private List<Comment> commentList = new ArrayList<>();

 

Comment.java

public class Comment extends Timestamped{
    @Id
    @GeneratedValue(strategy =  GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false)
    private String contents;

    @ManyToOne
    @JoinColumn(name = "post_id", nullable = false)
    private Post post;

    @ManyToOne
    @JoinColumn(name = "user_id", nullable = false)
    private User user;

 

 

 

 

 


references :

자세한 질문사항은 github Issue에 등록되어 있습니다.

https://github.com/Chaeyounglim/myBlog/issues

 

GitHub - Chaeyounglim/myBlog: It's blog to do; post CRUD.

It's blog to do; post CRUD. Contribute to Chaeyounglim/myBlog development by creating an account on GitHub.

github.com

2023.06.26 - [내배캠 주요 학습/Spring 숙련] - myBlog - Version 2.1