Maven
:Maven은 인터넷에서 필요한 라이브러리를 직접 원사이트에서 받아서 가져옵니다. 처음 실행할때만 원사이트에서 가져오고 그다음부터는 로컬에서 가져온다. 근데 처음에 라이브러리를 한 한두개 안가져 오는 경우가 있는데 이때는 로컬에 있는 모든것들을 지우고 다시 실행해서 받아야합니다. 또는 잘 돌아가는 사람의 라이브러리를 가져다가 씁니다.
Maven 기반의 프로젝트를 만들면 아래와 같은 디렉토리 구조가 생깁니다.
C:\Users\ljh\.m2\repository\org\springframework-> 라이브러리가 모여있는 경로
라이브러리가 잘 설치되어 있지 않으면 여기에 .m2를 지우고 다시 maven을 실행합니다. 그러면 다시 각각의 사이트에서 필요한 모든 라이브러리를 설치합니다. 다만 MyBatis 관련 라이브러리는 직접 poem.xml에 추가 해줘야합니다.
SpringFramework 필수 라이브러리
springMVC와 spring core가 필수적이고 나머지는 모듈처럼 다른 것을 사용하거나 사용하지 않을 수 있습니다. 그렇기 때문에 필수적이지 않은 라이브러리는 따로 넣어 주어야합니다.
MyBatis 관련 라이브러리를 추가해줍니다.
maven repository - Google 검색
Maven - Repositories - In Maven terminology, a repository is a directory where all the project jars, library jar, plugins or any other project specific artifacts are ...
www.google.com
Maven Repository: Search/Browse/Explore
The AWS Java SDK for AWS CodePipeline module holds the client classes that are used for communicating with AWS CodePipeline Last Release on Aug 5, 2020
mvnrepository.com
이렇게 해서 적절한 library 버전을 poem.xml에 추가 시켜줍니다. 결과적으로 아래의 라이브러리를 추가해줍니다.
<!-- mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<!-- mybatis-spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.2</version>
</dependency>
<!-- spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.1.3.RELEASE</version>
</dependency>
<!-- spring-tx -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
<!-- commons-dbcp -->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
<!-- commons-pool2 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.6.0</version>
</dependency>
<!-- mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.15</version>
</dependency>
poem.xml-> 실습에서는 spingframework-version을 3.1.1에서 4.1.1로 변경해 줍니다.
여기에서
<groupId>com.encore</groupId>
<artifactId>spring</artifactId>
이것은 처음 Maven 프로젝트를 만들 때 작성했던 패키지입니다. com.encore.spring 곧, contextPath를 의미합니다.
그리고 <name>sp06_SpringMVC_Product</name>은 프로젝트명을 의미합니다.
<?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>com.encore</groupId>
<artifactId>spring</artifactId>
<name>sp06_SpringMVC_Product</name>
<packaging>war</packaging>
<version>1.0.0-BUILD-SNAPSHOT</version>
<properties>
<java-version>1.6</java-version>
<org.springframework-version>4.1.1.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>
<!-- mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<!-- mybatis-spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.2</version>
</dependency>
<!-- spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.1.3.RELEASE</version>
</dependency>
<!-- spring-tx -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
<!-- commons-dbcp -->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
<!-- commons-pool2 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.6.0</version>
</dependency>
<!-- mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.15</version>
</dependency>
<!-- Test -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.7</version>
<scope>test</scope>
</dependency>
</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>
Maven 기반으로 전체적인 web programming을 해봅니다.
1. DB 설계
drop table myproduct;
CREATE TABLE myproduct(
id int(10) auto_increment primary key,
name varchar(30),
maker varchar(30),
price int(10));
(id가 auto_increment이고 primary key인것에 주의해야한다.)
목표
2. vo객체 생성
MyProduct.java
package com.encore.spring.domain;
public class MyProduct {
private int id;
private String name;
private String maker;
private int price;
public MyProduct() {
super();
}
public MyProduct(String name, String maker, int price) {
super();
this.name = name;
this.maker = maker;
this.price = price;
}
public MyProduct(int id, String name, String maker, int price) {
super();
this.id = id;
this.name = name;
this.maker = maker;
this.price = price;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getMaker() {
return maker;
}
public void setMaker(String maker) {
this.maker = maker;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
@Override
public String toString() {
return "MyProduct [id=" + id + ", name=" + name + ", maker=" + maker + ", price=" + price + "]";
}
}
id는 자동으로 증가하기 때문에 id를 제외한 나머지만 들어가는 생성자가 있어야 합니다.
3. MyBatis Framework
- DB정보
## fileName :: jdbc.proeprties...dbSetting
JDBC.Driver=com.mysql.cj.jdbc.Driver
JDBC.ConnectionURL=jdbc:mysql://127.0.0.1:3306/scott?serverTimezone=UTC
JDBC.Username=root
JDBC.Password=1234
- sql 쿼리문 맵핑
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="ProductMapper">
<insert id ="addProduct" parameterType="myProduct" useGeneratedKeys="true" keyProperty="id">
INSERT INTO myproduct(name, maker, price) values(#{name}, #{maker}, #{price})
</insert>
<select id="findByProductName" parameterType="string" resultType="myProduct">
SELECT id, name, maker, price
FROM myproduct where name LIKE '%${value}%'
</select>
<select id="findProducts" parameterType="string" resultType="myProduct">
SELECT id, name, maker, price
FROM myproduct
</select>
</mapper>
useGeneratedKeys="true" keyProperty="id" 이것을 써주는 이유!
: 인서트 문에서 위의 id 같이 자동으로 생성되는 생성값이 PK일때는 보통 PK를 통해서 select를 하게 됩니다 DB의 데이터와 vo가 동기화가 바로 안되기 때문에 select를 한번 써줘서 VO와 DB를 동기화 시켜줘야합니다. 이렇게 select로 해주는 것이 아니라 위에 속성을 줘서 한번에 처리해줍니다. (setId와 같음 keyProperty="id“)
- SqlMapConfig.xml작성 (DB 정보+ SQL 쿼리문 맵핑)
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<properties resource="config/jdbc.properties"></properties>
<settings>
<!-- 오라클일경우 뒤에껄 써야됩니다. <setting name="jdbcTypeForNull" value="NULL"/> -->
<setting name="mapUnderscoreToCamelCase" value="True"/>
</settings>
<typeAliases>
<!--vo객체가 여러개면 아래같이 여러개를 써야하는데,
<typeAlias type="com.encore.spring.domain.MyProduct" alias="myProduct1"/>
<typeAlias type="com.encore.spring.domain.MyProduct" alias="myProduct2"/> -->
<package name="com.encore.spring.domain"/><!-- 알아서 alias를 vo객체 이름의 대문자를 소문자로 바꿔서 해준다. 자동임 -->
</typeAliases>
<!--여기에서 필요없는데, 무조건 단위테스트를 해야하니까, 무조건 넣어줍니다. -->
<environments default="aa">
<environment id="aa">
<transactionManager type="JDBC" />
<dataSource type="UNPOOLED">
<property name="driver" value="${JDBC.Driver}"/>
<property name="url" value="${JDBC.ConnectionURL}"/>
<property name="username" value="${JDBC.Username}"/>
<property name="password" value="${JDBC.Password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<!--이것도 package가 있는데, 직접 써주는게 보는게 좋습니다. -->
<mapper resource="mapper/myproduct.xml"/>
</mappers>
</configuration>
proproperties와 environments는 단위테스트를 하는데 있어서 쓰이는 부분입니다. 필수적이진 않지만 단위테스트는 필수 적이므로 필수적인 부분입니다.
<typeAliases>
<!--vo객체가 여러개면 아래같이 여러개를 써야하는데,
<typeAlias type="com.encore.spring.domain.MyProduct" alias="myProduct1"/>
<typeAlias type="com.encore.spring.domain.MyProduct2" alias="myProduct2"/> -->
<package name="com.encore.spring.domain"/><!-- 알아서 alias를 vo객체 이름의 대문자를 소문자로 바꿔서 해준다. 자동임 -->
</typeAliases>
원래는 vo객체가 여러개면 위와 같이 <typeAlias /> 이걸 여러개 했어야 합니다. 그러나 <package />이거를 쓰게 되면, 알아서 각각의 vo 객체의 이름에서 첫번째 대문자를 소문자로 바꿔 alias를 주게 됩니다. 객체가 하나만 있지 않을 것이기 때문에 편리하게 사용할 수 있습니다.
<mappers/>에도 똑같은 package tag가 있지만 네이밍하는데 있어서도 그렇게 직접 다 써주는게 내용 및 구조파악에 용이합니다.
4. 단위테스트 (이 부분의 단위테스트는 너무나 중요합니다. )
package com.encore.spring.test;
import java.io.IOException;
import java.io.Reader;
import java.util.List;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import com.encore.spring.domain.MyProduct;
public class MyBatisUnitTest {
public static void main(String[] args) throws IOException {
Reader r = Resources.getResourceAsReader("config/SqlMapConfig.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(r);
SqlSession session = factory.openSession();
MyProduct vo = new MyProduct("세탁기3", "삼성3", 650000);
System.out.println("before DB "+vo.getId());
session.insert("ProductMapper.addProduct", vo);//디비에 값 집어 넣고, id값 자동 생성+ 그 값을 vo에 setting
System.out.println("INSERT OK!!!");
System.out.println("after DB "+vo.getId());
session.commit();//---> 무조건 해줘야한다. mybatis에서만 돌아가니까
System.out.println("==================================");
List<MyProduct> list=session.selectList("ProductMapper.findByProductName", "세탁기");
for(MyProduct v:list)
System.out.println(v);
System.out.println("==================================");
List<MyProduct> list2=session.selectList("ProductMapper.findProducts");
for(MyProduct v:list2)
System.out.println(v);
}
}
(SqlSession 만들어 오는 부분을 따로 빼서 하는 것이 더 좋습니다. )
5. Persistence Layer
<<Interface>>
MyProductDAO.java
package com.encore.spring.model;
import java.util.List;
import com.encore.spring.domain.MyProduct;
public interface MyProductDAO {
void addProduct(MyProduct myProduct) throws Exception;
List<MyProduct> findByProductName(String words) throws Exception;
List<MyProduct> findProducts() throws Exception;
}
MyProductDAOImpl.java
package com.encore.spring.model.impl;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import com.encore.spring.domain.MyProduct;
import com.encore.spring.model.MyProductDAO;
@Repository
public class MyProductDAOImpl implements MyProductDAO{
private final String ns = "ProductMapper.";
@Autowired
SqlSession sqlSession;
@Override
public void addProduct(MyProduct myProduct) throws Exception{
sqlSession.insert(ns+"addProduct", myProduct);
}
@Override
public List<MyProduct> findByProductName(String words) throws Exception {
return sqlSession.selectList(ns+"findByProductName", words);
}
@Override
public List<MyProduct> findProducts() throws Exception{
return sqlSession.selectList(ns+".findProducts");
}
}
@Repository-> persistence layer
@Autowired -> 필드위에 있다는 것은 setter의 역할을 해줍니다. setter로 인해 생기는 재사용성 저하를 막습니다.
6. Service Layer
<<Interface>>
MyProductService.java
package com.encore.spring.model;
import java.util.List;
import com.encore.spring.domain.MyProduct;
public interface MyProductService {
void addProduct(MyProduct myProduct) throws Exception;
List<MyProduct> findByProductName(String words) throws Exception;
List<MyProduct> findProducts() throws Exception;
}
MyProductServiceImpl.java
package com.encore.spring.model.impl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.encore.spring.domain.MyProduct;
import com.encore.spring.model.MyProductDAO;
import com.encore.spring.model.MyProductService;
@Service
public class MyProductServiceImpl implements MyProductService{
@Autowired
MyProductDAO myProductDAO;
@Override
public void addProduct(MyProduct myProduct) throws Exception {
myProductDAO.addProduct(myProduct);
}
@Override
public List<MyProduct> findByProductName(String words) throws Exception {
return myProductDAO.findByProductName(words);
}
@Override
public List<MyProduct> findProducts() throws Exception {
return myProductDAO.findProducts();
}
}
7. Presentation Layer
- front
productRegister.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2 align="center">Product Register Form...</h2>
<form action="myProduct.do" method="post">
상품명 : <input type="text" name="name"><br><br>
제조사 : <input type="text" name="maker"><br><br>
가 격 : <input type="text" name="price"><br><br>
<input type="submit" value="상품등록">
</form>
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
<form action="mySearch.do" method="post">
상품명 검색 : <input type="text" name="word"><br><br>
<input type="submit" value="상품찾기">
</form>
</body>
</html>
insert_result.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
${info}
</body>
</html>
find_result.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style>
table{
border: 2px solid black;
}
table *{
border: 2px solid black;
}
</style>
</head>
<body>
<h1>++++++++++++++++검색결과++++++++++++++++</h1>
<table>
<thead>
<tr>
<td>ID</td>
<td>NAME</td>
<td>MAKER</td>
<td>PRICE</td>
</tr>
</thead>
<tbody>
<c:forEach items="${info}" var="vo">
<tr>
<td>${vo.id}</td>
<td>${vo.name}</td>
<td>${vo.maker}</td>
<td>${vo.price}</td>
</tr>
</c:forEach>
</tbody>
</table>
</body>
</html>
MyProductController.java
package com.encore.spring;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import com.encore.spring.domain.MyProduct;
import com.encore.spring.model.MyProductService;
@Controller
public class MyProductController {
@Autowired
private MyProductService myProductService;
@RequestMapping("myProduct.do")
public ModelAndView insert(MyProduct pvo) throws Exception {
//form에 입력 값이 자동으로 vo에 바인딩됩니다. 폼에 이름과 필드명이 일치해야합니다.
System.out.println("폼에서 받은 데이타"+pvo.getId());//0
myProductService.addProduct(pvo);
System.out.println("폼에서 받은 데이타"+pvo.getId());//다른 값
return new ModelAndView("insert_result","info",pvo);
}
@RequestMapping("mySearch.do")
public ModelAndView getProducts(String word) throws Exception {
List<MyProduct> list=myProductService.findByProductName(word);
return new ModelAndView("find_result","info",list);
}
}
원래는 Bean configuration file에 mapping을 아래와 같이 해줘야하는데, @RequestMapping("myProduct.do") annotation을 사용함으로써 아래 bean은 만들지 않아도 됩니다.
어노테이션을 쓰면 오버라이딩 할 수가 없습니다. pojo(implement도 없습니다.)입니다. 그러나 기능이 돌아가야하기때문에 메소드는 있어야합니다. 우리 마음대로 함수를 만들면 됩니다. 아무런 제약조건이 없이 자유롭게 만들면 됩니다.
<bean name="/myProduct.do" class ="com.encore.spring.MyProductController"></bean>
8. DI Container를 통한 DI
mvcBean.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"
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">
<!-- 1. DataSource API Bean -->
<context:property-placeholder location="classpath:config/jdbc.properties"/>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${JDBC.Driver}"/>
<property name="url" value="${JDBC.ConnectionURL}"/>
<property name="username" value="${JDBC.Username}"/>
<property name="password" value="${JDBC.Password}"/>
</bean>
<!-- 2. SqlSessionFactory API Bean -->
<bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="configLocation" value="classpath:config/SqlMapConfig.xml" />
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 3. SqlSession API Bean -->
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg ref="sqlSessionFactoryBean" /><!--얘는 꼭 생성자 주입으로 해줍니다. -->
</bean>
<!--4. HandlerMapping은 알아서 디폴트로 만들어 집니다. -->
<!--5. API Bean 등록 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name ="prefix" value="/WEB-INF/result/" />
<property name ="suffix" value=".jsp" />
</bean>
<context:component-scan base-package="com.encore.spring"></context:component-scan>
</beans>
나머지 세개 bean은 annotation으로 만들었습니다.
이 파일은 DD 파일에 wiring 되어 들어가게 됩니다.
9. (WAS) D.D file
클라이언트로부터 요청이 들어오게 되면, was에 의해서 DD파일을 읽어 들여서 Dispatcher Servlet을 만들게 됩니다. 그런다음에 Bean 설정 문서를 읽어 bean을 생성하게 되어 DI가 일어나게 됩니다.
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 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_2_5.xsd">
<!-- 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/mvcBean.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<!-- 한글처리 -->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
<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/mvcBean.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-name>appServlet</servlet-name> 여기에 있는 것이 서블릿의 이름이 됩니다. 따로 아래를 써주지 않으면
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/mvcBean.xml</param-value>
</init-param>
자동으로 appServlet-servlet.xml의 이름을 가지는 Bean configuration file을 WEB-INF 아래서 찾아 wiring합니다. 그러나 저렇게 위와같이 init-param을 해줄 경우에는 우리가 지정한 이름의 Bean configuration file을 찾아 wiring해서 DI를 진행하게 됩니다.
아래와 같이 한글처리를 해주면 됩니다.
<!-- 한글처리 -->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>