'spring'에 해당되는 글 9건

  1. 2011.08.22 bean property 간단하게 설정하기 : http://www.springframework.org/schema/p 활용 1
  2. 2011.08.19 ContentNegotiatingViewResolver 활용 : 하나의 RequestMapping 으로 JSP, JSON, JSONP 처리하기
  3. 2011.08.16 [추천 플러그인] SpringSource Tool Suite(STS) : Eclipse Spring Plugin 2
  4. 2011.08.03 <context:property-placeholder/> 를 사용할때 property file의 encoding 지정하기

bean property 간단하게 설정하기 : http://www.springframework.org/schema/p 활용

bean 의 property 를 설정하기 위해서
<bean class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
	<property name="maxUploadSize" value="10000000" />
</bean>
요런식으로 property 태그를 이용해서 설정한다.



프로퍼티를 설정하는 다른 방법으로 스프링 설정 xml 파일 상단에 xmlns:p="http://www.springframework.org/schema/p" 요런걸 추가해 주고
<bean class="org.springframework.web.multipart.commons.CommonsMultipartResolver"
      p:maxUploadSize="10000000"/>
요렇게도 설정할 수 있다.



가독성 측면에는 위에것 처럼 property 태그를 사용하는게 뭐 아무래도 쪼금 더 좋겠지만  그냥 위처럼 설정할 프로퍼티가 딸랑 하나밖에 없는 bean 은 심플하게 죠래 한줄로 설정하는것도 괜찮을것 같다.


property 에 value 를 설정할때는 p:maxUploadSize="값" 요렇게 설정하고
property 에 다른 bean을 참조시키게 할때는 p:maxUploadSize-ref="다른bean ID" 요것처럼 뒤에다 -ref 를 붙여주면 된다.
그리고 만약 이클립에 STS 가 설치되 있다면 p: 한 다음에 컨트롤 + 스페이스 키를 누르면 자동완성 기능도 동일하게 작동된다. 

ContentNegotiatingViewResolver 활용 : 하나의 RequestMapping 으로 JSP, JSON, JSONP 처리하기

뭔가를 맨들다 보면 데이터를 가져와서 대부분 JSP 를 이용해서 랜더링을 하게 되지만 똑같은 데이터를 ajax 호출을 통해 json 형식으로 받고 싶은 경우도 종종 있다.

그리고 JSONP 형식으로 같은 도메인이 아닌 다른 도메인으로 데이터를 제공하고 싶은 경우도 있다.

고럴때 ContentNegotiatingViewResolver 를 활용하면 하나의 리퀘스트 핸들러를 맹글어 놓고 맨 뒤에 URL 만 살짝 바꾸면 URL 에 따라 다른 View 를 이용해서 랜더링 시킬 수 있다.

예를 들어 

http://127.0.0.1:8080/test/view                  요럴땐 jsp 로 랜더링
http://127.0.0.1:8080/test/view.json           요럴땐 json 형식으로 랜더링
http://127.0.0.1:8080/test/view.jsonp         요럴땐 jsonp 형식으로 랜더링~

또 약간의 노력을 더해주면 xml 형식이나 rss 형식으로도 랜더링 시킬 수 있다.

죠런 기능을 구현하기 위해서 ContentNegotiatingViewResolver 를 사용하도록 설정해 주고 필요에 따라 AbstractView 클래스를 구현해서 원하는 View를 맹글면 된다.



스프링 설정파일
<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
	<!-- ViewResolver 우선순위 설정 -->
	<property name="order" value="1" />
	<property name="mediaTypes">
		<!-- 맵핑될 확장자 정의 -->
		<map>
			<entry key="json" value="application/json" />
			<entry key="jsonp" value="javascript/jsonp" />
		</map>
	</property>

	<property name="defaultViews">
		<list>
			<!-- JSON 요청을 처리할 뷰 -->
			<bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView"/>
			
			<!-- JSONP 요청을 처리할 뷰 -->
			<bean class="stove99.views.JSONPView">
				<property name="contentType" value="javascript/jsonp"/>
			</bean>
		</list>
	</property>
	<property name="ignoreAcceptHeader" value="true" />
</bean>

<!-- 맵핑되는 확장자가 없을때 JSP 로 뷰 처리 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
	<property name="order" value="2" />
	<property name="prefix" value="/WEB-INF/views/"/>
	<property name="suffix" value=".jsp"/>
</bean>
mediaTypes에 정의된 entry 들은 URL 맨 뒤에 붙은 확장자와 mediaType 을 설정한다. 여기에서 설정된 mediaType 정보를 바탕으로 아래쪽 defaultViews 목록에 정의된 View 들 중에서 랜더링 가능한 View 를 찾아서 그 View 로 랜더링 시킨다. 뭐 설명이 허접하긴 하지만 내가 이해한 바로는 그렇다.



stove99.views.JSONPView 클래스 소스
package stove99.views;

import java.io.Writer;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.codehaus.jackson.map.ObjectMapper;
import org.springframework.web.servlet.view.AbstractView;

public class JSONPView extends AbstractView{

	@Override
	protected void renderMergedOutputModel(Map<String, Object> model, 
                                               HttpServletRequest request,
                                               HttpServletResponse response) throws Exception {
		String callback = request.getParameter("callback");
		ObjectMapper om = new ObjectMapper();
		String json = om.writeValueAsString(model);
		
		Writer out = response.getWriter();
		out.append(callback).append("(").append(json).append(")");
	}
}


컨트롤러 소스
package stove99.controller;

import java.util.HashMap;
import java.util.Map;

import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/test/*")
public class TestController {

	@RequestMapping
	public void view(ModelMap model) {
		Map<String, String> data = new HashMap<String, String>();
		data.put("data1", "value1");
		data.put("data2", "value2");
		data.put("data3", "value3");

		model.addAttribute("model", data);
	}
}

테스트 결과 화면

JSP 로 랜더링


JSON 으로 랜더링


JSONP로 랜더링


ContentNegotiatingViewResolverTest.war


[추천 플러그인] SpringSource Tool Suite(STS) : Eclipse Spring Plugin

이클립에서 스프링으로 개발할때 편리하게 맹글어 주는 플러그인이다.



설치방법 

STS 를 설치전 Window > Preferences > Install/Update 에 가서 Import 버튼을 클릭해서 bookmark.xml 을 import 시켜줘야 한다.

[Eclipse Indigo 용 bookmark.xml : http://dist.springsource.com/release/TOOLS/composite/e3.7/bookmarks.xml]

[Eclipse Helios 용 bookmark.xml : http://dist.springsource.com/release/TOOLS/composite/e3.6/bookmarks.xml]



자기 이클립 버전에 맞는 bookmark.xml 파일을 다운로드 받아 import 시켜준다.

bookmark를 추가해준 후 목록






추가해 준 다음 Help > Install New Software 에 가서 업데이트 사이트 목록중 SpringSource Update Site for Eclipse 3.7 어쩌고 하는걸 목록중에 선택하면 조회되는 업데이트 가능 목록들 중에 Core / STS 를 체크한다. 뭐 기타 다른 필요한 것들이 있으면 더 체크해도 된다. 

※ 나는 이클립 인디고에서 설치했기 때문에 Eclipse 3.7 을 선택한 것이고, Helios 용 bookmark.xml을 Import 한 사람들은 목록에 Eclipse 3.6을 선택하면 된다.

SpringSource Update Site for Eclipse 3.7 선택


고런 다음 Next~ Next~ 해서 쭉 진행해서 설치완료후 이클립을 껏다켜면 설치가 끝난다. 설치하는 중간에 경고창이 하나 뜰 수도 있는데 그냥 무시하고 예~ 를 선택하면 된다.





이 플러그인을 설치하면 이클립 설정파일을 편집할때 기본 XML 에디터가 아니라 스프링 설정파일 전용 에디터가 열린다. 

내가 주로 쓰는 기능으로 bean 을 설정하고 그 bean 에 어떤 property 들이 있는지 파악할 수 있는 Code Assist 기능이다.


예를들어 컨트롤 + 스페이스를 누르면 org.springframework.web.servlet.view.InternalResourceViewResolver bean 에서 설정가능한 모든 property 목록들이 뜬다. 초보자인 내 개인적 입장에서 제일 마음에 드는 기능이다.

bean property code assist 기능







위 그림에서 보면 디폴트 xml 에디터 와는 다르게 아래쪽에 여러가지 탭이 추가되 있다.
두번째로 자주 쓰는 기능은 beans 탭에서 bean을 추가하는 기능이다.

요 탭에 있는 New Bean 버튼을 클릭하면 bean을 추가할 수 잇는 팝업창이 하나 뜨는데 여기서 Class 를 추가하기 위해 Browse 버튼을 클릭하면 쉽게 Class 들을 검색할 수 있다.

뭐 하는건지는 직접해보면 안다~

검색어란에 contentn 만 입력해 줘도 ContentNegotiatingViewResolver 뽓 검색해서 타이핑 하기 부담스러운 패키지명과 클래스명을 쉽게 입력할 수 있다.

bean 추가를 쉽게~~~


※ bean으로 설정할 Class 가 어떤 패키지에 있는지 알고 있는 사람들은 xml 에서 <bean class="org.  한 다음에 컨트롤 스페이스를 해서 쭉쭉 찾아 들어가도 된다.






다음으로 Namespaces 탭은 스프링 설정파일에 context, mvc 같은 네임스페이스 설정 부분을 추가해 주는 기능이다. 어데서 복사하면 되지만 체크만 해줘도 간단히 네임스페이스 설정을 추가할 수 있다. 그래서 세번째로 간간히 사용하는 기능이다.

Spring 설정파일 namespace 편집






그밖에 현재 설정된 bean 간의 관계도도 약간 비쥬얼 하게 볼 수 있다.

Bean 관계 그래프 보기



이것말고도 쓸만하고도 편리하면서 유용한 기능이 많겠지만 아직 파악이 덜 관계로~






※ 기타
기존 프로젝트에 Spring 프로젝트 라고 표시해주기
프로젝트명에서 오른쪽 버튼 클릭 > Spring TOOLS > Add Spring Nature 를 해주면 프로젝트 명 옆에 쪼그만하게 s 라고 표시되면서 스프링 프로젝트라고 표시된다.

기존 프로젝트를 Spring 프로젝트로 설정하기


설정을 해주면 프로젝트에 s 아이콘이 붙는다.



원래는 죠렇게만 해주면 프로젝트에 포함된 Spring bean 설정파일을 인식해서 s 아이콘을 붙여줬던것 같은데 이상하게 잘 안됬다.

아무튼 설정파일까지 인식시킬려면 설정파일을 선택후 마우스 오른쪽 버튼 클릭해서 Spring Tools > Add Bean Configuration File 을 해주면 설정파일로 인식시킬수 있다.

bean 설정파일 인식시키기


설정해 주면 파일에도 s 아이콘이 붙는다.



죠렇게 설정해주면 설정파일에도 s 아이콘이 붙고, 에디터로 열어보면 Bean Graph 탭이 추가된다.

 

<context:property-placeholder/> 를 사용할때 property file의 encoding 지정하기


config.property
#한글로 된 프로퍼티값
attach.path=c:\첨부파일\ 
 위처럼 property 파일에 있는 값들중 한글값은 제대로 받아지지 않는다.



 뭐 이것저것 받을 수 있는 방법이야 많겠지만 많은 방법들 중 한가지로 요렇게도 할 수 있다.
<bean id="fileEncoding" class="java.lang.String">
	<constructor-arg value="UTF-8"/>
</bean>
 
<context:property-placeholder location="classpath:config.properties" file-encoding="fileEncoding"/>


file-encoding="UTF-8" 요렇게만 하면 될줄 알았는데 그렇게 설정하니 No bean named 'UTF-8' is defined 라나 뭐라나~

어렴풋이 대략 찾아보니 버그라고 쫑알쫑알 거리는 사람들이 있던데 버근지 원래 저래 하면 안되는건지 나는 잘 모르겠다.

더 찾아 보기도 귀찮고~~~



원래는
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
	<property name="locations" value="classpath:config.properties"/>
	<property name="fileEncoding" value="UTF-8"/>
</bean>
요렇게 썼었는데 <context:property-placeholder/> 이게 왠지 더 있어 보이고 한 라인으로 끝낼 수 있을것 같아서 바꿨는데

file-encoding="UTF-8" 이게 안되서 설정을 위한 라인수가 더 길어져 버렸다~
 
prev 1 2 next