본문 바로가기

Dev. Java/Dev.Spring

스프링 어노테이션 정리

@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<StringString> testMethod(Model model) {
    HashMap<StringString> map = new HashMap<StringString>();
    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() {
        // ...
    }
}

cs



@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


[ 출처] http://noritersand.tistory.com/156