부서별 사원 조회

✒️ 2025-05-26 11:14 내용 수정


실습 목표

실습 흐름

  1. 데이터베이스에 테이블 및 시퀀스, 필요 시 샘플 데이터 추가
  2. 데이터베이스에 연결 : context.xml 파일, 라이브러리(JDBC), Mybatis 라이브러리와 SqlMapConfig.xml 파일과 mapper.xml 파일
  3. 테이블의 정보를 저장할 DTO 클래스 생성
  4. 데이터베이스에서 조회를 수행하고 정보를 저장하는 DAO 클래스 생성
  5. 조회 결과를 확인할 JSP 생성
  6. DAO 클래스 객체를 생성하고, JSP와 연결할 Servlet 생성
  7. Servlet에서 코드 실행 시 결과 확인

DB 연결

  1. context.xml
<?xml version="1.0" encoding="UTF-8"?>
<Context>
	<Resource 
	        auth="Container" 
      		name="jdbc/oracle_test"
      		type="javax.sql.DataSource"
      		driverClassName="oracle.jdbc.driver.OracleDriver"
      		factory="org.apache.commons.dbcp.BasicDataSourceFactory"
      		url="jdbc:oracle:thin:@localhost:1521:xe"
      		username="계정명" password="비밀번호" 
      		maxActive="20" maxIdle="10" maxWait="1"/>
</Context>
  1. 라이브러리
    • 라이브러리에 lomboc 추가하여 사용
파일
commons-collections-3.2.1.jar
commons-dbcp-1.2.2.jar
commons-pool-1.4.jar
ojdbc8-23.3.0.23.09.jar
lomboc.jar
mybatis-3.1.1.jar
  1. MybatisConnector 클래스
package service;

import java.io.Reader;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;


public class MybatisConnector {
	static MybatisConnector single = null;

	SqlSessionFactory factory = null;
	
	public static MybatisConnector getInstance() {
		if (single == null)
			single = new MybatisConnector();
		return single;
	}
	
	public MybatisConnector() {
		
		try {
			Reader reader = Resources.getResourceAsReader("config/mybatis/sqlMapConfig.xml");

			factory = new SqlSessionFactoryBuilder().build(reader);
			
			reader.close();
		} catch (Exception e) {
		}
	}
	
	// sqlMapConfig.xml의 정보를 담고 있는 factory객체를 반환
	public SqlSessionFactory getSqlSessionFactory() {
		return factory;
	}
}
  1. SqlMapConfig.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>
	<environments default="">
		<environment id="">
			<transactionManager type="JDBC" />
			<dataSource type="JNDI">
				<property name="data_source" 
				value="java:comp/env/jdbc/oracle_test" />
			</dataSource>
		</environment>
	</environments>
	<mappers>
		<mapper resource="config/mybatis/mapper/sawon.xml" />
	</mappers>
</configuration>
  1. sawon.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="sawon">

 <select id="sawon_list" resultType="dto.SawonDTO">
	SELECT * FROM SAWON 
 </select>
 
  <select id="sawon_list_no" parameterType="int" resultType="dto.SawonDTO">
	SELECT * FROM SAWON WHERE DEPTNO = #{DEPTNO}
 </select>
</mapper>

DTO와 DAO

  1. dto
package dto;

import lombok.Data;

@Data

public class SawonDTO {
	private int sabun, sapay, deptno;
	private String saname, sajob, sahire;
	
}
  1. dao
package dao;

import java.util.List;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;

import dto.SawonDTO;
import service.MybatisConnector;

public class SawonDAO {
	SqlSessionFactory factory = null;
	
	static SawonDAO single = null;

	public static SawonDAO getInstance() {
		//생성되지 않았으면 생성
		if (single == null)
			single = new SawonDAO();
		//생성된 객체정보를 반환
		return single;
	}
	
	public SawonDAO() {
		factory = MybatisConnector.getInstance().getSqlSessionFactory();
	}
	
	// 모든 사원 목록 조회
	public List<SawonDTO> select() {
		SqlSession sqlSession = factory.openSession();
		List<SawonDTO> list = sqlSession.selectList("sawon.sawon_list");
		
		sqlSession.close();
		
		return list;
	}
	
	// 부서별 사원 목록 조회
	public List<SawonDTO> select(int deptno) {
		
		SqlSession sqlSession = factory.openSession();
		
		// sqlSession이 관리하는 CRUD 관련 메소드는 파라미터를 단 1개 추가할 수 있다.
		List<SawonDTO> list = sqlSession.selectList("sawon.sawon_list_no", deptno);
		
		sqlSession.close();
		
		return 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" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
	<script type="text/javascript">
		function find() {
			// select 태그의 value값
			var deptno = document.getElementById("deptno").value;
			
			// form 태그를 사용하지 않기에 location.href를 통해 전송
			location.href = "sawon_list?deptno="+deptno;
			
		}
		// window.onload : html이 모두 로드된 후에 작동하는 callback 함수
		// select 태그 옵션들 중에서 특정 번호를 선택하고 검색 버튼을 누르면 해당 번호를 선택한 상태를 유지하도록 설정
		window.onload = function() {
			var deptno = document.getElementById("deptno");
			var dept_array = [0, 10, 20, 30, 40];
			
			for (var i = 0; i < dept_array.length; i++) {
				if ('${param.deptno}' == dept_array[i]) {
					deptno[i].selected = true;
					break;
				}
			}
		}
	</script>
</head>
<body>
	<div align="center">
		부서번호 : 
		<select id="deptno">
			<option value="0">:::부서를 선택하세요:::</option>
			<option value="10">총무부</option>
			<option value="20">영업부</option>
			<option value="30">전산부</option>
			<option value="40">관리부</option>
			<option value="50">경리부</option>
		</select>
		<input type="button" value="검색" onclick="find();">
	</div>
	<table border="1" align="center">
	<caption>::사원목록::</caption>
		<tr>
			<th>사번</th>
			<th>이름</th>
			<th>직책</th>
			<th>부서</th>
			<th>급여</th>
			<th>입사일</th>
		</tr>
		<c:forEach var="dto" items="${list}">
			<tr>
				<td>${dto.sabun}</td>
				<td>${dto.saname}</td>
				<td>${dto.sajob}</td>
				<td>${dto.deptno}</td>
				<td>${dto.sapay}</td>
				<c:set var="sahire" value="${dto.sahire}"/>
				<td>${fn:split(sahire,' ')[0]}</td>
			</tr>
		</c:forEach>
	</table>
</body>
</html>

Servlet

package action;

import java.io.IOException;
import java.util.List;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import dao.SawonDAO;
import dto.SawonDTO;


@WebServlet("/sawon_list")
public class SawonListAction extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		// sawon_list?deptno=X
		int deptno = 0;
		String str_deptno = request.getParameter("deptno"); // null이 들어올 수 있어서 String으로 받음
		
		System.out.println(str_deptno);
		
		// 전송받은 값이 null이 아니고 비어있지 않을 때만 정보를 전송
		if (str_deptno != null && !str_deptno.isEmpty()) {
			deptno = Integer.parseInt(str_deptno);
		}
		
		List<SawonDTO> list = null;

		if (deptno == 0) {
			list = SawonDAO.getInstance().select();
		} else {
			list = SawonDAO.getInstance().select(deptno);
		}
		
		request.setAttribute("list", list);
		RequestDispatcher disp = request.getRequestDispatcher("sawon_list.jsp");
		disp.forward(request, response);
	}

}