코드스테이츠_국비교육/[Section3]

43_[Spring MVC] 서비스 계층_22.10.24

생각없이 해도 생각보다 좋다. 2022. 10. 24. 23:15

>API 계층과 Service 계층 연동 방법
-인스턴스(객체)를 통한 연동
-DI를 이용한 연동
-DTO와 Mapper를 이용한 연동

>API 계층과 Service 계층 연동
: 기본적으로 API 계층에서 요청을 처리하는 메서드와 1대 1로 Service 계층의 비즈니스 로직과 연동되어야 한다.
-Domain Entity Class
: API 계층과 Service 계층을 매개하는 클래스

 

>DTO Class 와 Entity Class
DTO Class는 API 계층에 들어오는 요청 데이터를 담는 역할을 한다.
Entity Class는 비슷한 용도지만 위치가 다르다.
Entity Class는 Service 계층에서 데이터 액세스 계층과 연동하며 비즈니스 로직을 처리하기 위한 데이터를 담는 역할을 하는 클래스이다.

>Lomboc Annotation
-@Getter
: 게터가 있는 것으로 간주
-@Setter
: 세터가 있는 것으로 간주
-@NoArgsConstructor
: 파라미터가 없는 기본 생성자가 있는 것으로 간주
-@AllArgsConstructor
: 현재 클래스의 모든 멤버 변수를 파라미터로 갖는 생성자가 있는 것으로 간주

>Mappper; 코드 레벨에서 사용하는  Map의 의미
: 코드를 짜다보면 Map, Mapping 이라는 용어를 자주 접하게 된다.
: 무엇이 됐든 다른 두 객체를 매개하며, 나아가 변환을 한다는 의미로 알면 된다.

>MapStruct
: MapStruct 라이브러리를 사용하여 Mapper 인터페이스를 작성할 수 있음.
: @Mapper 애너테이션 사용
: Attribute 값으로 (componentModel = "spring")을 주면 자동으로 Spring Bean으로 등록해줌.
: MapStruct 라이브러리를 사용하여 만든 Mapper 인터페이스의 구현체(MapperImpl)는 Gradle 의 build task 를 실행하면 자동으로 생성된다.

>MapperImpl
-생성 : 우측 Gradle 탭 > 프로젝트명 > Tasks > build > build tasks
(나는 build tasks 를 찾지 못해서 그냥 애플리케이션을 실행했더니 생겼다)
-생성 위치 : 좌측 Project 탭 > 프로젝트명 > build 디렉토리내의 Mapper 인터페이스가 위치한 패키지에 생성

>API 계층과 Service 계층의 연동(DI & DTO, Mapper, Entity 사용)

0. 클라이언트에서 API 계층으로 요청(RequestBody)을 보낸다.
1. API 계층에서 Service 계층으로 DTO 객체를 제공한다.

2. 중간에서 Mapper가 개입하여 DTO 객체를 Entity 타입으로 변환시킨다.

3. Entity 객체가 변환된 정보를 받는다.

4. 제공받은 Entity 객체를 비즈니스 로직으로 처리한다. 처리된 반환값은 Entity 타입이다.

5. 처리된 Entity 객체를 API 계층으로 제공한다.

6. 중간에서 Mapper가 개입하여 Entity 객체를 DTO 타입으로 변환시킨다.

7. API 계층에서 DTO 타입의 값과 HttpStatus를 클라이언트로 반환한다.

 

>DI와 Spring Bean

-Spring Bean으로 등록하기 위해 사용한 애너테이션들

@RestController

@Service

@Component

@Mapper(componentModel = "spring")

-Spring Bean으로 등록하고 DI를 활용한다.

 

>DDD(Domain Driven Design)

-DDD

: 비즈니스 로직을 처리하기 위한 서비스 계층은 대부분 도메인 모델을 포함한다.

: 쉽게 말하면, 클래스, 메서드, 변수 등의 이름을 비즈니스 도메인(애플리케이션 사용 분야)의 용어로 일치시켜 나간다는 것이다.

: DDD를 실현하면, 가독성이 좋고 유지보수가 편해진다.

-도메인 모델 구분

anemic domain model(빈약한 도메인 모델)

rich domain model(풍부한 도메인 모델)