Spring

[Spring] 부서조회하기

(งᐛ)ว 2023. 11. 18. 23:41
728x90

 

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에서 호출 

 

 

 

결과

 

 

 

 

728x90

'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