[Spring MVC]서비스 계층

Backend kwon·2023년 8월 17일

DI를 통한 서비스 계층 <-> API 계층 연동

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

애플리케이션에 있어 Service의 의미는 도메인 업무 영역을 구현하는 비즈니스 로직과 관련이 있습니다.

비즈니스로직을 처리하는 Service 클래스 작성

MemberService 클래스와 Member 클래스의 기본 구조 작성

public class MemberService {
    public Member createMember(Member member) {
        return null;
    }

    public Member updateMember(Member member) {
        return null;
    }

    public Member findMember(long memberId) {
        return null;
    }

    public List<Member> findMembers() {
        return null;
    }

    public void deleteMember(long memberId) {

    }

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

Member 클래스처럼 서비스 계층에서 데이터 액세스 계층과 연동하면서 비즈니스 로직을 처리하기 위해 필요한 데이터를 담는 역할을 하는 클래스를 도메인 엔티티(Entity) 클래스라고 부릅니다.

 

DI를 적용한 비즈니스 계층과 API 계층 연동

@RestController
@RequestMapping("/v3/members")
@Validated
public class MemberController {
    private final MemberService memberService;

		// (1) MemberController의 변경 포인트
    public MemberController(MemberService memberService) {
        this.memberService = memberService;
    }
		
		...
		...
}

Spring의 DI 기능을 이용해서 MemberController 생성자 파라미터로 MemberService의 객체를 주입(Injection) 받았습니다.

Spring이 애플리케이션 로드 시, ApplicationContext에 있는 MemberService 객체를 주입해 줍니다.

Spring에서 DI를 통해서 어떤 객체를 주입받기 위해서는 주입을 받는 클래스와 주입 대상 클래스 모두 Spring Bean이어야 합니다.

MemberController의 경우, @RestController 애너테이션이 추가되어 있으므로 Spring Bean입니다.

MemberService 클래스에는 @Service 애너테이션을 추가함으로써 MemberService 클래스는 Spring Bean이 됩니다.

일반적으로 생성자가 하나일 경우에는 @Autowired 애너테이션을 붙이지 않아도 Spring이 알아서 DI를 적용합니다.
하지만, 생성자가 하나 이상일 경우, DI를 적용하기 위한 생성자에 반드시 @Autowired 애너테이션을 붙여야 합니다.

profile
백엔드개발자를 향해서

0개의 댓글