웹개발 교육/Spring

[74일] Spring (18) - MyBatis 프로젝트 (설정, 첫페이지, 목록)

ewok 2022. 11. 10. 18:17

수업 관련 자료

더보기

https://www.youtube.com/watch?v=sAYJt1ElNog 

 

03_스프링부트 MyBatis Framework기반 상품게시판_product.pdf
1.11MB

 

테이블 생성 시 filesize가 누락되어 추가하여야 하고, regdate도 있으면 좋다.

 

 

새 프로젝트 생성

 

 

 

 

pom.xml

		<!-- 사용자 지정 의존성 추가 시작 -->
		<dependency>
			<groupId>org.apache.tomcat.embed</groupId>
			<artifactId>tomcat-embed-jasper</artifactId>
			<version>9.0.58</version>
		</dependency>

		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>jstl</artifactId>
			<version>1.2</version>
		</dependency>

		<dependency>
			<groupId>commons-fileupload</groupId>
			<artifactId>commons-fileupload</artifactId>
			<version>1.4</version>
		</dependency>

		<!-- 사용자 지정 의존성 추가 끝 -->

 

 

생성

main.css

@charset "UTF-8";

a:link    {color: black; text-decoration: none;}
a:visited {color: black; text-decoration: none;}
a:hover   {color: black; text-decoration: underline;}
a:active  {color: black; text-decoration: none;}

 

 

product_sql.txt

-- 상품테이블
create table product (
	 product_code int           primary key  --상품번호
	,product_name varchar(100)  not null     --상품명
	,description  varchar(2000)              --상품내용
	,price        int           default 0    --상품가격
	,filename     varchar(500)               --파일명
);

-- 상품 시퀀스
create sequence product_seq;


commit;

 

 

 

 

application.properties

인코딩

 

server.port=9095

#주의사항 JSP, Thymeleaf, Mustache는 공통으로 사용할 수 없음
#JSP를 뷰페이지로 사용할 경우 pom.xml에 라이브러리 추가해야 함
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp

#JSP페이지가 수정이 되면 자동으로 서버 재시작
server.servlet.jsp.init-parameters.development = true

#파일 업로드 용량 제한 설정
spring.servlet.multipart.max-file-size = 500MB
spring.servlet.multipart.max-request-size = 500MB

#오라클 DB 환경 설정
spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver
spring.datasource.url=jdbc:oracle:thin:@localhost:1521/xe
spring.datasource.username=system
spring.datasource.password=1234

 

 

 

모든 xml 파일에 대해 객체화를 해주기 위해 mappers 폴더에 xml문서를 모아둔다. 이를 위해 시작 클래스에서 설정을 해줘야 한다.

 

 

Spring07MyshopApplication.java

package kr.co.itwill;

import javax.sql.DataSource;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;

@SpringBootApplication
public class Spring07MyshopApplication {

	public static void main(String[] args) {
		SpringApplication.run(Spring07MyshopApplication.class, args);
	}//main() end

	//참조) spring05_mybatis 프로젝트 MemMainTest 클래스
	//Mapper 객체 생성
	@Bean
	public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
		SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
		bean.setDataSource(dataSource);
		Resource[] res = new PathMatchingResourcePatternResolver().getResources("classpath:mappers/*.xml");
		bean.setMapperLocations(res);
		return bean.getObject();
	}//sqlSessionFactory() end
	
	@Bean
	public SqlSessionTemplate sqlSession(SqlSessionFactory factory) {
		return new SqlSessionTemplate(factory);
	}//sqlSession() end
	
	
}//class end

 

 

 

HomeController.java

package kr.co.itwill;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class HomeController {

	public HomeController() {
		System.out.println("-----HomeController() 객체 생성됨");
	}
	
	/*
		spring07_myshop 프로젝트의 첫 페이지 호출
		http://localhost:9095
	*/
	@RequestMapping("/")
	public ModelAndView home() {
		ModelAndView mav = new ModelAndView();
		//redirect : 등록한 명령어를 호출할 수 있다
		mav.setViewName("redirect:/product/list");
		return mav;
	}//home() end
	
}//class end

 

 

 

생성

 

ProductDAO.java

package kr.co.itwill.product;

import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

@Repository
public class ProductDAO {

	public ProductDAO() {
		System.out.println("-----ProductDAO() 객체 생성됨");
	}//end
	
	//스프링 빈으로 생성된 객체를 가져와서 연결하기
	@Autowired
	SqlSession sqlSession;
	
}//class end

 

 

 

 

ProductCont.java

package kr.co.itwill.product;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

@Controller
public class ProductCont {

	public ProductCont() {
		System.out.println("-----ProductCont() 객체 생성됨");
	}
	
	@Autowired
	ProductDAO productDao;
	
}//class end

 

 

product.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">

<!-- product.xml -->
<mapper namespace="product">

</mapper>

 

 

 

 

 

ProductCont.java

package kr.co.itwill.product;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class ProductCont {

	public ProductCont() {
		System.out.println("-----ProductCont() 객체 생성됨");
	}
	
	@Autowired
	ProductDAO productDao;
	
	@RequestMapping("/list")
	public ModelAndView list() {
		ModelAndView mav = new ModelAndView();
		mav.setViewName("product/list");
		mav.addObject("list", productDao.list());
		return mav;
	}//list() end
	
}//class end

 

 

ProductDAO.java

package kr.co.itwill.product;

import java.util.List;
import java.util.Map;

import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

@Repository
public class ProductDAO {

	public ProductDAO() {
		System.out.println("-----ProductDAO() 객체 생성됨");
	}//end
	
	//스프링 빈으로 생성된 객체를 가져와서 연결하기
	@Autowired
	SqlSession sqlSession;
	
	public List<Map<String, Object>> list() {
		return sqlSession.selectList("product.list");
	}//list() end
	
}//class end

 

 

 

product.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">

<!-- product.xml -->
<mapper namespace="product">
	
	<select id="list" resultType="java.util.Map">
		SELECT product_code, product_name, description, price, filename
		FROM product
		ORDER BY product_name
	</select>

</mapper>

 

 

 

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="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>

<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>list.jsp</title>
	<link href="../css/main.css" rel="stylesheet" type="text/css">
</head>
<body>
	<h3>상품목록</h3>
	<p>
		<button type="button" onclick="location.href='write'">상품등록</button>
		<button type="button" onclick="location.href='list'">상품전체목록</button>
	</p>
	
	<form method="post" action="search">
		상품명 : <input type="text" name="product_name" value="${product_name}">
			   <input type="submit" value="검색">
	</form>
	
	<hr>
	상품갯수 : ${fn:length(list)}
	<br>
	<table border="1">
	<tr>
		<c:forEach var="row" items="${list}" varStatus="vs">
			<td>
				<c:choose>
					<c:when test="${row.FILENAME != '-' }">
						<img src="/storage/${row.FILENAME}" width="100px">
					</c:when>
					<c:otherwise>
						등록된 사진 없음!!<br>
					</c:otherwise>
				</c:choose>
				<br>
				상품명 : <a href="detail/${row.PRODUCT_CODE}">${row.PRODUCT_NAME}</a>
				<br>
				상품가격 : <fmt:formatNumber value="${row.PRICE}" pattern="#.###"/>
			</td>
			<c:if test="${vs.count mod 5==0}">
				<tr><tr>
			</c:if>
		</c:forEach>
	</tr>
	</table>
	
</body>
</html>