서비스 계층의 DI
DI를 이용한 서비스 계층과 API 계층 연동
서비스 계층과 API 계층 연동
- Controller 클래스와 Service 클래스 메서드 호출로 상호작용
- Service
- 도메인 업무 영역을 구현하는 비즈니스 로직 처리
- 도메인 모델 포함
- 빈약한 도메인 모델
- 풍부한 도메인 모델
- DDD(Domain Driven Design)
비지니스 로직을 처리하는 Service 클래스 작성
- API 계층에 있는 핸들러 메서드가 전달받은 요청을 처리하는 메서드를 service 클래스에 작성
- Contropller 클래스의 핸들러 메서드와 1대 1로 매치
- 도메인 Entitiy 클래스
- 리턴하는 값을 DTO 클래스가 아닌 새로운 클래스 생성
- 새로운 클래스는 비지니스 로직을 처리하기 위해 필요한 데이터를 받고 결과를 API 계층에 리턴
- @Getter/@Setter - getter/setter 메서드 작성해주는 lombok 라이브러리
- @NoArgsConstructor - 파라미터가 없는 기본 생성자
- @AllArgsConstructor - 모든 파라미터가 있는 생성자
DI 없이 비지니스 계층, API 계층 연동
- API 계층에 Service 계층을 private final로 생성
- 생성자로 Service 클래스를 new 키워드를 통해 할당
- new 키워드를 사용하여 entity 생성
- Dto에 있는 내용을 담아서 해당 entity를 responseEntity에 담아서 반환
DI를 적용한 비지니스 계층, API 계층 연동
- API 계층에 Service를 private final로 생성
- 생성자 주입(DI)를 통해서 new 키워드 없이 할당
- Service 클래스에 @Service를 통해 Bean으로 등록해야 한다
- 생성자가 한개인 경우 @Autowired 생략 가능
계층 연동 과정에서의 문제점
- Controller 핸들러 메서드에서 DTO 클래스를 Entity 객체로 변환하는 작업을 포함하고 있다.
- Controller에서 entity 클래스를 클라이언트 응답으로 전송하고 있다. 계층 분리가 이루어지지 않았다. entity는 service에서 사용하는 역할이다.
Mapper를 이용하여 DTO class와 Entity 클래스 매핑
Mapper클래스 구현
- mapper 클래스를 구현하여 DTO 객체를 entity 객체로 변환하는 메서드와 entity를 반환 DTO 객체로 변환하는 메서드를 구현
- controller에서 mapper를 privte final로 선언하고 DI를 통해 생성자 주입
- 전달받은 DTO 객체를 mapper를 통해 enity로 변환하고 service 클래스로 비지니스 로직을 처리한 후 반환한 entity를 다시 mapper를 통해 반환 DTO로 변환하고 ResponseEntity로 반환
MapStruct를 이용한 Mapper 자동 생성
- 하나 하나 매퍼 클래스를 제작하는 것은 비효율
- MapStruct를 통해 매퍼 구현 클래스를 자동으로 생성
- dependency에 추가
- implementation 'org.mapstruct:mapstruct:1.4.2.Final'
- annotationProcessor 'org.mapstruct:mapstruct-processor:1.4.2.Final'
- Mapper 인터페이스를 생성하여 DTO 클래스 변환 기능을 정의
- @Mapper(componentModel=”spring”)을 추가하여 MapStruct의 매퍼 인터페이스로 등록하고 스프링 빈으로 등록
- 자동 생성된 인터페이스 구현 클래스는 gradle → build task를 실행하면 자동 생성
- MapperImpl은 gradle→ 프로젝트 명 → Tasks 디렉터리 → build 디렉터리 → build task를 더블 클릭하면 build 디렉터리 내에 Mapper 인터페이스가 위치한 패키지 안에 생성
DTO class와 Entity class 분리의 목적
- 계층별 관심사 분리
- 기능에 대한 관심사가 다르다
- DTO 클래스는 API 계층에서 요청 데이터를 전달받고 응답 데이터를 전송하는 관심사
- Entity 클래스는 서비스 계층에서 비즈니스 로직의 결과로 생성된 데이터를 다루는 관심사
- 코드 단순화
- DTO에서 사용하는 유효성 검사 에너테이션이 Entity 클래스에 사용하면 JPA에서 사용하는 애너테이션과 함께 혼합된다.
- REST API 스펙 독립성
- 데이터 액세스 계층에서 전달받은 데이터를 entity 클래스가 받은 뒤 원하는 데이터를 DTO 클래스를 통해 전달 가능
'Backend boot camp > Session3' 카테고리의 다른 글
[Spring MVC] 트랜잭션 (0) | 2022.11.07 |
---|---|
[Spring MVC] JPA 데이터 액세스 계층 (0) | 2022.11.07 |
[Spring MVC] JDBC DB Access Layer (0) | 2022.10.29 |
[Spring MVC] Exception Handle (0) | 2022.10.29 |
[Spring MVC] API Layer (0) | 2022.10.29 |