처음에 코드를 작성했을 때는 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 어노테이션은 클라이언트 측에서 필요에 따라 다양한 조합의 검색 조건을 쉽게 설정할 수 있도록 해준다!!