티스토리 뷰

반응형

어노테이션을 이용하여 컨트롤러를 구현하는 방식의 가장 큰 장점

1) 컨트롤러 타입에 제한이 없다

다른 컨트롤러를 구현하는 방식들은 정해진 인터페이스를 구현해야 되요. 하지만 어노테이션은어느 클래스든지 컨트롤러가 될 수 있다.

2) 한 개의 컨트롤러에 하나 이상의 URL이 매핑될 수 있다

어노테이션을 이용하면 URL 매핑을 컨트롤러 클래스 단위가 아니라, 메소드 단위로 할 수 있다.****

때문에, 요청의 타입이 늘어나도, 컨트롤러 내의 메소드만 늘어난다.


@Component

component-scan을 선언에 의해 특정 패키지 안의 클래스들을 스캔하고,

@Component Annotation이 있는 클래스에 대하여 bean 인스턴스를 생성한다.


@Controller, @Service, @Repository

@Component을 구체화하여 표현한 것이 @Controller, @Service, @Repository 이다.
각 기능에 맞게 붙여준다. bean으로 등록된다.
해당 클래스가 Controller/Service/Repository로 사용됨을 Spring Framework에 알린다.


@RequestMapping

@RequestMapping에 대한 모든 매핑 정보는 Spring에서 제공하는 HandlerMapping Class가 가지고 있다.

<mvc:annotaion-driven /> 태그를 설정파일에 추가해야함

  1. Class Level Mapping
    모든 메서드에 적용되는 경우이다.
    “/home”로 들어오는 모든 요청에 대한 처리를 해당 클래스에서 한다는 것을 의미한다.
  2. Handler Level Mapping
    요청 url에 대해 해당 메서드에서 처리해야 되는 경우이다.
    “/home/employees” POST 요청에 대한 처리를 addEmployee()에서 한다는 것을 의미한다.
  • value: 해당 url로 요청이 들어오면 이 메서드가 수행된다.
  • method: 요청 method를 명시한다. 없으면 모든 http method 형식에 대해 수행된다.
package webprj.controller.customer;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import webprj.entity.Notice;
import webprj.service.NoticeService;

import java.sql.SQLException;
import java.util.List;

@Controller
@RequestMapping("/customer/notice/")
public class NoticeController {
  @Autowired
  private NoticeService noticeService;

  @RequestMapping("list")
  public String list() throws SQLException, ClassNotFoundException {
      return "notice.list";
  }

  @RequestMapping("detail")
  public String detail(){
    return "notice.detail";
  }
}

클래스에 RequestMapping 된 url에 메소드의 RequestMapping된 url을 붙인다.

메소드에 URL매핑을 할 수 있기 때문에, 더 이상 Controller 클래스는 내가 사용하던 의미가 아니라 폴더 개념으로 바뀌었다고 볼 수 있다. 컨트롤러를 담는 컨테이너로써 사용되는 것이다.

controller의 폴더구조와 view 폴더 구조를 맞추는 것이 좋다.


 

그리고 그전의 ViewName을 return하는 것은 다음과 같이 간단하게 바꿈으로써 tilesViewResolver에게 해당 정보를 보낼 수 있다.

package webprj.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class HomeController {

    @RequestMapping("/index")
    public String index(){
      return "root.index";
    }
}

 

@Autowired , @Qualifier 등은 앞에서 배웠다.

2021/01/22 - [Web/Spring] - [ Spring ] DI (Dependency Injection) Annotation 방식 설명 및 사용법



 

문서 출력 방법 4가지

  • 서블릿 객체를 얻어서 문자열 출력하기
  • @ResponseBody 설정을 통한 문자열 출력하기
  • ResourceViewResolver를 이용한 문서 출력하기
  • TilesViewResolver를 이용한 문서 출력하기

 

@RestController

@Controller와 @RestController는 HTTP Response Body가 생성되는 방식의 차이가 있다. 기존의 MVC @Controller는 Model과 View를 적절히 반환한다. 그런데 @RestController는 객체를 반환할때 객체 데이터는 바로 JSON/XML 타입의 HTTP 응답을 직접 리턴하게 된다. 위에서 본 것 처럼@Controller의 메서드에 @ResponseBody를 선언해서 객체를 리턴 하는 방법도 있다.

  • @Controller의 실행 흐름

Client -> Request -> Dispatcher Servlet -> Handler Mapping -> Controller -> View -> Dispatcher Servlet -> Response -> Client

 

  • @ResponseBody의 실행 흐름

Client -> Request -> Dispatcher Servlet -> Handler Mapping -> Controller (ResponseBody)-> Response -> Client

 

  • @RestController의 실행 흐름

Client -> HTTP Request -> Dispatcher Servlet -> Handler Mapping -> RestController (자동 ResponseBody 추가)-> HTTP Response -> Client

 

 

 

@ResponseBody나 @RestController 같은 문서 출력 시에 한글이 깨지는 현상을 고치기 위해

servlet-context.xml 설정 파일에 아래 내용을 추가한다.

<mvc:annotation-driven>
  <mvc:message-converters>
      <bean class="org.springframework.http.converter.StringHttpMessageConverter">
          <property name="supportedMediaTypes">
              <list>
                  <value>text/html;charset=UTF-8</value>
              </list>
          </property>
      </bean>
  </mvc:message-converters>
</mvc:annotation-driven>

 

반응형
댓글
반응형
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday