일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 검색
- 테스트
- 메세지수정
- 테스트메소드
- foreignkey
- 서브쿼리
- 2 > /dev/null
- 네이티브쿼리
- 외부키
- application.yml
- querydsl
- EC2
- Query
- subquery
- docker명령어
- appspec.yml
- 포트
- 메소드명
- ㅔㄴ션
- ubuntu
- 추후정리
- MySQL
- appspec
- 예약
- 컨테이너실행
- 참조키
- AuthenticationEntryPoint
- WeNews
- 커밋메세지수정
- 적용우선순위
Archives
- Today
- Total
제뉴어리의 모든것
[Section 3] [Spring MVC] 서비스 (비즈니스) 계층 본문
전체 항목
- 서비스 (비즈니스) 계층이란
- Mapper 라이브러리인 MapStruct의 사용
서비스 (비즈니스) 계층이란
서비스 계층이란 Controller 계층 (API 계층) 에서 받은 클라이언트의 요청정보를 가지고
해당 어플리케이션이 작업하고자 하는 실질적인 로직을 가지고 처리를 하는 계층을 말한다.
해당 계층에서는 DTO가 아닌 Entity를 다루는것이 Entity와 서비스 계층의 존재 이유에 적합하다.
Service 계층의 클래스는
@Service 란 어노테이션을 붙여서 빈으로 등록한다.
Mapper 라이브러리인 MapStruct의 사용
MapperStruct는 DTO와 Entity 간에 반복적인 매핑 과정을 자동으로 처리해 준다.
공식 사이트 : https://mapstruct.org/
적용 방법
SpringBoot 와 Gradle 환경에서의 적용 방법이다.
- MapStruct 의존 라이브러리 설정
dependencies {
...
...
implementation 'org.mapstruct:mapstruct:1.4.2.Final'
annotationProcessor 'org.mapstruct:mapstruct-processor:1.4.2.Final'
}
- MapStruct 기반의 매퍼(Mapper) 인터페이스 정의
아래의 Mapper (interface) 는 Tasks 라는 Entity와 Tasks의 DTO들간의 매핑을 선언해둔 내용이다.
그러니까 당연히 Tasks라는 Entity와 Tasks의 해당하는 DTO 클래스들이 존재해야한다.
그리고 Entity에 존재하는 필드명과 DTO에 존재하는 필드명이 같아야 한다.
물론 같지 않더라도 할 수있는 방법이 있겠지만, 현재로썬 그냥 필드명을 같게해서 사용중이다.
중요한 부분은
@Mapper(componentModel = "spring") 이다
해당 내용으로 인해 MapStruct가 해당 인터페이스를 인식하여 자동으로 매퍼 구현체를 만들어준다.
import code.solo.todoapp.tasks.dto.TasksDto;
import code.solo.todoapp.tasks.entity.Tasks;
import org.mapstruct.Mapper;
import java.util.List;
import java.util.stream.Collectors;
@Mapper(componentModel = "spring")
public interface TasksMapper {
Tasks tasksDtoPostToTasks(TasksDto.Post dto);
Tasks tasksDtoPatchToTasks(TasksDto.Patch dto);
TasksDto.Response tasksToTasksDtoResponse(Tasks tasks);
default List<TasksDto.Response> tasksListToTasksDtoResponseList(List<Tasks> list) {
List<TasksDto.Response> responseList = list.stream().map(tasks -> {
TasksDto.Response responseDto = new TasksDto.Response();
responseDto.setId(tasks.getId());
responseDto.setTitle(tasks.getTitle());
responseDto.setOrder(tasks.getOrder());
responseDto.setCompleted(tasks.getCompleted());
return responseDto;
}).collect(Collectors.toList());
return responseList;
}
}
- 인터페이스 기반의 매퍼 구현체 자동 생성
Gradle의 build task를 실행하면 자동으로 생성됨.
하지만, 그냥 개발환경일때는 IDE에서 돌리듯이 RUN, DEBUG하면 생김
- 생성된 매퍼 구현체 확인 (인텔리제이 기준)
IntelliJ IDE의 좌측에서 [Project 탭 > 프로젝트명 > build] 디렉토리내의 MemberMapper 인터페이스가 위치한 패키지 안에 생성
MapStruct 주의점
Entity와 DTO에서 Setter, Getter, 그리고 생성자가 존재해야한다.
그리고 Lombok과 함께 사용할 경우 build.gradle에서 의존성 추가때도 순서에 따라 에러가 발생할 수 있다.
참고할것.
'코드스테이츠 > 정리 블로깅' 카테고리의 다른 글
[Section3] section3 회고 (0) | 2022.10.18 |
---|---|
[Section 3] [Spring MVC] API 문서화 (0) | 2022.10.18 |
[Section2] section2 회고 (0) | 2022.10.17 |
[Section2] 기술면접 (0) | 2022.10.17 |
[Section2] [네트워크] HTTP (0) | 2022.10.17 |