본문 바로가기
Study/Spring

[백발백준] Post Dto 구현

by _비니_ 2023. 12. 15.

처음에 코드를 작성했을 때는 PostDto클래스 안에 Request와 Response를 나누어 한꺼번에 넣어갔는데,

이는 좋지 못한 코드라고 한다. 구체적으로 나눠주는 것이 유지보수면에서도 가독성, 이해도 면에서도 훨씬 좋다고 한다.

PostCreateRequest / PostListResponse / PostResponse / PostSearchCondition 이렇게 4개로 나누어 dto 패키지를 구성하였다.

 

PostCreateRequest.java

package com.api.TaveShot.domain.Post.dto;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import org.springframework.web.multipart.MultipartFile;

/** 게시글의 등록,을 처리할 Request 클래스 **/
@Getter
@Builder
@AllArgsConstructor
public class PostCreateRequest {

    private String title;
    private String content;
    private String writer;
    private MultipartFile attachmentFile;
}

 

'게시글 생성 요청을 처리하기 위한 데이터 전송 객체'이며 게시글 생성에 필요한 데이터를 담는 역할을 한다.

모든 필드에 대한 getter 메소드를 자동으로 생성해주는 @Getter / 객체의 빌더 패턴을 구현을 자동화해주는 @Builder / 모든 필드를 인자로 받는 생성자를 자동으로 생성해주는 @AllArgsConstructor 는 필수로 넣어주고 시작한다.

 

게시글 생성 요청을 할 때 담을 데이터인 title, content, writer, attachmentFile를 넣어준다.

이 클래스는 게시글 생성 요청을 받을 때 사용될 것이다★

 

PostListResponse

package com.api.TaveShot.domain.Post.dto;

import java.util.List;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;

@Getter
@Builder
@AllArgsConstructor
public class PostListResponse {
    private List<PostResponse> postResponses;
    private Integer totalPage;
    private Long totalElements;
    private Boolean isFirst;
    private Boolean isLast;
}

 

이 클래스는 게시글 목록을 반환하는 API의 응답 형식을 나타낸다.

 

  • postResponses: PostResponse 객체의 리스트로, 각 게시글의 정보를 담고 있음
  • totalPage: 전체 페이지 수, 페이지네이션에 사용됨
  • totalElements: 전체 게시글 수
  • isFirst, isLast: 현재 페이지가 첫 페이지인지, 마지막 페이지인지를 나타내는 불린 값

클라이언트에게 게시글 목록과 관련된 정보를 전달하는 데 사용되는 클래스로 예를 들어, REST API를 통해 게시글 목록을 요청했을 때, 이 클래스의 인스턴스가 응답 데이터로 반환해준다.

 

PostResponse

package com.api.TaveShot.domain.Post.dto;

import com.api.TaveShot.domain.Comment.dto.CommentDto;
import com.api.TaveShot.domain.Comment.dto.CommentDto.Response;
import com.querydsl.core.annotations.QueryProjection;
import java.util.List;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;

/** 게시글 정보 리턴할 Response 클래스 **/
@Getter
@Builder
@AllArgsConstructor
public class PostResponse {
    private Long postId;
    private String title;
    private String content;
    private String writer;
    private int view;
    private Long writerId;
    private List<CommentDto.Response> comments;

    @QueryProjection
    public PostResponse(Long postId, String title, String content, String writer, int view, Long writerId) {
        this.postId = postId;
        this.title = title;
        this.content = content;
        this.writer = writer;
        this.view = view;
        this.writerId = writerId;
    }
}

 

이 클래스는 클라이언트에게 게시글의 상세 정보를 제공

 

여기에서 @QueryProjection 어노테이션은 QueryDSL을 사용할 때, 특정 쿼리 결과를 이 클래스의 객체로 직접 매핑하는 데 사용된다.

더보기

QueryDSL이란??

 

Java 프로그래밍 언어를 위한 타입-세이프(Type-safe) 쿼리 생성 라이브러리로, SQL, JPA, JDO, Lucene, MongoDB 등 다양한 저장소 기술에 대한 쿼리를 생성할 수 있도록 지원.

 

QueryDSL의 주요 목적은 복잡한 쿼리를 작성할 때 컴파일 타임에 타입 검사를 제공하여 오류를 줄이고, 코드의 가독성을 향상시키는 것!!!

(타입-세이프 쿼리, 코드 기반 쿼리 작성, 다양한 저장소 지원, 동적 쿼리 생성, 직관적인 API등의 특징이 있음)

 

특히 동적 쿼리 생성은 조건에 따라 동적으로 쿼리를 생성할 수 있는 특징이며, 이는 복잡한 검색 조건이나 다양한 사용자 입력을 처리할 때 유용하게 사용된다★

 

postId, title, content, writer, view, writerId: 각각 게시글의 ID, 제목, 내용, 작성자, 조회수, 작성자의 ID를 나타내고,

comments는 댓글 Dto 객체의 리스트로 각 게시글에 대한 댓글 정보를 담고 있다.

 

즉 PostResponse 클래스는 게시글 상세 조회 요청에 대한 응답을 처리하는 데 필요한 모든 정보를 포함하고 있다고 생각하면 된다!!

 

PostSearchCondition

package com.api.TaveShot.domain.Post.dto;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;

@Getter
@Builder
@AllArgsConstructor
public class PostSearchCondition {
    private String writer;
    private String content;
    private String title;
}

 

이 클래스는 게시글 검색 시 사용되는 검색 조건을 나타내는 데이터 전송 객체이다

 

writer, content, title은 각각 게시글의 작성자, 내용, 제목을 나타내는 검색 조건을 저장한다.

 

게시글 검색 기능을 구현할 때 사용되는 클래스로 사용자가 게시글을 검색할 때, 작성자, 내용, 제목을 기준으로 검색할 수 있도록 하는 검색 조건을 담는다.

사용자가 입력한 검색 조건에 따라 결과를 필터링해주는데 필수적인 역할을 한다고 생각하면 된다.

 

특히 @Builder 어노테이션은 클라이언트 측에서 필요에 따라 다양한 조합의 검색 조건을 쉽게 설정할 수 있도록 해준다!!

반응형