* 필요한 환경 : jdk5.0 이상
@Required
목적 : 필수 프로퍼티를 지정
설정 위치 : setter메소드
추가설정 : RequiredAnnotationBeanPostProcessor 클래스를 빈으로 등록시켜줘야 한다. 해당 설정 대신에<context:annotation-config> 태그를 사용해도 된다.
@Autowired
목적 : 의존관계를 자동설정할 때 사용하며 타입을 이용하여 의존하는 객체를 삽입해 준다. 그러므로 해당 타입의 빈객체가 존재하지 않거나 또는 2개 이상 존재할 경우 스프링은 예외를 발생시키게 된다.
설정 위치 : 생성자, 필드, 메소드(굳이 setter메소드가 아니여도 된다)
추가설정 : AutowiredAnnotationBeanPostProcessor 클래스를 빈으로 등록시켜줘야 한다. 해당 설정 대신에 <context:annotation-config> 태그를 사용해도 된다.
옵션 : required - @Autowired어노테이션을 적용한 프로퍼티에 대해 굳이 설정할 필요가 없는 경우에 false값을 주며 이때 해당 프로퍼티가 존재하지 않더라도 스프링은 예외를 발생시키지 않는다. 디폴트값은 true
@Qualifier
목적 : @Autowired의 목적에서 동일 타입의 빈객체가 존재시 특정빈을 삽입할 수 있게 설정한다.
설정위치 : @Autowired 어노테이션과 함께 사용된다.
추가설정 : 동일타입의 빈객체 설정에서 <qualifier value="[alias명]" />를 추가하여 준다.
옵션 : name - alias명
@Resource
목적 : 어플리케이션에서 필요로 하는 자원을 자동 연결(의존하는 빈 객체 전달)할 때 사용
@Autowired 와 같은 기능을 하며 @Autowired와 차이점은 @Autowired는 타입으로(by type), @Resource는 이름으로(by name)으로 연결시켜준다는 것이다.
설정위치 : 프로퍼티, setter메소드
추가설정 : CommonAnnotationBeanPostProcessor 클래스를 빈으로 등록시켜줘야 한다. 해당 설정 대신에 <context:annotation-config> 태그를 사용해도 된다.
옵션 : name
@PostConstruct
목적 : 의존하는 객체를 설정한 이후에 초기화 작업을 수행하기 위해 사용
설정위치 : 초기화 작업 수행 메소드
추가설정 : CommonAnnotationBeanPostProcessor 클래스를 빈으로 등록시켜줘야 한다. 해당 설정 대신에 <context:annotation-config> 태그를 사용해도 된다.
@PreConstruct
목적 : 컨테이너에서 객체를 제거하기 전에 해야할 작업을 수행하기 위해 사용
설정위치 : 해당 작업 메소드
추가설정 : CommonAnnotationBeanPostProcessor 클래스를 빈으로 등록시켜줘야 한다. 해당 설정 대신에 <context:annotation-config> 태그를 사용해도 된다.
어노테이션은 자바 1.5부터 지원한다.
스프링2는 어노테이션을 이용하여 빈과 관련된 정보를 설정할 수 있다.
@Required
org.springframework.beans.factory.annotaion패키지에 에 있으며 스프링 2부터 제공되고 필수 프로퍼티를 명시할때 사용된다.
@Required를 이용하여 필수 프로퍼티를 설정
1단계 : 코드내에 프로퍼티 설정 메서드에 @Required 어노테이션을 붙인다.
import org.springframework.beans.factory.annotation.Required
public class TestBean {
private TestDao testDao;
@Required
public void setTestDao(TestDao testDao) {
this.testDao = testDao;
}
}
2단계 : 스프링 설정 파일에 RequiredAnnotationBeanPostProcessor클래스를 빈으로 등록
<bean class="org.springframework.beans.factory.annotaion.RequiredAnnotationBeanpostProcessor"/>
<bean name="testBean" class="lja.test.TestBean">
<property name="testDao" ref="testDao"/> <!--@Required 어노테이션을 적용하였으므로 설정하지 않으면 예외를 발생시킨다.-->
</bean>
RequiredAnnotationBeanPostProcessor 클래스는 스프링 컨테이너에 등록된 bean객체를 조사하여 @Required 어노테이션으로 설정되어 있는 프로퍼티의 값이 설정되어 있는지 검사하고 설정되어있지 않으면 bean생성시 예외를 발생시킨다.
RequiredAnnotationBeanPostProcessor 클래스를 빈으로 등록하지 않고
<context:annotation-config>태그를 이용할 수도 있다.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd">
<context:annotation-config/>
</beans>
@Autowired
의존관계를 자동으로 설정해주는 어노테이션
: 타입을 이용하여 의존객체를 자동으로 설정한다.
: 생성자, 필드, 메서드 세곳에 적용 가능하다.
예) 프로퍼티 설정 메서드 이용
import org.springframework.beans.factory.annotation.Required
public class TestBean {
private TestDao testDao;
@Autowired
public void setTestDao(TestDao testDao) {
this.testDao = testDao;
}
}
위와 같은 경우 testDao프로퍼티에 TestDao 타입의 bean객체를 전달한다.
AutowiredAnnotationBeanPostProcessor 클래스를 설정파일에 빈객체로 등록하면 @Autowired 어노테이션을 이용한 자동설정이 적용된다.
또한 Required어노테이션과 마찬가지로 <context:annotation-config>태그를 사용하면 된다.
@Autowired 어노테이션은 프로퍼티 설정 메서드 뿐 아니라 일반 메서드나 멤퍼필드 자체에 적용시킬수도 있다.
제너릭이 적용된 컬렉션 타입에도 적용시킬 수 있다.
@Autowired 어노테이션은 타입을 이용하여 자동으로 빈객체를 전달하기 때문에 타입에 맞는 객체가 없거나 두개 이상일 경우 예외를 발생시킨다.
@Autowired 어노테이션을 적용한 프로퍼티를 반드시 설정할 필요가 없는 경우에는 @Autowired 어노테이션의 required속성 값을 false로 지정한다.
@Autowired(required=false)
이렇게 지정된 경우에는 해당 타입에 맞는 빈객체가 존재하지 않는다고 해도 예외를 발생시키지는 않는다.
@Qualifier
: 동일한 타입의 빈객체들 중 특정 빈 객체를 자동으로 설정하도록 한다.
: @Autowired 어노테이션과 함께 사용되며 자동 연결될 빈객체의 수식어를 값으로 갖는다.
public class TestBean {
@Autowired
@Qualifier("main")
private TestDao testDao;
}
위 코드에서 수식어구는 main 이고
이러한 수식어는 설정파일에서 <qualifer> 태그를 이용하여 설정한다.
<bean id="testDao" class="lja.test.TestDao">
<qualifier value="main"/>
</bean>
@Resource
:javax.annotation 패키지에 위치한 어노테이션
:자바 6버전 및 JEE5 버전에 추가된 것으로 어플리케이션에서 필요로 하는 자원을 자동 연결할 때 사용
:스프링 2.5 부터 지원하는 어노테이션으로 스프링에서는 의존하는 빈객체를 전달할 때 사용하다.
:name속성에 자동으로 연결될 빈객체의 이름을 입력한다 @Resource(name="testDao")
:CommonAnnotationBeanPostProcessor 클래스를 설정파일에 빈객체로 등록하여 어노테이션을 적용시킨다.
<bean class="org.springframework.beans.factory.annotation.CommonAnnotationBeanPostProcessor"/>
혹은 <context:annotation-config>태그를 이용한다.
예제, MemberDao.java / MemberService.java(webservice)
==== MemberDao.java ====
@Repository
public class MemberDao extends SqlMapClientDaoSupport{
@Resource(name="memberSqlMapClient")
public void initDao(SqlMapClient sqlMapClient) throws Exception
{
super.setSqlMapClient(sqlMapClient);
}
....
}
==== MemberService.java ====
@Path("/memberservice/")
@Service
public class MemberService {
private Logger logger = Logger.getLogger(this.getClass());
@Resource(name="memberDao")
private MemberDao memberDao;
.....
}
@Resource를 사용하려면 보라색과 같이 미리 xml파일에 설정이 되어 있거나 (예제에선 설정 내용이 없습니다.) 혹은 빨간색처럼 페어로 써야한다.ㅋ
□ 어노테이션을 이용한 자동 스캔
- @Repository 어노테이션(스프링 2.0), @Component 어노테이션, @Service 어노테이션, @Controller 어노테이션은 클래스 선언
■ @Component 어노테이션 적용
package kame.spring.chap02.scan; import org.springframework.stereotype.Component; ... @Component public class SystemMonitor { private int periodTime; private MessageSender sender; private Sensor[] sensors; @Resource(name="sensor1") private Sensor sensor; @Autowired @Qualifier("main") private Camera mainCamera; ... } |
- <context:component-scan> 태그를 이용하여 스프링이 클래스를 검색할 패키지를 지정.
- <context:component-scan> 태그를 추가하면 스프링은 지정한 패키지에서 어노테이션이 적용된 클래스를 검색하여 빈으로 등록.
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd"> <context:component-scan base-package="kame.spring.chap02.scan" /> ... </beans> |
□ 자동 검색된 빈의 이름과 범위
■ 특정한 이름 명시
- 어노테이션의 속성에 빈의 이름을 입력.
@Component("monitor") public class SystemMonitor { ... } |
- 스프링은 기본적으로 빈의 범위를 singleton으로 설정.
- 범위를 지정하고 싶으면 @Scope 어노테이션을 이용하여 범위를 지정.
import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @Scope("prototype") @Component("monitor") public class SystemMonitor { ... } |
□ 스캔 대상 클래스 범위 지정
- <context:include-filter> 태그와 <context:exclude-filter> 태그를 사용하면 자동스캔 대상에 포함시킬 클래스와 포함시키지 않을
<context:component-scan base-package="kame.spring.chap02.scan"> <context:include-filter type="regex" expression!=".*HibernateRepository" /> <context:exclude-filter type="aspectj" expression!=".*IBatisRepository" /> </context:component-scan> |
- type 속성에 따라 expression! 속성에 올 수 있는 값이 달라짐.
Controller
- DispatcherServlet 으로부터 요청을 받아 어플리케이션의 기능 수행.
- request 를 전달 받아 서비스를 처리하고 , 결과 전송.
- org.springframework.web.servlet.mvc.Controller
- Spring 은 Controller 를 상속받는 다양한 하위 Controller
- Spring 에서 제공되는 Controller 를 상속받아 어플리케이션 Controller 를 구현.
용도에 따른 Controller 클래스 종류
유형 | 클래스 | 상황 |
정적 뷰 매핑 | ParameterizableViewController UrlFilenameViewController | 컨트롤러에서 어떤 기능도 수행하지 않고, 단순히 클라이언트 요청을 뷰로 전달할 때 사용. |
단순 처리 | Controller(인터페이스) AbstractController | 별도 기능이 제공되지 않은 컨트롤러. 요청파라미터 등의 작업을 직접 . |
일회성 | ThrowayController | Request 를 단순히 comman 로 처리할 경우. |
다중액션 | MultiActionController | 연관된 로직을 수행하는 다수의 기능을 하나의 컨트롤러에서 구현. |
명령(파라미터 매핑) | BaseCommandController AbstractCommandController | Request 로부터 파라미터를 받아서 다른 객체에 바인딩 시 요청 파라미터를 객체에 저장. 파라미터 값 검증 기능 제공. |
입력폼 처리 | AbstractFormController SimpleFormController | 폼을 출력하고 폼에 입력한 데이터를 처리할 때 사용 |
다중페이지 입력폼 처리 | AbstractWizardFormController | 여러 페이지를 거쳐 데이터를 입력 하는 경우, 입력 폼의 흐름 제어, 입력한 데이터를 처리. |
단순 컨트롤러 (AbstractController 상속)
- Requst 로부터 요구되는 파라미터가 적고, 로직수행이 단순한 경우 사용되는 Controller
- Controller 인터페이스를 구현하거나 AbstractController 클래스를 상속.
- org.springframework.web.servlet.mvc.AbstractController
package com.zeroad.spring.mvc.controller; import org.springframework.web.servlet.ModelAndView; public class HelloController extends AbstractController{ |
request.setAttribute(“hello”,hello)
- Controller 를 spring 의 빈으로 등록
- URL 매핑을 위해 name 속성을 사용
http://localhost/hello.do
<bean name="/hello.do" class="com.zeroad.spring.mvc.controller.HelloController"> </bean> |
다중액션 컨트롤러( MultiActionController 상속하여 구현)
- 비슷하거나 관련된 기능을 수행하는 컨트롤러
- 다수의 요청을 하나의 Controller 에서 처리
-org.springframework.web.servlet.mvc.multiaction.MultiActionController
- bind() 메서드 : request 로부터 파라미터를 추출하여 Command 객체에 설정.
package com.zeroad.spring.mvc.controller; import org.springframework.web.servlet.mvc.multiaction.MultiActionController; public class BoardController extends MultiActionController{ |
- 요청 action에 대해 Controller에서 실행 되는 메서드는 parameter나 proeprty 를 이용해서 매핑.
메서드 매핑 | 설 명 |
ParameterMethodNameResolver | 요청 파라미터를 기초로하여 실행 메소드 이름을 정함. |
PropertiesMethodNameResolver | 키-값 쌍의 목록을 기초로 하여 실행 메서드 이름을 결정. |
http://localhost/board/boardMgt.do?method=list
<bean name="/board/boardMgt.do" class="com.zeroad.spring.mvc.controller.BoardController">
<property name="methodNameResolver" ref="methodNameRsolver"/>
</bean>
<bean id="methodNameRsolver"
class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">
<property name="paramName">
<value>method</value>
</property>
<property name="defaultMethodName">
<value>list</value>
</property>
</bean>
SimpleFormController
- Form 처리를 위한 controller.
- org.springframework.web.servlet.mvc.SimpleFormController
- GET 방식 : Form 입력화면을 출력.
- POST 방식 : Form 에 입력되어 전송된 데이터를 처리.
- setCommandClass() , setCommandName() 를 이용하여 Command 정보 설정.
- formBackingObject() 메서드 : GET 방식의 요청시, Form 에 필요한 데이터 전달.
- onSubmit() 메서드 : POST 방식의 요청을 처리하여 비즈니스 로직 수행.
package com.zeroad.spring.controller;
import org.springframework.web.servlet.mvc.SimpleFormController;
public class LoginController extends SimpleFormController {
public LoginController(){ // 생성자
setCommandClass(UserDto.class);
setCommandName("login");
}
protected Object formBackingObject(HttpServletRequest request)throws Exception{
UserDto userForn=(UserDto)super.formBackingObject(request);
return userForn;
}
protected ModelAndView onSubmit(HttpServletRequest request, HttpServletResponse response)throws Exception{
UserDto user=(UserDto)command;
loginService.login(user);
return new ModelAndView(getSuccessView());
}
}
- formVeiw property : From 입력화면을 위한 view
- successView property : Form 전송 데이터 처리 후 결과를 보여주는 view
<bean id="loginController" class="com.zeroad.spring.mvc.controller.LoginController"> <property name="formView" value="login"/> <property name="successView" value="main"/> </bean> |
'spring' 카테고리의 다른 글
Spring AOP - @Aspect 애노테이션 (<aop:aspectj-autoproxy proxy-target-class="true" />) (0) | 2012.10.16 |
---|---|
<context:component-scan />의 사용법 (1) | 2012.10.16 |
XStream (0) | 2012.03.15 |
XStream XML (0) | 2012.03.15 |
@Controller, @RequestMapping - Annotation in Spring(어노테이션을 사용한 컨트롤러 구현) (0) | 2012.03.15 |