Web/Spring

[Spring] MVC 디자인 패턴

hikr90 2025. 1. 9. 22:06

[예시] 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>
# 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="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;
	}
	
}
 
# testDao.java
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>

 

# test_list.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>
<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