일상/일기장
TIL22.03.17 - Spring : Spring MVC - Template 페이지, 환경설정
jmaster
2022. 3. 17. 23:49
Template 페이지 구축하기
- 템플릿 페이지를 이용한 사이트 구현 기능을 제공하는 라이브러리
- Tiles : 템플릿 페이지를 이용한 사이트 구현 기능을 제공하는 프로그램
- Tiles 관련 라이브러리를 빌드 처리 - porm.xml
- 요청 처리 메소드에서 반환받는 ViewName를 Tiles 프로그램으로 응답되도록 ViewResolver 설정 - sevlet-context.xml
- 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 클래스를 작성하는 방법
- DataSource 관련 라이브러리와 Mybatis 관련 라이브러리 빌드 처리 - porm.xml
- ⇒ojbc, spring-jdbc(spring-tx), mybatis, mybatis-spring
- 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>
- SqlSessionFactory 관련 클래스와 SqlSession 관련 클래스를 Spring Bean으로 등록
- root-context.xml : 모든 Front Controller에서 사용할 수 있는 Spring Bean을 등록하기 위한 Bean Configuration File⇒ DataSource, SqlSessionFactory, SqlSession, TransactionManager 등
- ⇒ DAO 클래스 작성에 필요한 클래스를 Spring Bean으로 등록
- ⇒ 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>
- DTO 클래스 작성
- 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
- 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();
}
}