InitializingBean 인터페이스

빈 객체의 라이프 사이클과 관련된 인터페이스 중에서 가장 많이 사용되는 것 중의 하나가
  org.springframework.beans.factory.InitializingBean 인터페이다.
 
  객체를 생성하고 프로퍼티를 초기화 하고, 컨테이너관련 설정을 완료한 뒤에 호출되는 메서드를 정의하고 있다.
 
  public interface InitializingBean {
    public void afterPropertiesSet() throws Exception
  }
 
  afterPropertiesSet() 메서드는 주로 빈 객체의 프로퍼티가 모두 올바르게 설정되었는지의 여부를 검사하는 용도
  (프로퍼티 값을 검증하는 코드를 구현)
 
  public abstract class AbstractUrlBasedView extends AbstractView implements InitializingBean {
    ...
    public void afterPropertiesSet() throws Exception {
      if( getUrl() == null ) {
        throw new lllegalArgumentException("Property 'url' is required");
      }
    }
    ...
  }

-- 위 설정을 보면 세 개의 빈은 이름만 다를 뿐 <bean> 에서 가지고 있는 <property> 값이 대부분 동일하다.
   이렇게 중복되는 설정을 갖는 빈이 다수 존재할 경우, 중복되는 설정 정보를 담고 있는 부모빈을 정의한 뒤, 부모 빈 정보를
   재사용하도록 설장할 수 있다. 부모 빈으로 부터 설정 정보를 상속받는 예
<bean id="doorMonitor" class="madvirus.spring.chap02.SystemMonitor">
  <property name="periodTime" value="10" />
  <property name="sender" ref="smsSender" />
</bean>

<bean id="lobbyMonitor" class="madvirus.spring.chap02.SystemMonitor">
  <property name="periodTime" value="10" />
  <property name="sender" ref="smsSender" />
</bean>

<bean id="roomMonitor" class="madvirus.spring.chap02.SystemMonitor">
  <property name="periodTime" value="10" />
  <property name="sender" ref="smsSender" />
</bean>


<bean id="commonMonitor" class="madvirus.spring.chap02.SystemMonitor" abstract="true">
  <property name="periodTime" value="10" />
  <property name="sender" ref="smsSender" />
</bean>
※ abstract 속성 값을 "true" 지정하면 스프링 컨테이너는 해당 빈 객체를 생성하지 않는다.
  commonMonitor 빈은 설정정보만 존재할 뿐 실제로 객체는 생성되지 않는다.

<bean id="lobbyMonitor" parent="commonMonitor">
</bean>
<bean id="roomMonitor" parent="commonMonitor">
</bean>
<bean id="doorMonitor" parent="commonMonitor">
  <property name="periodTime" value="20" />
</bean>
※ 자식 빈에서는 parent 속성을 사용하여 클래스 및 프로퍼티 설정 정보를 물려 받을 부모빈을 설정한다.
   그래서 자식 빈에서는 class명 설정이 없어도 부모빈의 class 설정정보를 물려받는다.
   변경하고자 하는 값이 있다면, 추가로 입력해주면된다.( property , class 모두 공통 )

 - java.util.Properties 클래스는특별한 타입의 Map으로서 이 모두 String 인 Map 이다.

보통 Properties 클래스는 환경변수나 설정 정보와 같이 상황에 따라 변경되는 값을 저장

하기 위한 용도로 주로 사용된다.


스프링에서 <props> 태그를 이용하여 Properties 타입의 프로퍼티설정 방법

예제)

-- properties 설정

<bean naem="client" class="madvirus.spring.chap02.bookClient">

<property name="config">

<props>

<prop key="server">192.168.1.100</prop>

<prop key="connectionTimeout">5000</prop>

</props>

</property>

</bean>


-- properties 사용

public class BookClient {

private Properties config;

public void setConfig(Properties config) {

this.config = config;

}


public void connect() {

String serverIp = config.getProperty("server");

...

}

}


- 자주 값이 바뀌는 정보를 Properties 를 사용해서 설정을 한다는데..

그냥 <value> 로 해서 가져다가 쓰는거랑 모가 다른지는...

어떨때 저걸써야되는지는 확~ 느낌이 오진 않는다...

1. Spring 에서 Multipart 지원 기능을 사용하려면 먼저 MultipartResolver를 스프링 설정 파일에 등록해 주어야 한다.

MultipartResolver는 Multipart 형식으로 데이타가 전송된 경우, 해당 데이터를 스프링 MVC 에서 사용할 수 있도록

변환해준다.

스프링이 기본으로 제공하는 MultipartResolver는 CommonsMultipartResolver이다.

CommonsMultipartResolver는 Commons FileUpload API를 이용해서 Multipart를 처리해준다.



2. 업로드할 입력폼 예제

입력 폼 생성시 enctype = "multipart/form-data" 꼭 입력하자.


3. Controller 에서 업로드 파일 데이타 전달받기

업로드 파일 데이타 받는 방법은 여러가지가 있는데 내가 처리한 업로드 파일 접근 방식은

@RequestParam 어노테이션 이용

(MultipartHttpServletRequest를 이용한 방법도 있다.)

Controller 에서 파일 접근 방법이 다를 뿐 그 이후 Controller 에서 업로드하는 방법은 모두 같다.

인터넷 뒤져가며 만든건데... 맞는지 옳은지는 모르겠다. 업로드는 된다.



4. Controller 에서 파일 접근 후 업로드를 처리하는 FileWriter

위의 Controller 에서 파일 생성 메서드(fileWriter.writeFile) 에서 String fullPath 리턴 받는 건

파일(엑셀) 업로드 이후에 엑셀 파일 읽으려고 파일이 업로드된 경로를 받아 온 경우이다.

경우에 따라 그건 다르니 모...



- Spring 외부 설정프로퍼티

가장 많이 사용하는 db.properties 를 예로 설명

1. 우선 확장자 .properties 접속정보 파일 생성

jdbc.driverClassName = oracle.jdbc.OracleDriver
jdbc.url = jdbc:oracle:thin:@localhost:1521:orcl
jdbc.username = scott
jdbc.password = scott

 

2. applicationContext.xml 내에 외부 설정 프로퍼티 사용위한 PropertyPlaceholderConfigurer 클래스 빈 등록

    <!-- Property Configurer -->
    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <value>WEB-INF/database.properties</value>
        </property>
    </bean>

 

3. dataSource bean 에 properties 값 등록

    <!-- Data Source -->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <!-- JDBC 드라이버 클래스명 설정 -->
        <property name="driverClassName">
            <value>${jdbc.driverClassName}</value>
        </property>
        <!-- JDBC 접속 문자열 설정 -->
        <property name="url">
            <value>${jdbc.url}</value>
        </property>
        <!-- MySQL 유저ID 설정 -->
        <property name="username">
            <value>${jdbc.username}</value>
        </property>
        <!-- MySQL 패스워드 설정 -->
        <property name="password">
            <value>${jdbc.password}</value>
        </property>
    </bean>


4. 한개 이상의 프로퍼티 파일을 지정하려면 <list> 태그를 이용하여 프로퍼티 목록을 지정해 주면된다.

    <!-- Property Configurer -->
    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
          <list>
             <value>WEB-INF/database.properties</value>
             <value>WEB-INF/monitor.properties</value>
          </list>
        </property>
    </bean>

 

※ bean "dataSource" 생성 중 class org.apache.commons.dbcp.BasicDataSource 이용에 필요한 jar 파일

commons-dbcp-1.4.jar

commons-pool-1.6.jar

 

 

- web.xml 의 ContentLoaderListener

스프링에 대해 아무것 도 모르는 사람이 봐도 이해가 되도록 하자. 난 천재가 아니니깐

스프링 설정 방법 중 web.xml 에 Spring DispatcherServlet 를 서블릿 클래스로 등록 하고

예)

<?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>spring_Item</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
 
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <servlet>
        <servlet-name>springItem</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>springItem</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>
</web-app>

 

<servlet-name> 에 입력한 값-servlet,xml(springItem-servlet.xml) 에 웹 계층, 비지니스 로직 계층 모두 선언을 해서 사용을 하지만 이렇게 하면 파일 한개로 관리가 가능은 하지만, 보기에도 수정하기에도 마니 힘들다.

그래서 웹계층 / 비지니스로직 계층 설정 파일을 분리해서 관리를 한다.

그렇게 하려면 web.xml 에 <listener></listener> 을 등록 해주어야 한다.

      <listener>
        <listener-class>

org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

※ 위의 설정 기본 설정파일 /WEB-INF/applicationContext.xml 이다.

 

혹시나 이거 외에 더 등록을 해야 한다거나, 명칭을 바꾸려면

<context-param>

                 <param-name> contextConfigLocation </param-name>

                 <param-value>

                            /WEB-INF/applicationContext.xml ,

                       /WEB-INF/applicationContext-acegi-security.xml ,

                       /WEB-INF/applicationContext-common-authorization.xml,

                       /WEB-INF/applicationContext-acegi-security-memory.xml

                 </param-value>

       </context-param>

이라고 web.xml 에 등록을 해주어야 한다.

- Spring  HandlerMapping 을 이용한 Controller 설정방법

   1. BeanNameUrlHandlerMapping 클래스(HandlerMapping 설정을 하지않으면 기본으로 적용되는 클래스)

   dispatcher-servlet.xml Controller 등록 예

        <!-- Controller -->
    <bean id="indexController" name="/index.html" class="controller.IndexController"
        p:shopService-ref="shopService">
    </bean>

    ※ Controller : 브라우져에서 URL요청이 오면 처리해야할 비지니스로직을 맵핑해주는 클래스

        위의 예제를 보면 name="/index.html" 요청이오면 indexController 클래스에 정의된 서비스조직으로 넘긴다(shopService)

        밑에 p:shopService-ref="shopService" 가 무조건 서비스를 처리한다는 것은 아니다.(거의 대부분 맞지만..)

        Controller 클래스에서 인스턴스를 직접 생성하지않고, 스프링이 제공하는 객체를 받아서 사용할 때 설정하는 부분

        Controller 클래스를 열어보면 아마도...

        private Shop shopService;

        public void setShopService(Shop shopService) {

            this.shopService = shopService;

        }

        이 Setter 이 있을 것이고, 스프링이 자동으로 객체를 넘겨주는 역할을 한다.

        즉 프레임워크 사용전에 Shop shopService = new Shop(); 를 안해도 사용이 가능케 하준다는 말!!!

        위의, 1번 Controller 클래스(BeanNameUrlHandlerMapping) 를 사용하면 요청 URL 마다 일일이 컨트롤러 클래스를 맵핑을

        해주어야 하는 번거로움이 심각하다. 걍 이런게 있다고 알고만 있자..


   2. SimpleUrlHandlerMapping

   dispatcher-servlet.xml Controller 등록 예

    <!-- HandlerMapping -->
    <bean id="handlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">

<property name="mappings">

<value>

/index.html=indexController

/detail.html=detailController

</value>

</proerty>

    </bean>

      <!-- Controller -->
    <bean id="indexController" name="/index.html" class="controller.IndexController"
        p:shopService-ref="shopService">
    </bean

    ※ /index.html 이 요청이 오면 indexController 클래스로 맵핑


3. 한가지 더 있는데 그건 아직.. 공부중 나중에 올리자.

- web.xml 스프링 MVC의 DispatcherServlet 클래스를 서블릿으로 정의

<?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>spring_Web</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
 
  <!-- spring DispatcherServlet -->
    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>*.html</url-pattern>
    </servlet-mapping>
 
</web-app>

※ 확장자 'html' 에 대한 요청은 모두 DispatcherServlet 클래스로 맵핑하여 처리한다라고 설정하는 것이다.



- dispatcher-servler.xml 스프링 MVC 설정파일

<?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:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
   
    <!-- HandlerMapping 생략 ( 요청URL 과 Controller 맵핑 ) -->
   
    <!-- Controller -->
    <bean id="indexController" name="/index.html" class="controller.IndexController"
        p:shopService-ref="shopService">
    </bean>
   
    <!-- ViewResolver 생락 ( Controller 에서 반환받은 뷰이름과 출력할 뷰페이지 맵핑 ) -->
   
    <!-- dataSource -->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
            <!-- JDBC 드라이버 클래스 이름 설정 -->
            <property name="driverClassName">
                <value>oracle.jdbc.OracleDriver</value>
            </property>   
            <property name="url">
                <value>jdbc:oracle:thin:@localhost:1521:orcl</value>
            </property>
            <property name="username">
                <value>scott</value>
            </property>
            <property name="password">
                <value>scott</value>
            </property>
    </bean>
   
    <!-- Shop -->
    <bean id="shopService" class="logic.ShopImpl" p:itemCatalog-ref="itemCatalog">
    </bean>

    <!-- ItemCatalog -->
    <bean id="itemCatalog" class="logic.ItemCatalogImpl"
        p:itemDao-ref="itemDao">
    </bean>

    <!-- ItemDao -->
    <bean id="itemDao" class="dao.ItemDaoImpl" p:dataSource-ref="dataSource">
    </bean>
   
</beans>
※ DispatcherServlet 클래스 의 이름은 web.xml 에 설정한 <servlet-name> 의 명칭과 동일한 이름으로 정의하여야 한다.

    (<servlet-name> 의 동일한 이름-servlet.xml 로하고, 그 파일은 WEB-INF 폴더에 있으면 자동으로 컨테이너가 적재한다)

    예 : /WEB-INF/dispatcher-servlet.xml

- XML(Bean) 설정 ( Autowired 사용전 적용법)

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


<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-3.0.xsd">

    <bean id="messageBean" class="sample1.MessageBeanImpl" >

        <constructor-arg>  // 설정된 bean 의 생성자 파라미터 초기값 세팅

            <value>Spring</value>

        </constructor-arg>

        <property name="outputter">// 설정된 bean 의 갑 세팅(해당 클래스의 Setter 이 존재해야함)

            <ref local="outputter" />

        </property>

    </bean>

    <bean id="outputter" class="sample1.FileOutputter">

        <property name="filePath">

            <value>out.txt</value>

        </property>

    </bean>

</beans>


- XML(Bean) 설정 ( Autowired 사용후 적용법)

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


<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-3.0.xsd">

    <bean id="messageBean" class="sample1.MessageBeanImpl" >

        <constructor-arg>  // 설정된 bean 의 생성자 파라미터 초기값 세팅

            <value>Spring</value>

        </constructor-arg>

    </bean>

    <bean id="outputter" class="sample1.FileOutputter" autowire="byType">

        <property name="filePath">

            <value>out.txt</value>

        </property>

    </bean>

</beans>



- xml 변경 후 해당 클래스 sample1.MessageBeanImpl 에서 <property> 값 세팅을 위한 Setter 은 없어도 된다.

  ex)

      (변경 전)

       private Outputter outputter;

       public void setOutputter(Outputter outputter) {

           this.outputter = outputter;

       }


        (변경 후)

        @Autowired

        private Outputter outputter;

    

- XML(Bean) 설정

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


<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-3.0.xsd">

    <bean id="messageBean" class="sample1.MessageBeanImpl" >

        <constructor-arg>  // 설정된 bean 의 생성자 파라미터 초기값 세팅

            <value>Spring</value>

        </constructor-arg>


        <property name="greeting"> // 설정된 bean 의 갑 세팅(해당 변수의 Setter 이 존재해야함)

            <value>Hello, </value>

        </property>

        

        <property name="outputter">// 설정된 bean 의 갑 세팅(해당 클래스의 Setter 이 존재해야함)

            <ref local="outputter" />

        </property>

    </bean>

    <bean id="outputter" class="sample1.FileOutputter">

        <property name="filePath">

            <value>out.txt</value>

        </property>

    </bean>

</beans>

+ Recent posts