본문 바로가기
백엔드(Back End)/Spring

[TIL]20230704 - 엔티티와 DTO다루기

by tjsdn9803 2023. 7. 5.

오늘을 과제레벨 3를 진행하였다.

과제 3의 요구사항으로는 기존의 회원과 게시글이 있던 프로젝트에 댓글 기능을 추가하는게 주요 요구사항이었다.

그래서 댓글 엔티티를 생성하고 게시글과 회원 엔티티와 1대다 관계를 맺어주었다.

그 후 기존의 게시글을 얻어오는 api를 게시글에 달린 댓글까지 언어오게 api를 변경하려하였다. 

그 과정에서 PostResponseDto의 필드에 CommentList라는 arrayList를 추가하여 댓글을 함께 가져오려 하였다.

@Getter
public class PostResponseDto {
    private Long id;
    private String title;
    private String content;
    private String author;
    private LocalDateTime createdAt;
    private LocalDateTime modifiedAt;
    private List<Comment> commentList = new ArrayList<>();
}

하지만 postman으로 요청해본 결과 게시글을 조회시 댓글이 가져와 지지만 댓글 내용에 유저의 이름이 포함되지 않는 현상이 발생하였다.

그래서 한참을 고민하다 발견한것은  List의 제네릭에 Comment 엔티티가 들어가있어서 Comment안의 필드인 User를 가져오다보니 제대로 댓글 작성자를 가져오지 못한것 같았다. 

@Entity
@Getter
@Setter
@NoArgsConstructor
public class Comment extends TimeStamped{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "comment_id")
    private Long id;

    private String content;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "post_id")
    @JsonIgnore
    private Post post;

    @JsonIgnore
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "user_id")
    private User user;
    
}

그래서  PostResponseDto의 리스트 필드를 다음과 같이 변경하였다.

private List<CommentResponseDto> commentList = new ArrayList<>();

CommentResponseDto는 필드에 엔티티가 있는것이 아니라 username, content, id등이 변수로 선언되어있기 때문에 게시글 조회시 댓글 또한 성공적으로 가져올 수 있었다.

이러한 상황이 발생했던 이유는 코드를 작성하면서 DTO와 엔티티의 역할을 정확하게 구분하지못하고 혼동하여 사용하여서라고 생각이 들었다.

엔티티는 DB와 매핑되는 객체로써 사용되어야하고 계층간 데이터 교환이 이루어질때는 엔티티가 아닌 Dto를 사용했어야 했는데 엔티티와 Dto의 역할 분리가 제대로 이루어지지않아 엔티티를 응답해주는 상황이 발생하였던것 같다.