Page 클래스 구현(Entity)
@Setter
@Getter
@AllArgsContructor
@NoArgsContructor
public class Page {
private Long id;
private String title;
private String writer;
}
PageService 클래스 구현
public class PageService {
public Page createPage(Page page){
Page createPage = page;
return createPage;
}
public Page updatePage(Page page){
Page updatePage=page;
return updatePage;
}
public Page findPage(Page page){
Page findPage = page;
return findPage;
}
public Page deletePage(Page page){
Page deletePage=page;
return deletePage;
}
}
PageController 클래스 구현(Service 적용 전)
API 계층과 Service 계층 연동 전
@RestController
@RequestMapping("/pages")
@Validated
public class PageController {
@PostMapping
public ResponseEntity postPage(@Valid @RequestBody PagePostDto PageDto) {
return new ResponseEntity<>(PageDto, HttpStatus.CREATED);
}
@PatchMapping("/{page-id}")
public ResponseEntity patchPage(@PathVariable("page-id") long pageId,
@Valid @RequestBody PagePatchDto PagePatchDto){
pagePatchDto.setPageId(pageId);
return new ResponseEntity<>(PagePatchDto, HttpStatus.OK);
}
...
}
--------------------------------------
- postPage() : 글 등록을 위한 요청을 받는다.
- patchPage() : 글 수정을 위한 요청을 받는다.
- 이 외에도 찾기, 삭제 등의 기능을 추가할 수 있다.
DI를 적용한 계층간 연동
public class PageController {
private final PageService pageService;
public PageController(PageService pageService){
this.pageService = pageService;
}
--------------------------------------
[문제점]
1. PageController 핸들러 메서드가 DTO 클래스를 엔티티 클래스로 변환하는 작업까지 진행한다.
2. 엔티티 클래스의 객체를 클라이언트 응답으로 전송하므로 계층 간 역할 분리되지 않음
>> DTO 클래스와 엔티티 클래스를 서로 변환하는 mapper 활용
MapStruct는 매퍼 구현 클래스를 자동으로 생성해주는 코드 자동생성기
buil.grale(의존 라이브러리 설정)
dependencies {
...
implementation 'org.mapstruct:mapstruct:1.4.2.Final'
annotationProcessor 'org.mapstruct:mapstruct- processor:1.4.2.Final'
}
MapStruct 기반의 매퍼 인터페이스 정의
import com.example.page.dto.PagePatchDto;
import com.example.page.dto.PagePostDto;
import com.example.page.dto.PageResponseDto;
import com.example.page.entity.Page;
import org.mapstruct.Mapper;
@Mapper(componentModel = "spring") /Bean 등록
public interface PageMapper {
Page pagePostDtoToPage(PagePostDto pagePostDto);
Page pagePatchDtoToPage(PagePatchDto pagePatchDto);
PageResponseDto pageToPageResponseDto(Page page);
}
PageController 핸들러 메서드에 MapStruct 적용
import com.example.page.mapstruct.mapper.PageMapper // 경로 적용
@RestController
@RequestMapping("/pages")
@Validated
public class PageController {
private final PageService pageService;
public PageController(PageService pageService){
this.pageService = pageService;
}