Spring 프로젝트를 구성할 때 이런 방식으로 계층을 나눴다.
// 게시글 작성
@PostMapping("/board")
public BoardResponseDto createBoard(@RequestBody BoardRequestDto requestDto) {
return boardService.createBoard(requestDto);
}
Client의 요청을 받았을 때, Service(해당 요청에 대해 실제 업무 수행)를 호출
업무 수행이 완료되면, 그 결과를 바탕으로 화면을 구성하도록 View 에 전달
Dto 에 데이터를 담아 Client에게 반환
// 게시글 작성
public BoardResponseDto createBoard(BoardRequestDto requestDto) {
Board board = new Board(requestDto); // RequestDto -> Entity
Board saveBoard = boardRepository.save(board); // DB 저장
BoardResponseDto boardResponseDto = new BoardResponseDto(saveBoard); // Entity -> ResponseDto
return boardResponseDto;
}
데이터 가공
DB 정보가 필요할 때는 Repository에게 요청
Repository를 상속받아 .findByID , .save()등의 함수 사용이 가능해진다.
private final BoardRepository boardRepository;
public BoardService(BoardRepository boardRepository) {
this.boardRepository = boardRepository;
}
데이터를 저장해서, 계층간에 데이터를 교환해주는 객체
request 와 response 는 Client(사용자) 기준으로 생각하면 쉽다.
request -->
<-- response
로직을 갖고 있지 않다.
순수한 데이터 객체이며, getter, setter 메소드만을 갖고 있다.
Dto의 필요성
@Getter
public class BoardRequestDto {
private String title; // 제목
private String username; // 작성자명
private String password; // 비밀번호
private String contents; // 작성 내용
}
@Getter
public class BoardResponseDto {
private Long id; // 게시글 구분을 위한 id 값
private String title; // 제목
private String username; // 작성자명
private String contents; // 작성 내용
private LocalDateTime createdAt; // 게시글 생성 날짜
private LocalDateTime modifiedAt; // 게시글 수정 날짜
private String msg; // 게시글 삭제 시, 삭제 성공 메시지
public BoardResponseDto(Board board) {
this.id = board.getId();
this.title = board.getTitle();
this.username = board.getUsername();
this.contents = board.getContents();
this.createdAt = board.getCreatedAt();
this.modifiedAt = board.getModifiedAt();
}
// 게시글 삭제 시, 삭제 성공 메시지
public BoardResponseDto(String msg) {
this.msg = msg;
}
}
public interface BoardRepository extends JpaRepository<Board, Long> {
List<Board> findAllByOrderByModifiedAtDesc(); // Service 계층에서 '게시글 전체 조회'를 위해 사용되는 메서드
}
DB 관리 (연결, 해제, 자원 관리)
JPA를 상속받음으로써, 기본적인 CRUD의 동작(함수 사용)이 가능해진다. (그래서 이렇게 간단히 표현 가능해짐)
'저장소'라는 뜻을 가진 단어
JPA에서 Repository 인터페이스를 생성 후,
JpaRepository<Entity, 기본키 타입>을 상속받으면(extends하면)
기본적인 Create, Read, Update, Delete가 자동으로 생성됨
@Entity
@Getter
@Setter
@Table(name = "board")
@NoArgsConstructor
public class Board extends Timestamped {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "title", nullable = false)
private String title;
@Column(name = "username", nullable = false)
private String username;
@Column(name = "password", nullable = false)
private String password;
@Column(name = "contents", nullable = false, length = 500)
private String contents;
// 게시글 작성
public Board(BoardRequestDto requestDto) {
this.title = requestDto.getTitle();
this.username = requestDto.getUsername();
this.password = requestDto.getPassword();
this.contents = requestDto.getContents();
}
Db의 테이블과 매핑되며, Entity class라고도 부른다.
하나의 객체가 DB의 하나의 Column처럼 작용
프로젝트를 만들어보는 중 어느 계층부터 구현하기 시작해야할지에 대해 의문이 들었다.
그리고 기술 매니저님께 여쭤본 답변에 기반해서 작성헀다.
큰 흐름을 보면, DB를 중심으로 구현하는 것이 올바른 방법이라 할 수 있다.
Entity
Repository
resquestDto
자유
참고: Spring Controller , Service , Repository , Domain , DTO
참고: dTo / Controller, Service, Repository 란?