본문 바로가기

spring

어노테이션 기반 설정

* 필요한 환경 : 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> 태그를 사용해도 된다.

-------------------------------------------------------------------------------------------------------------------
 
어노테이션(Annotation)  spring 

 


어노테이션은 자바 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>태그를 이용한다.

 
-------------------------------------------------------------------------------------------------------------------
 
[스프링 어노테이션] @Resource @Repository 사용법
 

예제, 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>
      - AutowiredAnnotationBeanPostProcessor 클래스와 CommonAnnotationBeanPostProcessor 클래스도 빈으로 등록되기 때문에
        @Required나 @Autowired와 같은 어노테이션 사용 가능.

  □ 자동 검색된 빈의 이름과 범위

    ■ 특정한 이름 명시
      - 어노테이션의 속성에 빈의 이름을 입력.
 @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>
    - <context:include-filter> 태그와 <context:exclude-filter> 태그는 각각 type 속성과 expression! 속성을 갖음.
    - type 속성에 따라 expression! 속성에 올 수 있는 값이 달라짐.
 
  ■ type 속성에 올 수있는 값
 
 
-------------------------------------------------------------------------------------------------------------------

Spring MVC ( Model View Controller) 4 

 

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;
 import org.springframework.web.servlet.mvc.AbstractController;

 public class HelloController extends AbstractController{
    String name;
    public void setName(String name){ this.name=name; }
    protected ModelAndView handleRequestInternal(HttpServletRequest request,
                                                   HttpServletResponse response) throws Exception {
        String hello="Hello "+name;
       return new ModelAndView("hello", "hello" ,hello); 
                                                                 view 이름 ,       ,  메시지 
   }
}

                                                                                          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{
     public ModelAndView list(HttpServletRequest request, HttpServletResponse response) throws Exception {
          List boardList=boardService.findBoard(boardSC);
          return new ModelAndView("board/boart_list","boardList",boardList);
     }
 
     public ModelAndView save(HttpServletRequest request, HttpServletResponse response) throws Exception {
         BoardDto boad=new BoardDto();
         bind(request.board);
         board=boardService.saveBoardInfo(board);
         return new ModelAndView("board/board_list");
     }
 }


- 요청 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>