(5-1) [Spring&mybatis] 학생관리 프로그램 만들기 (전체 데이터 조회)

씩씩한 조약돌·2023년 1월 27일
0

미니프로젝트🤹

목록 보기
13/21

학생관리 프로그램

참고자료 : spring 프로젝트 생성 / mybatis연결 / spring+mybatis연결 / Bootstrap

구현내용

  • 기존의 데이터 조회, 추가, 수정, 삭제를 포함
  • 조회 페이지를 2개로 나누기
    -> main.jsp : 성적의 총점, 평균을 구하고 순위를 보여줌
    -> admin.jsp : 데이터 추가, 수정, 삭제를 처리
  • 각 페이지에는 이동할 수 있는 버튼 추가 (메인->관리자 / 관리자->메인)
  • 부트스트랩 이용해서 스타일 적용하기

개발환경

언어 : JAVA (JDK 11)
서버 : Apache Tomcat 9.0
프레임워크 : Spring Framework 3.9.18, MyBatis 3.5.8, Bootstrap 5.2.3
DB : OracleXE 11gR2
IDE : Eclipse 2020-12, SQL Developler


0. DB - studentlist 테이블

시퀀스없이 진행

--DROP TABLE studentlist;

CREATE TABLE studentlist (
 num number constraint stuli_num_pk primary key,
 name varchar2(100),
 kor number(3),
 eng number(3),
 math number(3)
);

--INSERT INTO studentlist(num, name, kor, eng, math)
--VALUES(1, '홍길동', 80, 75, 80);

--INSERT INTO studentlist(num, name, kor, eng, math)
--VALUES(2, '고수', 90, 90, 97);

--DELETE FROM studentlist
--WHERE num =5;

SELECT * FROM studentlist
ORDER BY num;

commit;

1. 새 프로젝트 (springmybatisdemo) 생성

  • Dynamic Web Project
  • Java 11
  • UTF-8
  • pom.xml -> maven update project
  • pom.xml -> 라이브러리 5개 설치 (aspectj / Ojdbc6 (11.2.0.4) / mybatis (3.5.9) / mybatis spring (2.0.6) / Spring JDBC (5.2.18.RELEASE))
  • web.xml -> UTF-8
  • Apache Tomcat v9.0 추가

2. DTO, DAO, controller 생성

service는 stu-context.xml에서 빈으로 처리

1. 객체처리 : StuDTO클래스

model 패키지 - StuDTO클래스 생성

  • 변수 5개 (num, name, kor, eng, math)
  • 기본생성자
  • getter, setter
package model;

public class StuDTO {

	private int num;
	private String name;
	private int kor;
	private int eng;
	private int math;
	
	public StuDTO() {
		// TODO Auto-generated constructor stub
	}

	public int getNum() {
		return num;
	}

	public void setNum(int num) {
		this.num = num;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getKor() {
		return kor;
	}

	public void setKor(int kor) {
		this.kor = kor;
	}

	public int getEng() {
		return eng;
	}

	public void setEng(int eng) {
		this.eng = eng;
	}

	public int getMath() {
		return math;
	}

	public void setMath(int math) {
		this.math = math;
	}
	
}//class StuDTO

2. dao패키지 - StuDAO 인터페이스 생성

package dao;

import java.util.List;

import model.StuDTO;

public interface StuDAO {

	//전체 조회(SELECT)
	public List<StuDTO> list();
	
	//추가(INSERT)
	public void insertMethod(StuDTO dto);
	
	//수정할 데이터의 num값 가져오기
	public StuDTO one(int num);
    
	//수정(UPDATE)	
	public void updateMethod(StuDTO dto);

	//삭제(DELETE)
	public void deleteMethod(int num);
		
}//interface StuDAO

3. dao패키지 - StuDaoImp 클래스 생성

  • 기본생성자
  • implements StuDAO
  • 모든 메서드 오버라이드
  • SqlSessionTemplate 변수 + setter
  • SqlSessionTemplate : SqlSession을 구현하고 코드에서 SqlSession를 대체 (마이바티스 스프링 연동모듈에서 사용됨)
package dao;

import java.util.List;

import org.mybatis.spring.SqlSessionTemplate;

import model.StuDTO;

public class StuDaoImp implements StuDAO{
	
	private SqlSessionTemplate sqlSession;

	public StuDaoImp() {
		// TODO Auto-generated constructor stub
	}
	
	public void setSqlSession(SqlSessionTemplate sqlSession) {
		this.sqlSession = sqlSession;
	}

	@Override
	public List<StuDTO> list() {
		// TODO Auto-generated method stub
		return null;
	}
    
	@Override
	public StuDTO one(int num) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public void insertMethod(StuDTO dto) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void updateMethod(StuDTO dto) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void deleteMethod(int num) {
		// TODO Auto-generated method stub
		
	}
	
}//class StuDaoImp

4. controller패키지 - StuController 클래스 생성

  • @Controller
  • StuDAO변수 + setter
  • 기본생성자
package controller;

import org.springframework.stereotype.Controller;

import dao.StuDAO;

// http://localhost:8090/myapp/admin.do

@Controller
public class StuController {

	private StuDAO stuDao;
	
	public StuController() {
		// TODO Auto-generated constructor stub
	}
	
	public void setStuDao(StuDAO stuDao) {
		this.stuDao = stuDao;
	}
	
}//class StuController

3. 환경설정 (Mapper 연결)

1. resource - mybatis폴더생성

2. StuMapper.xml, configuration.xml 생성

3. DTD설치 : StuMapper.xml

- mybatis에서 사용될 SQL 구문을 담고 있는 xml

  • myBatis를 사용할 때 SQL Mapper XML을 사용하여 쿼리문을 작성해야함.
    이 때 XML의 구조를 정의해주는 DTD
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
    
<mapper namespace = "stu">

</mapper>

4. mapper 연결 : configuration.xml

  • mybatis에서 사용될 DB를 연동하기 위한 설정값들과 mapper.xml을 등록하기 위한 xml
  • <mapper resource="mybatis/StuMapper.xml"/>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
  <mappers>
    <mapper resource="mybatis/StuMapper.xml"/>
  </mappers>
</configuration>

4. 환경설정 (오라클 드라이버, SqlSession, dao, controller, viewResolver) web.xml, stu-context.xml

1. WEB-INF - web.xml -> 환경설정 변경

2. WEB-INF - spring - appServlet - stu-context.xml 생성

  • Spring Bean Configration File
  • [1] DataSource 빈 선언 (DB Connection)
  • [2] SqlSessionFactoryBean 빈 선언
  • [3] SqlSessionTemplate 빈 선언
  • [4] MemDaoImp 빈 선언
  • [5] Controller 빈 선언
  • [6] ViewResolver 빈 선언
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

	<!--  [1] DataSource 빈 선언 -->
	<bean id = "dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
		<property name="driverClassName" value="oracle.jdbc.OracleDriver" />
		<property name = "url" value="jdbc:oracle:thin:@127.0.0.1:1521:xe"/>
		<property name="username" value="hr"></property>
		<property name="password" value="a1234"></property>
	</bean>
	
	<!--  [2] SqlSessionFactoryBean 빈 선언 -->
	<bean id= "sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name = "dataSource" ref="dataSource" />
		<property name ="mapperLocations">
			<list>
				<value>classpath:mybatis/StuMapper.xml</value>
			</list>
		</property>
	</bean>
	
	<!--  [3] SqlSessionTemplate 빈 선언 -->
	<bean id= "sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
		<constructor-arg ref = "sqlSessionFactoryBean" />
	</bean>
	
	<!--  [4] MemDaoImp 빈 선언 -->
	<bean id= "dao" class="dao.StuDaoImp">
		<property name="sqlSession" ref="sqlSession" />
	</bean>
	
	<!--  [5] Controller 빈 선언 -->
	<bean class="controller.StuController">
		<property name="stuDao" ref="dao" />
	</bean>
	
	<!--  [6] ViewResolver 빈 선언 -->
	<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix" value="/WEB-INF/views/" />
		<property name="suffix" value=".jsp" />
	</bean>	
	
</beans>

5. '전체 데이터 조회'(admin.jsp) 화면 구현

1. '전체데이터조회' 쿼리문 -> stuMapper.xml 수정

	<select id="list" resultType="model.StuDTO">
		SELECT * FROM studentlist
		ORDER BY num
	</select>

2. sqlsession-쿼리문 연결 : MemDaoImp클래스

  • list()
  • `selectList(query_id) : id에 대한 select문을 실행한 후 레코드를 List로 반환
	@Override
	public List<StuDTO> list() {
		return sqlSession.selectList("stu.list");
	}

3. 쿼리문 데이터 처리 및 jsp 호출 : StuController

  • addObject() : "list"에 stuDao.list()리턴값 넣어주기
    -> stuDao.list()리턴값 = 쿼리문에 대한 데이터를 List<StuDTO>로 받아옴
  • setViewName() : view로 보여줄 admin.jsp와 연결
  • 리턴값 : ModelAndView (List와 admin.jsp)
	@RequestMapping(value="/admin.do")
	public ModelAndView process(ModelAndView mav) {
		mav.addObject("list", stuDao.list());
		mav.setViewName("stu/admin");
		return mav;
	}

4. views - stu폴더 - admin.jsp 생성

  • <c:forEach items="${list}" var="stu"> : mav에서 받아온 list값을 stu변수에 담아서 뿌려줌
<%@ 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>admin</title>
</head>
<body>
	<p><a href="insert.do">추가</a></p>
	
	<table>
		<tr>
			<th>번호</th> <th>이름</th> <th>국어</th> <th>영어</th> <th>수학</th>
			<th>수정</th> <th>삭제</th> 
		</tr>
		<c:forEach items="${list}" var="stu">
			<tr>
				<td>${stu.num}</td> <td>${stu.name}</td>
				<td>${stu.kor}</td> <td>${stu.eng}</td> <td>${stu.math}</td> 
				<td><a href="update.do?num=${stu.num}">수정</a></td>
				<td><a href="delete.do?num=${stu.num}">삭제</a></td> 
			</tr>
		</c:forEach>
	</table>
</body>
</html>

5. 실행

6. Bootstrap 추가

<%@ 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>admin</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-rbsA2VBKQhggwzxH7pPCaAqO46MgnOM80zW1RWuH61DGLwZJEdK2Kadq2F9CUG65" crossorigin="anonymous">
<style>
#ins {display: inline-block; width : 100px; text-align:center; margin-bottom:10px; margin-right:10px; float :right;}
table {clear : both;}
tr, td {text-align:center;}
#main {margin-left:10px;}
</style>

</head>
<body>
	<p><a id="ins" class="list-group-item list-group-item-success" href="insert.do">학생 추가</a></p>
	<table class="table">
		<tr class="table-light">
			<th>번호</th> <th>이름</th> <th>국어</th> <th>영어</th> <th>수학</th>
			<th></th> <th></th> 
		</tr>
		<c:forEach items="${list}" var="stu">
			<tr>
				<td>${stu.num}</td> <td>${stu.name}</td>
				<td>${stu.kor}</td> <td>${stu.eng}</td> <td>${stu.math}</td> 
				<td><a class="list-group-item list-group-item-primary" href="update.do?num=${stu.num}">수정</a></td>
				<td><a class="list-group-item list-group-item-warning" href="delete.do?num=${stu.num}">삭제</a></td> 
			</tr>
		</c:forEach>
	</table>
	<p><a id="main" class="btn btn-primary" href="">< Main</a></p>
</body>
</html>

profile
씩씩하게 공부중 (22.11~)

0개의 댓글