Spring MVC | Service와 Controller

전수·2022년 11월 29일
0

Spring

목록 보기
3/13

Service

  • 실제 비지니스 로직을 수행하는 component
  • Controller에서 요청을 보내면 DAO를 이용해 실제 비지니스 로직 수행
  • Service Layer

예시
어떤 주문 번호 oId로 해당 주문 상품의 정보와 결제 정보를 출력하고자 한다.
Controller는 해당 기능을 구현한 service를 찾아 비지니스 로직을 수행한다.
Controller

private PaymentService paymentService;
private ProdService prodService;

    @Autowired
    public PaymentRestController(PaymentService paymentService, ProdService prodService){
        this.paymentService = paymentService;
        this.prodService = prodService;
    }

    @GetMapping("/payment")
    public ResponseEntity<PaymentVO> getPaymentByoId(@RequestParam String oId){
        PaymentDTO paymentDTO = paymentService.getPaymentById(oId);
        ProdDTO prodDTO = prodService.getByOrderNo(oId);
        Map<ProdVO, PaymentVO> map = new HashMap<>();
        map.put(prodDTO.toVO(),paymentDTO.toVO());
        return new ResponseEntity(map.get(prodDTO.toVO()), HttpStatus.OK);
    }

Service

 private PaymentDAO paymentDAO;

    @Autowired
    public PaymentService(PaymentDAO paymentDAO){
        this.paymentDAO = paymentDAO;
    }

    @Override
    public PaymentDTO getPaymentById(String oId) {
        if (oId == null) return null;

        Payment payment= paymentDAO.select(oId);
        if (payment == null) return null;

        return payment.toDTO();
    }

위의 예시와 같이 Controller에서 Service를 호출하고 Service는 DAO를 이용해 비지니스 로직을 수행함을 알 수 있다.


Controller

  • 요청에 따라 어떤 처리를 할지 결정하며 viewmodel을 연결하는 라우팅 역할
  • 사용자 요청에 맞는 view 호출 (html, jsp 연결)
  • 사용자 요청에 맞는 서비스 단의 비지니스 로직 메소드 실행

각 계층마다 관심을 분리하여 개발하여 협업에 능하고 유지보수에 용이한 장점이 있음

Return View, Data

  1. Client가 URI 형식으로 Web Service에 Request 전달
  2. DispatcherServlet이 Request를 위임할 HandlerMapping을 찾음
    • 공통적으로 처리하는 부분은 DispatcherServlet에서 실행
  3. HandlerMapping을 통해 request를 Controller로 위임
  4. Controller는 Request 처리 후 view return
  5. view : DispatcherServlet은 VeiwResolver를 통해 View를 찾아 Client에게 return
    data : return Object는 보통 JSON으로 Serialize되어 Client에게 return

Controller를 통해 객체를 반환할 때는 HttpMessageConverter가 동작

  • @ResponseBody : 데이터를 주고 받을 때 페이지 전환이 일어나지 않고 비동기 통신으로 전달받는 경우가 많음
  • StringHttpMessageConverter : 단순 문자열
  • MappingJackson2HttpMessageConverter : 객체

RestController

  • @Controller + @ResponseBody
  • JSON형태로 객체 데이터를 반환하기 위함
  • 비동기통신 AJAX와 많이 결합되어 사용됨

MessageConverter

  • 자바 객체와 http 요청 및 응답 바디를 변환하는 역할
  • 주로 XML이나 JSON을 이용한 AJAX 기능이나 웹 서비스를 개발할 때 사용

@ResponseBody

  • 파라미터 타입에 맞는 메시지 컨버터를 선택한 뒤 http 요청 본문을 통째로 메시지 변환하여 파라미터로 바인딩

@RequestBody

  • 리턴 타입에 맞는 메시지 컨버터를 선택한 뒤 반환값을 통째로 메시지로 변환한 뒤 리턴
    GET 방식 요청은 http 요청 본문이 없으므로 사용 불가

MessageConverter 종류

  • ByteArrayHttpMessageConverter : 바이너리 정보를 주고 받을 때 사용
  • StringHttpMessageConverter : 단순 문자열을 그대로 전달 할 수 있음
  • FormHttpMessageConverter :정의된 폼 데이터를 주고 받을 때 사용
    • @ModelAttribute를 사용하는 것이 훨씬 유리
  • SourceHttpMessageConverter : XML 문서를 Source 타입의 오브젝트로 변환하고 싶을 때 사용

이외에도 새로운 MessageConverter를 등록하려면 직접 AnnotationMethodHandlerAdaptermessageConverters에 등록하고 사용할 수 있다.

0개의 댓글

관련 채용 정보