https://mvnrepository.com/artifact/org.apache.maven.plugins/maven-war-plugin
해당 영역 복사하여
pom.xml의 <plugins> </plugins> 영역 사이에 붙여넣고
해당 내용도 사이에 추가해주자
oraclexe 해당경로의 ojdbc.jar 파일을 복사하여
현재 스프링에서 사용중인 톰캣버전 lib 파일안에 붙여넣기
마이바티스를 스프링에서 사용할 때 설정파일은 다음과 같이 정리해보자
WebInitializer.java
package config;
import javax.servlet.Filter;
import org.springframework.web.filter.CharacterEncodingFilter;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
import context.Context_1_dataSource;
import context.Context_2_mybatis;
import context.Context_3_dao;
import mvc.Servlet_Context;
public class WebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
//root-context를 찾아주는 메서드
@Override
protected Class<?>[] getRootConfigClasses() {
// TODO Auto-generated method stub
return new Class<?>[]{Context_1_dataSource.class,
Context_2_mybatis.class,
Context_3_dao.class}; //context파일갯수에 맞게 추가
}
//servlet-context를 찾아주는 메서드
@Override
protected Class<?>[] getServletConfigClasses() {
// TODO Auto-generated method stub
return new Class<?>[]{Servlet_Context.class};
}
@Override
protected String[] getServletMappings() {
// TODO Auto-generated method stub
return new String[] {"/"};
}
//파라미터 인코딩 필터설정
@Override
protected Filter[] getServletFilters() {
CharacterEncodingFilter endcodingFilter = new CharacterEncodingFilter();
endcodingFilter.setEncoding("UTF-8");
return new Filter[] {endcodingFilter};
}
}
context 패키지 작성을 위한 라이브러리 다운로드
https://mvnrepository.com/artifact/commons-dbcp/commons-dbcp
Commons DBCP 1.4버전 Maven 영역 복사하여
pom.xml의 <dependencies> </dependencies> 영역 사이에 붙여넣기
(src/main/resources -> context패키지 -> Context_1_dataSource.java 작성하기 위함)
Context_1_dataSource.java
package context;
import javax.sql.DataSource;
import org.apache.commons.dbcp.BasicDataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration // 이 파일은 설정파일입니다!
public class Context_1_dataSource {
@Bean
public DataSource ds() { //db연결(이전엔 JNDI에서 했던 설정임)
BasicDataSource ds = new BasicDataSource();
ds.setDriverClassName("oracle.jdbc.OracleDriver");
ds.setUrl("jdbc:oracle:thin:@localhost:1521:xe");
ds.setUsername("test_pm");
ds.setPassword("0000");
return ds;//데이터소스 객체 반환
}
}
https://mvnrepository.com/artifact/org.mybatis/mybatis
MyBatis 3.5.6버전 Maven 영역 복사하여
pom.xml의 <dependencies> </dependencies> 영역 사이에 붙여넣기
(src/main/resources -> context패키지 -> Context_2_mybatis.java 작성하기 위함)
https://mvnrepository.com/artifact/org.mybatis/mybatis-spring
MyBatis Spring 1.3.1버전 Maven 영역 복사하여
pom.xml의 <dependencies> </dependencies> 영역 사이에 붙여넣기
(src/main/resources -> context패키지 -> Context_2_mybatis.java 작성하기 위함)
https://mvnrepository.com/artifact/org.springframework/spring-jdbc
Spring JDBC 3.2.2버전 Maven 영역 복사하여
pom.xml의 영역 사이에 붙여넣기
(src/main/resources -> context패키지 -> Context_2_mybatis.java 작성하기 위함)
Context_2_mybatis.java
package context;
import javax.sql.DataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
@Configuration
//Spring이 @Configuration 어노테이션이 붙은 클래스의 Bean을 생성하고 생성자 주입이 성립
public class Context_2_mybatis {
DataSource ds; //DataSource 타입의 참조변수를 선언, 아직 메모리에 올라가지 않은 상태
//생성자 주입(constructor Injection)
public Context_2_mybatis(DataSource ds) {
this.ds=ds;
}
//(SqlSessionFactory클래스) Factory객체가 DB에 접근하는 방법을 알고있는 객체
@Bean
public SqlSessionFactory factoryBean() throws Exception {
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(ds); //생성자주입에서 전달
//추가적인 Mybatis 설정
factoryBean.setConfigLocation(new ClassPathResource("config/mybatis/mybatis-config.xml"));
//SqlSessionFactoryBean 객체 자체를 생성하는 것이 아니라 Factory에서 getObject()메서드를 호출한 결과를 리턴함
//이 경우 스프링은 어플리케이션 시작지점에서 SqlSessionFactory를 빌드하고 sqlSessionFactory라는 이름으로 저장
return factoryBean.getObject();
}
//Mybatis 원래작동방식
//factory객체를 가지고 factory.openSession() -> SqlSession객체 생성
//Mybatis 스프링 작동방식
//스프링에서는 SqlSessionTemplate클래스가 SqlSession을 구현하고 다른 코드에서 SqlSession을 대체하는 역할을 한다.
//SQL을 처리하는 마이바티스 메서드를 호출할 때, SqlSessionTemplate은 SqlSession이 현재의 스프링 트랜잭션에서 사용될 수 있도록 보장해줌
//SqlSessionTemplate은 필요한 시점에서 세션을 닫고 commit이나 rollback을 포함한 Session의 LifeCycle을 관리한다.
@Bean
public SqlSessionTemplate sqlSessionBean(SqlSessionFactory factoryBean) throws Exception {
return new SqlSessionTemplate(factoryBean());
}
}
DeptVO.java
package vo;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class DeptVO {
private String dname,loc;
private int deptno;
}
DeptDAO.java
package dao;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import vo.DeptVO;
public class DeptDAO {
SqlSession sqlSession;
//생성자injection말고 setterinjection 사용해보자
//sqlSession을 담기위한 setSqlSession을 만드는것
//생성자injection을 원한다면 void setSqlSession 대신 클래스명을 써주면됨
public void setSqlSession(SqlSession sqlSession) {
this.sqlSession = sqlSession;
}
//전체부서 조회
public List<DeptVO> selectList(){
List<DeptVO> list = sqlSession.selectList("dept.dept_list"); //mapper에서 namespace와 id
return list;
}
}
dao객체만들기
Context_3_dao.java
package context;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.context.annotation.Bean;
import dao.DeptDAO;
public class Context_3_dao {
@Bean
public DeptDAO dept_dao(SqlSessionTemplate sqlSession) {
DeptDAO dept_dao = new DeptDAO();
dept_dao.setSqlSession(sqlSession);
return dept_dao;
}
}
dept.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="dept">
<select id="dept_list" resultType="vo.DeptVO">
SELECT * FROM DEPT
</select>
</mapper>
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>
<!-- <typeAlias type="vo.DeptVo" alias="dept"/> -->
</typeAliases>
<mappers>
<mapper resource="config/mybatis/mapper/dept.xml" />
</mappers>
</configuration>
DeptController.java
package com.korea.db;
import java.util.List;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import dao.DeptDAO;
import vo.DeptVO;
@Controller
public class DeptController {
public static final String VIEW_PATH = "/WEB-INF/views/dept/";
//dao에 대한 정보가 필요하기 때문에 이미 만들어놓은 정보를 주입해야 한다.
DeptDAO dept_dao;
public DeptController(DeptDAO dept_dao) { //생성자주입
this.dept_dao = dept_dao;
}
@RequestMapping(value= {"/", "list.do"})
public String list(Model model) {
List<DeptVO> list = dept_dao.selectList();
model.addAttribute("list",list); //바인딩
return VIEW_PATH + "dept_list.jsp"; //포워딩
}
}
Servlet_Context.java
package mvc;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import com.korea.db.DeptController;
import dao.DeptDAO;
@Configuration //이 파일은 설정파일입니다!
@EnableWebMvc
//@ComponentScan("com.korea.param") //모든 컨트롤러 자동탐색후 객체생성
public class Servlet_Context implements WebMvcConfigurer{
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
}
// @Bean
// public InternalResourceViewResolver resolver() {
// InternalResourceViewResolver resolver = new InternalResourceViewResolver();
// resolver.setViewClass(JstlView.class);
// resolver.setPrefix("/WEB-INF/views/");
// resolver.setSuffix(".jsp");
// return resolver;
// }
@Bean
public DeptController deptController(DeptDAO dept_dao) {
return new DeptController(dept_dao);
}
}
dept_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>
</head>
<body>
<table border = "1" align = "center">
<tr>
<th>부서번호</th>
<th>부서명</th>
<th>부서위치</th>
</tr>
<c:forEach var="i" items="${list}">
<tr>
<td>${i.deptno}</td>
<td>${i.dname}</td>
<td>${i.loc}</td>
</tr>
</c:forEach>
</table>
</body>
</html>
*순서참고*
1. VO생성
2. DAO클래스 생성 + Context_3_dao.java에 DAO 빈 생성
3. 2에서 만든 Bean 객체에 Context_2_mybatis.java에서 생성한 sqlSession을 참조시킴
4. Controller 생성 + DAO 객체를 생성자주입(또는 setter주입)으로 받아줌
5. ServletContext.java에서 4에서 준비한 DAO를 참조
6. DAO에서 mapper접근
7. Controller에서 url 매핑 지정 후 DAO에서 메서드호출
8. Controller에서 DB를 거쳐 포워딩된 정보를 jsp에서 호출
결과
'Spring' 카테고리의 다른 글
[Spring] JsonMaker (1) | 2023.11.23 |
---|---|
[Spring] 파일업로드 (+방명록에 적용) (1) | 2023.11.23 |
[Spring] 방명록 만들기 (1) | 2023.11.21 |
[Spring] 롬복(LOMBOK) (0) | 2023.11.16 |
[Spring] 스프링 프레임워크 기본개념 및 설치 (0) | 2023.11.09 |