'Java/Spring'에 해당되는 글 12건

  1. 2018.01.23 Spring4 웹 어플리케이션 생성하기
  2. 2017.12.19 logback library Exception 출력
  3. 2015.03.12 에러 콘트롤러를 만들어 로그를 찍어보자
  4. 2014.03.03 Spring + Maven 프로젝트 만들기
  5. 2012.08.01 dwr 오류
  6. 2012.06.28 스프링 버젼 확인하기
  7. 2012.06.28 form으로 파일 전송
  8. 2012.06.22 spring + freemarker
  9. 2011.05.31 Spring 3.0 프로그래밍 챕터3
  10. 2011.05.31 Spring 3.0 프로그래밍 챕터2

Spring4 웹 어플리케이션 생성하기

Java/Spring 2018.01.23 18:59

책을 보면서 작업하는데, 내용이 약간 달라서 수정하였다.

윈도우에서 2가지 방법으로 생성해 보겠다.

환경은 다음과 같다.

  • jdk1.8.0_45
  • Spring Tool Suite Version: 3.9.2.RELEASE

STS를 설치하고 툴바에서 Dashboard를 클릭하거나 메뉴에서 [Help>Dashboard]를 클릭하면 다음 화면이 나온다.


여기서 오른쪽 하단에 보면 Manage 안에 IDE EXTENSIONS 버튼을 누르면 다음과 같은 새창이 뜬다.


이미 설치하여 보이지는 않는데 다음 두개의 라이브러리를 설치하자.

  • Groovy Compiler 2.4
  • Groovy-Eclipse Feature
  • Gradle IDE

참고 문서에는 이름이 다르게 나와있으나 비슷한 것으로 설치해서 진행한다. 원본의 라이브러리는 다음과 같다.

  • Groovy 2.4 Compiler for Groovy-Eclipse
  • Groovy-Eclipse
  • Gradle Support

이제 프로젝트를 생성해보자.

메뉴에서 [File > New > Spring Starter Project]를 클릭한다.

그리고 Service URL에 http://start.spring.io 주소를 입력하면 다음과 같은 화면이 나온다.


일단 이 설정 그대로 생성 Next를 누르면 다음 화면이 나온다.


Web 옆에 체크박스를 클릭하던가, Available 안에서 [Web>Web]을 선택하고 Finish를 클릭하면 프로젝트가 생성된다. 여기서 여러가지 추가할 수 있지만, 일단 웹 어플리케이션 생성이기 때문에 Web으로 해보자.


생성된 프로젝트에서 마우스 오른쪽 버튼을 누르고 나오는 메뉴나 상단 메뉴에서 [Run As > Spring Boot App] 을 클릭하면 콘솔이 올라가면서 웹 서버가 올라간다.


이렇게 간단히 프로젝트를 생성할 수 있다. http://localhost:8080/ 주소를 브라우저에 입력하면 에러 페이지이지만 프로젝트가 올라간 것을 알 수 있다.


그리고 웹에서도 프로젝트를 생성할 수 있는데 아래 사이트에 접속해보자.

http://start.spring.io/



동일한 정보를 입력하고 Generate Project 버튼을 클릭하면 zip 파일을 다운 받을 수 있다.















'Java > Spring' 카테고리의 다른 글

Spring4 웹 어플리케이션 생성하기  (0) 2018.01.23
logback library Exception 출력  (0) 2017.12.19
에러 콘트롤러를 만들어 로그를 찍어보자  (0) 2015.03.12
Spring + Maven 프로젝트 만들기  (0) 2014.03.03
dwr 오류  (0) 2012.08.01
스프링 버젼 확인하기  (0) 2012.06.28
Trackbacks 0 : Comments 0

logback library Exception 출력

Java/Spring 2017.12.19 17:31

간만에 로그 설정을 하면서 logback이 좋다고 해서 사용해보려고한다.

일단 대표적인 장점으론 속도가 log4j보다 10배정도 빠르다고 한다.


설정 중 문제가 생겼다. 설정한데로 로그는 잘 나오는데, 라이브러리에 있는 항상 보던 로그들이 하나도 찍히지 않는다. 해결방법은 configuration 태그에 debug를 true로 설정하면 된다. 

<configuration debug="true" scan="true" scanPeriod="30 seconds">


logger로 설정하면 된다고 되어 있는데, debug 속성값이 디폴트가 false로 확인할 때는 library Exception이 출력되지 않았다. debug 속성값을 true하는게 좋을 듯하다. 로그가 없으니 오류나도 확인할 방법이 없다. 하나하나 전부 로깅해보기에는 작업량이 많을 경우 비효율적이다.


참고 페이지

https://stackoverflow.com/questions/37431945/spring-exceptions-do-not-log-to-a-file

'Java > Spring' 카테고리의 다른 글

Spring4 웹 어플리케이션 생성하기  (0) 2018.01.23
logback library Exception 출력  (0) 2017.12.19
에러 콘트롤러를 만들어 로그를 찍어보자  (0) 2015.03.12
Spring + Maven 프로젝트 만들기  (0) 2014.03.03
dwr 오류  (0) 2012.08.01
스프링 버젼 확인하기  (0) 2012.06.28
Trackbacks 0 : Comments 0

에러 콘트롤러를 만들어 로그를 찍어보자

Java/Spring 2015.03.12 15:50

web.xml에 다음 코드를 추가하면 간단히 에러 페이지로 이동할 수 있다.

 <error-page>

  <error-code>404</error-code>

  <location>/error/error.html</location>

 </error-page>


 <error-page>

  <error-code>500</error-code>

  <location>/error/error.html</location>

 </error-page>


그런데 나는 error.html을 컨트롤러로 구현하여 로그를 찍어보고 싶었다. 에러코드, URI, 에러 메시지등.

가능해보여서 찾다가보니 쉽게 나오지 않는다. 일반적인 방식이 아닌모양이다. 순수 자바로 구현한 예제를 찾았다.

그렇게 해서 구현한 것이 다음과 같다.

Throwable throwable = (Throwable)req.getAttribute("javax.servlet.error.exception");

Integer statusCode = (Integer)req.getAttribute("javax.servlet.error.status_code");

String servletName = (String)req.getAttribute("javax.servlet.error.servlet_name");

if (servletName == null){

servletName = "Unknown";

}

String requestUri = (String)req.getAttribute("javax.servlet.error.request_uri");

if (requestUri == null){

requestUri = "Unknown";

}


LOG.info("!!!!!!!  ##### Error information #####");

LOG.info("!!!!!!!  The status code : " + statusCode);

LOG.info("!!!!!!!  Servlet Name : " + servletName);

LOG.info("!!!!!!!  The request URI: " + requestUri );

LOG.info("!!!!!!!  The exception message: " + throwable.getMessage());

LOG.info("!!!!!!!  Exception Type : " + throwable.getClass().getName() );


request를 이용해서 에러코드인 서버의 상태코드, 서블릿 이름, URI, 에러 메시지, 에러 타입등을 알 수 있다.

그런데 404 코드의 경우에는 throwable 이 오류나기 때문에 다음과 같이 해주면 된다.

LOG.info("!!!!!!!  ##### Error information #####");

LOG.info("!!!!!!!  The status code : " + statusCode);

LOG.info("!!!!!!!  Servlet Name : " + servletName);

LOG.info("!!!!!!!  The request URI: " + requestUri );

if(statusCode == 500){

LOG.info("!!!!!!!  The exception message: " + throwable.getMessage());

LOG.info("!!!!!!!  Exception Type : " + throwable.getClass().getName() );

}


이렇게 하면 문제없이 동작이 된다. 상태코드를 확인하다가 내가 모르는 내용이 더 있다는 것을 알았다. 5XX 상태코드는 서버 오류였다. 그래서 다음과 같이 수정해주면 좋을것 같다.

LOG.info("!!!!!!!  ##### Error information #####");

LOG.info("!!!!!!!  The status code : " + statusCode);

LOG.info("!!!!!!!  Servlet Name : " + servletName);

LOG.info("!!!!!!!  The request URI: " + requestUri );

if( (statusCode/100) == 5 ){

LOG.info("!!!!!!!  The exception message: " + throwable.getMessage());

LOG.info("!!!!!!!  Exception Type : " + throwable.getClass().getName() );

}


아직 다른 오류로 확인된건 없지만 동작은 잘 된다. 역시 훌륭한 사람은 넘처나는 구나. 훌륭해 지자.


참고 URL

http://www.tutorialspoint.com/servlets/servlets-exception-handling.htm

http://www.journaldev.com/1973/servlet-exception-and-error-handling-example-tutorial

http://ko.wikipedia.org/wiki/HTTP_%EC%83%81%ED%83%9C_%EC%BD%94%EB%93%9C


'Java > Spring' 카테고리의 다른 글

Spring4 웹 어플리케이션 생성하기  (0) 2018.01.23
logback library Exception 출력  (0) 2017.12.19
에러 콘트롤러를 만들어 로그를 찍어보자  (0) 2015.03.12
Spring + Maven 프로젝트 만들기  (0) 2014.03.03
dwr 오류  (0) 2012.08.01
스프링 버젼 확인하기  (0) 2012.06.28
Trackbacks 0 : Comments 0

Spring + Maven 프로젝트 만들기

Java/Spring 2014.03.03 18:03

간만에 새 프로젝트를 만들려고 하니 잘 생각이 안나는 것이.. 하는 김에 플로깅해본다.


STS + MAVEN은 전에 남겼으니 이 두가지가 설치됬다는 가정하에 진행하겠다.


메뉴 [File] -> [New]에 보면 Spring Project가 있다. 선택하자. 보통은 바로 보이지만 안보일 경우에 [Other]를 선택하고 상단에 spring이라고 치면 관련 목차가 나온다.



Next를 누르면 아래와 같은 화면이 나오는데 Spring MVC Project를 선택하면된다.


이제 페키지를 입력해야하는데 적어도 3단계는 넣어줘야 완료할 수 있다.



여기까지 하면 기본적인 HomeController가 생성된다.

'Java > Spring' 카테고리의 다른 글

logback library Exception 출력  (0) 2017.12.19
에러 콘트롤러를 만들어 로그를 찍어보자  (0) 2015.03.12
Spring + Maven 프로젝트 만들기  (0) 2014.03.03
dwr 오류  (0) 2012.08.01
스프링 버젼 확인하기  (0) 2012.06.28
form으로 파일 전송  (0) 2012.06.28
Trackbacks 2 : Comments 0

dwr 오류

Java/Spring 2012.08.01 12:06

tomcat에서 아래의 오류로그가 나오고 있다. 허나.... 로컬에서는 에러가 없다. 삽질을 엄청나게 하며 찾고 있다.

2012-08-01 12:03:26,706 ERROR [org.springframework.web.context.ContextLoader] - <Context initialization failed>

org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Line 11 in XML document from ServletContext resource [/WEB-INF/ajax-layer.xml] is invalid; nested exception is org.xml.sax.SAXParseException: cvc-complex-type.2.4.c: The matching wildcard is strict, but no declaration can be found for element 'dwr:remote'.



원인을 찾았다. 하지만 정확한 이유는 알수가 없다. 왜냐고? 다른 프로젝트에서는 잘 동작하기 때문이다.

<bean id="dwr" class="dwrService">

   <property name="txService"><ref bean="txService" /></property>

   <property name="txAuthService"><ref bean="txAuthService" /></property>

</bean>

이렇게 수정하니 잘 된다. 일딴 환경을 설명하자면 dwr은 별도의 파일로 관리되고 있어, dwr.xml이외의 별도 파일이 존재한다. 그래서 거기에 각종 bean을 설정해둔다. 문제는 여기에 있다. 왜 로컬은 되고 서버는 안되냐.... 모른다. 추측은 있지만 정확한게 아니라 언급하지 않겠다.


원래 설정은 다음과 같다.

<bean id="dwr" class="dwrService">

   <property name="txService"><ref local="txService" /></property>

   <property name="txAuthService"><ref local="txAuthService" /></property>

</bean>

local이라는 설정이 문제였다. 문제는 다른 프로젝트는 잘 돌아간다는거...설정만 보면 완벽히 같은 프로젝트이다.

근데 안된다. ㅡㅡ

알 수 없다. bean은 당연히 될거라 생각해서 그런지 바꾼다는 생각보다 왜 안되는지 궁금하다.

'Java > Spring' 카테고리의 다른 글

에러 콘트롤러를 만들어 로그를 찍어보자  (0) 2015.03.12
Spring + Maven 프로젝트 만들기  (0) 2014.03.03
dwr 오류  (0) 2012.08.01
스프링 버젼 확인하기  (0) 2012.06.28
form으로 파일 전송  (0) 2012.06.28
spring + freemarker  (0) 2012.06.22
Trackbacks 0 : Comments 0

스프링 버젼 확인하기

Java/Spring 2012.06.28 17:48

스프링 버젼을 확인할 필요가 있어서 찾아보았다.

System.out.println( org.springframework.core.SpringVersion.getVersion() );


'Java > Spring' 카테고리의 다른 글

Spring + Maven 프로젝트 만들기  (0) 2014.03.03
dwr 오류  (0) 2012.08.01
스프링 버젼 확인하기  (0) 2012.06.28
form으로 파일 전송  (0) 2012.06.28
spring + freemarker  (0) 2012.06.22
Spring 3.0 프로그래밍 챕터3  (0) 2011.05.31
Trackbacks 0 : Comments 0

form으로 파일 전송

Java/Spring 2012.06.28 13:42

파일을 전송하기 위해선 다들 아시겠지만 form을 사용하면 된다. 


화면

<form id="formXml" name="formXml" method="post" action=""  enctype="multipart/form-data" >

<input type="file" name="xml_file" id="xml_file"/>

//--- submit(); --- //

</form>

다들 사용하는 방법이라 딱히 설명할게 없다. submit은 자바스크립트로 어디서든 가능하니 뺐다. 본인은 다른 곳에서 submit한다.


자바에서 처리하는 방법은 여러가지 있다. 

방법 1.

MultipartFile mf = (MultipartFile) ((MultipartHttpServletRequest) req).getFileMap().get("xml_file");

InputStream is = mf.getInputStream();

이건 문제가 좀 있다. xml_file에 데이터가 없으면 오류가 발생한다. 예외처리를 하면 되지만 왠지 부족해보인다. 하지만 가장 간단하다. 사용자가 딴짓을 할게 이유가 없다면 자바스크립트로 예외처리를 하면 되겠다. 아니면 별도의 파라메터로 체크를 하던가... 개인적으론 둘다 해주면 좋다고 본다.


방법2.

DefaultMultipartHttpServletRequest multipartRequest = new DefaultMultipartHttpServletRequest(request);

MultipartFile multipartFile = multipartRequest.getFile("file");

사용해보지 못했다. 현재 사용하는 스프링 버젼을 확인해보니 1.1.1이라는 놀라운 사실과 2.5부터 지원되는 클래스라는 사실을 알았다.... 구지 버젼업으로 뒤엎는 방법은 사용하고 싶지 않아서 테스트하지 않았다. 다음에 해봐야지...


찾다보니 다양한 방법이 있었다. 하루 날잡아서 전부 테스트해보고 싶다.

'Java > Spring' 카테고리의 다른 글

dwr 오류  (0) 2012.08.01
스프링 버젼 확인하기  (0) 2012.06.28
form으로 파일 전송  (0) 2012.06.28
spring + freemarker  (0) 2012.06.22
Spring 3.0 프로그래밍 챕터3  (0) 2011.05.31
Spring 3.0 프로그래밍 챕터2  (0) 2011.05.31
Trackbacks 0 : Comments 0

spring + freemarker

Java/Spring 2012.06.22 15:01

테스트를 위해 로컬에 환경을 구현해보았다.


freemarker 라이브러리 다운 페이지

http://freemarker.sourceforge.net/freemarkerdownload.html


1. web.xml

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">

<display-name>Sample_Spring3.0</display-name>


<welcome-file-list>

<welcome-file>/html/test.html</welcome-file>

</welcome-file-list>


<!-- Spring Dispatcher Servlet //-->  

<servlet>

<servlet-name>spring</servlet-name>

<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

<load-on-startup>1</load-on-startup>

</servlet>

<servlet-mapping>

<servlet-name>spring</servlet-name>

<url-pattern>*.free</url-pattern>

</servlet-mapping>

<!-- //Spring Dispatcher Servlet -->


<!-- Encoding // -->  

<filter>

<filter-name>encodingFilter</filter-name>

<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>

<init-param>

<param-name>encoding</param-name>

<param-value>UTF-8</param-value>

</init-param>

</filter>

    <filter-mapping>

        <filter-name>encodingFilter</filter-name>

        <url-pattern>*</url-pattern>

    </filter-mapping>

<!-- // Encoding -->

   

</web-app>


오랜만에 하니 헷갈리는 부분이 있었다. servlet에서 url-pattern을 *로 설정하는 실수를 했더니 모든게 서블릿으로 동작하고 view와 연결이 안되고 404 에러가 나온다. 하지만 controller는 타고 넘어간다. 주의해야겠다.


2. spring-servlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
    http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/mvc 
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-3.0.xsd">

<!-- com.skyunoe.spring 패키지의 하위 bean 자동 등록 -->
<context:component-scan base-package="rsa.controller" />
<!-- To enable @RequestMapping process on type level and method level -->
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />
<!--/ configration set start /-->
    <bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
        <property name="templateLoaderPath"><value>/WEB-INF/freemarker/</value></property>
        <property name="freemarkerSettings">
            <props>
                <prop key="default_encoding">utf-8</prop>
                <prop key="template_update_delay">1</prop>
                <prop key="number_format">#.#######</prop>
                <prop key="date_format">yyyy년 MM월 dd일</prop>
                <prop key="time_format">a hh시 mm분 ss초</prop>
                <prop key="datetime_format">yyyy년 MM월 dd일 hh시 mm분 a</prop>
            </props>
        </property>
        <property name="freemarkerVariables">
            <props>
<prop key="HOME">http://localhost.home.com</prop>
            </props>
        </property>
    </bean>
    
    <!--/ view resolver /-->
<bean id="viewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
   <property name="order" value="2" />
        <property name="cache"><value>true</value></property>
        <property name="contentType"><value>text/html; charset=utf-8</value></property>
        <property name="exposeSpringMacroHelpers"><value>true</value></property>
</bean>
</beans>



3. TestController 작성 : /src/rsa/controller/TestController.java

package rsa.controller;


import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.servlet.ModelAndView;


@Controller

public class TestController {


//http://localhost.home.com:8080/rsa/test.jsp

@RequestMapping("/rsa/test")

public ModelAndView test(){

String message = "Hello World 한글";

System.out.println("/rsa/test --> 실행됨");

//ModelAndView mnv = new ModelAndView();

//mnv.setViewName("/rsa/test");

//mnv.addObject("message", message);

//return mnv;

return new ModelAndView("/rsa/test.ftl", "message", message);

}


}



4. view 작성 : /WebContent/WEB-INF/freemarker/rsa/test.ftl

<#ftl encoding="utf-8"/>

<html>

<head>

</head>

<h2>Spring3 Test Page</h2>

<body>

    Controller return value : ${message}

</body>

</html>



http://localhost.home.com:8080/rsa/test.free 으로 동작을 확인했다.



참고로 2가지 작업이 필요한데

본인은 로컬에서 돌릴 때, hosts 파일에 localhost.home.com을 도메인으로 만들고 test한다.

톰켓 설정은 실행한 프로젝트를 root( / )로 설정한다.



freemarker를 정식으로 공부해보고 싶지만 많이 사용하지 않는듯해서 API문서만 보고있다. 개인적으로는 jsp보다 좋은듯하다.



'Java > Spring' 카테고리의 다른 글

스프링 버젼 확인하기  (0) 2012.06.28
form으로 파일 전송  (0) 2012.06.28
spring + freemarker  (0) 2012.06.22
Spring 3.0 프로그래밍 챕터3  (0) 2011.05.31
Spring 3.0 프로그래밍 챕터2  (0) 2011.05.31
Spring 3.0 프로그래밍 챕터1  (0) 2011.05.23
Trackbacks 0 : Comments 0

Spring 3.0 프로그래밍 챕터3

Java/Spring 2011.05.31 16:46
03 메시지 및 이벤트 처리

03-01 MessageSource를 이용한 국제화 처리

 웹 어플리케이션은 화면에 다양한 텍스트 메시지를 출력한다. 게시글 목록을 보여 줄때 각 칼럼에 '제목', '번호'와 같은 메시지를 사용하고,특정 기능을 성공적으로 수행한경우에도  그 결과를 메시지로 출력해서 알려 주게된다.만약 개발해야 할 어플리케이션이 다국어를 지원해야 한다면, 각 언어에 맞는 메시지가 화면에 출력되어야 할 것이다.
 
메시지의 국제화를 지원하기 위해 org.springframework.context.MessageSource 인터페이스를 제공하고 있다.아래는 인터페이스 정의한 코드이다.

public interface MessageSource{

      String getMessage(String code, Object[] args, Locale locale)

throws NoSuchMessageException;

      String getMessage(String code, Object[] args,String defaultMessage, Locale locale)

throws NoSuchMessageException;

      String getMessage(MessageSourceResolvable resolvable, Locale locale)

throws NoSuchMessageException;


 ApplicationContext는 MessageSource 인터페이스를 상속받고 있다. 따라서 위 세가지 메서드를 이용하면  ApplicationContext 로부터 지역 및 언어에 알맞은 메시지를 가져올 수 있게 된다.

 ApplicationContext 를 이용하여 메시지를 가져오기위하여 아래와 같이 스프링 설정 파일에 이름이 'messageSource' 인 빈 객체를 정의해 주어야 한다.

 

<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">

<property name="basename">

<value>message.greetion</value>

</property>

</bean>

 
 
ResourceBundleMessageSource 클래스는 MessageSource 인터페이스의 구현 클래스로서  java.util.ResourceBundle을 이용하여 메시지를 읽어오는 MessageSource구현체이다.
 위설정에서 basename 프로퍼티의 값은 메시지를 로딩할 때 사용할  ResourceBundle의 베이스 이름을 의미한다.
 베이스 이름은 클래스를 포함한 완전한 이름이어야 한다. 따라서 위의 message.greetion 값은 message 패키지에 있는  greetion 프로퍼티 파일로부터 메시지를 가져온다는 것을 의미한다.
 한 개 이상의 프로퍼티 파일로부터 메시지를 로딩하고 싶다면, basenames 프로퍼티에<list>태그를 이용하여 베이스 이름 목록을 전달하면 된다.

 <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">

 <property name="basenames">

<list>

<value>message.greeting</value>

<value>message.error</value>

</list>

</property>

 </bean>


ResourceBundle은 프로퍼티 파일의 이름을 이용하여 언어 및 지역에 따른 메시지를 로딩한다. 예를 들어, message 프로퍼티 파일은 지원할 언어나 지역에 따라 다음과같은 파일명을 갖게 된다.


message.properties
:기본 메시지,시스템의 언어 및 지역에 맞는 프로퍼티 파일이 존재 하지 않을경우에 사용된다.

message_en.properties:영어

message_ko.properties:한글

message_en_UK.properties:영국을 위한 영어 메시지

 각 프로퍼티 파일에 다음과 같이 동일한 키에 대하여 각 언어에 알맞은 메시지를 포함시킨다.

#message_en.properties 파일
greeting=Hello!

#message_ko.properties 파일
greeting=\uc548\ub155\ud558\uc138\uc694!

※ 자바의 프로퍼티 파일은 유니코드를 이용하여 값을 표시해 주어야한다.

 MessageSource빈 객체를 등록했다면, 다음과 같이 ApplicationContext.getMessage()메서드를 이용하여 메시지를 로딩할수있다.

Local locale = Locale.getDefault();

String greeting =  context.getMessage("greeting",new Object[0],locale);

 

Locale englishLocale = Locale.ENGLISH;

String englishGreeting = context.getMessage("greetion",new Object[0],englishLocale);

 
 ■ 빈객체에서 메시지 이용하기

빈 객체에서 스프링이 제공하는 MessageSource를 사용하려면 다음 두가지 방법중 한 가지를 사용하면 된다.

     1.ApplicationContextAware 인터페이스를 구현한 뒤, setApplicationContext()메서드를 통해 전달받은
     ApplicationContext의 getMessage() 메서드를 이용하여 메시지 사용.

     2.MessageSourceAware 인터페이스를 수현한 뒤, setMessageSource() 메서드를 통해 전달받은 
     MessageSource의 getMessage()메메서드를 이용하여 메시지 사용.


MessageSourceAware 인터페이스를 사용하는 법을 살펴보면,

org.springframework.context.MessageSourceAware 인터페이스는 다음과 같이 MessageSource를 전달받을 수 잇는 메서드를 정의하고 있다.

 public interpace MessageSourceAware{ void setMessageSource(Messagesource messageSource)}

 
 MessageSourceAware 인터페이스를 구현한 빈 클래스는 setMessageSource()메서드를 통해 전달받은 MessageSource를 이용하여 필요한 메시지를 가져와 사용할수있다.

public class LoginProcessor implements MessageSourceAware{

private MessageSource messageSource;

 

public void setMessageSource(MessageSource messageSource){

this.messageSource = messageSource;

}

 

public void login(String username,String password){

...

Object[] args = new String[]{username};

String failMessage = messageSource.getMessage("login.fail",args,locale);

...

}

}



03-02 스프링 컨텍스트 이벤트

 ApplicationContext는 이벤트를 발생시킬 수 있는 publishEvent() 메서드를 제공하고 있다.

void publishEvent(ApplicationEvent event)


 org.springframework.context.ApplicationEvent 타입의 객체를 전달받는다.
 ApplicationEvent는 추상 클래스로서 다음과 같이 객체를 전달받는다.

 public abstract class ApplicationEvent extends EventObject {

...


public ApplicationEvent(Object source) {

super(source);

this.timestamp = System.currentTimeMillis();

}


public final long getTimestamp() {

return this.timestamp;

}

}


ApplicationContext를 통해 이벤트를 발생시키고 싶은 빈은 ApplicationContextAware 인터페이스를 구현한 뒤ApplicationContext를 전달받아 이벤트를 발생시키면 된다.

public class Member implements ApplicationContextAware {

private ApplicationContext context;


public void setApplicationContext(ApplicationContext context) {

this.context = context;

}

public void regist(Member member) {

...

context.publishEvent(new MemberRegistrationEvent(this, member));

}

}


이벤트 클래스는 ApplicationContextEvent 클래스를 상속받아 구현한다.

public class MemberRegistrationEvent extends ApplicationEvent {

private Member member;

public MemberRegistrationEvent(Object source, Member member) {

super(source);

this.member = member;

}

public Member getMember() {

return member;

}

}


ApplicationContext가 발생시킨 이벤트를 처리할 클래스는 ApplicationListener 인터페이스를 알맞게 구현한다.

public interface ApplicationListener<E extends ApplicationEvent> extends EventListener {

void onApplicationEvent(E event);


ApplicationContext는 이벤트 발생시 ApplicationListener 인터페이스를 구현한 빈 객체의 onApplicationEvent() 메서드를 호출함으로써 이벤트를 전달한다.

public class CustomEventListener implements ApplicationListener<MemberRegistrationEvent> {

@Override

public void onApplicationEvent(MemberRegistrationEvent event) {

   // 원하는 타입의 이벤트만을 처리.

}

}


ApplicationListener 인터페이스를 구현한 클래스를 빈으로 등록해주면 ApplicationContext가 발생한 이벤트를 전달받아 처리할 수 있게 된다.

<beans xmlns="http://www.springframework.org/schema/beans"

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">


...

<bean id="customEventListener"

class="madvirus.spring.chap03.CustomEventListener" />

</beans>

 
스프링은 기본적으로 ApplicationContext와 관련된 이벤트를 발생시키고 있는데, 다음과 같다.

 org.springframework.context.event.ContextRefreshedEvent
- ApplicationContext가 초기화되거나 설정을 재로딩해서 초기화를 재수행할 때 발생.
 org.springframework.context.event.ContextClosedEvent
- ApplicationContext가 종료될 때 발생.
 org.springframework.context.event.ContextStartedEvent
- ApplicationContext가 시작될 때 발생.
 org.springframework.context.event.ContextStoppedEvent
- ApplicationContext가 중지될 때 발생.

※ 스프링 2.5버전까지는 Application 인터페이스에 제너릭이 적용되어 있지 않았기 때문에, 아래와 같이 instanceof 연산자를 이용해서 일일이 이벤트 객체의 타입을 비교했어야 했다.

public class CustomEventListener implements ApplicationListener {

@Override

public void onApplicationEvent(ApplicationEvent event) {

if(event instanceof CustomEvent) {

   // 원하는 타입의 이벤트만을 처리.

}

}

}


하지만 스프링 3.0 버전부터는 ApplicationListener에 제너릭이 적용되었기 때문에, 지정한 타입만 처리하는 리스너를 작성할 수 있게 되었다.

정리하면
 1. ApplicationEvent를 상속받은 이벤트 클래스를 구현.
 2. ApplicationListener 인터페이스를 구현한 클래스를 만들어 onApplicationEvent 메서드를 구현.
 3. xml 설정파일에 ApplicationListener 인터페이스를 구현한 클래스를 등록.
 4. ApplicationContext의 객체를 생성시켜서 publishEvent 메서드를 통해 이벤트 발생시킴.





































































'Java > Spring' 카테고리의 다른 글

form으로 파일 전송  (0) 2012.06.28
spring + freemarker  (0) 2012.06.22
Spring 3.0 프로그래밍 챕터3  (0) 2011.05.31
Spring 3.0 프로그래밍 챕터2  (0) 2011.05.31
Spring 3.0 프로그래밍 챕터1  (0) 2011.05.23
XML을 출력하자  (0) 2011.05.20
Trackbacks 2 : Comments 0

Spring 3.0 프로그래밍 챕터2

Java/Spring 2011.05.31 11:37

 

02-01. 스프링 컨테이너

 스프링은 객체를 관리하는 컨테이너를 제공한다. 컨테이너에 객체를 담아두고, 필요할 때에 컨테이너로부터 객체를 가져와 사용할 수 있도록 하고 있다. BeanFactory ApplicationContext가 컨테이너 역할을 수행하는 인터페이스가 된다.




2.1 스프링 컨테이너의 주요 인터페이스

 

1.1   BeanFactory 인터페이스

org.springframework.beans.factory.BeanFactory 인터페이스는 Bean 객체를 관리하고 각 Bean 객체간의 의존 관계를 설정해 주는 기능을 제공하는 가장 단순한 컨테이너로서, 구현 클래스로 org.springframework.beans.factory.xml.XmlBeanFactory 클래스가 존재한다.

XmlBeanFactory 클래스는 외부 자원으로부터 설정 정보를 읽어 와 Bean 객체를 생성한다. 그리고 org.springframework.core.io.Resouce 인터페이스를 사용하여 다양한 종류의 자원을 동일한 방시으로 표현할 수 있도록 하고 있다.

클래스

설 명

org.springframework.core.io.

FileSystemResouce

파일 시스템의 특정 파일로부터 정보를 읽어 온다.

org.springframework.core.io.

InputStreamResouce

InputStream으로부터 정보를 읽어온다.

org.springframework.core.io.

ClassPathResouce

Class Path에 있는 자원으로부터 정보를 읽어 온다.

org.springframework.core.io.

UrlResouce

특정 URL로부터 정보를 읽어 온다.

org.springframework.web.context.

support.servletContextResource

웹 어플리케이션의 루트 디렉토리를 기준으로 지정한 경로에 위치한 자원으로부터 정보를 읽어 온다.

 

1.2   ApplicationContext 인터페이스와 WebApplicationContext 인터페이스

 Org.springframework.context.ApplicationContext인터페이스는 BeanFactory 인터페이스를 상속받은 하위 인터페이스로서 BeanFactory가 제공하는 Bean관리 기능 이외에 Bean 객체 라이프 사이클, 파일과 같은 자원 처리 추상화, 메시지 지원 및 국제화 지원, 이벤트 지원, XML스키마 확장을 통한 편리한 설정 등 추가적인 기능을 제공하고 있다. 따라서, 스프링을 이용하여 어플리케이션을 개발할 때에는 단순히 빈 객체 생성 기능만을 제공하는 BeanFactory보다 ApplicationContext 인터페이스의 구현 클래스를 주로 사용하게 된다.

Org.springframework.context.WebApplicationContext 인터페이스는 웹 어플리케이션을 위한 ApplicationContext로서 하나의 웹 어플리케이션(하나의 ServletContext)마다 한 개 이상의 WebApplicationContext를 가질 수 있다.

 

02. Bean 생성과 의존 관계 설정

 2.1 Bean 객체 설정 및 컨테이너를 통한 Bean 객체 사용.

 

<bean id=”articleDao” class=”madvirus.spring.chap02.MySQLArticleDao”>

 

class속성: 생성할 bean 객체의 완전한 클래스 이름을 입력한다.

id속성: 컨테이너에서 생성된 객체를 구분하는 데 사용되는 식별 값.

id속성 대신에 name 속성을 사용해도 된다.

 

 2.2 의존 관계 설정

 스프링 컨테이너에서 각 객체의 의존 관계도 XML 파일을 통해 명시할 수 있다.

 

의존관계 설정 방식

태그

 

생성자 방식

<constructor-arg>

생성자를 통해 의존하는 객채를 전달받을 경우에 사용함.

프로퍼티 설정 방식

<property name=”setter이름>”

setXXX()형태의 메서드를 사용해서 필요한 객체와 값을 전달 받는다.

XML 네임스페이스를 이용한 프로퍼티 설정

<bean id=”xx” class=”xx”

p:periodTime:”10”

p:sender-ref=”객체이름”/>

Property 태그를 사용하지않고 좀더 간단하게 설정하는 방식. Ref로 끝나는 객체는 사용할 수 없다.

룩업 메서드 인잭션 방식

<lookup-method

Name=”메서드명

Bean=”식별값 />”

상속을 이용해서 오버라이딩하여 사용한다.

임의 빈 객체 전달

<constructor-arg>

 <bean …

</constructor-arg>

또는

<property>

 <bean …

</property>

constructor-arg 태그나 property태그 안에 bean 객체를 직접 넣는다. 식별값을 갖지 않기 때문에 재사용할 수 없다. 식별값을 준다 하여도 사용할 수 없다.

태그에 값을 전달할 경우 객체는 ref 태그를 사용한다.

 

) <ref bean=”articleDao”/>

 

기본 데이터 타입나 String인 경우에는 value 태그를 사용한다.

 

<value>10<value>

 

Value 태그는 타입을 지정하지 않으면 기본적으로 String으로 식별한다. 그러므로 다른 타입인 경우에는 type을 지정해줘야 한다. Long의 경우 아래처럼 사용한다.

 

 <value type=”long”>10<value>

 

2.3 컬렉션 타입을 입력 받기 위한 스프링 태그

태 그

컬렉션 타입

설 명

<list>

java.util.List

List타입이나 배열에 값 목록을 전달할 때 사용된다.

<map>

java.util.Map

Map 타입에<,>목록을 전달할 때 사용된다.

<set>

java.util.Set

Set 타입에 값 목록을 전달할 때 사용된다.

<properties>

java.util.Properties

Properties 타입에 <프로퍼티이름, 프로퍼티값> 목록을 전달할 때 사용된다.

 

List, map set 태그는 value 태그뿐만 아니라 다양한 값을 표현할 수도 있다.

           <ref> : 다른 스프링 빈 객체를 값으로 사용

           <bean> : 임의 빈 객체를 생성해서 값으로 사용

           <value> : 레퍼 타입이나 String을 값으로 사용

           <list>,<map>,<props>,<set> : 콜렉션 객체를 값으로 사용

           <null> : null 레퍼런스를 값으로 사용

 

2.4 의존 관계 자동 설정

           byname : 프로퍼티의 이름과 같은 이름을 갖는 빈 객체를 설정한다.

           byType : 프로퍼티의 타입과 같은 타입을 갖는 빈 객체를 설정한다.

           constructor : 생성자 파라미터 타입과 같은 타입을 갑는 bean객체를 생성자에 전달한다.

autodetect : constructor방식을 먼저 적용하고, byType 방식을 적용하여 의존 객체를 설정한다.

 

3      Bean 객체의 범위

범 위

설 명

singeton

스프링 컨테이너에 한 개의 빈 객체만 존제한다.(기본값)

prototype

빈을 사용할 때 마다 객채를 생성한다.

request

HTTP 요청마다 빈 객체를 생성한다.WebApplicationContext에서만 적용 가능하다.

session

HTTP 세션마다 빈 객체를 생성한다.WebApplicationContext에서만 적용 가능하다.

global-session

글로벌 HTTP 세션에 대해 빈 객체를 생성한다. 포틀릿을 지원하는 컨텍스트에 대해서만 적용 가능하다.

 

 

4      라이프 사이클

 

4.1 bean객체의 라이프 사이클

빈 객체 생성

②BeanNameAware.setBeanName() - 빈 이름 설정

③BeanFactoryAware.setBeanFactory() - 빈 팩토리 설정

④BeanPostProcessor의 초기화 전처리 - 초기화 전에 빈에 대한 처리

⑤InitializingBean.afterPropertiesSet() - property설정(setter설정) 완료후 실행

커스텀 init-method - 초기화 메서드

⑦BeanPostProcessor의 초기화 후처리 - 초기화 후에 빈에 대한 처리

빈 객체 사용

⑨DisposableBean.destory() - 객체가 소멸되기 전에 수행

커스텀 destory-method - 객체가 소멸되기 전에 사용자가 정의한 것 수행

 

5      외부설정 프로퍼티

PropertyPlaceholderConfigurer 클래스를 빈으로 등록하면 외부의 프로퍼티 파일에 저장된 정보를 스프링 설정 파일에서 사용할 수있다. 다음과 같은 프로퍼티 파일이 있다고 하자.

jdbc.driver=com.mysql.jdbc.Driver

jdbc.url=jdbc:mysql://localhost:3306/office

jdbc.username=springbook

jdbc.password=springbook


위 프로퍼티 파일의 정보를 스프링 설정파일에서 사용하고 싶다면, 
다음과 같이 PropertyPlaceholderConfigurer 클래스를 빈으로 등록한 뒤, 프로퍼티 이름을 설정 파일에서 사용하면 된다.

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">

 <property name="locations">

    <value>classpath:config/jdbc.propertyes</value>

 </property>

</bean>

 

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">

    <property name="driverClassName" vlaue="${jdbc.driver}"/>

    <property name="url" vlaue="${jdbc.url}"/>

    <property name="username" vlaue="${jdbc.username}"/>

    <property name="password" vlaue="${jdbc.password}"/>

</bean>









외부 환경에 따라 설정 벙보가 변경되는 경우에 프로퍼티 파일을 유용하게 사용할 수 있다
. 예를 들어,로컬에서의 테스트와 테스트 서버에서의 통합 테스트, 그리고 실제 운영 환경에서 사용하는 데이터베이스가 다르다고 하자. 이경우 각 환경에 맞게 스프링 설정 파일을 변경하는 것보다는 환경에 맞는 프로퍼티 설정 파일을 작성하고, 환경에 따라 알맞은 프로퍼티 파일을 사용하도록 배치 스크립트를 삭성하는 것이 유지 및 보수에 더 편리하다.

 

<context:property-placeholder>태그를 사용하여 외부 프로퍼티 파일을 로딩하도록 설정할 수도 있다.

<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:context="
http://www.springframework.org/schema/context"
 xmlns:p="http://www.springframework.org/schema/p"
 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-3.0.xsd
       
http://www.springframework.org/schema/context
      
http://www.springframework.org/schema/context/spring-context-3.0.xsd">

  

<context:property-placeholder location="classpath:config/jdbc.properties"/>

 

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">

    <property name="driverClassName" vlaue=${jdbc.driver}"/>

    <property name="url" vlaue=${jdbc.url}"/>

    <property name="username" vlaue=${jdbc.username}"/>

    <property name="password" vlaue=${jdbc.password}"/>

</bean>

 




context:property-placeholder>
태그를 사용하려면 위 코드와 같이  context 접두어 에 대한 네임스페이스
http://www.springframework.org/schema/context 로지정하고 네임스페이스와 관련된 XML 스키마 경로를 spring-context-3.0.xsd로 지정해 주어야 한다.

여러 개의 프로퍼티 파일을 사용하려면 각 프로퍼티 파일을 콤마로 구분하여 지정하면 된다.
 

<context:property-placeholder location="classpath:config/jdbc.properties,classpath:config/monitor.properties"/>

 

'Java > Spring' 카테고리의 다른 글

form으로 파일 전송  (0) 2012.06.28
spring + freemarker  (0) 2012.06.22
Spring 3.0 프로그래밍 챕터3  (0) 2011.05.31
Spring 3.0 프로그래밍 챕터2  (0) 2011.05.31
Spring 3.0 프로그래밍 챕터1  (0) 2011.05.23
XML을 출력하자  (0) 2011.05.20
Trackbacks 0 : Comments 0