Spring

[Spring] 예제 - 환경 설정

아잠만_ 2024. 8. 19. 15:39

설정

SQL

CREATE TABLE CAR
(
	CAR_NUM               VARCHAR2(60)  NOT NULL ,
	MFR                   VARCHAR2(300)  NULL ,
	MYR                   NUMBER  NULL ,
	DRV_DST               NUMBER  NOT NULL ,
	CUST_NUM              NUMBER  NOT NULL 
);



CREATE UNIQUE INDEX XPK_CAR ON CAR
(CAR_NUM  ASC);



ALTER TABLE CAR
	ADD CONSTRAINT  XPK_CAR PRIMARY KEY (CAR_NUM);



CREATE TABLE CUST
(
	CUST_NUM              NUMBER  NOT NULL ,
	CUST_NM               VARCHAR2(300)  NOT NULL ,
	ADDR                  VARCHAR2(1000)  NULL ,
	PNE                   VARCHAR2(50)  NULL ,
	PNUM                  VARCHAR2(30)  NOT NULL ,
	DET_ADDR              VARCHAR2(1000)  NULL 
);



CREATE UNIQUE INDEX XPK고객 ON CUST
(CUST_NUM  ASC);



ALTER TABLE CUST
	ADD CONSTRAINT  XPK고객 PRIMARY KEY (CUST_NUM);



CREATE TABLE EMP
(
	EMP_NUM               NUMBER  NOT NULL ,
	NM                    VARCHAR2(300)  NOT NULL ,
	ADDR                  VARCHAR(1000)  NOT NULL ,
	PNE                   VARCHAR2(50)  NOT NULL ,
	SAL                   NUMBER  NOT NULL ,
	PNUM                  VARCHAR2(30)  NOT NULL ,
	DET_ADDR              VARCHAR2(1000)  NOT NULL 
);



CREATE UNIQUE INDEX XPK_EMP ON EMP
(EMP_NUM  ASC);



ALTER TABLE EMP
	ADD CONSTRAINT  XPK_EMP PRIMARY KEY (EMP_NUM);



CREATE TABLE PER_SER
(
	EMP_NUM               NUMBER  NOT NULL ,
	CUST_NUM              NUMBER  NOT NULL ,
	CAR_NUM               VARCHAR2(60)  NOT NULL ,
	AMT                   NUMBER  NULL ,
	PER_TME               NUMBER  NULL ,
	SER_NUM               NUMBER  NOT NULL 
);



CREATE UNIQUE INDEX XPK_SER ON PER_SER
(SER_NUM  ASC);



ALTER TABLE PER_SER
	ADD CONSTRAINT  XPK_SER PRIMARY KEY (SER_NUM);



ALTER TABLE CAR
	ADD (CONSTRAINT  R_1 FOREIGN KEY (CUST_NUM) REFERENCES CUST(CUST_NUM));



ALTER TABLE PER_SER
	ADD (CONSTRAINT  R_3 FOREIGN KEY (EMP_NUM) REFERENCES EMP(EMP_NUM));



ALTER TABLE PER_SER
	ADD (CONSTRAINT  R_4 FOREIGN KEY (CUST_NUM) REFERENCES CUST(CUST_NUM));



ALTER TABLE PER_SER
	ADD (CONSTRAINT  R_5 FOREIGN KEY (CAR_NUM) REFERENCES CAR(CAR_NUM));

프로젝트 생성

 

프로젝트 설정

pom.xml설정

자바와 springframework 버전 변경 + 라이브러리 추가

<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>kr.or</groupId>
	<artifactId>ddit</artifactId>
	<name>dasuriProj</name>
	<packaging>war</packaging>
	<version>1.0.0-BUILD-SNAPSHOT</version>
	<properties>
		<java-version>1.8</java-version>
		<org.springframework-version>5.2.5.RELEASE</org.springframework-version>
		<org.aspectj-version>1.6.10</org.aspectj-version>
		<org.slf4j-version>1.6.6</org.slf4j-version>
	</properties>
	<dependencies>
		<!-- Spring -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>${org.springframework-version}</version>
			<exclusions>
				<!-- Exclude Commons Logging in favor of SLF4j -->
				<exclusion>
					<groupId>commons-logging</groupId>
					<artifactId>commons-logging</artifactId>
				 </exclusion>
			</exclusions>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>
				
		<!-- AspectJ -->
		<dependency>
			<groupId>org.aspectj</groupId>
			<artifactId>aspectjrt</artifactId>
			<version>${org.aspectj-version}</version>
		</dependency>	
		
		<!-- Logging -->
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-api</artifactId>
			<version>${org.slf4j-version}</version>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>jcl-over-slf4j</artifactId>
			<version>${org.slf4j-version}</version>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-log4j12</artifactId>
			<version>${org.slf4j-version}</version>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<version>1.2.15</version>
			<exclusions>
				<exclusion>
					<groupId>javax.mail</groupId>
					<artifactId>mail</artifactId>
				</exclusion>
				<exclusion>
					<groupId>javax.jms</groupId>
					<artifactId>jms</artifactId>
				</exclusion>
				<exclusion>
					<groupId>com.sun.jdmk</groupId>
					<artifactId>jmxtools</artifactId>
				</exclusion>
				<exclusion>
					<groupId>com.sun.jmx</groupId>
					<artifactId>jmxri</artifactId>
				</exclusion>
			</exclusions>
			<scope>runtime</scope>
		</dependency>

		<!-- @Inject -->
		<dependency>
			<groupId>javax.inject</groupId>
			<artifactId>javax.inject</artifactId>
			<version>1</version>
		</dependency>
				
		<!-- Servlet -->
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>servlet-api</artifactId>
			<version>2.5</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>javax.servlet.jsp</groupId>
			<artifactId>jsp-api</artifactId>
			<version>2.1</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>jstl</artifactId>
			<version>1.2</version>
		</dependency>
	
		<!-- Test -->
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.7</version>
			<scope>test</scope>
		</dependency> 
		
		<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
		<!-- 
			1) 자바빈 클래스(VO)의 getter/setter메소드, toString 자동처리
			2) log.info() 메소드로 sysout대신 로그를 console에 출력
			1. 개요
			메이븐을 사용하게 되면 POM 파일을 다뤄야 합니다. 
			POM은 Project Object Model의 약자인데... 
			pom.xml이라는 파일이 바로 POM 파일이고 이 파일을 통해 dependency라고 부르는 의존성 설정을 하게 됩니다...
			그리고 각 dependency는 scope을 가지고 있어요...
			종류는 compile, runtime, provided 등의 종류가 있지요...
			2. compile
			compile은 컴파일때 필요한 것입니다... 기본값이기 때문에 만일 scope 설정을 안하면 compile이 기본입니다...
			
			3. runtime
			runtime은 런타임때 필요한 것입니다. 컴파일할 때는 필요가 없지만 실행할 때는 필요한 것이지요.
			JDBC 드라이버 같은게 되겠습니다.
			
			4. provided
			provided는 컴파일때 필요하긴 하지만 런타임때는 JDK 혹은 컨테이너가 제공하는 것입니다.
			마지막 패키징 시 포함되지 않음
			서블릿이나 JSP 관련 API 같은거죠. 
			즉 WAS에서 제공하는 servlet-api.jar를 사용하는 경우 (대부분이겠죠) 입니다.
			만약 운영환경에서 servlet-api.jar 중복으로 인한 문제가 발생한다면 꼭 provided로 바꿔주셔야 합니다.
			
			5. test
			test는 조금 특별한데 테스트 코드를 컴파일할때 필요하지만 배포때는 제외가 됩니다. (따라서 굳이 운영 환경에 JUnit 의존성을 삭제할 필요가 없어요)
			easymock, JUnit 같은거죠.
			
			6. system
			system은 provided와 유사하지만 JAR 파일을 직접 사용합니다...
			이 때는 JAR 파일의 위치를 지정하는 systemPath 엘리먼트가 따라와야 해요...
		-->
		<dependency>
		    <groupId>org.projectlombok</groupId>
		    <artifactId>lombok</artifactId>
		    <version>1.18.22</version>
		    <scope>provided</scope>
		</dependency>
		
		<!-- Database 라이브러리 시작 -->
		<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
		<!-- XML로 쿼리를 작성하게 해주는 라이브러리 -->
		<dependency>
		    <groupId>org.mybatis</groupId>
		    <artifactId>mybatis</artifactId>
		    <version>3.5.10</version>
		</dependency>
		
		<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
		<!-- 스프링과 mybatis를 연동하게 해주는 라이브러리 -->
		<dependency>
		    <groupId>org.mybatis</groupId>
		    <artifactId>mybatis-spring</artifactId>
		    <version>2.0.4</version>
		</dependency>
		
		<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
		<!-- 스프링에서 JDBC(Java DataBase Connectivitiy) -->
		<dependency>
		    <groupId>org.springframework</groupId>
		    <artifactId>spring-jdbc</artifactId>
		    <version>${org.springframework-version}</version>
		</dependency>
		
		<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-dbcp2 -->
		<!-- dbcp : database connection pool => 커넥션객체를 미리 만들어놓고 쓰고/반납 
					최근에는 hikaricp를 사용하는 경우도 있음
		-->
		<dependency>
		    <groupId>org.apache.commons</groupId>
		    <artifactId>commons-dbcp2</artifactId>
		    <version>2.7.0</version>
		</dependency>
		
		<!-- https://mvnrepository.com/artifact/org.bgee.log4jdbc-log4j2/log4jdbc-log4j2-jdbc4 -->
		<!-- 로깅을 위한 라이브러리. 쿼리를 console이나 파일 로그로 볼 수 있음 -->
		<dependency>
		    <groupId>org.bgee.log4jdbc-log4j2</groupId>
		    <artifactId>log4jdbc-log4j2-jdbc4</artifactId>
		    <version>1.16</version>
		</dependency>
		
		<!-- https://mvnrepository.com/artifact/com.oracle.database.jdbc/ojdbc6 -->
		<!-- ojdbc6 : oracle java database connectivity 드라이버 -->
		<dependency>
		    <groupId>com.oracle.database.jdbc</groupId>
		    <artifactId>ojdbc6</artifactId>
		    <version>11.2.0.4</version>
		</dependency>
		<!-- Database 라이브러리 시작 -->
		
		<!-- 타일즈 시작 -->
		<!-- https://mvnrepository.com/artifact/org.apache.tiles/tiles-extras -->
		<dependency>
		    <groupId>org.apache.tiles</groupId>
		    <artifactId>tiles-extras</artifactId>
		    <version>3.0.8</version>
		</dependency>
		
		<!-- https://mvnrepository.com/artifact/org.apache.tiles/tiles-servlet -->
		<dependency>
		    <groupId>org.apache.tiles</groupId>
		    <artifactId>tiles-servlet</artifactId>
		    <version>3.0.8</version>
		</dependency>
		
		<!-- https://mvnrepository.com/artifact/org.apache.tiles/tiles-jsp -->
		<dependency>
		    <groupId>org.apache.tiles</groupId>
		    <artifactId>tiles-jsp</artifactId>
		    <version>3.0.8</version>
		</dependency>
		<!-- 타일즈 끝 -->
		
		<!-- json 데이터 바인딩을 위한 의존 라이브러리 -->
		<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
		<dependency>
		    <groupId>com.fasterxml.jackson.core</groupId>
		    <artifactId>jackson-databind</artifactId>
		    <version>2.13.3</version>
		</dependency>
		
		<!-- 파일업로드 시작  -->
		<!-- common-fileupload 라이브러리는 tomcat7.0버전 이후로는
			서블릿3.0이상에서 지원함
		 -->
		<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
		<dependency>
		    <groupId>javax.servlet</groupId>
		    <artifactId>javax.servlet-api</artifactId>
		    <version>3.1.0</version>
		    <scope>provided</scope>
		</dependency>
		
		<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
		<dependency>
		    <groupId>commons-fileupload</groupId>
		    <artifactId>commons-fileupload</artifactId>
		    <version>1.4</version>
		</dependency>
		
		<!-- 파일을 처리하기 위한 의존 라이브러리 -->
		<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
		<dependency>
		    <groupId>commons-io</groupId>
		    <artifactId>commons-io</artifactId>
		    <version>2.11.0</version>
		</dependency>
		
		<!-- 썸네일 -->
		<!-- https://mvnrepository.com/artifact/org.imgscalr/imgscalr-lib -->
		<dependency>
		    <groupId>org.imgscalr</groupId>
		    <artifactId>imgscalr-lib</artifactId>
		    <version>4.2</version>
		</dependency>
		
		<!-- https://mvnrepository.com/artifact/net.coobird/thumbnailator -->
		<dependency>
		    <groupId>net.coobird</groupId>
		    <artifactId>thumbnailator</artifactId>
		    <version>0.4.8</version>
		</dependency>
		<!-- 파일업로드 끝  -->
		
		<!-- 입력값을 검증하기 위한 라이브러리 의존 관계 정의 시작 
      스프링 
      M(Model) : Service, ServiceImple, Mapper
      V(View) : JSP
      C(Controller) : Controller 
      Bean(자바빈 클래스, ArticleVO) Validation(유효성검사) 기능을 이용해 
      요청 파라미터 값이 바인딩된(멤버변수에 세팅된) 도메인 클래스(ArticleVO)의 입력값 검증을 함
      요청 파라미터 : ?articleNo=112&title=개똥이
      public String write(골뱅이ModelAttribute ArticleVO articleVO)
      -->
      <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-validator -->
      <dependency>
          <groupId>org.hibernate</groupId>
          <artifactId>hibernate-validator</artifactId>
          <version>5.2.5.Final</version>
      </dependency>
		
		<!-- 스프링 시큐리티 라이브러리 의존관계 정의 시작 -->
      <!-- 스프링 시큐리티를 웹에서 동작하도록 해줌 -->
      <!-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-web -->
      <dependency>
          <groupId>org.springframework.security</groupId>
          <artifactId>spring-security-web</artifactId>
          <version>5.0.7.RELEASE</version>
      </dependency>
      
      <!-- 스프링 시큐리티 설정을 도와줌 -->
      <!-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-config -->
      <dependency>
          <groupId>org.springframework.security</groupId>
          <artifactId>spring-security-config</artifactId>
          <version>5.0.7.RELEASE</version>
      </dependency>
      
      <!-- 스프링 시큐리티 일반 기능 -->
      <!-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-core -->
      <dependency>
          <groupId>org.springframework.security</groupId>
          <artifactId>spring-security-core</artifactId>
          <version>5.0.7.RELEASE</version>
      </dependency>
      
      <!-- 스프링 시큐리티와 태그라이브러리를 연결해줌 -->
      <!-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-taglibs -->
      <dependency>
          <groupId>org.springframework.security</groupId>
          <artifactId>spring-security-taglibs</artifactId>
          <version>5.0.7.RELEASE</version>
      </dependency>
      
      <!-- 스프링 시큐리티 라이브러리 의존관계 정의 끝 -->
      
       <!-- AOP(Aspect Oriented Programming : 관점 지향 프로그래밍) 시작 
      1) aspectjrt => 이미 있으므로 생략
      2) aspectjweaver => 없으므로 의존 관계를 정의
      -->
      <!-- https://mvnrepository.com/artifact/aspectj/aspectjweaver
      1.5.4 -->
      <!-- AspectJ RunTime -->
      <dependency>
          <groupId>org.aspectj</groupId>
          <artifactId>aspectjrt</artifactId>
          <version>${org.aspectj-version}</version>
      </dependency>    
      <!-- AspectJ Weaver -->
      <dependency>
          <groupId>org.aspectj</groupId>
          <artifactId>aspectjweaver</artifactId>
          <version>${org.aspectj-version}</version>
      </dependency>
      <!-- AspectJ Tools -->
      <dependency>
          <groupId>org.aspectj</groupId>
          <artifactId>aspectjtools</artifactId>
          <version>${org.aspectj-version}</version>
      </dependency>
      <!-- AOP(Aspect Oriented Programming : 관점 지향 프로그래밍) 끝 -->
		       
	</dependencies>
    <build>
        <plugins>
            <plugin>
                <artifactId>maven-eclipse-plugin</artifactId>
                <version>2.9</version>
                <configuration>
                    <additionalProjectnatures>
                        <projectnature>org.springframework.ide.eclipse.core.springnature</projectnature>
                    </additionalProjectnatures>
                    <additionalBuildcommands>
                        <buildcommand>org.springframework.ide.eclipse.core.springbuilder</buildcommand>
                    </additionalBuildcommands>
                    <downloadSources>true</downloadSources>
                    <downloadJavadocs>true</downloadJavadocs>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.5.1</version>
                <configuration>
                    <source>1.6</source>
                    <target>1.6</target>
                    <compilerArgument>-Xlint:all</compilerArgument>
                    <showWarnings>true</showWarnings>
                    <showDeprecation>true</showDeprecation>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
                <version>1.2.1</version>
                <configuration>
                    <mainClass>org.test.int1.Main</mainClass>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

Run as

web.xml 설정

web버전 4.0으로 변경

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="4.0" xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee https://java.sun.com/xml/ns/javaee/web-app_4_0.xsd">

	<!-- The definition of the Root Spring Container shared by all Servlets and Filters -->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>
			/WEB-INF/spring/root-context.xml
			/WEB-INF/spring/security-context.xml
		</param-value>
	</context-param>
	
	<!-- Creates the Spring Container shared by all Servlets and Filters -->
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>

	<!-- Processes application requests -->
	<servlet>
		<servlet-name>appServlet</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
		
		<!-- web.xml의 설정은 WAS(Tomcat) 자체 설정일 뿐임. -->
		<!-- multipart-config : 메모리사이즈, 업로드 파일 저장 위치, 최대 크기 설정 -->
		<multipart-config>
			<location>c:\\upload</location><!-- 업로드 되는 파일을 저장할 공간 -->
			<max-file-size>20971520</max-file-size><!-- 업로드 파일의 최대 크기 1MB * 20 -->
			<max-request-size>41943040</max-request-size><!-- 한 번에 올릴 수 있는 최대 크기 40MB -->
			<file-size-threshold>20971520</file-size-threshold><!-- 메모리 사용 크기 20MB -->
		</multipart-config>
	</servlet>
		
	<servlet-mapping>
		<servlet-name>appServlet</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>
	
	<!-- 한글 처리
	웹 브라우저(크롬)에서 서버(톰캣)로 보내는 요청(Requeset)과 그 반대 방향인 응답(Response)을
		모두 UTF-8로 고정하기 위해 인코딩 필터를 설정함
	 -->
	<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>
		<init-param>
			<param-name>forceEncoding</param-name>
			<param-value>true</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>encodingFilter</filter-name>
		<!-- 모든 요청에서 -->
		<url-pattern>/*</url-pattern>
	</filter-mapping>

	<!-- multipart filter 추가하기(한글 처리 다음에 넣기!!!) -->
	<filter>
		<display-name>springMultipartFilter</display-name>
		<filter-name>springMultipartFilter</filter-name>
		<filter-class>org.springframework.web.multipart.support.MultipartFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>springMultipartFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
	
	<!-- 스프링 시큐리티가 제공하는 서블릿 필터 클래스를 서블릿 컨테이너에 등록함 -->
   <filter>
      <filter-name>springSecurityFilterChain</filter-name>
      <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
   </filter>
   <filter-mapping>
      <filter-name>springSecurityFilterChain</filter-name>
      <url-pattern>/*</url-pattern>
   </filter-mapping>
   
   <!-- 상태 코드를 사용하여 오류 페이지 설정 시작
   HTTP 오류 코드 정리
   - 400 : Bad Request. 문법 오류(잘못 입력한 url)
   - 404* : Not Found. 요청한 문서를 찾지 못함(url확인 및 캐시 삭제가 필요한 상태)
   - 405 : Method not allowed. 메소드 허용 안됨(메소드 매핑이 안 될 때 발생)
   - 415 : 서버의 요청에 대한 승인 거부. (ContentType, Content Encoding 데이터 확인 필요)
   - 500* : 서버 내부 오류. (웹 서버가 요청사항을 수행할 수 없을 때 발생)
   - 505 : HTTP Version Not Supported.
    -->
   <error-page>
      <error-code>400</error-code>
      <location>/error/error400</location>
   </error-page>
   <error-page>
      <error-code>404</error-code>
      <location>/error/error404</location>
   </error-page>
   <error-page>
      <error-code>500</error-code>
      <location>/error/error500</location>
   </error-page>
   <!-- HTTP 상태 코드를 사용하여 오류 페이지 설정 끝 -->
</web-app>

root-context.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:mybatis-spring="http://mybatis.org/schema/mybatis-spring"
   xmlns:aop="http://www.springframework.org/schema/aop"
   xmlns:tx="http://www.springframework.org/schema/tx"
   xsi:schemaLocation="http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring-1.2.xsd
      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
      http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.1.xsd
      http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd">

                  
	<!-- Root Context: defines shared resources visible to all other web components -->
	<!-- 
	root-context.xml : 스프링 설정 파일
	서블릿과 필터가 공유할 수 있는 루트 스프링 컨테이너 설정으로, 
	공통 빈(Service, Repository(DAO), DB, Log 등)을 설정함.
	공통빈을 설정하는 곳으로 주로 View 지원을 제외한 bean을 설정함
	
	스프링 설정?
	view와 관련되지 않은 객체를 정의
	Service(기능), DAO(Repository : 저장소), DB등 비즈니스 로직과 관련된 설정
	BasicDataSource dataSource = new BasicDataSource();
	dataSource.setDriverClassName() = "oracle.jdbc.driver.OracleDriver";
	 -->
	 <!-- dataSource : 데이터베이스와 관련된 정보를 설정 -->
	<!-- 
	db : database(개념. 공유/저장/통합/운영). RDB(Relational DB.관계형DB)
	dbms : database management system(DB관리시스템.오라클)
	localhost=127.0.0.1=내ip주소
	xe : express(OracleXE11g.r2) => SID(sequence ID)
	 -->
	
	<bean id="uploadFolder" class="java.lang.String">
		<constructor-arg value="C:\\eGovFrameDev-3.10.0-64bit\\workspace\\dasuriProj\\src\\main\\webapp\\resources\\upload"></constructor-arg>
	</bean>
	
	<bean id="uploadFolderDirect" class="java.lang.String">
		<constructor-arg value="C:\\eGovFrameDev-3.10.0-64bit\\workspace\\.metadata\\.plugins\\org.eclipse.wst.server.core\\tmp0\\wtpwebapps\\springProj\\resources\\upload"></constructor-arg>
	</bean>
	 <!-- 
	BasicDataSource dataSource = new BasicDataSource();
	dataSource.setDriverClassName("oracle.jdbc.driver.OracleDriver");
	dataSource.setUrl("jdbc:oracle:thin:@localhost:1521:xe");
	 -->
	<bean id="dataSource" 
		class="org.apache.commons.dbcp2.BasicDataSource" 
		destroy-method="close">
		<property name="driverClassName" 
		value="oracle.jdbc.driver.OracleDriver" />
		<property name="url" 
		value="jdbc:oracle:thin:@localhost:1521:xe" />
		<property name="username" value="jsptest" />
		<property name="password" value="java" />
	</bean>
	<!-- 데이터베이스와 연결을 맺고 끊어질 때까지의 
	라이프 사이클을 관리해주는 sqlSession 객체를 생성
	1) dataSource
	2) 매퍼 xml의 위치 지정. / : src/main/resources/
	SqlSessionFactoryBean sqlSessionFactory = new SqlSessionFactoryBean();
	sqlSessionFactory.setDataSource(dataSource);
	 -->
	<bean id="sqlSessionFactory"
	class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="dataSource"></property>
		<property name="mapperLocations"
		value="classpath:/sqlmap/**/*_SQL.xml" />
		<property name="configLocation"
		 value="/WEB-INF/mybatisAlias/mybatisAlias.xml" />
	</bean>
	<!-- 데이터베이스에 개별적으로 쿼리를 실행시키는 객체.
		이 객체를 통해 query를 실행함
	 -->
	<bean id="sqlSessionTemplate"
	class="org.mybatis.spring.SqlSessionTemplate">
		<constructor-arg index="0" ref="sqlSessionFactory" />
	</bean>
	
	<!-- 파일업로드 설정
	CommonsMultipartResolver multipartResolver = new multipartResolver();
	multipartResolver.setMaxUploadSize(10485760);
	multipartResolver.setDefaultEncoding("UTF-8");
	 -->
	<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
		<!-- 파일업로드 용량 (10MB)-->
		<property name="maxUploadSize" value="10485760"/>
		<property name="defaultEncoding" value="UTF-8" />
	</bean>
	
	<!-- 파일업로드 디렉토리 설정 -->
	<bean id="uploadPath" class="java.lang.String">
		<constructor-arg value="c:\\upload"/>
	</bean>
	
	<!-- Mapper 인터페이스 설정 
   개발자가 직접 DAO를 설정하지 않아도
   자동으로 Mapper 인터페이스를 활용하는 객체를 생성하게 됨
   -->
   <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
      <property name="basePackage" value="kr.or.ddit.**.mapper" />
   </bean>
   
   <!-- 트랜잭션 관리자의 빈을 정의 -->
   <bean id="transactionManager" 
      class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
      <property name="dataSource" ref="dataSource"></property>
   </bean>
   
   <!-- 애너테이션 기반의 트랜잭션 제어를 활성화함 -->
   <tx:annotation-driven/>
   
   <!-- 스프링 AOP 활성화 -->
  <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
  
  <!-- kr.or.ddit.aop 패키지를 컴포넌트 스캔 대상으로 등록 -->
  <context:component-scan base-package="kr.or.ddit.aop"></context:component-scan>
</beans>

servlet-context.xml

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

	<!-- DispatcherServlet Context: defines this servlet's request-processing 
		infrastructure -->

	<!-- Enables the Spring MVC @Controller programming model -->
	<annotation-driven />

	<!-- Handles HTTP GET requests for /resources/** by efficiently serving 
		up static resources in the ${webappRoot}/resources directory -->
	<!-- static folder설정(정적 폴더 설정)=>css, images, upload, js 서버에서 앞서 처리될 필요가 
		없는 정적 리소스 파일을 처리하는 역할 수행 웹 애플리케이션의 물리적 경로 이름을 설정하고 이 경로에 정적 리소스 파일들을 저장하면 
		소스 코드나 웹 브라우저의 주소창에서 해당 리소스의 경로를 사용하여 직접 접속할 수 있음 정적 리소스란 클라이언트에서 요청이 들어왔을 
		때 요청 리소스가 이미 만들어져 있어 그대로 응답하는 것 mapping : 웹 요청 경로 패턴을 설정. 컨텍스트 경로를 제외한 나머지 
		부분의 경로와 매핑 location : 웹 애플리케이션 내에서 실제 요청 경로의 패턴에 해당하는 자원 위치를 설정. 위치가 여러 곳이면 
		각 위치를 쉼표로 구분 -->
	<!-- http://localhost/resources/ -->
	<resources mapping="/resources/**" location="/resources/" />

	<resources  mapping="/upload/**" location="file:\\\c:\\upload\\"></resources>

	<!-- Resolves views selected for rendering by @Controllers to .jsp resources 
		in the /WEB-INF/views directory -->
	<beans:bean
		class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<beans:property name="prefix" value="/WEB-INF/views/" />
		<beans:property name="suffix" value=".jsp" />
	</beans:bean>

	<context:component-scan
		base-package="kr.or.ddit" />

	<!-- Tile -->
	<beans:bean id="tilesConfigurer"
		class="org.springframework.web.servlet.view.tiles3.TilesConfigurer">
		<beans:property name="definitions">
			<beans:list>
				<beans:value>/WEB-INF/spring/tiles-config.xml</beans:value>
			</beans:list>
		</beans:property>
	</beans:bean>
	<!-- UrlBasedViewResolver tilesViewResolver = new UrlBasedViewResolver(); -->
	<beans:bean id="tilesViewResolver"
		class="org.springframework.web.servlet.view.UrlBasedViewResolver">
		<beans:property name="viewClass"
			value="org.springframework.web.servlet.view.tiles3.TilesView" />
		<beans:property name="order" value="1" />
	</beans:bean>
	
	<!-- 스프링 시큐리티 애너테이션을 활성화
    - pre-post-annotations="enabled" -> 골뱅이PreAuthorize, 골뱅이PostAuthorize 활성화
      *** PreAuthorize : 특정 메소드를 실행하기 전에 role 체킹
      PostAuthorize : 특정 메소드를 실행한 후에 role 체킹
    - secured-annotations="enabled" -> 골뱅이Secured를 활성화
      Secured : 스프링 시큐리티 모듈을 지원하기 위한 애너테이션
    -->
	<security:global-method-security pre-post-annotations="enabled"
	secured-annotations="enabled"/>
	
</beans:beans>

security-context.xml

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

	<!-- DispatcherServlet Context: defines this servlet's request-processing 
		infrastructure -->

	<!-- Enables the Spring MVC @Controller programming model -->
	<annotation-driven />

	<!-- Handles HTTP GET requests for /resources/** by efficiently serving 
		up static resources in the ${webappRoot}/resources directory -->
	<!-- static folder설정(정적 폴더 설정)=>css, images, upload, js 서버에서 앞서 처리될 필요가 
		없는 정적 리소스 파일을 처리하는 역할 수행 웹 애플리케이션의 물리적 경로 이름을 설정하고 이 경로에 정적 리소스 파일들을 저장하면 
		소스 코드나 웹 브라우저의 주소창에서 해당 리소스의 경로를 사용하여 직접 접속할 수 있음 정적 리소스란 클라이언트에서 요청이 들어왔을 
		때 요청 리소스가 이미 만들어져 있어 그대로 응답하는 것 mapping : 웹 요청 경로 패턴을 설정. 컨텍스트 경로를 제외한 나머지 
		부분의 경로와 매핑 location : 웹 애플리케이션 내에서 실제 요청 경로의 패턴에 해당하는 자원 위치를 설정. 위치가 여러 곳이면 
		각 위치를 쉼표로 구분 -->
	<!-- http://localhost/resources/ -->
	<resources mapping="/resources/**" location="/resources/" />

	<resources  mapping="/upload/**" location="file:\\\c:\\upload\\"></resources>

	<!-- Resolves views selected for rendering by @Controllers to .jsp resources 
		in the /WEB-INF/views directory -->
	<beans:bean
		class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<beans:property name="prefix" value="/WEB-INF/views/" />
		<beans:property name="suffix" value=".jsp" />
	</beans:bean>

	<context:component-scan
		base-package="kr.or.ddit" />

	<!-- Tile -->
	<beans:bean id="tilesConfigurer"
		class="org.springframework.web.servlet.view.tiles3.TilesConfigurer">
		<beans:property name="definitions">
			<beans:list>
				<beans:value>/WEB-INF/spring/tiles-config.xml</beans:value>
			</beans:list>
		</beans:property>
	</beans:bean>
	<!-- UrlBasedViewResolver tilesViewResolver = new UrlBasedViewResolver(); -->
	<beans:bean id="tilesViewResolver"
		class="org.springframework.web.servlet.view.UrlBasedViewResolver">
		<beans:property name="viewClass"
			value="org.springframework.web.servlet.view.tiles3.TilesView" />
		<beans:property name="order" value="1" />
	</beans:bean>
	
	<!-- 스프링 시큐리티 애너테이션을 활성화
    - pre-post-annotations="enabled" -> 골뱅이PreAuthorize, 골뱅이PostAuthorize 활성화
      *** PreAuthorize : 특정 메소드를 실행하기 전에 role 체킹
      PostAuthorize : 특정 메소드를 실행한 후에 role 체킹
    - secured-annotations="enabled" -> 골뱅이Secured를 활성화
      Secured : 스프링 시큐리티 모듈을 지원하기 위한 애너테이션
    -->
	<security:global-method-security pre-post-annotations="enabled"
	secured-annotations="enabled"/>
	
</beans:beans>

tiles-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE tiles-definitions PUBLIC 
"-//Apache Software Foundation//DTD Tiles Configuration 3.0//EN" 
"http://tiles.apache.org/dtds/tiles-config_3_0.dtd">
<!-- tiles 설정 -->
<tiles-definitions>
   <!-- main layout -->
   <definition name="tiles-layout" template="/WEB-INF/views/tiles/index.jsp">
      <put-attribute name="header" value="/WEB-INF/views/tiles/header.jsp" />
      <put-attribute name="aside" value="/WEB-INF/views/tiles/aside.jsp" />
      <put-attribute name="body" value="" />
      <put-attribute name="footer" value="/WEB-INF/views/tiles/footer.jsp" />
   </definition>
   <!-- name의 */*은 body의 value에서 1과 2에 해당
      controller에서 forwarding 시 return "1/2";
      return "book/list";
    -->
   <definition name="*/*" extends="tiles-layout">
      <put-attribute name="body" value="/WEB-INF/views/{1}/{2}.jsp" />
   </definition>
</tiles-definitions>

그 외

나머지 설정은 git참조 (dasuriProj)