DTO와 Repository란 무엇일까?
DTO(Data Transfer Object) : 계층 간 데이터 교환을 위한 Java Bean
Repository : Database에 CRUD 명령을 실행하게 만드는 Interface
(JpaRepository<Entity, PK>를 extends 하게 되면 CRUD를 사용할 수 있게 된다.)
BoardDto : 게시판 API 간에 Data를 전달하는 DTO
com.board.dto.BoardDto.java
package com.board.dto;
import java.time.LocalDateTime;
import com.board.domain.Board;
import lombok.*;
// DTO : 데이터 전달 목적
// 데이터를 캡슐화한 데이터 전달 객체
@Getter
@Setter
@ToString // 객체가 가지고 있는 정보나 값들을 문자열로 만들어 리턴하는 메서드
@NoArgsConstructor // 인자 없이 객체 생성 가능
public class BoardDto {
private Long id;
private String writer;
private String title;
private String content;
private LocalDateTime createDate;
private LocalDateTime modifiedDate;
public Board toEntity() {
Board board = Board.builder()
.id(id).writer(writer)
.title(title)
.content(content)
.build();
return board;
}
public static BoardDto fromEntity(Board board) {
return BoardDto.builder()
.id(board.getId())
.title(board.getTitle())
.content(board.getContent())
.writer(board.getWriter())
.build();
}
@Builder
public BoardDto(Long id, String writer, String title, String content, LocalDateTime createDate,
LocalDateTime modifiedDate) {
this.id = id;
this.writer = writer;
this.title = title;
this.content = content;
this.createDate = createDate;
this.modifiedDate = modifiedDate;
}
}
Lombok의 Builder 패턴을 이용하여 BoardDto를 생성한다.
1. @Builder 애노테이션으로 BoardDto 객체의 생성자 부분을 만들어주고
2. toEntity 메서드를 통해 Service -> Database(Entity)로 Data(게시판 글 상세 정보)를 전달할 때 Dto를 Entity로 바꿔서 전달
3. Database(Entity) -> Service로 Data를 전달할 땐 FromEntity로 Entity를 Dto객체로 만들어 전달
=> BoardDto 클래스는 @Builder 애노테이션으로 인해 builder() 메서드가 만들어지게 된 것이다.
com.board.repository.BoardRepository.java
package com.board.repository;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import com.board.domain.Board;
public interface BoardRepository extends JpaRepository<Board, Long>{
Page<Board> findByTitleContaining(String keyword, Pageable pageable);
Page<Board> findByContentContaining(String keyword, Pageable pageable);
Page<Board> findByWriterContaining(String keyword, Pageable pageable);
long countByTitleContaining(String title);
long countByContentContaining(String content);
long countByWriterContaining(String writer);
}
Interface는 '규격'으로의 역할을 한다.
JpaRepository : Entity의 CRUD가 가능하도록 JpaRepository 인터페이스를 제공하며, 상속해주기만 하면 된다.
아래의 형태로 사용한다.
JpaRepository<Entity 클래스, PK 타입>
JpaRepository<Board, Long>
=> Entity Class가 Board이며, Primary Key의 Type은 Long임을 의미한다.
'Develop > Java & Spring' 카테고리의 다른 글
[Spring Boot] 게시판 프로젝트 외전 #1 JUnit과 Mockito를 이용한 테스트 - 이론 (0) | 2025.03.25 |
---|---|
[Spring Boot] 게시판 프로젝트 #4 Service, Controller 구현 (0) | 2025.03.25 |
[Spring Boot] 게시판 프로젝트 #2 Domain(Entity), Util 구현 (0) | 2025.03.25 |
[Spring Boot] 게시판 프로젝트 #1 세팅 (0) | 2025.03.25 |
BufferedReader, BufferedWriter,StringTokenizer, StringBuilder 빠른 입출력을 위한 함수들 (0) | 2025.03.21 |