Develop/Java & Spring

[Spring Boot] 게시판 프로젝트 #3 DTO, Repository 구현

jjh0119 2025. 3. 25. 18:40

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임을 의미한다.