티스토리 뷰
어노테이션을 이용하여 컨트롤러를 구현하는 방식의 가장 큰 장점
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 /> 태그를 설정파일에 추가해야함
- Class Level Mapping
모든 메서드에 적용되는 경우이다.
“/home”로 들어오는 모든 요청에 대한 처리를 해당 클래스에서 한다는 것을 의미한다. - 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>
'백엔드 및 서버' 카테고리의 다른 글
[Spring] JPA Entity 사용 시 쓰이는 lombok annotation (0) | 2023.07.17 |
---|---|
[ Spring ] 예외 처리(@ExceptionHandler, @ControllerAdvice) (0) | 2021.08.28 |
[ Spring ] css나 js 같은 정적 파일 서비스하기 (0) | 2021.01.27 |
[ Spring ] Service 객체 및 DB연결 정보 분리 (0) | 2021.01.27 |
[ Spring ] tiles 설명 및 설정 방법 (0) | 2021.01.27 |