๐Ÿ” Spring MVC ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐ ์„ค์ •

1. pom.xml ํŒŒ์ผ ์ˆ˜์ •

		<!-- ์ถ”๊ฐ€ ์˜์กด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ -->
		<!-- MyBatis ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ -->
	  	<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis</artifactId>
			<version>3.2.8</version>
		</dependency>
	  	<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis-spring</artifactId>
			<version>1.2.0</version>
		</dependency>
		<!-- Spring JDBC ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ -->
	  	<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-jdbc</artifactId>
			<version>4.0.0.RELEASE</version>
		</dependency>
		<!-- ํŒŒ์ผ์—…๋กœ๋“œ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ (SmartEditor ์—์„œ๋„ ํ•„์š”ํ•จ)-->
	  	<dependency>
			<groupId>commons-io</groupId>
			<artifactId>commons-io</artifactId>
			<version>2.4</version>
		</dependency>
	  	<dependency>
			<groupId>commons-fileupload</groupId>
			<artifactId>commons-fileupload</artifactId>
			<version>1.3.1</version>
		</dependency>						
		<!--  json, xml ์‘๋‹ต์„ ํŽธํ•˜๊ฒŒ ํ• ์ˆ˜ ์žˆ๋„๋ก ๋„์™€ ์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ -->
		<dependency>
		    <groupId>com.fasterxml.jackson.core</groupId>
		    <artifactId>jackson-databind</artifactId>
		    <version>2.6.0</version>
		</dependency>
		<!-- Aop ์šฉ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ -->
	  	<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-aop</artifactId>
			<version>4.0.0.RELEASE</version>
		</dependency>
	  	<dependency>
			<groupId>org.aspectj</groupId>
			<artifactId>aspectjweaver</artifactId>
			<version>1.8.0</version>
		</dependency>
	  	<!-- Spring Security ๊ด€๋ จ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ -->
	  	<dependency>
		    <groupId>org.springframework.security</groupId>
		    <artifactId>spring-security-web</artifactId>
		    <version>4.0.0.RELEASE</version>
		</dependency>
		<!-- ํŠธ๋ Œ์ ์…˜ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ -->
		<dependency>
		    <groupId>org.springframework</groupId>
		    <artifactId>spring-tx</artifactId>
		    <version>4.0.0.RELEASE</version>
		</dependency>
                       <!-- ์˜ค๋ผํด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ -->
		<dependency>
		    <groupId>com.oracle.database.jdbc</groupId>
		    <artifactId>ojdbc8</artifactId>
		    <version>21.1.0.0</version>
		</dependency>







2. web.xml ํŒŒ์ผ ์ˆ˜์ •

<!-- post ๋ฐฉ์‹ ์ „์†ก๋ ๋•Œ  ํ•œ๊ธ€ ๊นจ์ง€์ง€ ์•Š๋„๋ก Spring ์ธ์ฝ”๋”ฉ ํ•„ํ„ฐ ์ •์˜ํ•˜๊ธฐ  -->
<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>
<!-- Spring ์ธ์ฝ”๋”ฉ ํ•„ํ„ฐ ๋งตํ•‘ํ•˜๊ธฐ -->
<filter-mapping>
   <filter-name>EncodingFilter</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>


3. HomeController.java ํŒŒ์ผ ์ˆ˜์ •





4. web.xml ํŒŒ์ผ ์ˆ˜์ •
- Controller์—์„œ /home.do๋กœ๋งŒ ์š”์ฒญ ๋งตํ•‘ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฃจํŠธ ๊ฒฝ๋กœ์— ์ ‘๊ทผํ•ด๋„ ์•„๋ฌด๋Ÿฐ ํŽ˜์ด์ง€๊ฐ€ ๋œจ์ง€ ์•Š๋Š”๋‹ค.
- web.xml ํŒŒ์ผ์— welcome-file-list๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.



๐Ÿ” MyBatis ๋ชจ๋“ˆ ๊ฐ€์ ธ์˜ค๊ธฐ

MyBatis
- ํŠน์ • ์ฝ”๋“œ๋ฅผ ์ž๋™ํ™”ํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ๋ชจ๋“ˆ


MyBatis ๋ชจ๋“ˆ ๊ฐ€์ ธ์˜ค๊ธฐ
1. MyBatis ์—์„œ xml ์ผ๋ถ€ ๋ณต์‚ฌ

<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">

2. com.ํŒจํ‚ค์ง€๋ช….ํ”„๋กœ์ ํŠธ ํด๋” ๋‚ด๋ถ€์— ํด๋” ์ถ”๊ฐ€
- com.ํŒจํ‚ค์ง€๋ช….ํ”„๋กœ์ ํŠธ.mybatis ํด๋” ์ƒ์„ฑ


3. Configuration.xml ํŒŒ์ผ ์ƒ์„ฑ
- ํด๋” ์šฐํด๋ฆญ โ†’ new โ†’ others โ†’ xml โ†’ ํŒŒ์ผ ์ƒ์„ฑํ•˜๊ธฐ


4. Configuration.xml ํŒŒ์ผ ์ˆ˜์ •

<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">

ํ•ด๋‹น xml ๋ถ™์—ฌ๋„ฃ๊ธฐ



๐Ÿ” SqlSessionTemplate ๊ฐ์ฒด ์„ค์ •

1. servlet-context.xml ํŒŒ์ผ ์ˆ˜์ •
sessionFactory ๊ฐ์ฒด ์ƒ์„ฑ ์‹œ, ์„ค์ • ์ •๋ณด๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•œ๋‹ค.

<!-- 
  	JNDI ๋ฐ์ดํ„ฐ ์†Œ์Šค ๊ฐ์ฒด ์–ป์–ด์˜ค๋Š” ์„ค์ •   
  	Servers/context.xml ์— ์„ค์ •๋œ oracle ์ ‘์†์ •๋ณด ๊ฐ€ ์žˆ์–ด์•ผ ๋œ๋‹ค. 

  	<Resource name="jdbc/myoracle" auth="Container"
      	type="javax.sql.DataSource" driverClassName="oracle.jdbc.OracleDriver"
      	url="jdbc:oracle:thin:@127.0.0.1:1521:xe"
      	username="scott" password="tiger" maxTotal="20" maxIdle="10"
      	maxWaitMillis="-1"/>          
-->
<beans:bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
   <beans:property name="jndiName" value="java:comp/env/jdbc/myoracle"/>
</beans:bean>

<!-- 
์œ„๋Š” ์•„๋ž˜์˜ ์ฝ”๋“œ์™€ ๊ฐ™๋‹ค
dataSource = new JndiObjectFactoryBean();
dataSource.setJndiName("java:comp/env/jdbc/myoracle");
-->


  <!-- 
    SqlSessionFactory ๊ฐ์ฒด 
    Configuration.xml ๋ฌธ์„œ๊ฐ€ ์–ด๋””์— ์žˆ๋Š”์ง€ ์•Œ๋ ค์•ผ ํ•œ๋‹ค. 
 -->
 <beans:bean id="sessionFactory" 
    class="org.mybatis.spring.SqlSessionFactoryBean">
    <beans:property name="dataSource" ref="dataSource"/>
    <beans:property name="configLocation"
 value="classpath:com/ํŒจํ‚ค์ง€๋ช…/ํ”„๋กœ์ ํŠธ๋ช…/mybatis/Configuration.xml"/>
 </beans:bean>
 <!-- 
    sessionFactory=new SqlSessionFactoryBean();
    sessionFactory.setDataSource(dataSource);
    sessionFactory.setConfigLocation("classpath:com/gura/xxx");
  -->


 <!-- 
    SqlSession ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ 
    SqlSessionTemplate(SqlSession) ๊ฐ์ฒด 
    Dao ๊ฐ€ ์˜์กดํ•˜๋Š” ๊ฐ์ฒด 
 -->
  <beans:bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
     <beans:constructor-arg name="sqlSessionFactory" ref="sessionFactory"/>
  </beans:bean>

<!-- 
์œ„์˜ bean ์„ค์ •์„ java code ๋กœ ํ™˜์‚ฐ ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค 

dataSource = new JndiObjectFactoryBean();
dataSource.setJndiName("java:comp/env/jdbc/myoracle");

sessionFactory=new SqlSessionFactoryBean();
sessionFactory.setDataSource(dataSource);
sessionFactory.setConfigLocation("classpath:com/gura/xxx");

new SqlSessionTemplate(sessionFactory);
-->


2. Servers/context.xml ํŒŒ์ผ ์ˆ˜์ •

<Resource name="jdbc/myoracle" auth="Container"
        	type="javax.sql.DataSource" driverClassName="oracle.jdbc.OracleDriver"
        	url="jdbc:oracle:thin:@127.0.0.1:1521:xe"
        	username="scott" password="tiger" maxTotal="20" maxIdle="10"
        	maxWaitMillis="-1"/>


3. com.aa.step03 ํŒจํ‚ค์ง€ ๋‚ด๋ถ€์— ํŒจํ‚ค์ง€ ์ƒ์„ฑ
- com.aa.step03.member.dao ์ƒ์„ฑ
- com.aa.step03.member.dto ์ƒ์„ฑ


4. ๊ฐ ํŒจํ‚ค์ง€์— Dto, Dao ํŒŒ์ผ ์ƒ์„ฑ
- MemberDao Interface๋กœ ์ƒ์„ฑ
- MemberDto Class๋กœ ์ƒ์„ฑ


5. Dao ํŒจํ‚ค์ง€์— Dao๋ฅผ ๊ตฌํ˜„ํ•  Class ์ƒ์„ฑ
- MemeberDaoImpl Class ์ƒ์„ฑ



๐Ÿ” DAO ๊ฐ์ฒด, MyBatis Mapper ์ƒ์„ฑ

1. Interface Type์˜ Dao๋ฅผ implements ํ•œ๋‹ค.

public class MemberDaoImpl implements MemberDao {}

2. interface์— ์ •์˜๋œ ๋ฉ”์†Œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.

public class MemberDaoImpl implements MemberDao {
	@Override
	public void insert(MemberDto dto) {
		session.insert("member.insert", dto);
	}

	@Override
	public void update(MemberDto dto) {

	}

	@Override
	public void delete(int num) {

	}

	@Override
	public MemberDto getData(int num) {

		return null;
	}

	@Override
	public List<MemberDto> getList() {

		return null;
	}
}

3. ๊ตฌํ˜„ ํด๋ž˜์Šค๋ฅผ Spring Bean Container์—์„œ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.

// Dao ๊ฐ์ฒด๋„ Spring Bean Container์—์„œ ๊ด€๋ฆฌํ•˜๋„๋ก ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ถ™์ธ๋‹ค.
@Repository
public class MemberDaoImpl implements MemberDao {....}

4. SqlSessionTemplate์„ ๋ฐ›๋Š” SqlSession interface type ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

// Dao ๊ฐ์ฒด๋„ Spring Bean Container์—์„œ ๊ด€๋ฆฌํ•˜๋„๋ก ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ถ™์ธ๋‹ค.
@Repository
public class MemberDaoImpl implements MemberDao {
	// Spring Bean Container ์—์„œ SqlSession Type ๊ฐ์ฒด๋ฅผ ์ฐพ์•„์„œ ์ฃผ์ž…ํ•ด(DI) ์ฃผ์„ธ์š”๋ผ๋Š” ์˜๋ฏธ
	// Autowired ๋•Œ๋ฌธ์— Null ๊ฐ’์„ ๊ฐ–์ง€ ์•Š๋Š”๋‹ค.
	@Autowired
	private SqlSession session;

    ....
}

5. ๊ตฌํ˜„ํ•œ ๋ฉ”์†Œ๋“œ ๋‚ด๋ถ€์—์„œ ๊ธฐ๋Šฅ์— ๋”ฐ๋ผ SqlSession ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•œ๋‹ค.
- session : SqlSession interface ํƒ€์ž…์˜ ๊ฐ์ฒด
- insert : SqlSessionTemplate ํด๋ž˜์Šค์˜ ๋ฉ”์†Œ๋“œ
- ์ฒซ๋ฒˆ์งธ ์ธ์ž : mapper์— ์ •์˜ํ•œ "namespace.id"๋ฅผ ๋ช…์‹œ
- ๋‘๋ฒˆ์งธ ์ธ์ž : mapper์— ์ •์˜ํ•œ parameterType์˜ ์ธ์ž๊ฐ’์œผ๋กœ ๋งคํ•‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์ •

@Override
public void insert(MemberDto dto) {
	session.insert("member.insert", dto);
}

6. Configuration.xml ํŒŒ์ผ์ด ์žˆ๋Š” mybatis ํŒจํ‚ค์ง€ ๋‚ด๋ถ€์— xml ํŒŒ์ผ ์ƒ์„ฑ
- ํ•ด๋‹น xml ํŒŒ์ผ์€ DB์—ฐ๋™ ๋ฐ DML์„ ์ปจํŠธ๋กคํ•˜๋Š” ํŒŒ์ผ์ด๋‹ค.
- ํŒŒ์ผ๋ช… : MemberMapper.xml
- namespace : mybatis mapper ๊ฐ์ฒด๋ช…
- insert ํƒœ๊ทธ์˜ id : mybatis mapper ๋ฉ”์†Œ๋“œ๋ช…
- parameterType : ์‚ฌ์šฉํ•  DTO ๊ฐ์ฒด ๊ฒฝ๋กœ
- #{ํ•„๋“œ๋ช…} : Dto์—์„œ ์ •์˜๋œ ํ•„๋“œ๋ช…์„ ์ž‘์„ฑ
- ๋‚ด๋ถ€์— DML ๋ฌธ๋ฒ•์„ ์ž‘์„ฑ

<?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="member">
	<insert id="insert" parameterType="com.aa.step03.member.dto.MemberDto">
		INSERT INTO member
		(num, name, addr)
		VALUES (member_seq.NEXTVAL, #{name}, #{addr})
	</insert>
</mapper>

7. MemberMapper.xml ํŒŒ์ผ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก Configuration.xml์— ๋ช…์‹œํ•œ๋‹ค.
- mapper resource : MemberMapper.xml์ด ์žˆ๋Š” ๊ฒฝ๋กœ๋ฅผ ์ž‘์„ฑ

<configuration>
	<mappers>
		<mapper resource="com/aa/step03/mybatis/MemberMapper.xml"/>
	</mappers>
</configuration>

8. ์‹ค์ œ ์‚ฌ์šฉํ•˜๋Š” Controller์—์„œ Dao Interface type ๊ฐ์ฒด๋ฅผ DI ์ฃผ์ž…ํ•œ๋‹ค.
- ๊ฒฐ๊ณผ์ ์œผ๋กœ ์‹ค์ œ Dao๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค์™€์˜ ์˜์กด๊ด€๊ณ„๊ฐ€ ์•ฝํ•ด์ง„๋‹ค.

@Controller
public class MemberController {
	// MemberDaoImpl ํด๋ž˜์Šค ๊ฐ์ฒด๋ฅผ Interface type ๊ฐ์ฒด์— DI ์ฃผ์ž…ํ•œ๋‹ค.
	@Autowired
	private MemberDao dao;

	@RequestMapping("/member/list.do")
	public String getList(HttpServletRequest req) {
		List<MemberDto> list = dao.getList();
		req.setAttribute("list", list);
		return "member/list";
	}
}


๐Ÿ” bean ์ถ”๊ฐ€

  • servlet-context.xml ํŒŒ์ผ ์ˆ˜์ •
    1. ๋งจ ์œ„์— ์žˆ๋Š” bean ๊ฐ์ฒด๋ฅผ ์•„๋ž˜ ์ฝ”๋“œ๋กœ ์ˆ˜์ •
<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:aop="http://www.springframework.org/schema/aop"
   xmlns:tx="http://www.springframework.org/schema/tx"
   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/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
      http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">

2. ๋งจ ๋ฐ‘์— ์•„๋ž˜ ์ฝ”๋“œ(Ascpect ์ฝ”๋“œ) ์ถ”๊ฐ€

<!-- ์–ด๋…ธํ…Œ์ด์…˜ ๊ธฐ๋ฐ˜์œผ๋กœ aop ์ ์šฉํ• ์ˆ˜ ์žˆ๋„๋ก ์„ค์ • -->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>

3. ์•„๋ž˜ ์ฝ”๋“œ(์—…๋กœ๋“œ ๊ด€๋ จ ์ฝ”๋“œ) ์ถ”๊ฐ€

   <!-- Multipart ํผ ์ „์†ก ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ bean ์„ค์ • -->
   <beans:bean id="multipartResolver" 
               class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
      <beans:property name="maxUploadSize" value="102400000"/>
   </beans:bean>   


๐Ÿ” Transaction Bean ์ถ”๊ฐ€

  • servlet-context.xml ํŒŒ์ผ ์ˆ˜์ •
	<!-- Spring Transaction Manager ์„ค์ • -->
	<beans:bean id="txManager" 
		class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<beans:property name="dataSource" ref="dataSource"/>
	</beans:bean>

	<!-- @Transactional ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ  ํŠธ๋ Œ์ ์…˜์„ ๊ด€๋ฆฌ ํ• ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •-->
	<tx:annotation-driven transaction-manager="txManager"/>
profile
๋ฐ์ดํ„ฐ ์‚ฌ์ด์–ธํ‹ฐ์ŠคํŠธ๋ฅผ ๋ชฉํ‘œ๋กœ ํ•˜๋Š” ๊ฐœ๋ฐœ์ž

0๊ฐœ์˜ ๋Œ“๊ธ€