[SpringMVC]API계층

이용준·2023년 1월 4일
0

Spring

목록 보기
4/6

Spring MVC

  • Spring framework에서 제공하는 웹 모듈
  • Model-View-Controller의 약자
  • 기본 시스템 모듈을 MVC로 나누어 구현.
    • Model - 데이터 디자인 담당
      • 작업의 처리 결과 데이터
      • ex) 상품 목록, 주문 내역 등
    • View - 실제 렌더링되어 보이는 페이지
      • 화면에 보여지는 리소스 제공하는 역할
      • ex) HTML 페이지 출력 / XML, JSON 등 특정 형식의 포맷 변환 등
    • Controller - 클라이언트의 요청을 받고 응답하는 로직 담당
      • Model과 View 중간에서 상호작용
      • ex) GET 등의 uri 매핑

SpringMVC 동작 방식과 구성 요소

DispatcherServlet의 역할

HandlerMapping, HanddlerAdapter 등 Spring
MVC 구성 요소들과 상호 작용하며 처리 위임(Front Controller Pattern)

Front Controller Pattern, 애플리케이션 가장 앞단에 배치되어 타 구성요소들과 상호작용하며 클라이언트의 요청을 처리하는 패턴


Controller

  1. @Contorller - 특정 웹 페이지 모델 만들고 반환할때 사용
  2. @RestController - RESTful API 서버 만들때 사용
    • @RestController@Controller+ @ResponseBody 합쳐진 어노테이션

클라이언트에서 요청이 들어올 때, 해당 요청을 수행할 비즈니스 로직을 만들어 제어하는 객체.
스프링에서는 컨트롤러에서 세부적으로 서비스 레이어를 만들어 해당 요청 사항을 객체 지향적 방식으로 세분화해 관리한다.

(컨트롤러 -> 서비스 레이어)

비즈니스 로직 : 프로그램에서 실세계의 규칙에 따라 데이터 생성, 표시, 저장, 변경하는 부분을 의미하며, 사용자에게 보이지 않는 부분에서 데이터를 처리하는 코드이다.

핸들러 메서드

  • 클라이언트 요청을 처리하는 메서드
  • Spring MVC에서의 요청 핸들러는 Controller 클래스를 의미
  • @GetMapping, @PostMapping 같은 애너테이션이 분은 메서드를 핸들러 메서드라 지칭
  • @PathVariable, URL 경로에 변수 넣어주는 것
    @RequestMapping(value = "user/email/{email:.+}", method = RequestMethod.GET)
    public ModelAndView getUserByEmail(@PathVariable("email") String email) {

사용자 요청과 Handler 메서드 매핑 기준

  • @GetMapping("/coffee")과 같이 HTTP Request Method(GET/POST 등)와 Mapping URL 기준으로 Handler 매핑

ResponseEntity

  • HttpStatus 상태 코드를 직접 제어하는 HttpEntity의 확장 개념

  • 사용자의 HttpRequest에 대한 응답 데이터가 포함된다.

  • RestTemplate 및 @Controller 메서드에 사용된다.

  • 결괏값, 상태 코드, 헤더값을 모두 프론트에 넘겨줄 수 있다.

    @RequestMapping("/handle")
    public ResponseEntity<String> handle() {
      URI location = ...;
      HttpHeaders responseHeaders = new HttpHeaders();
      responseHeaders.setLocation(location);
      responseHeaders.set("MyResponseHeader", "MyValue");
      return new ResponseEntity<String>("Hello World", responseHeaders, HttpStatus.CREATED);
    }

DTO

  • 계층 간 데이터 교환 위해 사용하는 객체
  • 로직을 갖지 않는 순수한 데이터 객체(Getter&Setter만 갖는다.)
  • 예시)
    • entity
    public class Flower{
      private Long flowerId;
      private String flowerName;
      private String flowerCode;
    }  
    • DTO
    public class FlowerPostDto{
      private String flowerName;
      private String flowerCode;
      
      public void setFlowerName{
        this.flowerName = flowerName;
      }
      
      public void getFlowerName{
        this.flowerName = flowerName;
      }
      public void setFlowerCode{
        this.floweCode = flowerCode;
      }
      
      public void getFlowerCode{
        this.flowerCode = flowerCode;
      }
    • Controller
    @RestController
    @RequestMapping("/flowerInfo")
    public class FlowerController{
      @PostMapping
      public ResponseEntity postFlower(FlowerPostDto  flowerPostDto){
        return new ResponseEntity<FlowerPostDto>(flowerPostDto, HttpStatus.CREATED);

유효성 검증

  • build.gradle 추가
dependencies {
	...
	implementation 'org.springframework.boot:spring-boot-starter-validation'
}    
  • DTO 유효성 검증
    • flowerName 공백 금지
    • flowerCode 공백 금지 및 영문만 가능
    @Getter
    @Setter
    public class FlowerPostDto{
      @NotSpace(message = "공백 금지")
      private String flowerName;
      
      @Pattern(regex = "^([a-zA-Z])+(\\s?[a-zA-Z])*$,
        		message = "영문만 허용 가능하며, 글자 사이 한 칸의 스페이스만 포함 가능"
      private String flowerCode;
     }

Service

  • 세분화된 비즈니스 로직을 처리하는 객체
  • Controller가 Request를 받으면 적절한 Service에 전달하고 Service는 비즈니스 로직을 처리
    1) DAO를 통해 데이터베이스 접근
    2) DTO로 데이터 전달 받은
    3) 적절한 처리 후 반환

참고

profile
뚝딱뚝딱

0개의 댓글