@Autowired
패키지: org.springframework.beans.factory.annotation
버전: spring 2.5
설정 위치: 생성자, 필드, 메서드(setter메서드가 아니여도 된다) 앞
의존관계를 자동설정할 때 사용하며 타입을 이용하여 의존하는 객체를 삽입해 준다. 그러므로 해당 타입의 빈객체가 존재하지 않거나 또는 2개 이상 존재할 경우 스프링은 예외를 발생시키게 된다.
options:
- required: Autowired 어노테이션을 적용한 프로퍼티 중 반드시 설정할 필요가 없는 경우에 false값을 주어 프로퍼티가 존재하지 않더라도 스프링이 예외를 발생하지 않도록 한다. 기본값은 TRUE. ex) @Autowired(required=false)
사용하려면 <bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor" /> 클래스를 빈으로 등록시켜줘야 한다. 해당 설정 대신에 <context:annotation-config> 태그를 사용해도 된다.
@Autowired를 적용할 때 같은 타입의 빈이 2개 이상 존재하게 되면 예외가 발생하는데, Autowired도 이러한 문제가 발생한다. 이럴 때 @Qualifier를 사용하면 동일한 타입의 빈 중 특정 빈을 사용하도록 하여 문제를 해결할 수 있다.
@Autowired @Qualifier("test") private Test test; | cs |
@Controller
한 줄 정리
- 해당 클래스를 컨트롤러로 등록하는 역할을 한다. 그렇기때문에 항상 위치는 클래스 위에 위치해야 한다.
<덧붙임>
패키지: org.springframework.stereotype
버전: spring 2.5
spring MVC의 Controller 클래스 선언을 단순화시켜준다. 스프링 컨트롤러, 서블릿을 상속할 필요가 없으며, @Controller로 등록된 클래스 파일에 대한 bean을 자동으로 생성해준다.
Controller로 사용하고자 하는 클래스에 @Controller 어노테이션을 명시하면 component-scan으로 자동 등록된다.
<context:component-scan base-package="com.*"/> | cs |
package com.test; import org.springframework.stereotype.Controller; @Controller public class SpringTest { //... } | cs |
컨트롤러 메서드의 파라미터 타입
파라미터 타입 | 설명 |
HttpServletRequest, HttpServletResponse, HttpSession | Servlet API |
java.util.Locale | 현재 요청에 대한 Locale 정보 |
InputStream, Reader | 요청 컨텐츠에 직접 접근할 때 사용 |
OutputStream, Writer | 응답 컨텐츠를 생성할 때 사용 |
@PathVariable 어노테이션 적용 변수 | URL 템플릿 변수에 접근할 때 사용 |
@RequestParam 어노테이션 적용 변수 | HTTP 파라미터와 매핑 |
@RequestHeader 어노테이션 적용 변수 | HTTP 헤더 매핑 |
@CookieValue 어노테이션 적용 변수 | HTTP 쿠키 매핑 |
@RequestBody 어노테이션 적용 변수 | HTTP RequestBody에 접근할 때 사용. HttpMessage Converter를 이용해 RequestBody 데이터를 해당 타입으로 변환한다. |
Map, Model, ModelMap | 뷰에 전달할 모델 데이터를 설정할 때 사용 |
커맨드 객체 | HTTP 요청 파라미터를 저장한 객체, 기본적으로 클래스 이름을 모델명으로 사용. |
Errors, BindingResult | HTTP 요청 파라미터를 커맨드 객체에 저장한 결과. 커맨드 객체를 위한 파라미터 바로 다음에 위치한다. |
SessionStatus | 폼 처리를 완료 했음을 처리하기 위해 사용. @SessionAttribute를 명시한 session 속성을 제거하도록 이벤트를 발생시킨다. |
컨트롤러 메서드의 파라미터 타입 사용 예시 보기
컨트롤러 메서드의 리턴 타입
리턴 타입 | 설명 |
ModelAndView | 뷰 정보 및 모델 정보를 담고 있는 ModelAndView 객체 |
Model | 뷰에 전달할 객체 정보를 담고 있는 Model을 리턴한다. 이때 뷰 이름은 요청 URL로부터 결정된다. (RequestToViewNameTranslator를 통해 뷰 결정) |
Map, ModelMap | 뷰에 전달할 객체 정보를 담고 있는 Map 혹은 ModelMap을 리턴한다. 이때 뷰 이름은 요청 URL로부터 결정된다. (RequestToViewNameTranslator를 통해 뷰 결정) |
String | 뷰 이름을 리턴한다. |
View 객체 | View 객체를 직접 리턴. 해당 View 객체를 이용해서 뷰를 생성한다. |
void | 메서드가 ServletResponse나 HttpServletResponse 타입의 파라미터를 갖는 경우 메서드가 직접 응답을 처리한다고 가정한다. 그렇지 않을 경우 요청 URL로부터 결정된 뷰를 보여준다. (RequestToViewNameTranslator를 통해 뷰 결정) |
@ResponseBody 어노테이션 적용 | 메서드에서 @ResponseBody 어노테이션이 적용된 경우, 리턴 객체를 HTTP 응답으로 전송한다. HttpMessageConverter를 이용해서 객체를 HTTP 응답 스트림으로 변환한다. |
@Repository
패키지: org.springframework.stereotype
버전: spring 2.0
@Repository는 일반적으로 DAO에 사용되며 DB Exception을 DataAccessException으로 변환한다.
@Repository("bbs.boardDAO") public class BoardDAO { private SqlSession sqlSession; public int insertBoard(Board dto) throws Exception { ... } } | cs |
public class BoardServiceImpl implements BoardService { @Resource(name="bbs.boardDAO") private BoardDAO dao; public int insertBoard(Board dto){} } | cs |
@RequestMapping
한 줄 정리
- 해당 요청에 대한 메서드를 맵핑해줍니다.
<덧붙임>
관련 문서
RequestMapping annotation은 url을 Controller의 method와 mapping 시켜주는 역할을 한다.
class에 하나의 url mapping을 할 경우, class위에 @RequestMapping("/url")을 지정하며, GET 또는 POST 방식 등의 옵션을 줄 수 있다.
해당되는 method가 실행된 후, return 페이지가 따로 정의되어 있지 않으면 RequestMapping("/url")에서 설정된 url로 다시 돌아간다.
options
value
"value='/getMovie.do'"와 같은 형식의 매핑 URL 값이다. 디폴트 속성이기 때문에 value만 정의하는 경우에는 'value='은 생략할 수 있다.
@RequestMapping(value={"/addMovie.do", "/updateMovie.do" }) public String myMethod() { // "/addMovie.do", "/updateMovie.do" 두 URL 모두 처리한다. } | cs |
method
GET, POST, HEAD 등으로 표현되는 HTTP Request method에 따라 requestMapping을 할 수 있다. method=RequestMethod.GET' 형식으로 사용한다. method 값을 정의하지 않는 경우 모든 HTTP Request method에 대해서 처리한다. value 값은 클래스 선언에 정의한 @RequestMapping의 value 값을 상속받는다.
@RequestMapping(method = RequestMethod.POST) public String myMethod() { // ... } | cs |
params
HTTP Request로 들어오는 파라미터 표현이다. 'params={"param1=a", "param2", "!myParam"}' 로 다양하게 표현 가능하다.
HTTP Request에 param1과 param2 파라미터가 존재해야하고 param1의 값은 'a'이어야하며, myParam이라는 파라미터는 존재하지 않아야한다. 또한, value 값은 클래스 선언에 정의한 @RequestMapping의 value 값을 상속받는다.
@RequestMapping(params = {"param1=a", "param2", "!myParam"}) public String myMethod() { // ... } | cs |
headers
HTTP Request의 헤더 값이다.'headers="someHader=someValue"', 'headers="someHader"', 'headers="!someHader"' 로 다양하게 표현 가능하다. Accept나 Content-Type 같은 헤더에 대해서 media type 표현 시 '*' 도 지원한다.
HTTP Request에 Content-Type 헤더 값이 "text/html", "text/plain" 모두 매칭이 된다. Type-Level, Method-Level에서 모두 사용할 수 있는데, Type-Level에 정의된 경우, 하위의 모든 핸들러 메서드에서도 Type-Level에서 정의한 헤더값 제한이 적용된다.
@RequestMapping(value="/movie.do", headers="content-type=text/*") public String myMethod() { // ... } | cs |
produces: TODO
@RequestMapping(value="...", produces = "application/json") @RequestBody public HashMap<String, String> testMethod(Model model) { HashMap<String, String> map = new HashMap<String, String>(); map.put("code", "0"); return map; } | cs |
example
@Controller @RequestMapping("/test/*") public class SampleController1 { @RequestMapping(method=RequestMethod.GET, value="go") public returntype getMethodName() { // ... } @RequestMapping(method=RequestMethod.POST, value="go2") public returntype getMethodName2() { // ... } } @Controller @RequestMapping(value="/main.action") public class SampleController2 { @RequestMapping(method=RequestMethod.GET) public String method() { return ".mainLayout"; } } @Controller public class SampleController3 { @RequestMapping(value="/main.action") public returntype m01() { // ... } } |
@Resource
자바 6 및 JEE5에 추가된 것으로 어플리케이션에서 필요로 하는 자원을 자동 연결할 때 사용 한다. 스프링 2.5 부터 지원하는 어노테이션으로 스프링에서는 의존하는 빈 객체를 전달할 때 사용한다.
@Autowired와 흡사하지만 @Autowired는 타입으로(by type), @Resource는 이름으로(by name)으로 연결한다는 점이 다르다.
options:
- name: 자동으로 연결될 빈객체의 이름을 입력한다. ex) @Resource(name="testDao")
사용하려면 <bean class="org.springframework.beans.factory.annotation.CommonAnnotationBeanPostProcessor"/> 클래스를 빈으로 등록시켜줘야 한다. 해당 설정 대신에 <context:annotation-config> 태그를 사용해도 된다.
<beans> <!-- 기타 설정 생략 --> <context:annotation-config/> <bean id="user2" class="com.test.UserImpl" p:data="65536"/> </beans> | cs |
public class UserService { @Resource(name="user2") private User user; //UserImpl user2 = new UserImpl(); //User user = user2; public void setUser(User user) { this.user = user; } public String result() { return user.getData(); } } | cs |
'Dev. Java > Dev.Spring' 카테고리의 다른 글
[Spring 레퍼런스] 1장 스프링 프레임워크 소개 #1 (0) | 2015.02.01 |
---|---|
[스프링] 기업들은 왜 프레임워크를 사용하는가? (0) | 2015.01.06 |
커스텀 ArgumentResolver 등록하기 (0) | 2014.11.03 |
DispatcherServlet란 도데체 무엇일까? (0) | 2014.10.14 |
스프링 MVC 프로젝트 템플릿 구조 (0) | 2014.10.06 |