API 계층_Controller

김예인·2023년 6월 11일

백엔드 공부일지

목록 보기
36/43
post-thumbnail

Controller

Spring MVC에서 클라이언트 요청의 최종 목적지인 Controller 클래스


1. 애플리케이션의 경계를 설정 & 요구사항을 수집

2. 패키지 구조 생성

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

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

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

3. 리소스(Resource, 자원) 분류

REST API 기반의 애플리케이션에서는 애플리케이션이 제공해야 될 기능을 리소스(Resource, 자원)로 분류

  • 주인이 커피 정보를 관리하는 기능
  • 고객이 커피 정보를 조회하는 기능
  • 고객이 커피를 주문하는 기능
  • 고객이 주문한 커피를 주인이 조회하는 기능 등

위 기능의 애플리케이션에는 아래와 같은 리소스가 필요


4. 엔트리포인트(Entrypoint, 애플리케이션 시작점) 클래스 작성

‘Spring Initializr’를 통해 생성한 프로젝트에는 엔트리포인트 클래스가 이미 작성되어 있음

  • @SpringBootApplication : 자동 구성 활성화
  • SpringApplication.run(Section3Week1Application.class, args); : Spring 애플리케이션을 부트스트랩하고, 실행


5. Controller 구조 작성

  • @RestController : API 엔드포인트로 정의, 로딩 시, Spring Bean으로 등록
  • @RequestMapping : 클라이언트의 요청과 요청을 처리하는 핸들러 메서드(Handler Method)를 매핑

6. 핸들러 메서드(Handler Method) 작성

클라이언트의 요청을 처리하고 필요한 비즈니스 로직을 실행시켜 응답을 반환하는 역할

(1) Controller 뼈대 잡기

  • produces 애트리뷰트 : 클라이언트에게 전송할 응답 데이터의 미디어 타입 설정
  • MediaType.APPLICATION_JSON_VALUE : JSON 형식으로 설정
    (미설정 시 JSON이 아닌 문자열 자체를 전송)

(2) POST 핸들러 메서드

  • @PostMapping : POST 핸들러 메서드 정의 (URI 미지정해 기본경로 호출)
  • @RequsetParam : 쿼리 파라미터에서 값을 추출

그런데, 응답값을 개발자가 매번 수작업으로 JSON 문자열로 작성하는 것은 번거롭고 오타의 가능성이 높다. Map 객체로 대체하자.

그리고, Map 객체 리턴 시 Spring MVC 내부적으로 JSON 형태로 자동변환 해주기 때문에 produces 애트리뷰트 지정은 불필요!

POST 핸들러 메서드에게 요청을 전송 시 '200 OK' 출력.

그러나 HTTP 응답 상태 코드를 처리 결과를 좀 더 명확히 알 수 있도록 커스텀하고 싶다면?

  • ResponseEntity : httpentity를 상속받는, 결과 데이터와 HTTP 상태 코드를 직접 제어할 수 있는 클래스

  • HttpStatus.CREATED : "201 Created" , 요청 성공 & 새로운 리소스 생성 완료


(3) GET 핸들러 메서드

  • @GetMapping
  • @PathVariable : URI 경로에서 값을 추출, 경로명과 동일해야한다

🙋‍♀️ POST 메서드는 @PostMapping URI 지정 안했는데? GET 메서드에서 @GetMapping 는 왜 경로 지정해?

매핑 시 경로를 지정한 getMember() 메서드는 '특정 회원' 을 조회해야 하기 때문에 '회원 식별자' 로서 경로를 지정했어. 이처럼 필요에 따라 경로를 지정할 수 있어.
경로를 지정하지 않으면 @RequestMapping 의 기본 경로를 호출해.


profile
백엔드 개발자 김예인입니다.

0개의 댓글