Spring 3.0 (26) Spring Expression Language와 @Value

기다리던 M2의 최종 릴리즈는 기한을 넘긴채 아직 별 소식이 없다. 마지막 남은 이슈 하나만 해결되면 될 것 같은데 지연되고 있는 것은 혹시 내부에서 M2 발표에 대해서 좀 더 신중을 기하자는 논의가 있는 것이 아닌가 모르겠다. M2까지 진행됐으면서도 아직 레퍼런스 매뉴얼이나 제대로된 샘플조차 제공되지 않고 있는 부분에서 아무래도 마일스톤 버전의 공개가 가지는 효과를 반감시킬 수 있다는 지적이 있을 법도 싶다.

 

Spring Expression Language

레퍼런스 매뉴얼과 충분한 샘플이 없는 상태에서 가장 좋은 학습방법은 바로 테스트코드를 보는 것이다.

3.0에서 추가된 대표적인 기능 중의 하나는 스프링 전용의 expression language(근데 이걸 뭐라 번역하나..)를 지원한다는 것이다. 

처음 EL 소식을 듣고는 view에서 사용할 것도 아니고 구지 EL이 뭐가 필요할까라고 의문을 가졌는데 지난 S1A에서 본 SpringSecurity의 데모를 보고 그 필요성을 알게됐다. 설정의 일부이면서 런타임시 값의 평가(evaluate)가 필요한 영역에 적합한 용도라는 생각이다. 좀 더 사용예를 찾아봐야겠지만, 그런 케이스는 적지 않으리라고 본다.

 

@Value

EL의 특별한 케이스로 @Value 태그가 있다. 2.5에서 등장한 @Autowired와 같은 애노테이션 방식의 DI에서 불편했던 점은 다른 빈의 레퍼런스가 아닌 값(value)을 넣는 것이 불가능하다는 점이었다. 스프링의 설정에서 value라는 것은 단지 int, string 정도의 타입만을 말하지 않는다. PropertyEditor라는 개념을 이용해서 매우 다양한 타입의 오브젝트로 변환이 가능한 것이 스프링의 value 프로퍼티이다.  그래서 2.5에서 설정에서 value를 넣어야 하는 빈이 있을 때는 어쩔 수 없이 XML로 빼내야 하는 번거로움이 있었다.

하지만 3.0에서는 @Value라는 것을 이용해서 값을 직접 넣을 수 있다. 필드(또는 세팃용 메소드)앞에 @Autowired @Value("myvalue…")  형식으로 사용하면 된다.

여기서 단순한 고정값 뿐 아니라 다이나믹한 평가값을 넣을 수 있게 하기 위해서 EL이 등장한다. 예를 들어 다른 빈의 프로퍼티 값을 읽어서 value로 사용하고 싶다면,

@Value("#{otherBean.name}")

과 같은 식으로 사용할 수 있다. 또 시스템의 프로퍼티 값을 읽거나 Scope의 컨텍스트 값을 가져올 수도 있다.

당연히 일반적인 EL의 평가값을 가져오는 것도 가능하다.

@Value("#{1 > 2}")

@Value("#{ ‘[' + myDataSource.driverName + ']‘})

이런 스타일도 가능하다.

 

요즘 3.0으로 실무에 사용될 간단한 애플리케이션을 개발하고 있다. (고객 사이트를 마루타로 -_-) 당장에 value 설정을 위해서 XML에 빈을 직접 넣어야 하는 작업이 없어진 것만으로도 매우 편한 느낌이다.

EL이나 @Value에 대해서 알고 싶으면 스프링소스의 해당 Test코드를 잘 분석해보면 된다. @Value의 사용법을 보고 싶다면 context 모듈의 ApplicationContextExpressionTests클래스를 살펴보기 바란다.


출처 - http://toby.epril.com/?p=651





'Framework & Platform > Spring' 카테고리의 다른 글

Spring - MyBatis + 커넥션풀 + 트랜잭션  (0) 2012.05.24
Spring - @RequestBody , @ResponseBody  (0) 2012.05.24
spring - 메소드 파라미터  (0) 2012.05.24
spring - cookie 설정  (0) 2012.05.24
Spring - security 예제  (0) 2012.05.23
Posted by linuxism
,


1. HttpServletRequest, HttpServletResponse

 

2. HttpSession

HttpServletRequest 객체에서 가져와도 되지만 session만 필요할 때는 이렇게 바로 가져올 수 있다.

 

3. Locale

java.util.Locale 지역 정보

 

4. InputStream, Reader

HttpServletRequest의 getInputStream(), Reader

 

5. OutputStream, Writer

HttpServletResponse의 getOutputStream(), Writer - 서블릿 형태로 만들때 사용한다.

 

6. @PathVariable

@RequestMapping의 URL {} 부분의 패스 변수를 받는다.

  1. @RequestMapping("/board/{id}")
  2. public void view( @PathVariable("id") int id ) {...}

만약 타입이 틀린 값이 들어오면 HTTP 400 - Bad Request 가 전달 된다.

 

7. @RequestParam

스프링 내장 변환기가 다룰 수 있는 모든 타입을 지원한다.

해당 파라미터가 없다면 HTTP 400 - Bad Request 가 전달 된다.

  1. public String edit( @RequestParam("id") int id, @RequestParam("title") String title, @RequestParam("file") MultipartFile file ) {...}

 file의 경우는 <input type="file" name="file" /> 에 매핑 된다.

 

  1. public String add( @RequestParam Map<String, String> params ) {...}

맵 형태로 받으면 모든 파라미터 이름은 맵의 키에 파라미터 값은 맵의 값에 담긴다.

 

  1. public void view( @RequestParam(value = "id", required = false, defaultValue = "0" )  int id) {..}.

파라미터가 필수가 아니라면 required = false 로 지정하면 된다. 이때 파라미터가 없으면 NULL이 들어간다. default 값을 지정 할 수도 있다.

 

8. @CookieValue

  1. public String check( @CookieValue("check") String check, required = false, defaultValue = "" ) {...}

@RequestParam과 동일 하며 쿠키값을 가져올 때 사용한다.

 

9. @RequestHeader

  1. public String header( @RrequestHeader("ajax") String ajax ) {...}

해더 정보를 메소드 파라미터에 넣어 준다. Ajax로 처리할때 $.ajax(...) 에서 head에 특정 값을 넣고 여기서 받아서 있으면 ajax이고 없으면 일반페이지라는 식으로 이용하면 된다.

 

10. Map, Model, ModelMap

view를 String으로 리턴해 주고 Attribute를 Map, Model, ModelMap 에 담을 수 있다.

 

11. @ModelAttribute

파라미터를 Object형태로 받을때 사용된다. 일반적인 파라미터 형태로 쓰인 경우

  1. public void update( @ModelAttribute("board") Board board) {...}

타입이 일치하지 않으면 객체에 매핑 되지 않으며 에러는 발생 시키지 않는다.

자동으로 ModelMap에 담기므로 modelMap.addAttribute를 해 줄 필요가 없다.

 

메소드에도 @ModelAttribute를 설정 할 수 있다. 리턴값이 항상 나머지 컨트롤러에 자동 추가 되며 보통 참조용 데이터 등에 이용된다.

  1. @ModelAttribute("emailList")
  2. public Map<String, String> getEmailList() { ... }

 

12. Errors, BindingResult

 모델의 값을 검정한다. 이때 BindingResult나 Errors의 파라미터 값의 위치는 반드시 @ModelAttribute 뒤에 위치해야 한다. 자신의 바로 앞에 있는 @ModelAttribute 파라미터의 검정 작업만 하기 때문이다.

  1. @RequestMapping(value = "/board/add", method = RequestMethod.POST)
  2. public String add( @ModelAttribute("board") Board board, BindingResult result ) {...}

 

13. SessionStatus

모델 오브젝트를 세션에 저장하여 계속 사용한다. 더이상 모델 오브젝트를 사용하지 않을 때는 세션에서 제거해 줘야 한다.

 

14. @RequestBody

HTTP body 부분만 전달 한다. XML 이나 JSON 으로 출력 할 경우 사용한다.

리턴타입의 @ResponseBody 를 참조하자.

 

15. @Value

프로퍼티값이나 값을 파라미터에 적용한다.

  1. public class BoardController {
  2. @Value("${eng.url}") String engUrl;

  3.  
  4. @RequestMapping(..)

  5. public String gotoEng() {

  6. return this.engUrl;

  7. }

  8. }

 위는 프로퍼티중 eng.url 의 값을 String engUrl에 매핑 시키고 메소드에서 사용한 케이스다. 파라미터에도 적용 된다.

  1. public String gotoEng( @Value("${eng.url}") String engUrl ) {
  2. return engUrl;

  3. }

 

16. @Valid

JSR - 303 검증기를 이용해서 @ModelAttribute를 검정하도록 한다.

  1. public String add( @Valid @ModelAttribute("board") Board board, BindingResult result ) { ...}


출처 - http://routine.springnote.com/pages/8180286


===================================================================================


@Required

필수 속성 지정

RequiredAnnotationBeanPostProcessor 등록 또는 <context:annotation-config/>

@Autowired

AutowiredAnnotationBeanPostProcessor  등록 또는 <context:annotation-config/>

멤버필드나 메서드에 선언

@Autowired(required=false)

 

@Autowired

@Qualifier("main")

빈객체의 수식어는 <qualifer>태그를 이용해 지정.

<bean>

   <qualifier value="main'/>

</bean>

 

@Autowired

publid void init(@Qulifier("testJob") Job job, Task task)

 

@Resource

@Resource(name="beanId")

메서드나 멤버객체에 다사용

CommonAnnotationBeanPostProcessor 혹은 <context:annotation-config/>

 

@PostConstruct @PreDestroy

CommonAnnotationBeanPostProcessor 혹은 <context:annotation-config/>

 

@Component

<context:component-scan
    base-package="com.nhncorp.smon.filemgr.action">

   <context:include-filter type="regex" expression=".*TestJob"/>

   <context:exclude-filter type="aspectj" expression="..*Task"/>

<context:component-scan>

@Autowired나 @Required도 함께 사용가능

@Component("testJob")

 

@Scope("prototype")

@Component

 

filter의 type은 annotation, assignable, regex, asjpectj

 

<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:context="http://www.springframework.org/schema/context"
 xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd
  http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

 


출처 - http://benelog.springnote.com/pages/2514294


'Framework & Platform > Spring' 카테고리의 다른 글

Spring - @RequestBody , @ResponseBody  (0) 2012.05.24
Spring - Expression Language와 @Value  (0) 2012.05.24
spring - cookie 설정  (0) 2012.05.24
Spring - security 예제  (0) 2012.05.23
Spring Security 이해  (1) 2012.05.23
Posted by linuxism
,


기간을 정해야 할 경우

01.public String loginProc(HttpServletResponse response ) throws Exception {
02.if( userInfo.isLongin_save() == true){     
03.Cookie cookie = new Cookie("login_save", userInfo.getEmpNo());
04.cookie.setMaxAge(7*24*60*60);
05.response.addCookie(cookie);
06.}else{
07.response.addCookie(new Cookie("login_save",""));
08.}
09....
10.}

위에는 cookie에 기간을 정해주기 위해서 저렇게 한거고 기간이 상관없다면 더 간단하게 아래처럼 할수 있겟다. 

1.public String loginProc(HttpServletResponse response ) throws Exception {
2.if( userInfo.isLongin_save() == true){     
3.response.addCookie(new Cookie("login_save","저장할값"));
4.}else{
5.response.addCookie(new Cookie("login_save",""));
6.}
7....
8.}

근데 딱히 지워주는걸 못찾아서리.. 그냥 "" 빈값을 넣어버린다.

혹시 jsp에서 어떻게 가져쓰는지 모르시는분을 위해.. 아래와 같이 el을 써서 가져오면 심플하게 사용할 수 있다. 

${cookie.login_save.value}

how to use cookie in spring controller ..


출처 - http://beans9.tistory.com/111


===================================================================================













실행후 모든 페이지 닫은후 다시 실행후 쿠키 확인






쿠키가 남아 있지 않음을 확인 할 수 있다(defaultValue가 동작하여 0으로 셋팅이 됨)





Servlet Import 에러 발생시 이전 게시물 참고
[JSP/Spring] - Spring Servlet import 에러시









CookieController.java

response.addCookie
쿠키를 전송하는 일을 수행
key 값 value로 전송



@CookieValue 어노테이션은 클라이언트가 제공하는 쿠키 정보를 읽어들임









dispatcher-servlet.xml
01.<?xml version="1.0" encoding="UTF-8"?>
02. 
06.xsi:schemaLocation="http://www.springframework.org/schema/beans
07.http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
08.http://www.springframework.org/schema/context
09.http://www.springframework.org/schema/context/spring-context-3.0.xsd">
10. 
11. 
12. 
13.<!-- @CookieValue 어노테이션을 이용한 쿠키 매핑 -->
14.<bean id="cookieController" class="madvirus.spring.chap06.controller.CookieController" />
15. 
16. 
17.<!-- View 글로벌 설정 -->
18.<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
19.<property name="prefix" value="/WEB-INF/view/" />
20.<property name="suffix" value=".jsp" />
21.</bean>
22.</beans>




CookieController.java
01.package madvirus.spring.chap06.controller;
02. 
03.import javax.servlet.http.Cookie;
04.import javax.servlet.http.HttpServletResponse;
05. 
06.import org.springframework.stereotype.Controller;
07.import org.springframework.web.bind.annotation.CookieValue;
08.import org.springframework.web.bind.annotation.RequestMapping;
09. 
10. 
11.@Controller
12.public class CookieController {
13. 
14.@RequestMapping("/cookie/make.do")
15.public String make(HttpServletResponse response){
16.response.addCookie(new Cookie("auth""1"));
17.return "cookie/made"//View경로
18.}
19. 
20.//@CookieValue 어노테이션은 클라이언트가 제공하는 쿠키 정보를 읽어들임
21. 
22.@RequestMapping("/cookie/view.do")
23.public String view(@CookieValue(value="auth",defaultValue="0") String auth){
24.System.out.println("auth 쿠키 : "+auth);
25.return "cookie/view";
26.}
27.}







cookie/made.jsp
01.<%@ page language="java" contentType="text/html; charset=UTF-8"
02.pageEncoding="UTF-8"%>
03.<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
04.<html>
05.<head>
06.<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
07.<title>쿠키</title>
08.</head>
09.<body>
10.쿠키 생성함
11.</body>
12.</html>





cookie/view.jsp 
01.<%@ page language="java" contentType="text/html; charset=UTF-8"
02.pageEncoding="UTF-8"%>
03.<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
04.<html>
05.<head>
06.<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
07.<title>쿠키</title>
08.</head>
09.<body>
10.쿠키 확인
11.</body>
12.</html>

출처 - http://javai.tistory.com/569








'Framework & Platform > Spring' 카테고리의 다른 글

Spring - Expression Language와 @Value  (0) 2012.05.24
spring - 메소드 파라미터  (0) 2012.05.24
Spring - security 예제  (0) 2012.05.23
Spring Security 이해  (1) 2012.05.23
Spring - @mvc -@Pattern  (0) 2012.05.23
Posted by linuxism
,