OpenFrameWork

오픈프레임워크_Day89

px 2015. 7. 20. 17:24

### : 목차 구분 기호

--- : 목차 내에 항목 구분 기호
@@@ : 태그 용도 
... : 같은 목차 내에 구분 기호
................................... 
목차
1. 이론 및 정보
2. 설정 및 그 밖에
3. 소스코드 또는 실습
4. 과제
................................... 
###################################
1. 이론 및 정보
-----------------------------------
* 스프링 설정파일 변경방법

web.xml 
필요한 정보를 스프링에 전달할때?
다른이름으로 설정 파일을 만들고 싶을때?

초기값을 설정하는 태그를 이용
<init-param>
     <param-name>contextConfigLocation</param-name>
     <param-value>/WEB-INF/totalsite.xml</param-value>
</init-param>

설정파일의 위치와 이름을 따로 지정할 수 있다.

여러개의 설정파일도 사용가능함

<param-value>
     /WEB-INF/totalsite.xml
     /WEB-INF/test1.xml
     /WEB-INF/test2.xml
</param-value>

설정이 복잡해지면 분산시킬 필요가 있음
또는 개발할때 설정파일하고 배포할때 설정파일이 달라질 수 있음

보통은 개발하는 단계에 따라서 설정파일을 만드는데
이번에는 기능 별로 분리해서 설정파일을 만들어 봅시다
----------------------------------- 
* ContextLoaderListener 사용
하나의 사이트가 다양한 기능을 가질 수 있음
보통 한가지 주제를 가지고 사이트를 만드는데
여러가지 주제를 가진 사이트가 가질수 있음
이럴때 어떻게 할 수 있을까?

DispatcherServlet을 여러개 만들 수 있음
각각의 DispatcherServlet은 각각 독립된 공간임!
서로 다른 프로젝트이기 때문에 접근 불가능!

그런데 만약 같은 DB에 같은 테이블을 쓰는데
DB에 접근하는 객체가 따로 생긴다면????
만약 서로 다른 DispatcherServlet이 같은 객체를
공유하고 싶으면 어떻게 할까?

DispatcherServlet 보다 먼저 처리는 객체가 있음
ContextLoaderListener 객체를 이용해서 공유를 하면 됨
ContextLoaderListener 는 서블릿이 아니라 리스너로 등록
----------------------------------- 
* 인코딩을 설정파일에서 하기
filter class
기본 클래스에 기능 추가 - filter class
-----------------------------------
* Spring에서 DB연결  

1. 기본 제공 DB 연결 가능
     - Connection Pool을 제공하지 않음

2. 다른 객체로 DB 연결 가능

JNDI 방식으로 연결해서 쓸 예정
-----------------------------------
* sql문을 처리해주는 인터페이스

PerpareStatementSetter 인터페이스
- 재활용 할 수 있음, 복잡합, 서브 클래싱을 해줘야함

Ojbcet[] 배열 이용
- 간단하고 쉽게 사용 가능, 재활용 불가능, 특정 위치에서만 사용 가능
- 배열이 아닌 단 한개의 인자라도 Object 배열을 이용해야함


ResultSetExtractor 인터페이스는 한개의 결과를 가져오는데 적합
-----------------------------------
* 연결된 DB에 접근할 수 있게 해주는 클래스
JdbcTemplate - 실제 DB와 연결해서 사용하는 
가장 직접적인 클래스

RowMapper - DB의 결과값을 가져옴
반복문도 필요없음 자동으로 돌아줌
-----------------------------------
###################################
2. 설정 및 그 밖에
-----------------------------------
----------------------------------- 
###################################
3. 소스코드 또는 실습 
-----------------------------------
3-1
Workspace : ~\study\SpringWork  
/BoardApp/src/main/webapp/WEB-INF/web.xml
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
     <display-name>Archetype Created Web Application</display-name>
     <servlet>
          <servlet-name>board</servlet-name>
          <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
          <init-param>
               <param-name>contextConfigLocation</param-name>
               <param-value>
                    /WEB-INF/totalsite.xml
                    /WEB-INF/test1.xml
                    /WEB-INF/test2.xml
               </param-value>
          </init-param>
     </servlet>
     <servlet-mapping>
          <servlet-name>board</servlet-name>
          <url-pattern>/</url-pattern>
     </servlet-mapping>
</web-app>


/BoardApp/src/main/webapp/WEB-INF/board-servlet.xml
/BoardApp/src/main/webapp/WEB-INF/totalsite.xml
로 이름 변경

/BoardApp/src/main/webapp/WEB-INF/conf
폴더 만들고 설정 파일 이동
/BoardApp/src/main/webapp/WEB-INF/conf/totalsite.xml
위 설정 파일의 이름을 바꾸면서 설정파일에서 설정도 바꿈

/BoardApp/src/main/webapp/WEB-INF/web.xml
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
     <display-name>Archetype Created Web Application</display-name>
     <servlet>
          <servlet-name>board</servlet-name>
          <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
          <init-param>
               <param-name>contextConfigLocation</param-name>
               <param-value>
                    /WEB-INF/conf/factory-config.xml
                    /WEB-INF/conf/viewresolver-config.xml
                    /WEB-INF/conf/handlermapping-config.xml
               </param-value>
          </init-param>
     </servlet>
     <servlet-mapping>
          <servlet-name>board</servlet-name>
          <url-pattern>/</url-pattern>
     </servlet-mapping>
</web-app>

/BoardApp/src/main/webapp/WEB-INF/conf/factory-config.xml
빈을 생성하는 설정 파일로 사용할 예정으로 만듬

/BoardApp/src/main/webapp/WEB-INF/conf/viewresolver-config.xml
/BoardApp/src/main/webapp/WEB-INF/conf/handlermapping-config.xml

----------------------------------- 
3-2
Workspace : ~\study\SpringWork  

dispatcher servlet을 여러개 만들 수 있음

/BoardApp/src/main/webapp/WEB-INF/web.xml

<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
     <display-name>Archetype Created Web Application</display-name>
     <servlet>
          <servlet-name>board</servlet-name>
          <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
          <init-param>
               <param-name>contextConfigLocation</param-name>
               <param-value>
                    /WEB-INF/conf/factory-config.xml
                    /WEB-INF/conf/viewresolver-config.xml
                    /WEB-INF/conf/handlermapping-config.xml
               </param-value>
          </init-param>
     </servlet>
     <servlet-mapping>
          <servlet-name>board</servlet-name>
          <url-pattern>/</url-pattern>
     </servlet-mapping>

     <servlet>
          <servlet-name>webservice</servlet-name>
          <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
     </servlet>
     <servlet-mapping>
          <servlet-name>webservice</servlet-name>
          <url-pattern>/webservice/</url-pattern>
     </servlet-mapping>
</web-app>


서로다른 디스패처 공유를 위해 ContextLoaderListener 를 사용

/BoardApp/src/main/webapp/WEB-INF/web.xml

<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
     <display-name>Archetype Created Web Application</display-name>

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

     <servlet>
          <servlet-name>board</servlet-name>
          <servlet-class>org.springframework.web.servlet.DispatcherServlet
          </servlet-class>
          <init-param>
               <param-name>contextConfigLocation</param-name>
               <param-value>
                    /WEB-INF/conf/factory-config.xml
                    /WEB-INF/conf/viewresolver-config.xml
                    /WEB-INF/conf/handlermapping-config.xml
               </param-value>
          </init-param>
     </servlet>
     <servlet-mapping>
          <servlet-name>board</servlet-name>
          <url-pattern>/</url-pattern>
     </servlet-mapping>
     <!-- <servlet> -->
     <!-- <servlet-name>webservice</servlet-name> -->
     <!-- <servlet-class>org.springframework.web.servlet.DispatcherServlet -->
     <!-- </servlet-class> -->
     <!-- </servlet> -->
     <!-- <servlet-mapping> -->
     <!-- <servlet-name>webservice</servlet-name> -->
     <!-- <url-pattern>/webservice/</url-pattern> -->
     <!-- </servlet-mapping> -->
</web-app>


ContextLoaderListener 를 위한 설정파일 준비
/BoardApp/src/main/webapp/WEB-INF/applicationContext.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:context="http://www.springframework.org/schema/context"
     xmlns:p="http://www.springframework.org/schema/p"
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
          http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd">
     <context:component-scan base-package="board.controller"></context:component-scan>    
</beans>

수정
/BoardApp/src/main/webapp/WEB-INF/conf/factory-config.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:context="http://www.springframework.org/schema/context"
     xmlns:p="http://www.springframework.org/schema/p"
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
          http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd">
     <bean id="listController" class="board.controller.ListController"></bean>
</beans>
----------------------------------- 
3-3
Workspace : ~\study\SpringWork 
문자 인코딩 설정 , Request에만 해당하는 내용
UTF-8로 설정함

/BoardApp/src/main/webapp/WEB-INF/web.xml

<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
     <display-name>Archetype Created Web Application</display-name>

     <filter>
          <filter-name>filterEncoding</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>
          <init-param>
               <param-name>forceEncoding</param-name>
               <param-value>true</param-value>
          </init-param>
     </filter>

     <filter-mapping>
          <filter-name>filterEncoding</filter-name>
          <url-pattern>/*</url-pattern>
     </filter-mapping>

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

     <servlet>
          <servlet-name>board</servlet-name>
          <servlet-class>org.springframework.web.servlet.DispatcherServlet
          </servlet-class>
          <init-param>
               <param-name>contextConfigLocation</param-name>
               <param-value>
                    /WEB-INF/conf/factory-config.xml
                    /WEB-INF/conf/viewresolver-config.xml
                    /WEB-INF/conf/handlermapping-config.xml
               </param-value>
          </init-param>
     </servlet>
     <servlet-mapping>
          <servlet-name>board</servlet-name>
          <url-pattern>/</url-pattern>
     </servlet-mapping>
     <!-- <servlet> -->
     <!-- <servlet-name>webservice</servlet-name> -->
     <!-- <servlet-class>org.springframework.web.servlet.DispatcherServlet -->
     <!-- </servlet-class> -->
     <!-- </servlet> -->
     <!-- <servlet-mapping> -->
     <!-- <servlet-name>webservice</servlet-name> -->
     <!-- <url-pattern>/webservice/</url-pattern> -->
     <!-- </servlet-mapping> -->
</web-app>
----------------------------------- 
3-4
Workspace : ~\study\SpringWork
JNDI 를 위한 톰캣 서버 설정 및 연결 테스트

/Servers/Tomcat v7.0 Server at localhost-config/server.xml
추가
<Context docBase="BoardApp" path="/BoardApp" reloadable="true"
     source="org.eclipse.jst.j2ee.server:BoardApp">
     <Resource name="jdbc/springDB" auth="Container" type="javax.sql.DataSource"
          driverClassName="oracle.jdbc.OracleDriver" url="jdbc:oracle:thin:@localhost:1521:orcl"
          username="scott" password="1111" maxTotal="20" maxIdle="10"
          maxWaitMillis="-1" />
</Context>


/Servers/Tomcat v7.0 Server at localhost-config/context.xml
<Resource name="jdbc/springDB" auth="Container" type="javax.sql.DataSource" />


/BoardApp/src/main/webapp/JNDITest.jsp

<%@page import="java.sql.Connection"%>
<%@page import="javax.sql.DataSource"%>
<%@page import="javax.naming.Context"%>
<%@page import="javax.naming.InitialContext"%>
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false"%>
<!DOCTYPE html>
<html>
<head>
<title>Insert title here</title>
</head>
<body>
<h1>JNDI를 이용한 DBCP 사용 테스트</h1>
<%
     try{
          Context ctx = new InitialContext();
          DataSource ds =
                    (DataSource)ctx.lookup("java:comp/env/jdbc/springDB");
          Connection con = ds.getConnection();
         
          if(con != null){
               out.println("연결 성공");
               con.close();
          }
     }
     catch(Exception err){
          System.out.println("연결 실패 : " + err);
     }
%>
</body>
</html>
----------------------------------- 
3-5 
Workspace : ~\study\SpringWork

/BoardApp/src/main/java/board/controller
/BoardApp/src/main/java/member/controller
폴더는 컨트롤러를 사용할 폴더(패키지)

/BoardApp/src/main/java/board/repository
/BoardApp/src/main/java/member/repository
폴더는 DAO 패턴을 사용할 폴더(패키지)

/BoardApp/src/main/java/board/domain
/BoardApp/src/main/java/member/domain
폴더는 DTO 패턴을 사용할 폴더(패키지)
----------------------------------- 
3-6 
Workspace : ~\study\SpringWork
/BoardApp/src/main/webapp/WEB-INF/applicationContext.xml
DB 관련 생성

<?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:context="http://www.springframework.org/schema/context"
     xmlns:p="http://www.springframework.org/schema/p"
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
          http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd">
     <context:component-scan base-package="board.controller"></context:component-scan>    
    
     <bean id="datasource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
          <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"></property>
          <property name="password" value="1111"></property>
     </bean>
</beans>

빠르고 편리하나 웹에서 쓰기에는 적합하지 않음
주로 테스트 용이나 응용프로그램에서 쓰면 됨
스프링에서 기본 제공하는 DB연결 클래스

----------------------------------- 
3-7 
Workspace : ~\study\SpringWork

<bean id="datasource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"></bean>
관련 라이브러리를 추가

http://mvnrepository.com/artifact/org.springframework/spring-jdbc/4.1.7.RELEASE
<dependency>
     <groupId>org.springframework</groupId>
     <artifactId>spring-jdbc</artifactId>
     <version>4.1.7.RELEASE</version>
</dependency>

/BoardApp/pom.xml
에 추가
----------------------------------- 
3-8 
Workspace : ~\study\SpringWork

스프링에서 JNDI를 지원하는 객체 사용
만들어져 있든 jdbc/springDB를 연결 시켜줌
/BoardApp/src/main/webapp/WEB-INF/applicationContext.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:context="http://www.springframework.org/schema/context"
     xmlns:p="http://www.springframework.org/schema/p"
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
          http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd">
     <context:component-scan base-package="board.controller"></context:component-scan>    
    
<!--      <bean id="datasource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> -->
<!--           <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"></property> -->
<!--           <property name="password" value="1111"></property> -->
<!--      </bean> -->
    
    
     <bean id="datasource" class="org.springframework.jndi.JndiObjectFactoryBean">
          <property name="jndiName" value="jdbc/springDB"></property>
          <property name="resourceRef" value="true"></property>
     </bean>
</beans>
-----------------------------------  
3-9
Workspace : ~\study\SpringWork
게시판 만들기 위한 작업 진행

/BoardApp/src/main/webapp/WEB-INF/conf/factory-config.xml
/BoardApp/src/main/webapp/WEB-INF/conf/handlermapping-config.xml

/BoardApp/src/main/java/board/controller/ListController.java
/BoardApp/src/main/java/board/controller/WriteController.java
/BoardApp/src/main/java/board/domain/BoardDto.java
/BoardApp/src/main/java/board/repository/BoardDao.java
/BoardApp/src/main/java/board/repository/BoardDaoImpl.java

/BoardApp/src/main/webapp/WEB-INF/views/board/list.jsp
/BoardApp/src/main/webapp/WEB-INF/views/board/write.jsp

----------------------------------- 
3-10
Workspace : ~\study\SpringWork
로그인 구현

/BoardApp/src/main/webapp/WEB-INF/views/member/login.jsp
/BoardApp/src/main/webapp/WEB-INF/views/member/login_success.jsp

/BoardApp/src/main/webapp/WEB-INF/conf/factory-config.xml
/BoardApp/src/main/webapp/WEB-INF/conf/handlermapping-config.xml
/BoardApp/src/main/resources/member_viewresolver.properties
/BoardApp/src/main/webapp/WEB-INF/conf/viewresolver-config.xml

/BoardApp/src/main/java/member/domain/UserDto.java
/BoardApp/src/main/java/member/repository/UserDao.java
/BoardApp/src/main/java/member/repository/UserDaoImpl.java

-----------------------------------
3-11
Workspace : ~\study\SpringWork

모든 코드 정리

...................................
/Servers/Tomcat v7.0 Server at localhost-config/server.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor
     license agreements. See the NOTICE file distributed with this work for additional
     information regarding copyright ownership. The ASF licenses this file to
     You under the Apache License, Version 2.0 (the "License"); you may not use
     this file except in compliance with the License. You may obtain a copy of
     the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required
     by applicable law or agreed to in writing, software distributed under the
     License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
     OF ANY KIND, either express or implied. See the License for the specific
     language governing permissions and limitations under the License. --><!-- Note: A "Server" is not itself a "Container", so you may not define
     subcomponents such as "Valves" at this level. Documentation at /docs/config/server.html --><Server port="8005" shutdown="SHUTDOWN">
     <Listener className="org.apache.catalina.startup.VersionLoggerListener"/>
     <!-- Security listener. Documentation at /docs/config/listeners.html <Listener
          className="org.apache.catalina.security.SecurityListener" /> -->
     <!--APR library loader. Documentation at /docs/apr.html -->
     <Listener SSLEngine="on" className="org.apache.catalina.core.AprLifecycleListener"/>
     <!--Initialize Jasper prior to webapps are loaded. Documentation at /docs/jasper-howto.html -->
     <Listener className="org.apache.catalina.core.JasperListener"/>
     <!-- Prevent memory leaks due to use of particular java/javax APIs -->
     <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener"/>
     <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"/>
     <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener"/>

     <!-- Global JNDI resources Documentation at /docs/jndi-resources-howto.html -->
     <GlobalNamingResources>
          <!-- Editable user database that can also be used by UserDatabaseRealm
               to authenticate users -->
          <Resource auth="Container" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" name="UserDatabase" pathname="conf/tomcat-users.xml" type="org.apache.catalina.UserDatabase"/>
     </GlobalNamingResources>

     <!-- A "Service" is a collection of one or more "Connectors" that share
          a single "Container" Note: A "Service" is not itself a "Container", so you
          may not define subcomponents such as "Valves" at this level. Documentation
          at /docs/config/service.html -->
     <Service name="Catalina">

          <!--The connectors can use a shared executor, you can define one or more
               named thread pools -->
          <!-- <Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="150"
               minSpareThreads="4"/> -->


          <!-- A "Connector" represents an endpoint by which requests are received
               and responses are returned. Documentation at : Java HTTP Connector: /docs/config/http.html
               (blocking & non-blocking) Java AJP Connector: /docs/config/ajp.html APR (HTTP/AJP)
               Connector: /docs/apr.html Define a non-SSL HTTP/1.1 Connector on port 8080 -->
          <Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
          <!-- A "Connector" using the shared thread pool -->
          <!-- <Connector executor="tomcatThreadPool" port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000" redirectPort="8443" /> -->
          <!-- Define a SSL HTTP/1.1 Connector on port 8443 This connector uses the
               BIO implementation that requires the JSSE style configuration. When using
               the APR/native implementation, the OpenSSL style configuration is required
               as described in the APR/native documentation -->
          <!-- <Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol"
               maxThreads="150" SSLEnabled="true" scheme="https" secure="true" clientAuth="false"
               sslProtocol="TLS" /> -->

          <!-- Define an AJP 1.3 Connector on port 8009 -->
          <Connector port="8009" protocol="AJP/1.3" redirectPort="8443"/>


          <!-- An Engine represents the entry point (within Catalina) that processes
               every request. The Engine implementation for Tomcat stand alone analyzes
               the HTTP headers included with the request, and passes them on to the appropriate
               Host (virtual host). Documentation at /docs/config/engine.html -->

          <!-- You should set jvmRoute to support load-balancing via AJP ie : <Engine
               name="Catalina" defaultHost="localhost" jvmRoute="jvm1"> -->
          <Engine defaultHost="localhost" name="Catalina">

               <!--For clustering, please take a look at documentation at: /docs/cluster-howto.html
                    (simple how to) /docs/config/cluster.html (reference documentation) -->
               <!-- <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/> -->

               <!-- Use the LockOutRealm to prevent attempts to guess user passwords
                    via a brute-force attack -->
               <Realm className="org.apache.catalina.realm.LockOutRealm">
                    <!-- This Realm uses the UserDatabase configured in the global JNDI resources
                         under the key "UserDatabase". Any edits that are performed against this UserDatabase
                         are immediately available for use by the Realm. -->
                    <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>
               </Realm>

               <Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true">

                    <!-- SingleSignOn valve, share authentication between web applications
                         Documentation at: /docs/config/valve.html -->
                    <!-- <Valve className="org.apache.catalina.authenticator.SingleSignOn"
                         /> -->

                    <!-- Access log processes all example. Documentation at: /docs/config/valve.html
                         Note: The pattern used is equivalent to using pattern="common" -->
                    <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" pattern="%h %l %u %t &quot;%r&quot; %s %b" prefix="localhost_access_log." suffix=".txt"/>

                    <Context docBase="FirstWebApp" path="/FirstWebApp" reloadable="true" source="org.eclipse.jst.j2ee.server:FirstWebApp"/>
                    <Context docBase="SpringWebApp1" path="/SpringWebApp1" reloadable="true" source="org.eclipse.jst.j2ee.server:SpringWebApp1"/>
                    <Context docBase="SpringWebApp2" path="/SpringWebApp2" reloadable="true" source="org.eclipse.jst.j2ee.server:SpringWebApp2"/>
                    <Context docBase="SpringWebApp3" path="/SpringWebApp3" reloadable="true" source="org.eclipse.jst.j2ee.server:SpringWebApp3"/>
                    <Context docBase="BoardApp" path="/BoardApp" reloadable="true" source="org.eclipse.jst.j2ee.server:BoardApp">
                         <Resource auth="Container" driverClassName="oracle.jdbc.OracleDriver" maxIdle="10" maxTotal="20" maxWaitMillis="-1" name="jdbc/springDB" password="1111" type="javax.sql.DataSource" url="jdbc:oracle:thin:@localhost:1521:orcl" username="scott"/>
                    </Context>
               <Context docBase="Uticle" path="/Uticle" reloadable="true" source="org.eclipse.jst.j2ee.server:Uticle"/></Host>
          </Engine>
     </Service>
</Server>
...................................
/Servers/Tomcat v7.0 Server at localhost-config/context.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor
     license agreements. See the NOTICE file distributed with this work for additional
     information regarding copyright ownership. The ASF licenses this file to
     You under the Apache License, Version 2.0 (the "License"); you may not use
     this file except in compliance with the License. You may obtain a copy of
     the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required
     by applicable law or agreed to in writing, software distributed under the
     License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
     OF ANY KIND, either express or implied. See the License for the specific
     language governing permissions and limitations under the License. --><!-- The contents of this file will be loaded for each web application -->
<Context>

     <!-- Default set of monitored resources -->
     <WatchedResource>WEB-INF/web.xml</WatchedResource>

     <!-- Uncomment this to disable session persistence across Tomcat restarts -->
     <!-- <Manager pathname="" /> -->

     <!-- Uncomment this to enable Comet connection tacking (provides events
          on session expiration as well as webapp lifecycle) -->
     <!-- <Valve className="org.apache.catalina.valves.CometConnectionManagerValve"
          /> -->
     <Resource name="jdbc/springDB" auth="Container" type="javax.sql.DataSource" />
</Context>
...................................
/BoardApp/pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
     <modelVersion>4.0.0</modelVersion>
     <groupId>com.study.myproject</groupId>
     <artifactId>BoardApp</artifactId>
     <packaging>war</packaging>
     <version>0.0.1-SNAPSHOT</version>
     <name>BoardApp Maven Webapp</name>
     <url>http://maven.apache.org</url>
     <dependencies>
          <dependency>
               <groupId>junit</groupId>
               <artifactId>junit</artifactId>
               <version>3.8.1</version>
               <scope>test</scope>
          </dependency>
          <dependency>
               <groupId>org.springframework</groupId>
               <artifactId>spring-webmvc</artifactId>
               <version>4.1.7.RELEASE</version>
          </dependency>
          <dependency>
               <groupId>javax.servlet</groupId>
               <artifactId>jstl</artifactId>
               <version>1.2</version>
          </dependency>
          <dependency>
               <groupId>taglibs</groupId>
               <artifactId>standard</artifactId>
               <version>1.1.2</version>
          </dependency>
          <dependency>
               <groupId>javax.servlet</groupId>
               <artifactId>javax.servlet-api</artifactId>
               <version>3.1.0</version>
          </dependency>
          <dependency>
               <groupId>org.springframework</groupId>
               <artifactId>spring-jdbc</artifactId>
               <version>4.1.7.RELEASE</version>
          </dependency>
     </dependencies>
     <build>
          <finalName>BoardApp</finalName>
     </build>
</project>
...................................
/BoardApp/src/main/webapp/WEB-INF/web.xml

<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
     <display-name>Archetype Created Web Application</display-name>

     <filter>
          <filter-name>filterEncoding</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>
          <init-param>
               <param-name>forceEncoding</param-name>
               <param-value>true</param-value>
          </init-param>
     </filter>

     <filter-mapping>
          <filter-name>filterEncoding</filter-name>
          <url-pattern>/*</url-pattern>
     </filter-mapping>

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

     <servlet>
          <servlet-name>board</servlet-name>
          <servlet-class>org.springframework.web.servlet.DispatcherServlet
          </servlet-class>
          <init-param>
               <param-name>contextConfigLocation</param-name>
               <param-value>
                    /WEB-INF/conf/factory-config.xml
                    /WEB-INF/conf/viewresolver-config.xml
                    /WEB-INF/conf/handlermapping-config.xml
               </param-value>
          </init-param>
     </servlet>
     <servlet-mapping>
          <servlet-name>board</servlet-name>
          <url-pattern>/</url-pattern>
     </servlet-mapping>
     <!-- <servlet> -->
     <!-- <servlet-name>webservice</servlet-name> -->
     <!-- <servlet-class>org.springframework.web.servlet.DispatcherServlet -->
     <!-- </servlet-class> -->
     <!-- </servlet> -->
     <!-- <servlet-mapping> -->
     <!-- <servlet-name>webservice</servlet-name> -->
     <!-- <url-pattern>/webservice/</url-pattern> -->
     <!-- </servlet-mapping> -->
</web-app>
...................................
/BoardApp/src/main/webapp/WEB-INF/applicationContext.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:context="http://www.springframework.org/schema/context"
     xmlns:p="http://www.springframework.org/schema/p"
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
          http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd">
     <context:component-scan base-package="board.controller"></context:component-scan>    
    
<!--      <bean id="datasource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> -->
<!--           <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"></property> -->
<!--           <property name="password" value="1111"></property> -->
<!--      </bean> -->
    
    
     <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
          <property name="jndiName" value="jdbc/springDB"></property>
          <property name="resourceRef" value="true"></property>
     </bean>
    
     <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
          <property name="dataSource" ref="dataSource"/>
     </bean>
    
     <bean id="boardDao" class="board.repository.BoardDaoImpl">
          <property name="jdbcTemplate" ref="jdbcTemplate"/>
     </bean>
    
          <bean id="userDao" class="member.repository.UserDaoImpl">
          <property name="jdbcTemplate" ref="jdbcTemplate"/>
     </bean>
</beans>
...................................
/BoardApp/src/main/webapp/WEB-INF/conf/factory-config.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:context="http://www.springframework.org/schema/context"
     xmlns:p="http://www.springframework.org/schema/p"
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
          http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd">
     <bean id="listController" class="board.controller.ListController">
          <property name="boardDao" ref="boardDao"></property>
     </bean>    
    
     <bean id="writeController" class="board.controller.WriteController">
          <property name="boardDao" ref="boardDao"></property>
     </bean>
    
     <bean id="loginController" class="member.controller.LoginController">
          <property name="userDao" ref="userDao"></property>
     </bean>
</beans>
...................................
/BoardApp/src/main/webapp/WEB-INF/conf/handlermapping-config.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:context="http://www.springframework.org/schema/context"
     xmlns:p="http://www.springframework.org/schema/p"
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
          http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd">
     <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
          <property name="mappings">
               <props>
                    <prop key="/board_list.board">listController</prop>
                    <prop key="/board_write.board">writeController</prop>
                    <prop key="/login.member">loginController</prop>
                    <prop key="/login_process.member">loginController</prop>                             
               </props>
          </property>
     </bean>    
</beans>
...................................
/BoardApp/src/main/webapp/WEB-INF/conf/viewresolver-config.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:context="http://www.springframework.org/schema/context"
     xmlns:p="http://www.springframework.org/schema/p"
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
          http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd">
     <bean
          class="org.springframework.web.servlet.view.InternalResourceViewResolver">
          <property name="viewClass">
               <value>org.springframework.web.servlet.view.JstlView</value>
          </property>
          <property name="prefix">
               <value>/WEB-INF/views/board/</value>
          </property>
          <property name="suffix">
               <value>.jsp</value>
          </property>

          <property name="order" value="2"></property>
     </bean>

     <bean class="org.springframework.web.servlet.view.ResourceBundleViewResolver"
          p:basename="member_viewresolver" p:order="1" />
</beans>
...................................
/BoardApp/src/main/resources/member_viewresolver.properties

login.(class)=org.springframework.web.servlet.view.JstlView
login.url=/WEB-INF/views/member/login.jsp

login_success.(class)=org.springframework.web.servlet.view.JstlView
login_success.url=/WEB-INF/views/member/login_success.jsp
...................................
/BoardApp/src/main/webapp/WEB-INF/views/board/list.jsp

<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<body>
     <h1>리스트 페이지</h1>
     <a href="board_write.board">글쓰기</a>
     <br/><br/>
     <table border="1">
          <tr>
               <th>번호</th><th>제목</th><th>등록자</th><th>등록일</th><th>조회수</th>
          </tr>
          <c:forEach var="dto" items="${list}">
          <tr>
               <td>${dto.b_seq }</td>
               <td>${dto.b_title }</td>
               <td>${dto.b_writer }</td>
               <td>${dto.b_regdate }</td>
               <td>${dto.b_hitcount }</td>                   
          </tr>
          </c:forEach>
     </table>
</body>
</html>
...................................
/BoardApp/src/main/webapp/WEB-INF/views/board/write.jsp

<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false"%>
<html>
<body>
     <h1>글쓰기</h1>
     <form action="board_write.board" method="post">
          제목 : <input type="text" name="b_title"/><br/><br/>
          작성자 : <input type="text" name="b_writer"/><br/><br/>
          내용 : <textarea type="text" name="content"></textarea>
          <br/><br/>
          <input type="submit" value="저장"/>
          <input type="button" value="리스트 페이지" onclick="location.href='board_list.board'"/>
     </form>
</body>
</html>
...................................
/BoardApp/src/main/webapp/WEB-INF/views/member/login.jsp

<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false"%>
<html>
<body>
     <h1>로그인</h1>
     <form action="login_process.member" method="post">
          아이디 : <input type="text" name="u_id"/><br/><br/>
          패스워드 : <input type="password" name="u_pw"/><br/><br/>
          <input type="submit" value="로그인"/>
     </form>
</body>
</html>
...................................
/BoardApp/src/main/webapp/WEB-INF/views/member/login_success.jsp

<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false"%>
<html>
<body>
     <h1>님 로그인에 성공하였습니다.</h1>
</body>
</html>
...................................
/BoardApp/src/main/java/board/controller/ListController.java

package board.controller;

import java.sql.SQLException;
import java.util.List;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import board.repository.BoardDao;

@Controller
public class ListController {
     private BoardDao boardDao;

     public void setBoardDao(BoardDao boardDao) {
          this.boardDao = boardDao;
     }

     @RequestMapping("/board_list.board")
     public ModelAndView handleRequest() throws SQLException {
          ModelAndView mv = new ModelAndView("list");
          List result = boardDao.getList();
          // boardDao.findBySeq(1);
          mv.addObject("list", result);
          return mv;
     }
}
...................................
/BoardApp/src/main/java/board/controller/WriteController.java

package board.controller;

import java.sql.SQLException;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

import board.domain.BoardDto;
import board.repository.BoardDao;

@Controller
public class WriteController {
     private BoardDao boardDao;

     public void setBoardDao(BoardDao boardDao) {
          this.boardDao = boardDao;
     }

     @RequestMapping(value = "/board_write.board", method = RequestMethod.GET)
     public ModelAndView handleRequest() throws SQLException {
          ModelAndView mv = new ModelAndView("write");
          return mv;
     }

     @RequestMapping(value = "/board_write.board", method = RequestMethod.POST)
     public ModelAndView handleRequest2(@ModelAttribute BoardDto boardDto) throws SQLException {
          boardDao.write(boardDto);

          // 이것만 쓰면 디스패쳐를 통과하지 않음!
          // 서버에서 페이지 이동을 하기만 함
          // ModelAndView mv = new ModelAndView("list");
         
          // 리다이렉트 쉐도우 프로토콜
          ModelAndView mv = new ModelAndView("redirect:board_list.board");
          return mv;
     }
}
...................................
/BoardApp/src/main/java/board/domain/BoardDto.java

package board.domain;

public class BoardDto {
     private int b_seq;
     private String b_title;
     private String b_content;
     private String b_writer;
     private String b_regdate;
     private int b_hitcount;
     private String b_password;
     public int getB_seq() {
          return b_seq;
     }
     public void setB_seq(int b_seq) {
          this.b_seq = b_seq;
     }
     public String getB_title() {
          return b_title;
     }
     public void setB_title(String b_title) {
          this.b_title = b_title;
     }
     public String getB_content() {
          return b_content;
     }
     public void setB_content(String b_content) {
          this.b_content = b_content;
     }
     public String getB_writer() {
          return b_writer;
     }
     public void setB_writer(String b_writer) {
          this.b_writer = b_writer;
     }
     public String getB_regdate() {
          return b_regdate;
     }
     public void setB_regdate(String b_regdate) {
          this.b_regdate = b_regdate;
     }
     public int getB_hitcount() {
          return b_hitcount;
     }
     public void setB_hitcount(int b_hitcount) {
          this.b_hitcount = b_hitcount;
     }
     public String getB_password() {
          return b_password;
     }
     public void setB_password(String b_password) {
          this.b_password = b_password;
     }
}
...................................
/BoardApp/src/main/java/board/repository/BoardDao.java

package board.repository;

import java.sql.SQLException;
import java.util.List;

import board.domain.BoardDto;

public interface BoardDao {
     public List getList() throws SQLException;
     public BoardDto findBySeq(int seq) throws SQLException;
     public void write(BoardDto dto) throws SQLException;
     public void update(BoardDto dto) throws SQLException;
     public void delete(int seq) throws SQLException;

}
...................................
/BoardApp/src/main/java/board/repository/BoardDaoImpl.java

package board.repository;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.ResultSetExtractor;
import org.springframework.jdbc.core.RowMapper;

import board.domain.BoardDto;

public class BoardDaoImpl implements BoardDao {

     private JdbcTemplate jdbcTemplate;

     public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
          this.jdbcTemplate = jdbcTemplate;
          // System.out.println("BoardDaoImpl - jdbcTemplate" + jdbcTemplate);
     }

     public List getList() throws SQLException {
          String sql = "select * from tblSpringBoard order by b_seq desc";

          RowMapper rm = new BoardRowMapper();
          List result = new ArrayList();

          // 반복문이 포함되어 있어서
          // 자동으로 result에 결과 값이 누적된다
          result = jdbcTemplate.query(sql, rm);
          System.out.println("BoardDaoImpl - result size : " + result.size());

          return result;
     }

     class BoardRowMapper implements RowMapper {
          public Object mapRow(ResultSet arg0, int arg1) throws SQLException {
               // (ResultSet arg0, int arg1)
               // arg0은 전달되는 데이터
               // arg1은 몇번째 데이터 인지
               BoardDto dto = new BoardDto();
               dto.setB_seq(arg0.getInt("b_seq"));
               dto.setB_title(arg0.getString("b_title"));
               dto.setB_content(arg0.getString("b_content"));
               dto.setB_writer(arg0.getString("b_writer"));
               dto.setB_regdate(arg0.getString("b_regdate"));
               dto.setB_hitcount(arg0.getInt("b_hitcount"));
               dto.setB_password(arg0.getString("b_password"));
               return dto;
          }
     }

     public BoardDto findBySeq(int seq) throws SQLException {
          // ResultsetExtractor
          String sql = "select * from tblSpringBoard where b_seq = "+seq;
//          ResultSetExtractor rse = new BoardResultSet();
         
          ResultSetExtractor rse = new ResultSetExtractor() {
               public Object extractData(ResultSet rs) throws SQLException, DataAccessException {
                    BoardDto dto = new BoardDto();
                    if(rs.next()){
                         dto.setB_seq(rs.getInt("b_seq"));
                         dto.setB_title(rs.getString("b_title"));
                         dto.setB_content(rs.getString("b_content"));
                         dto.setB_writer(rs.getString("b_writer"));
                         dto.setB_regdate(rs.getString("b_regdate"));
                         dto.setB_hitcount(rs.getInt("b_hitcount"));
                         dto.setB_password(rs.getString("b_password"));                   
                    }
                    return dto;
               }
          };
          BoardDto dto = jdbcTemplate.query(sql, rse);
          System.out.println("BoardDaoImpl - findBySeq - dto.getB_writer() : "+dto.getB_writer());
          return dto;
     }
    
     class BoardResultSet implements ResultSetExtractor{
          public Object extractData(ResultSet rs) throws SQLException, DataAccessException {
               BoardDto dto = new BoardDto();
               if(rs.next()){
                    dto.setB_seq(rs.getInt("b_seq"));
                    dto.setB_title(rs.getString("b_title"));
                    dto.setB_content(rs.getString("b_content"));
                    dto.setB_writer(rs.getString("b_writer"));
                    dto.setB_regdate(rs.getString("b_regdate"));
                    dto.setB_hitcount(rs.getInt("b_hitcount"));
                    dto.setB_password(rs.getString("b_password"));                   
               }
               return dto;
          }         
     }

     public void write(BoardDto dto) throws SQLException {
         
          String sql = "insert into tblSpringBoard(b_seq,b_title,b_content,"
                    + "b_writer,b_regdate,b_hitcount,b_password) "
                    + "values(seq_user.nextVal, ?,?,?,sysdate,0,'1111')";
         
          Object[] values = new Object[]{
                    dto.getB_title(),dto.getB_content(),dto.getB_writer()
                    };
         
          // DB에 전달
          jdbcTemplate.update(sql, values);
     }

     public void update(BoardDto dto) throws SQLException {
         

     }

     public void delete(int seq) throws SQLException {
         

     }

}
...................................
/BoardApp/src/main/java/member/controller/LoginController.java

package member.controller;

import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;

import member.domain.UserDto;
import member.repository.UserDao;

@Controller
public class LoginController {
     private UserDao userDao;

     public void setUserDao(UserDao userDao) {
          this.userDao = userDao;
     }
    
     @RequestMapping("/login.member")
     public String goLogin() {
          return "login";
     }
    
     @RequestMapping("login_process.member")
     public String LoginProcess(@ModelAttribute UserDto userDto, HttpServletRequest req){
          System.out.println("LoginController : userDto : "+userDto);
          UserDto user = userDao.getIdPw(userDto, req);
          String value = "";
          if(user != null){
               value = "login_success";
          }else{
               value = "login";
          }
          return value;
     }
}
...................................
/BoardApp/src/main/java/member/domain/UserDto.java

package member.domain;

public class UserDto {
     private int u_seq;
     private String u_id;
     private String u_pw;
     private String u_email;

     public int getU_seq() {
          return u_seq;
     }

     public void setU_seq(int u_seq) {
          this.u_seq = u_seq;
     }

     public String getU_id() {
          return u_id;
     }

     public void setU_id(String u_id) {
          this.u_id = u_id;
     }

     public String getU_pw() {
          return u_pw;
     }

     public void setU_pw(String u_pw) {
          this.u_pw = u_pw;
     }

     public String getU_email() {
          return u_email;
     }

     public void setU_email(String u_email) {
          this.u_email = u_email;
     }

     @Override
     public String toString() {
          return "UserDto [u_seq=" + u_seq + ", u_id=" + u_id + ", u_pw=" + u_pw + ", u_email=" + u_email + "]";
     }
}
...................................
/BoardApp/src/main/java/member/repository/UserDao.java

package member.repository;

import javax.servlet.http.HttpServletRequest;

import member.domain.UserDto;

public interface UserDao {
     UserDto getIdPw(UserDto dto, HttpServletRequest req);
}
...................................
/BoardApp/src/main/java/member/repository/UserDaoImpl.java

package member.repository;

import java.sql.ResultSet;
import java.sql.SQLException;

import javax.servlet.http.HttpServletRequest;

import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.ResultSetExtractor;

import member.domain.UserDto;

public class UserDaoImpl implements UserDao{
     private JdbcTemplate jdbcTemplate;
    
     public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
          this.jdbcTemplate = jdbcTemplate;         
     }

    
     public UserDto getIdPw(UserDto dto, HttpServletRequest req) {
          String sql = "select * from tblSpringMember where u_id=? and u_pw=?";
         
          Object[] values = new Object[]{
                    dto.getU_id(), dto.getU_pw()
          };
         
          ResultSetExtractor rse = new ResultSetExtractor() {
               public Object extractData(ResultSet rs) throws SQLException, DataAccessException {
                    UserDto dto = new UserDto();
                    if(rs.next()){                        
                         dto.setU_seq(rs.getInt("u_seq"));
                         dto.setU_id(rs.getString("u_id"));
                         dto.setU_pw(rs.getString("u_pw"));
                         dto.setU_email(rs.getString("u_email"));                        
                    }else{
                         dto = null;
                    }
                    return dto;
               }
          };
          UserDto user = jdbcTemplate.query(sql, values, rse);
          System.out.println("UserDaoImpl - getIdPw : "+user);
          return user;
     }
}
...................................
-----------------------------------
###################################
4. 과제
-----------------------------------
-----------------------------------
###################################
5. 과제 해결
-----------------------------------
-----------------------------------
###################################
6. 기타
----------------------------------- 
-----------------------------------