Spring 2.5 버전서부터 추간된 기능중에 Annotation(어노테이션)의 기능이 있다.
실제로 사용해본결과 이전의 xml에서 설정하여 사용하는것보단 훨씬 개발하기 편해진것은 확실하다.
( 솔찍히 Spring은 이번에 처음 써보는것나 마찮가지다. )
아직 많은 사용법을 모르지만 간단하게 정리를 해보고자 한다.
* 참고로 이문서는 어디까지나 어노테이션의 사용에 대한 것이지 Spring에 기본적인 내용은 필자도 잘아지 못한다.
( 필자도 앞으로 공부해나가야할 부분이다. )
즉, 간단하게 이미 spring 2.5 이전 버전을 쓰시는 분들은 그냥 "어노테이션을 이렇게 쓰는구나" 정도로 이해해 주시고
Spring을 안쓰시다 2.5를 처음 쓰시는 분들은 Spring의 이전 버전도 어느정도 지식을 쌓으시는 것이 좋을것으로 판단 된다.
Spring 2.5( 중에서도 Spring MVC) 에서 annotation을 사용하기 위해서는
dispatcher-servlet.xml 에 다음의 설정을 추가해야한다.
그래야만 어노테이션이 적용된 class( @Controller, @Service, @Repository 를 포함한 class )를 로딩할수가 있다.
- dispatcher-servlet.xml -
<context:component-scan base-package="kr.pe.jabsiri" /> 가존 작성중 틀린것
2009-06-26 수정내용
dispactcher-servlet.xml에는 아래와 같이해서 Controller의 어노테이션만 로딩을 하고<context:component-scan base-package="com.enz.adnad" use-default-filters="false"> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"></context:include-filter>
</context:component-scan>
applicationContext.xml에는 아래와 같이해서 Controller를 제외한 어노테이션만 로딩을 해야한다.<context:component-scan base-package="com.enz.adnad">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"></context:exclude-filter>
</context:component-scan>
아래는 dispactcher-servlet.xml
에 설정하는 ViewResolver 로써 /WEB-INF/spring/ 로 시작하고 .jsp 로 끝나는 파일을 찾아 옵니다.
controller에서
return "hello/hello_jabsiri"; 와 같이 하면 /WEB-INF/spring/hello/hello_jabsiri.jsp 파일을 찾습니다.
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/WEB-INF/spring/" p:suffix=".jsp">
1. @Controller
위에서 설정한 컴포넌트 스캔을 통하여 로딩된( <bean> tag를 써서 일일이 등록된 class도 )@Controller를 적용한 Class는 DefaultAnnotationHandlerMapping을 통해 컨트롤로 사용된다.
( DefaultAnnotationHandlerMapping을 통해 컨트롤러로 등록이 되는지 어쩐지는 나도 잘 모른다 그냥그렇다고 한다. 즉, 기본적인 Spring에 대한 공부는 각자의 몫이고 필자 또한 나중에 정리를 할 것이다. )
다음은 사용의 예이다.
@Controller
public class HelloJabsiri {
@RequestMapping(value="/hello/hello_jabsiri.jab")
public String helloJabsiri(){
return "hello/hello_jabsiri"; //리턴값은 .jsp 확장자를 뺀 경로
}
}
return 값의 "hello/hello_jabsiri" 는 dispatcher-servlet.xml 에서 정의한viewResolver 의 p:suffix=".jsp" p:prefix="/WEB-INF/spring/" 내용에 해당하는곳에서 jsp를 찾는다.
즉
/WEB-INF/spring/[ return 값].jsp 의 패턴에 해당하는 jsp를 찾는다.
여기서 잠시 주목할 사항은 helloJabsiri() 메소드는
아무런 파라미터도 받지 않는다는 것이다.
맞다 아무것도 안받아도된다.!!
Spring MVC에서 MultiController ( 명칭이 맞나;? )는 파라미터를 받아도되고 않받아도 되고, 받되 순서가 뒤죽 박죽이어도 된다.
다음과 같이 Member bean을 받을수 있는데 이는 html상의 form input type의 id와 Member 객체들의 맴버변수가 같은것을 알아서 매핑시켜 값을 넘겨주기도 한다.
@RequestMapping("member.do")
public String member(Member member, ModelMap modelMap){
modelMap.put("member", member);
return "member/member";
}
이것외에 @RequestParam과 메소드의 파라미터를 받는 방법등은 첨부파일을 받아서 꼭!!! 보길 바란다.
2. @RequestMapping
위의 HelloJabsiri의 Controller에 보면
@RequestMapping(value="/hello/hello_jabsiri.jab") 이 보일 것이다.
이는
@RequestMapping의 value 형태의 url이 들어오면 helloJabsiri method를 호출 하겠다는 것이다.
위의 코드는 다음과 같이 바뀔수 있다.
@Controller
@RequestMapping("/hello/*")
public class HelloJabsiri {
@RequestMapping(value="hello_jabsiri.jab")
public String helloJabsiri(){
return "hello/hello_jabsiri";
}
}
3. @Autowired
@Autowired 어노테이션은 Spring에서 의존관계를 자동으로 설정할때 사용된다.
이 어노테이션은
생성자, 필드, 메서드 세곳에 적용이 가능하다.
아래와 같이 설정해주면 사용할수 있지만 위에서처럼 scan으로 등록했으므로 안해도 된다.
<bean class=org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor />
(필자는 그냥 <context:component-scan base-package="kr.pe.jabsiri" /> 설정후 아무것도 하지 않는다. 뭐 몰라서 그런것도 있다. )
사용 코드는는 다음과 같다.
@Controller
public class HelloJabsiriController {
@Autowired
private HelloJabsiriService helloJabsiriService;
...........
}
@Service("helloJabsiriService")
public class HelloJabsiriServiceImpl implements HelloJabsiriService {
@Autowired
private HelloJabsiriDao helloJabsiriDao;
...........
}
위의 코드는 Controller에서 HelloJabsiriServiceImpl 의 interface인 HelloJabsiriService를 의존관계로 등록 한것이다.
자세히 보면 @Autowired를 적용한 변수명과 @Service 안에있는 String 값이 같다는걸 눈치챌수 있다.
4. @Service("xxxService")
@Service를 적용한 Class는 비지니스 로직이 들어가는 Service로 등록이 된다.
@Service("helloJabsiriService")
public class HelloJabsiriServiceImpl implements HelloJabsiriService {
@Autowired
private HelloJabsiriDao helloJabsiriDao;
public void helloJabsiri() {
System.out.println( "HelloJabsiriServiceImpl :: helloJabsiri()");
helloJabsiriDao.selectHelloJabsiri();
}
}
helloJabsiriDao.selectHelloJabsiri(); 와 같이 @Autowired를 이용한 객체를 이용하여 Dao 객체를 호출한다.
5. @Repository("xxxDao")
@Repository를 적용한 Class는 DataBaseAccess를 할수 있는 Dao로 등록된다.
@Repository("helloJabsiriDao")
public class HelloJabsiriDaoImpl implements HelloJabsiriDao {
public void selectHelloJabsiri() {
System.out.println("HelloJabsiriDaoImpl :: selectHelloJabsiri()");
}
}
Controller에 있는 @Autowired는 @Service("xxxService")에 등록된 xxxService와 변수명이 같아야 하며
Service에 있는 @Autowired는 @Repository("xxxDao")에 등로된 xxDao와 변수명이 같아야 한다.
6. @Transactional (이건 추후 작성 하겠음 )