[예시] MVC 디자인 패턴
# 1 src/main/resources 패키지 생성
# 2 config/spring/context 내 context 추가
[참고] MVC 디자인 패턴 구조

# TestController
- 컨트롤러
# TestDao.java
- 기능 단위 추상메소드 집합의 인터페이스
# TestService.java
- 모듈 단위 추상메소드 집합의 인터페이스
# TestServiceImpl.java
- TestService를 구현하는 클래스
# TestVO.java
- Value Object 객체
# test.xml
- 맵퍼
# db.properties
- DB접속 설정파일
# mybatis-config.xml
- 맵퍼 설정파일
# context-1-datasource.xml
- DB객체 의존성 주입 설정 파일
# context-2-mybatis.xml
- Mybatis객체 의존성 주입 설정 파일
# test_list.jsp
- 목록 화면
# 3 config/spring/mvc 내 servlet-context 작성
# 4 ojdbc6.jar를 tomcat > lib 폴더 내 저장
# 5 src/main/resource 내 db.properties, mybatis-config, 맵퍼 생성
# 6 Table 생성
type | Sql |
table | create table dept( test_no varchar2(30) primary key, test_nm varchar2(30), disp_order number(3,0), remark varchar2(100) ); |
# 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">
<!-- filter속성
- Jsp와 컨트롤러 간 파라미터로 전송 시 .do등의 특정 확장자의 맵핑 주소를 형식으로 사용할 경우
- 맵핑 주소를 특정 인코딩 타입으로 받을 수 있도록 설정하는 속성이다.
- .do로 끝나는 확장자명의 url은 모두 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>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
<!-- The definition of the Root Spring Container shared by all Servlets
and Filters -->
<context-param>
<param-name>contextConfigLocation</param-name>
<!-- root-context 참조 경로
- classpath의 * 표시는 프로젝트 내의 모든 경로를 뜻한다.
- 모든 경로 상을 검색하여 config/spring/context/context-*.xml 로 시작하는 XML파일을 전부 읽는다.
-->
<param-value>classpath*:config/spring/context/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>
<!-- servlet-context의 참조 경로
- config/spring/mvc/servlet-context.xml 파일을 참조한다.
# 동작 순서
- (1) web.xml이 실행되며 root-context의 경로 내 파일을 순차적으로 실행
- (2) config/spring/mvc/servlet-context.xml을 실행
-->
<param-value>classpath:config/spring/mvc/servlet-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
# db.properties
driver=oracle.jdbc.OracleDriver
url=jdbc:oracle:thin:@localhost:1521:xe
user=test
password=1111
# pom.xml
<?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.korea</groupId>
<artifactId>Test</artifactId>
<packaging>war</packaging>
<version>1.0.0-BUILD-SNAPSHOT</version>
<properties>
<java-version>1.6</java-version>
<org.springframework-version>3.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>
<!-- Test -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.7</version>
<scope>test</scope>
</dependency>
<!-- pom.xml
- 라이브러리를 넣는 설정파일로 플러그인과 라이브러리 등으로 구성되어있다.
라이브러리 등록 방법
- (1) dependencies 태그 내에 메이븐에서 복사한 소스를 붙여넣기한다.
- (2) 저장하는 순간부터 인터넷을 통해서 다운로드가 시작된다.
- (3) 다운로드가 완료되면 해당 라이브러리의 클래스 사용이 가능하다.
-->
<!-- commons-dbcp -->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
<!-- myBatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<!-- myBatis-Spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.1</version>
</dependency>
<!-- spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>3.2.2.RELEASE</version>
</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>
<name>Ex_0000_Test</name>
</project>
# context-1-datasource.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 https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd">
<!-- Root Context: defines shared resources visible to all other web components -->
<!-- context-1-datasource.xml
- context:property 태그를 사용하여 db.properties 파일을 읽어들여 DB에 접근하는 빈객체를 생성
의존성 주입을위한 준비
- (1) 웹 브라우저에서 http://mvnrepository.com 에 접속
- (2) maven 속성으로 되어있는 프로젝트는 라이브러리를 온라인으로 다운받는 것이 가능하다. (폐쇠망에서는 jar파일로 대체)
- (3) dbcp를 검색한 뒤 Commons Dbcp를 클릭한다.
- (4) 버전을 선택한다. (보통 최신버전은 안정성 이슈로 좀 예전 버전을 선택하지만, DB쪽은 최신버전도 괜찮다.)
- (5) maven 영역을 클릭하면 소스가 복사된다.
- (6) pom.xml의 dependencies 태그내에 복사한 영역을 붙여넣기한다. (개발자는 자신이 개인적으로 사용하는 pom.xml을 관리하기도 한다.)
데이터소스 의존성 주입
- 각 속성의 값은 db.properties에 있는 값을 ${명칭} 형태로 가져와서 사용한다.
- DB관련 객체는 싱글톤 방식으로 생성한다.
- 객체 속성의 class값은 인터넷에서 찾아서 넣어주면되며, 만약 오류가 발생한다면 라이브러리를 pom.xml 넣는 과정에서 문제가 있다는 뜻이다.
-->
<context:property-placeholder location="classpath:config/mybatis/db.properties"/>
<bean id="ds" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${user}"/>
<property name="password" value="${password}"/>
<property name="maxActive" value="20"/>
</bean>
</beans>
# context-2-mybatis.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- Root Context: defines shared resources visible to all other web components -->
<!-- context-2-mybatis.xml
- context-1-datasource.xml에서 생성한 DB객체를 사용하여
- 자바 객체와 Sql간 맵핑하는 mybatis 객체를 주입한다.
- mybatis, mybatis-spring, spring-jdbc 세가지 라이브러리가 pom.xml 에 있어야한다.
-->
<!-- sqlSessionFactroyBean
- DB연동 정보를 가지고있는 ds객체를 참조하여 군집을 생성하는 클래스
- DB설정 정보 및 맵퍼 정보를 가지고있는 mybatis-config.xml 파일을 파라미터로 받는다.
-->
<bean id="factoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="ds"/>
<property name="configLocation" value="classpath:config/mybatis/mybatis-config.xml"/>
</bean>
<!-- sqlSessionTemplate
- sqlSession 인터페이스를 싱글톤 방식으로 구현하는 클래스
- DB와 mybatis의 정보를 참조하는 sqlSessionBean 객체를 생성한다.
- factoryBean객체를 sqlSessionTemplate 객체에 주입하여 mybatis-config.xml에 있는 맵퍼를 등록하는 역할을 한다.
- 해당 클래스는 생성자만 존재해서 생성자 인젝션으로만 주입해야한다.
-->
<bean id="sqlSessionBean" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg ref="factoryBean"/>
</bean>
</beans>
<?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="cacheEnabled" value="false" />
<setting name="useGeneratedKeys" value="true" />
<setting name="defaultExecutorType" value="REUSE" />
</settings>
<!-- typeAliases
- 맵퍼 동작 시 VO의 명칭을 축약하여 사용할 수 있도록 하는 속성
- 축약된 단어는 맵퍼에서 resultType을 입력하는데 사용된다.
-->
<typeAliases>
<typeAlias type="com.korea.vo.TestVO" alias="test"/>
</typeAliases>
<!-- mappers
- config.mybatis.context에서 사용할 맵퍼 파일을 등록한다.
- 등록된 맵퍼는 context-2-mybatis에서 factoryBean객체의 configLocation속성 값에 적용되어 사용할 수 있다.
-->
<mappers>
<mapper resource="config/mybatis/mapper/test.xml"/>
</mappers>
</configuration>
# testVO.java
package com.korea.vo;
public class TestVO {
private String test_no, test_nm, disp_order, remark;
public String getTest_no() {
return test_no;
}
public void setTest_no(String test_no) {
this.test_no = test_no;
}
public String getTest_nm() {
return test_nm;
}
public void setTest_nm(String test_nm) {
this.test_nm = test_nm;
}
public String getDisp_order() {
return disp_order;
}
public void setDisp_order(String disp_order) {
this.disp_order = disp_order;
}
public String getRemark() {
return remark;
}
public void setRemark(String remark) {
this.remark = remark;
}
}
package com.korea.dao;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import com.korea.vo.TestVO;
@Repository
public class TestDao {
@Autowired
SqlSession sqlSession;
// 테스트 목록 가져오기
public List<TestVO> selectList(){
//
List<TestVO> list = sqlSession.selectList("test.test_list");
return list;
}
}
# testService.java
package com.korea.service;
import org.springframework.ui.Model;
public interface TestService {
//
public void list(Model model) throws Exception;
}
# testServiceImpl.java
package com.korea.serviceImpl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.ui.Model;
import com.korea.dao.TestDao;
import com.korea.service.TestService;
import com.korea.vo.TestVO;
@Service
@Transactional
public class TestServiceImpl implements TestService{
@Autowired
TestDao test_dao;
// 목록 조회
public void list(Model model) throws Exception{
//
List<TestVO> list = test_dao.selectList();
model.addAttribute("list",list);
}
}
# testController.java
package com.korea.ctr;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.korea.dao.TestDao;
import com.korea.service.TestService;
import com.korea.serviceImpl.TestServiceImpl;
import com.korea.vo.TestVO;
@Controller
public class TestController {
//
public static final String VIEW_PATH = "/WEB-INF/views/test/";
//
@Autowired
TestService test_service;
// 로그인 화면
@RequestMapping(value= {"/","/login.do"})
public String list(Model model) throws Exception {
//
test_service.list(model);
return VIEW_PATH + "test_list.jsp";
}
}
# test.xml
<?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="test">
<select id="test_list" resultType="test">
SELECT * FROM TEST
</select>
</mapper>
<%@ 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>
<script src="${ pageContext.request.contextPath }/resources/httpRequest.js"></script>
<script type="text/javascript">
</script>
</head>
<body>
<h1>테스트 목록</h1>
<table border="1">
<caption>:: 테스트 화면 ::</caption>
<tr>
<th>테스트 순번</th>
<th>테스트 명칭</th>
<th>조회순서</th>
<th>비고</th>
</tr>
<c:forEach var="list" items="${ list }">
<tr>
<td>${list.test_no}</td>
<td>${list.test_nm}</td>
<td>${list.disp_order}</td>
<td>${list.remark}</td>
</tr>
</c:forEach>
</table>
</body>
</html>
'Web > Spring' 카테고리의 다른 글
[Spring] 관점지향 프로그래밍 (0) | 2025.01.09 |
---|---|
[Spring] 어노테이션 (0) | 2025.01.09 |
[Spring] 의존성 주입 (0) | 2025.01.09 |
[Spring] Framework (0) | 2025.01.09 |
[Spring] Spring Framework 설치 (0) | 2025.01.09 |