일상/일기장

TIL22.03.17 - Spring : Spring MVC - Template 페이지, 환경설정

jmaster 2022. 3. 17. 23:49

Template 페이지 구축하기

  • 템플릿 페이지를 이용한 사이트 구현 기능을 제공하는 라이브러리

  • Tiles : 템플릿 페이지를 이용한 사이트 구현 기능을 제공하는 프로그램
    1. Tiles 관련 라이브러리를 빌드 처리 - porm.xml
    2. 요청 처리 메소드에서 반환받는 ViewName를 Tiles 프로그램으로 응답되도록 ViewResolver 설정 - sevlet-context.xml
    3. Tiles Configuration File(XML) 작성 - 요청 처리 메소드에서 반환되는 ViewName에 대한 템플릿 페이지에 대한 템플릿 페이지(JSP) 설정

 

UrlBasedViewResolver 클래스를 Spring Bean으로 등록

  • UrlBasedViewResolver : Spring Framework에서 제공하는 ViewResolver가 아닌 외부에서 제공하는 ViewResolver를 이용하여 응답 처리하기 위한 기능을 제공하기 위한 객체 -Apache 제공
  • viewClass 필드에 외부에서 제공하는 ViewResolver 클래스(TilesView)를 인젝션 처리
  • order 필드에는 ViewResolver 사용 관련 우선수위를 정수값으로 인젝션 처리
  • ⇒ 정수값이 낮을 수록 우선순위가 높게 설정
<beans:bean class="org.springframework.web.servlet.view.UrlBasedViewResolver">
		<beans:property name="viewClass" value="org.springframework.web.servlet.view.tiles3.TilesView"></beans:property>
		<beans:property name="order" value="2"></beans:property>
	</beans:bean>

 

TilesConfigurer 클래스를 Spring Bean으로 등록

  • TilesConfigurer : Tiles 프로그램에서 사용할 템플릿 페이지 정보가 저장된 XML 파일(Tiles Configuration File)의 경로를 저장하기위한 객체
  • definitions 필드에 List객체를 생성하여 인젝션 처리
  • ⇒ List 객체의 요소로 Tiles Configuration File의 경로를 추가
<beans:bean class="org.springframework.web.servlet.view.tiles3.TilesConfigurer">
	<beans:property name="definitions">
		<beans:list>
			<beans:value>/WEB-INF/spring/appServlet/tiles.xml</beans:value>
		</beans:list>
	</beans:property>
</beans:bean>

 

Tiles 사이트 (사용법)

https://tiles.apache.org/download.html

tiles.xml

  • definition : 클라이언트 요청에 대한 응답 템플릿 페이지를 설정하기 위한 엘리먼트
  • name 속성 : definition 엘리먼트를 구분하기 위한 식별자를 속성값으로 설정
  • ⇒ 요청 처리 메소드에서 제공되는 ViewName으로 사용
  • template 속성 : 템플릿 페이지로 응답되기 위한 JSP 문서의 경로를 속성값으로 설정
  • put-attribute : 템플릿 페이지를 구성하는 JSP 문서를 제공하기 위한 엘리먼트⇒ value 속성 : 템플릿 페이지에 포함될 JSP 문서의 경로를 속성값으로 설정
  • <definition name="main" template="/WEB-INF/views/layout/template.jsp"> <put-attribute name="header" value="/WEB-INF/views/layout/header.jsp"/> <put-attribute name="content" value="/WEB-INF/views/layout/content.jsp"/> <put-attribute name="footer" value="/WEB-INF/views/layout/footer.jsp"/> </definition>
  • ⇒ name 속성 : put-attribute 엘리먼트를 구분하기 위한 식별자를 속성값으로 설정
  • name 속성값 [*]로 설정한 경우 요청 처리 메소드의 제공되는 하나의 [ViewName] 형식의 제공되는 ViewName을 이용하여 템플릿 페이지로 응답되도록 처리
  • extends 속성: definition 엘리먼트의 식별자를 속성값으로 설정
  • ⇒ definition 엘리먼트의 템플릿 페이지 정보를 상속받아 사용
  • 상속받은 definition 엘리먼트에서 put-attribute 엘리먼트의 식별자가 중복될 경우 기존 JSP문서 대신 새로운 JSP 문서 제공하여 템플릿 페이지에 포함 = Override
  • definition 엘리먼트의 name 속성값을 [*]로 설정한 경우 put-attribute 엘리먼트의 value 속성값에서 제공되는 ViewName을 {정수값}으로 표현
<definition name="*" extends="main">
		<put-attribute name="content" value="/WEB-INF/views/{1}.jsp"/>	
	</definition>

 

  • name 속성값 [/]로 설정한 경우 요청 처리 메소드의 제공되는 하나의 [값/값] 형식의 제공되는 ViewName을 이용하여 템플릿 페이지로 응답되도록 처리
  • ⇒[*]문자는 ViewName의 값을 1부터 1씩 증가된 정수값으로 표현
<definition name="*/*" extends="main">
		<put-attribute name="content" value="/WEB-INF/views/{1}/{2}.jsp"/>	
	</definition>

 

template.jsp

  • tiles 관련 태그를 제공하는 태그 라이브러리 포함
<%@taglib prefix="tiles" uri="<http://tiles.apache.org/tags-tiles>" %>

 

  • insertAttribute 태그 : Tiles Configuration File의 put-attribute 엘리먼트로 설정한 JSP 문서의 실행결과를 삽입하는 태그
  • name 속성 : put-attribute 엘리먼트의 식별자를 속성값으로 설정
<body>
	<div id="header">
		<tiles:insertAttribute name="header"/>
	</div>
	<div id="content">
		<tiles:insertAttribute name="content"/>
	</div>
	<div id="footer">
		<tiles:insertAttribute name="footer"/>
	</div>
</body>

 

ex)관리자페이지 구현할 때

<definition name="amdin" template="/WEB-INF/views/admin/admin_template.jsp">
	<put-attribute name="header" value="/WEB-INF/views/admin/admin.jsp"/>	
	<put-attribute name="content" value="/WEB-INF/views/admin/content.jsp"/>	
</definition>

<definition name="amdin/*" extends="admin">
	<put-attribute name="content" value="/WEB-INF/views/admin/{1}.jsp"/>	
</definition>

 

MyBatis

  • Mybatis Framework를 제공하는 라이브러리
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
	<dependency>
	    <groupId>org.mybatis</groupId>
	    <artifactId>mybatis</artifactId>
	    <version>3.5.9</version>
	</dependency>

 

  • Spring Framework에서 MyBatis Framework를 사용할 수 있는 기능을 제공하는 라이브러리
<dependency>
	    <groupId>org.mybatis</groupId>
	    <artifactId>mybatis-spring</artifactId>
	    <version>2.0.7</version>
	</dependency>

 

 

DTO 생성

  • DTO 클래스 : JDBC 프로그램에서 테이블의 행정보를 표현하기 위한 클래스

DAO인터페이스 생성

public interface StudentDAO {
   int insertStudent(Student student);
   List<Student> selectStudentList();
}

 

DAO생성

SpringMVC에서 Mybatis Framework를 사용하여 DAO 클래스를 작성하는 방법

  1. DataSource 관련 라이브러리와 Mybatis 관련 라이브러리 빌드 처리 - porm.xml
  2. ⇒ojbc, spring-jdbc(spring-tx), mybatis, mybatis-spring
  3. Mybatis Framework의 환경설정파일 작성
<?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="tue"/>
	</settings>
</configuration>

 

  1. SqlSessionFactory 관련 클래스와 SqlSession 관련 클래스를 Spring Bean으로 등록
    • root-context.xml : 모든 Front Controller에서 사용할 수 있는 Spring Bean을 등록하기 위한 Bean Configuration File⇒ DataSource, SqlSessionFactory, SqlSession, TransactionManager 등
    • ⇒ DAO 클래스 작성에 필요한 클래스를 Spring Bean으로 등록
  2. ⇒ Bean configuration File(root-context) 에서 bean엘리먼트 사용하여 Spring Bean으로 등록
  • DataSource 관련 클래스를 Spring Bean으로 등록 ⇒ Connection 객체를 생성하기 위한 값을 필드에 인젝션 처리
<bean class="org.springframework.jdbc.datasource.DriverManagerDataSource" id="dataSource">
		<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
		<property name="url" value="jdbc:oracle:thin:@localhost:1521:xe"/>
		<property name="username" value="scott"/>
		<property name="password" value="tiger"/>
	</bean>

 

  • SqlSessionFactory 관련 클래스를 Spring Bean으로 등록
  • configLocation 필드에는 Mybatis 환경설정파일의 경로를 인젝션 처리
  • SpringMVC에서 사용하는 Spring Container(WebApplicationContext 객체)는 [src/main/webapp] 폴더(/)의 자원만 접근 가능
  • [src/main/java] 또는 [src/main/resources] 폴더에 작성된 자원에 접근하기 위해서는claspath 접두사를 사용하여 자원의 경로 표현
	<bean class="org.mybatis.spring.SqlSessionFactoryBean" id="sqlSessionFactoryBean">
		<property name="configLocation" value="/WEB-INF/spring/mybatis-config.xml"/> 
	</bean>

 

  • 패키지에 자원이 작성된 경우 파일 시스템 경로로 표현하여 접근 가능
	<bean class="org.mybatis.spring.SqlSessionFactoryBean" id="sqlSessionFactoryBean">
		<property name="configLocation" value="classpath:xyz/itwill10/xml/mybatis-config.xml"/>
		<property name="configLocation" value="classpath:mybatis-config.xml"/>
	</bean>

 

  • dataSource 필드에는 DataSource 관련 SpringBean을 인젝션 치리
  • ⇒ Mybatis 환경설정파일의 environment 엘리먼트 생략
<property name="dataSource" ref="dataSource"/>

 

  • typeAliasePackage 필드에는 DTO 클래스를 작성하는 패키지를 인젝션 처리
  • ⇒ Mybatis 환경설정파일의 typeAliase 엘리먼트 생략
<property name="typeAliasesPackage" value="xyz.itwill10.dto"/>

 

  • mapperLocations 필드에는 XML 맵퍼 파일을 List 객체의 요소로 추가하여 인젝션 처리⇒ Mybatis 환경설정파일의 typeAliase 엘리먼트 생략
  • ⇒ * 패턴문자를 이용하여 다수의 XML 파일을 맵퍼 파일로 등록 가능
<property name="mapperLocations">
		<list>
			<value>classpath:xyz/itwill10/mapper/*.xml</value>
		</list>
</property>

 

  • SqlSession 관련 클래스를 Spring Bean으로 등록⇒clearCache 메소드 : SqlSession 관련 객체를 소멸시키는 메소드
  • ⇒ destory-method 속성에 clearCache 메소드를 속성값으로 설정
  • 생성자를 이용하여 SqlSessionFactory 관련 클래스의 Spring Bean을 인젝션
<bean class="org.mybatis.spring.SqlSessionTemplate" id="sqlSession" destroy-method="clearCache">
		<constructor-arg ref="sqlSessionFactoryBean"/>
	</bean>

 

  • TransactionManager 관련 클래스를 Spring Bean으로 등록
  • ⇒beanName은 반드시 [TransactionManager]로 설정
  • dataSource 필드에는 DataSource 관련 Spring Bean를 인젝션 처리
<bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager" id="TransactionManager">
		<property name="dataSource" ref="dataSource"/>
	</bean>

 

  1. DTO 클래스 작성
  2. Mapper 작성 - XML 맵퍼와 Interface 맵퍼를 바인딩하여 작성하는 것을 권장

http://mybatis.org/dtd/mybatis-3-mapper.dtd>">

	
		insert into student values(#{no},#{name},#{phone}, #{address},#{birthday})
		select * from student order by no
	

 

 

  1. DAO 클래스 작성 - XML 맵퍼에 등록된 SQL 명령을 전달하여 실행하고 결과를 저장
    • DAO 클래스 : 저장매체에게 행에 대한 삽입,변경,삭제,검색 기능을 제공하는 클래스
    • ⇒DBMS 서버에 SQL 명령을 전달하여 실행하고 실행결과를 Java 객체로 반환하는 클래스
    • DAO 클래스를 Spring Annotiation으로 Spring Bean으로 등록 - DAO 객체로 메소드 호출 가능
    • @Repository : DAO 클래스를 Spring Bean으로 등록하기 위한 어노테이션
    • ⇒트렌젝션 관리자 기능을제공받아 사용
    • Spring Container가 Spring Annotation을 처리하기 위해 Bean Configuration File(servlet-context.xml)에서 component-scan 엘리먼트를 사용하여 DAO 클래스가 작성된 패키지를 설정
    • SqlSession 관련 클래스의 Spring Bean을 제공받아 필드에 인젝션 처리
    • ⇒ DAO 클래스의 메소드에서 SqlSession 객체의 메소드를 호출하여 XML 맵퍼에 등록된 SQL 명령을 전달하여 실행결과를 Java 객체로 반환하여 처리
    • @Autowired 어노테이션과 @Qualifier 어노테이션을 사용하여 인젝션 처리
    • ⇒ 인젝션 처리할 필드마다 @Autowired 어노테이션 사용
@Repository  
public class StudentDAOImpl implements StudentDAO {
	@Autowired
	private SqlSession sqlSession;
	
	@Override
	public int insertStudent(Student student) {
		return sqlSession.getMapper(StudentMapper.class).insertStudent(student);
	}

	@Override
	public List<Student> selectStudentList() {
		return sqlSession.getMapper(StudentMapper.class).selectStudentList();
	}
}

 

7.Service 작성

  • Service 클래스 : 프로그램 실행에 필요한 기능을 제공하는 클래스
  • ⇒ Service 클래스의 메소드는 DAO 클래스의 메소드를 호출하여 필요한 기능 구현
  • Service 클래스를 Spring Annotiation으로 Spring Bean으로 등록 - Service 객체로 메소드 호출 가능
  • @Service : Service 클래스를 Spring Bean으로 등록하기 위한 어노테이션
  • ⇒ 예외 처리 기능을 제공받아 사용
  • Spring Container가 Spring Annotation를 처리하기 위해 Bean Configuration File(servlet-context.xml)에서 component-scan 엘리먼트를 사용하여 Service 클래스가 작성된 패키지를 base-package 속성값으로 설정
//@Service
public class StudentServiceImpl implements StudentService {
	@Autowired
	private StudentDAO studentDAO;

	@Override
	public void addStudent(Student student) {
		studentDAO.insertStudent(student);
	}

	@Override
	public List<Student> getStudentList() {
		return studentDAO.selectStudentList();
	}
}