부트캠프

Spring MVC - Service 계층

hunm719 2023. 2. 17. 21:46
1.서비스 계층

1-1.DI를 통한 서비스 계층과 API 계층 연동
 -API 계층에서 구현한 Controller 클래스가 서비스 계층의 Service 클래스와 메서드 호출을 통해 상호 작용한다는 것을 의미

 -Service의 의미
  (1)애플리케이션에 있어 Service는 도메인 업무 영역을 구현하는 비즈니스 로직을 처리하는 것을 의미
  (2)서비스 계층은 대부분 도메인 모델을 포함하고 있으며, 도메인 모델은 빈약한 도메인 모델(anemic domain model)과 풍부한 도메인 모델(rich domain model)로 구분됨

 -도메인 엔티티(Entity) 클래스 : API 계층에서 전달 받은 요청 데이터를 기반으로 서비스 계층에서 비즈니스 로직을 처리하기 위해 필요한 데이터를 전달 받고, 비즈니스 로직을 처리한 후에는 결과 값을 다시 API 계층으로 리턴해주는 역할
  *DTO는 API 계층에서 클라이언트의 Request Body를 전달 받고 클라이언트에게 되돌려 줄 응답 데이터를 담는 역할

 -DI 적용 방법 : Spring에서 DI를 통해서 어떤 객체를 주입 받기 위해서는 주입을 받는 클래스와 주입 대상 클래스 모두 Spring Bean이어야함
  *@RestController, @Service, @Component, @Bean, @Autowired 등 애너테이션 활용
  **생성자 방식의 DI는 생성자가 하나일 경우에는 @Autowired 애너테이션을 추가하지 않아도 DI가 적용됨

 +lombok 라이브러리에서 제공하는 애너테이션 중 자주 사용 되는 것들
  (1)@Getter, @Setter : 각 멤버 변수에 해당하는 getter/setter 메서드를 대신 작성
  (2)@AllArgsConstructor : 해당 클래스에 추가된 모든 멤버 변수를 파라미터로 갖는 생성자를 자동으로 생성
  (3)@NoArgsConstructor : 파라미터가 없는 기본 생성자를 자동으로 생성
  (4)@ToString : 클래스의 변수들을 기반으로 ToString 메소드를 자동으로 완성(@ToString.Exclude는 출력 제외, @ToString(callSuper = true)는 상위 클래스에도 적용)
  (5)@Data : @ToString, @EqualsAndHashCode, @Getter, @Setter, @RequiredArgsConstructor를 자동으로 완성


1-2.매퍼(Mapper)를 이용한 DTO 클래스와 엔티티(Entity) 클래스 매핑
 (1)Mapper 클래스의 메서드에 DTO 클래스를 Entity 클래스로 변환하도록 구현(DTO를 매개변수로 입력 받아 new Entity 객체로 리턴)
 (2)Controller의 핸들러 메서드에 Mapper 클래스 적용

 -MapStruct 라이브러리 : Mapper 구현 클래스를 자동으로 생성해주는 코드 자동 생성기
  *의존 라이브러리 설정 후 Mapper Interface를 정의하고 @Mapper 애너테이션을 활용

 -ModelMapper 라이브러리 : 많이 사용되고 있지만 성능면에서 MapStruct보다 떨어짐

 +DTO 클래스와 Entity 클래스의 역할을 분리하는 이유
  (1)계층별 관심사의 분리 : 하나의 클래스나 메서드 내에서 여러 개의 기능들을 구현하고 있는 것은 객체 지향 코드 관점에서 리팩토링의 대상임
  (2)코드 구성의 단순화 : 이후 배울 JPA 애너테이션과 DTO 유효성 검사 애너테이션이 뒤섞이면 유지보수하기 어려운 코드가 됨
  (3)REST API 스펙의 독립성 확보 : DTO 클래스를 사용하면 회원의 로그인 패스워드 같은 정보를 클라이언트에게 노출하지 않고, 원하는 정보만 제공할 수 있음

 

 

 

 

-내용 출처 : code states