Programming/Spring

[Spring MVC] API 계층

Smile :DK 2023. 7. 22. 17:45

Controller 클래스 설계 및 구조 생성

API 계층(계층형 구조)

API 계층은 클라이언트의 요청을 직접적으로 전달받는 계층

 

패키지 구조 생성

Spring Boot 기반 애플리케이션에서 주로 사용되는 Java 패키지 구조는 "기능 기반 패키지 구조"와 "계층 기반 패키지 구조" 2가지로 나뉜다.

 

기능 기반 패키지 구조(package-by-feature)

말 그대로 패키지를 애플리케이션에서 구현해야 하는 기능을 기준으로 패키지를 구성

기능 기반으로 나누어진 패키지 안에는 하나의 기능을 완성하기 위한 계층별(API계층, 서비스 계층, 데이터 액세스 계층) 클래스들이 모여있음.

 

계층 기반 패키지 구조(package-by-layer)

패키지를 하나의 계층(Layer)으로 보고 클래스들을 계층별로 묶어서 관리하는 구조

 

 

어떤 유형의 패키지 구조를 사용하면 좋은가?
정답은 없는 것 같다. 애플리케이션의 요구 사항이나 특성에 따라 상황에 맞게 적절하게 사용하자.

다만, Spring Boot 팀에서는 테스팅과 리팩토링이 용이하고, 향후에 마이크로 서비스 시스템으로의 분리가 상대적으로 용이한 기능 기반 패키지 구조 사용을 권장하고 있다.

 

 


커피 주문 애플리케이션 컨트롤러 설계

"클라이언트로부터 발생할 요청에는 어떤 것들이 있을까?"를 고민해 보기.

이 말은 서버 애플리케이션의 입장에서 생각하면 "클라이언트 요청을 처리할 서버 애플리케이션의 기능으로 뭐가 필요할까?"와 같다.

 

기능 요구 사항

  • 주인이 커피 정보를 관리하는 기능
    • 커피 정보 등록
    • 등록한 커피 정보 수정
    • 등록한 커피 정보 삭제
    • 등록한 커피 정보 조회
  • 고객이 커피 정보를 조회하는 기능
    • 커피 정보 조회
  • 고객이 커피를 주문하는 기능
    • 커피 주문 등록
    • 커피 주문 취소
    • 커피 주문 조회
  • 고객이 주문한 커피를 주인이 조회하는 기능
    • 커피 주문 조회
    • 고객에게 전달 완료한 커피에 대한 주문 완료 처리

✔️ 요구 사항에 대한 Controller 클래스는 총 몇 개 필요?

 

애플리케이션 구현에 있어 정답이란 존재하지 않지만 더 나은 해결책을 찾기 위한 접근법이나 패턴은 존재한다.

 

필요한 리소스

Rest API 기반의 애플리케이션에서는 일반적으로 애플리케이션이 제공해야 될 기능을 자원(Resource, 리소스)으로 분류한다.

 

위의 리소스에 해당하는 컨트롤러 클래스를 작성하면 된다.

일반 고객과 주인의 기능을 따로 분리해야 하는 것 아닌가?
만약 고객과 주인을 완전히 분리된 별개의 리소스로 정의한다면 Customer와 Host라는 별개의 리소스가 만들어질 수 있다.
하지만, 이 경우 고객과 주인의 인증 프로세스가 복잡해질 가능성이 높다. 따라서
고객과 주인을 회원(Member)이라는 리소스에 포함시키고, 둘 사이의 Role(권한)을 통해 기능을 구분할 수 있다.
이 부분은 보안 기능(Spring Security)을 적용할 때 다시 적용하려고 한다.

 

 

엔트리 포인트(Entrypoint)

Spring Boot 기반의 애플리케이션이 정상적으로 실행되기 위해서 가장 먼저 해야 될 일은 main() 메서드가 포함된 애플리케이션의 엔트리포인트(Entrypoint, 애플리케이션 시작점)를 작성한다.

 

spring initializer를 통해 생성한 프로젝트에는 엔트리 포인트 클래스가 이미 작성되어 있으므로 생성할 필요 없다.

// Entrypoint 스프링부트 시작점, 진입점

@SpringBootApplication
public class Section3Application {

	public static void main(String[] args) {
		SpringApplication.run(Section3Application.class, args);
	}
}

@SpringBootApplication

  • 자동 구성을 활성화
  • 애플리케이션 패키지 내에 @Component Annotation이 붙은 클래스를 스캔한 후 Spring Bean으로 등록하는 기능을 활성화
  • @Configuration Annotation이 붙은 클래스를 자동으로 찾아주고, 추가적으로 Spring Bean으로 등록하는 기능을 활성화

 

SpringApplication.run(Section3Application.class, args)

Spring 애플리케이션을 부트스트랩하고 실행하는 역할

 

부트스트랩(Bootstrap)
애플리케이션이 실행되기 전에 여러 가지 설정 작업을 수행하여 실행 가능한 애플리케이션으로 만드는 단계를 의미한다.