순서
★스프링 설정파일 셋팅
1.pom.xml셋팅
2.web.xml셋팅
3.beans-biz.xml(root설정파일. 공통으로 사용할 클래스를 Bean객체로 만들어줄 root 파일)
4.mybatis-config.xml (마이바티스 설정파일)
5.mapper xml 작성
6.mvc.xml (컨트롤러 클래스를 자동으로 DI 컨테이너에 등록시키거나, 정적리소스 설정, 뷰리졸버 설정)
★스프링 클래스 파일 작성하기
7.VO 클래스 작성하기
8.DAO 인터페이스 작성하기
9.Service와 ServiceImpl 작성하기
10.Controller 작성하기
1.pom.xml 셋팅
메이븐 프로젝트를 생성하고 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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>ZSpring</groupId>
<artifactId>ZSpring</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<name>Spring MVC Sample</name>
<properties>
<org.springframework-version>4.2.6.RELEASE</org.springframework-version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.2.2.Final</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-jcl</artifactId>
<version>1.6.4</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.16</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.2</version>
</dependency>
<dependency>
<groupId>commons-httpclient</groupId>
<artifactId>commons-httpclient</artifactId>
<version>3.1</version>
<scope>test</scope>
</dependency>
<!-- 마이바티스 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<!-- 마이바티스 스프링-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.1</version>
</dependency>
<!-- DB 프로그래밍을 위해 필요한 Library
1.jdbc class: spring-jdbc
org.springframework.jdbc.core.JdbcTemplate
2.data source: commons-dbcp
org.apache.commons.dbcp.BasicDataSource
3.jdbc driver: mysql-connector-java
com.mysql.jdbc.Driver
-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.12</version>
</dependency>
</dependencies>
<build>
<finalName>mvc</finalName>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
</plugins>
</build>
</project>
2.web.xml 셋팅
서버가 시작될때 1번에 2번(ContextLoaderListener)이 먼저 공통으로 사용할 클래스 객체들을 메모리에 올려놓는다. 그래서 1번에는 service나 Dao 같이 공통으로 사용할 클래스들을 bean으로 정의해놓은 파일의 위치를 기록한다. 그럼 서버가 시작되면서 beans-biz.xml에 있는 bean 객체들을 미리 메모리에 올려놓는다. 그리고 3번에는 서블릿으로 사용할 클래스들의 Bean 객체를 정의한 파일의 위치를 작성한다. 아래에는 mvc.xml 파일에 서블릿 (컨트롤러)과 관련된 bean 객체가 정의되어 있다. 사용자의 요청이 들어오면
DispatcherServlet은 handlerMapping을 통해서 객체로 만든 컨트롤러들을 찾아서 주소에 맞는 컨트롤러를 반환해 준다. 그래서 mvc.xml에는 컨트롤러 어노테이션 (@Controller)이 있는 클래스를 스캔하는 태그들이 있다. 그리고 DispatcherServlet이 1번
contextConfigLocation을 참조하는 구조로 작성해 놓았는데, 컨트롤러가 먼저 1번에서 메모리에 올려진 서비스 클래스의 객체들, Dao 객체들을 사용할 것이기 때문에 참조하는 구조로 기입해놓았다. 7번은 한글처리와 관련된 태그다.
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<display-name>Sample MVC</display-name>
<!-- 1번 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:/META-INF/spring/beans-biz.xml
</param-value>
</context-param>
<!-- 2번 -->
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<!-- 3번 -->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<!-- 5번 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:/META-INF/spring/mvc.xml
</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- 4번 -->
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- 6번 -->
<context-param>
<param-name>defaultHtmlEscape</param-name>
<param-value>true</param-value>
</context-param>
<!-- 7번 -->
<filter>
<filter-name>characterEncodingFilter</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>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
3.beans-biz.xml
이 파일에는 위의 web.xml에서 1번부분 ContextLoaderListener가 미리 읽을 내용들이 있다. 위에서 부터 보면 context scan 태그를 작성해서 미리 사용할 service 클래스들을 DI 컨테이너에 등록한다. 그리고 DataSource를 설정해 준다. DBCP는 아파치가 제공하는 BasicDataSource클래스를 이용해서 dataSource를 만들어주고 하위에 property로 연결할 DB의 정보를 기입한다. DataSource는 DB 커넥션을 쉽게 관리해주는 라이브러리다. 그리고 시작할때 데이터베이스를 초기화 해주고 싶으면 jdbc:initialize-database 태그를 이용해서 db를 초기화 해줄 수 있다. 그리고 스프링이 제공하는 트랜잭션 매니저를 작성해주고, 그다음 중요한 SqlSessionFactoryBean 클래스를 사용해서 sqlSessionFactory를 만들어 준다. sqlSessionFactory는 세 가지를 참조한다. 위에서 만든 dataSource, mybatis설정 파일, sqlMapper.xml 이다. 그리고 이 sqlSessionFactory를 참조하는 sqlSession을 만들어 준다. (SqlSessionFactoryBuilder가 MyBatis 설정 파일을 참조해서 SqlSessionFactory를 생성해준다.) 그리고 사용자가 데이터베이스에 접근하는 요청을 하게 되면 SqlSessionFactory는 요청이 들어온 그 순간 SqlSession 객체를 생성한다. 그리고 SqlSession 객체를 이용해서 DB 관련 작업을 진행한다. 이 때 DB 쿼리문은 mapper 파일(xml)에 있다. 마지막으로 MapperFactoryBean을 이용해서 Dao인터페이스의 구현체인 매퍼 Bean을 생성해주는 태그문을 작성한다. service에서 CarDao 인터페이스를 호출하면 스프링은 해당 매퍼로 등록된 매퍼.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:jdbc="http://www.springframework.org/schema/jdbc"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jpa="http://www.springframework.org/schema/data/jpa"
xmlns:mybatis="http://mybatis.org/schema/mybatis-spring"
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.xsd
http://www.springframework.org/schema/jdbc
http://www.springframework.org/schema/jdbc/spring-jdbc.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/data/jpa
http://www.springframework.org/schema/data/jpa/spring-jpa.xsd
http://mybatis.org/schema/mybatis-spring
http://mybatis.org/schema/mybatis-spring.xsd
">
<!-- 1번 애플리케이션에서 사용할 서비스 클래스를 자동으로 DI 컨테이너에 등록하는 설정 -->
<context:component-scan base-package="com.test.ch.service"/>
<!--
Data Source 설정
mysql 8.0 부터는 url 에 ?serverTimezone=UTC 넣어야함.
driverClassName 은 com.mysql.cj.jdbc.Driver
서드파티가 제공하는 데이터 소스 - Apache Commons DBCP
-->
<bean id="dataSourceSpied" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/MYDB?serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=true"/>
<property name="username" value="root" />
<property name="password" value="111@" />
</bean>
<!-- 초기화
<jdbc:initialize-database data-source="dataSource" ignore-failures = "DROPS">
<jdbc:script location="classpath:/META-INF/script/table.sql" />
<jdbc:script location="classpath:/META-INF/script/data.sql" />
</jdbc:initialize-database> -->
<!-- 트랜잭션 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- https://pangtrue.tistory.com/141 -->
<!-- 결론적으로, Bean으로 등록해야할건 2개다. SqlSessionFactoryBean과 SqlSessionTemplate -->
<!-- SqlSessionFactoryBean -->
<!--
1.DataSource 정보
2.MyBatis 설정 정보
3.Mapper 설정 정보 ( 여기에 SQL문에 대한 정보가 담겨져 있음 )
-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation" value="classpath:/META-INF/spring/mybatis-config.xml" />
<property name="mapperLocations" value="classpath:/META-INF/sql/*.xml" />
</bean>
<!-- SqlSessionTemplate -->
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate" destroy-method="clearCache">
<constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>
<!-- CarDao 인터페이스의 구현체인 매퍼 자동생성 -->
<bean id="mycarDao" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface" value="com.test.ch.dao.CarDao" />
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
</beans>
4.mybatis-config.xml
마이바티스 설정파일이다. 아래와 같다.
<?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>
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
</configuration>
5.DAO 인터페이스를 구현해놓은 mapper xml 파일이다.
mapper의 namespace에는 Dao 인터페이스의 경로, 즉 패키지명을 써주고 인터페이스명(CarDao)까지 써준다. VO나 도메인 오브젝트를 써주지 않도록 주의하자. 그리고 id 명은 DAO 인터페이스의 메소드 명과 일치하는지도 주의해야한다.
<?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="com.test.ch.dao.CarDao">
<select id="getCar" resultType="string">
SELECT name FROM CAR limit 1
</select>
</mapper>
6.mvc.xml
컨트롤러 클래스를 자동으로 DI 컨테이너에 등록시키거나, 정적리소스 설정, 뷰리졸버 설정
<?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:mvc="http://www.springframework.org/schema/mvc"
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.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- 애플리케이션이 사용하는 컨트롤러 클래스를 자동으로 DI 컨테이너에 등록하기 -->
<context:component-scan base-package="com.test.ch.controller"/>
<!-- 이 태그가 없으면 mvc:resources 사용할때, 컨트롤러가 안먹힘 -->
<!-- <mvc:annotation-driven validator="globalValidator" enable-matrix-variables="true"/> -->
<mvc:annotation-driven></mvc:annotation-driven>
<!-- Static Resource 설정 -->
<mvc:resources mapping="/resources/**" location="/WEB-INF/resources/" />
<!-- 뷰리졸버 설정 -->
<mvc:view-resolvers>
<mvc:jsp prefix="/WEB-INF/views/" suffix=".jsp"/>
</mvc:view-resolvers>
</beans>
클래스 파일 작성하기 - @어노테이션을 각 클래스마다 잘 기입했는지 확인
7.VO 클래스 작성하기
package com.test.ch.vo;
public class CarVO {
private String id;
private String name;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
8.DAO 인터페이스 작성하기
package com.test.ch.dao;
public interface CarDao {
public String getCar() throws Exception;
}
9.Service와 ServiceImpl 작성하기
package com.test.ch.service;
public interface CarService {
public String getCar()throws Exception;
}
package com.test.ch.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.test.ch.dao.CarDao;
@Service
public class CarServiceImpl implements CarService{
@Autowired
private CarDao carDao;
public CarServiceImpl() {
super();
System.out.println("CarServiceImpl 초기화");
}
@Override
public String getCar()throws Exception {
System.out.println("CarServiceImpl - init");
String car = carDao.getCar();
return car;
}
}
10.Controller 작성하기
package com.test.ch.controller;
import static org.springframework.web.bind.annotation.RequestMethod.GET;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import com.test.ch.dao.CarDao;
import com.test.ch.service.CarService;
import com.test.ch.vo.CarVO;
@Controller
public class CarController {
@Autowired
private CarService carService;
public CarController() {
//super();
System.out.println("MainController 초기화");
}
@RequestMapping(value = "/home", method = GET)
public String home() throws Exception{
System.out.println("home 메소드 진입");
String carvo = carService.getCar();
System.out.println("이름 : " + carvo);
return "index";
}
@RequestMapping(value = "/test", method = GET)
public String test() {
System.out.println("test 메소드 진입");
return "test";
}
}
서버시작시 로그
서버가 시작되면 @ 어노테이션이 달려있는 클래스들을 스프링이 먼저 DI컨테이너에 등록해준다. 메모리에 올려준다. 순서는
ContextLoaderListener가 참조하는 beans-biz.xml 파일안에 작성되어 있는 bean 객체들(공통)을 초기화 하고 그다음 mvc.xml 파일안에 작성되어 있는 bean 객체들(뷰리졸버, Controller 등) 을 메모리에 올린다. 로그에보면 초기화, 초기화 로그가 보인다. 어노테이션 붙어있는 클래스들을 이제 사용할 수 있다는 뜻.
정보: Initializing Spring root WebApplicationContext
log4j:WARN No appenders could be found for logger (org.springframework.web.context.ContextLoader).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
CarServiceImpl 초기화
Nov 14, 2020 5:03:21 PM org.apache.catalina.core.ApplicationContext log
정보: Initializing Spring FrameworkServlet 'dispatcherServlet'
MainController 초기화
Nov 14, 2020 5:03:22 PM org.apache.coyote.AbstractProtocol start
정보: 프로토콜 핸들러 ["http-nio-8080"]을(를) 시작합니다.
Nov 14, 2020 5:03:22 PM org.apache.catalina.startup.Catalina start
정보: Server startup in 3053 ms
실행
http://localhost:8080/home 을 브라우저에 입력하면 아래와 같은 로그가 나온다. 정상작동한다는 뜻이다.
Nov 14, 2020 5:03:22 PM org.apache.catalina.startup.Catalina start
정보: Server startup in 3053 ms
home 메소드 진입
CarServiceImpl - init
이름 : volvo
파일구조
예제파일
'웹개발 > 스프링' 카테고리의 다른 글
스프링 시큐리티 인증 예제 (MyBatis MySql 연동) (0) | 2020.11.22 |
---|---|
스프링 개발전 Controller Class파일 작성하기 - part2 (0) | 2020.11.14 |
스프링 4 MyBatis 연동 (0) | 2020.11.12 |
스프링 4 MVC - part 3 (0) | 2020.11.11 |
스프링 4 MVC - part 2 (0) | 2020.11.11 |