본문 바로가기
Backend boot camp/Session3

[Spring MVC] Service layer

by orioncsy 2022. 10. 29.

서비스 계층의 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