본문 바로가기
Memo/BootCamp : TIL

[Day 62] Spring MVC : 서비스 계층

by 달의 조각 2022. 8. 23.

학습 주제

 

DI(Dependency Injection)를 사용해서 API 게층과 서비스 게층 연동하기
API 계층의 DTO 클래스와 서비스 계층의 엔티티(Entity) 클래스를 매핑하기

 


 

새롭게 배운 내용

 

2022.08.23 - [Back-End/Spring MVC] - 서비스 계층에서의 DI

 

서비스 계층에서의 DI

DI를 통한 서비스 계층과 API 계층의 연동 API 계층에서 구현한 Controller 클래스와 서비스 계층의 Service 클래스의 상호작용 Service: 도메인 업무 영역을 구현하는 비즈니스 로직과 관련을 가진다.

cookiee.tistory.com

 

자주 쓰이는 Lombok 애너테이션: @Getter, @Setter, @AllArgsConstructor, @NoArgsConstructor, @Data, @ToString

 

DTO 클래스와 Entity 클래스의 역할 분리 이유

  • 계층별 관림사의 분리
  • 코드 구성의 단순화
  • REST API 스펙의 독립성 확보
    • 패스워드 같은 원하지 않는 데이터 제외 기능
    • API 문서로써의 역할
  • 유지 보수 용이

 

Mapstruct가 매핑을 정상적으로 하기 위한 우선 순위 조건

  1. Builder 패턴이 적용되어 있는 경우
  2. 모든 필드를 파라미터로 가지는 생성자가 있는 경우
    1. 단, 기본 생성자가 포함되어 있을 경우 2의 생성자는 제 역할을 못한다.
  3. Setter 메서드가 있는 경우

 

 

보강할 내용

 

 

 

회고

 

어제는 클라이언트로부터 Controller로 데이터를 받고, DTO 클래스를 적용하는 방법에 대해 학습했었는데, 오늘은 Controller 클래스와 Service 클래스를 나누어서 관련 개념들을 학습하는 시간을 가졌다.

DTO 클래스와 Entity 클래스의 역할을 분리하기 위해 Mapstruct 라이브러리를 사용했다. Mapstruct는 개발자가 Mapper 클래스를 하나하나 작성하지 않아도 인터페이스를 만들어서 @Mapper 애너테이션만 붙이면 MapperImpl 구현 클래스를 자동으로 만들어 준다. 이 구현 클래스는 IntelliJ IDE의 Gradle 탭 > 프로젝트 명 > Tasks 디렉토리 > build 디렉토리 > build task를 더블 클릭하면 생성이 된다. 처음 실행했을 때 에러가 발생해서 이 생성 방법을 기억하고 재실행했더니 해결이 됐다. 이 구현 클래스는 build 디렉토리의 Mapper 인터페이스가 위치핸 패키지 안에 생성이 된다고 한다.

오늘 함께 과제를 진행한 페어 분이 Spring 유닛에 들어온 이후로 학습을 따라가기가 힘들다고 하셨다. 나도 Spring에 대한 것은 부트캠프에 들어오기 전에 인프런 강의를 들으며 정리해 온 게 다지만, 내가 아는 범위 내에서 오늘 학습 내용인 API 계층과 서비스 계층의 연동에 대해서 Controller와 Service의 가장 기초적인 역할부터 차근차근 설명을 드렸다. 페어 분이 이렇게 직접 차근차근 설명을 들어 가며 코드를 작성하니 이해가 잘된다고 하시고, 이해를 천천히 돕는 부분에서 교육 관련 일을 했었냐고 묻기도 하셔서 뿌듯했다.
깃허브의 부트캠프 Discussion에서 동기들의 질문에 답변을 달기도 했는데, Q&A에 2번 이상 Answer로 채택이 되면 획득할 수 있는 Galaxy Brain도 획득했다! 내가 아는 것을 공유하는 건 즐겁다.

Spring 코드를 작성하며 새롭게 배워 가는 개념들을 적용해 보면서 객체지향의 중요성에 대해 깨닫게 된다. 각 클래스에 많은 역할을 주지 않고 구체적인 것이 아닌 추상화에 의존하도록 탄생한 개념들은 감탄이 나온다. 마치 테트리스 블록들이 서로 모양과 크기가 딱 맞는 것처럼 설계가 되어 가는 것이 신기하고 재미있다.

 

 

★★★★★

댓글