[Spring] 스프링부트 & mybatis 환경에서 DB연결 연습 2

2021. 3. 3. 18:23Web_Back-end/Spring

 

  • 스프링부트 & mybatis 환경에서 DB연결 
  • 이전에 작성한 스프링부트 환경설정, 간단한 select 문을 view로 띄우는 연습을 한 후
  • 다른 select 쿼리문을 요청하는 어플리케이션을 작성해보자

 

2021/03/03 - [분류 전체보기] - [Spring] Spring boot 시작해보기

 

[Spring] Spring boot 시작해보기

STS : spring tool suite spring boot : 스프링 개발을 빠르게(쉽게) 할 수 있도록 환경을 제공 spring.io/tools Spring Tools 4 is the next generation of Spring tooling Largely rebuilt from scratch, Spring..

jjiny-bbany.tistory.com

2021/03/03 - [분류 전체보기] - [Spring] spring boot 기초_ DB와 연동하기

 

[Spring] spring boot 기초_ DB와 연동하기

Oracle mybatis web listGoods.do 요청에 따른 상품목록 출력하는 어플리케이션 만들기 goods 테이블을 사용해, DB와 연동해보기 spring starter project 생성 프로젝트 생성 _ next 사용할 환경에 대한 jar파일..

jjiny-bbany.tistory.com


  • 예제에 사용할 테이블은 도서정보를 담고있는 Book Table을 사용한다

book table

위의 내용을 참고하여 기본적으로 select * from book 을 실행하는 book 프로젝트를 생성해둔다

내용은 goods 프로젝트와 같으므로 포스팅은 생략하고 나머지 query실행을 위한 코드만 포스팅한다


도서목록에서 도서이름에 a 태그를 걸어, 도서정보를 상세보기하는 view 페이지로 이동하는 코드를 작성해보자

 

view 페이지에 a태그로 상세보기 링크걸기

  • 목록을 보여주는 jsp view페이지에서 a태그를 사용해, 링크를 건다
  • 단, queryString 을 통해 책번호를 전달한다
listBook.jsp
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
	<h2>도서 목록</h2>
	<hr>
	<table border="1" width="80%">
		<tr>
			<th>도서번호</th>
			<th>도서이름</th>
		</tr>
		<c:forEach var="b" items="${list }">
			<tr>
				<td>${b.no }</td>
				<td><a href="detailBook.do?no=${b.no }">${b.name }</a></td>
			</tr>
		</c:forEach>
	</table>
</body>
</html>

mapping 파일에 상세보기할 sql 작성

 

mybatis 홈페이지 _ product _ docs _ Mapper XML Files 

Parameter를 처리하는 방법 찾기

  • 그동안 바인드변수를 ? 로 표현했다면 
  • 스프링부트 mybatis에서는 #{} 로 표현한다

 

BookMapper.xml


Manager클래스에 method 추가

 

BookManager.java
package com.example.demo.db;

import java.io.Reader;
import java.util.List;

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

import com.example.demo.vo.BookVo;

public class BookManager {

	private static SqlSessionFactory factory;
	static {
		try {
			Reader reader = 
					Resources.getResourceAsReader("com/example/demo/db/dbConfig.xml");
			factory = new SqlSessionFactoryBuilder().build(reader);
			reader.close();
					
		}catch(Exception e) {
			System.out.println("예외발생 : " + e.getMessage());
		}
	}
	
	public static List<BookVo> findAll(){
		SqlSession session = factory.openSession();
		List<BookVo> list = session.selectList("book.findAll");
		session.close();
		return list;
	}
	
	/**
	 * 상세보기를 위해 매개변수로 책번호를 받아,
	 * 도서정보가 담긴 vo를 반환하는 일
	 * @return
	 */
	public static BookVo selectBook(int no) {
		SqlSession session = factory.openSession();
		// selectOne("id", parameter)
		BookVo b = session.selectOne("book.selectBook", no);
		session.close();
		return b;
	}
	
}

Dao 에 method를 추가하기

  • Manager 클래스에서, 만든 method를 호출한다 
  • 이때 매개변수의 유무를 꼭 확인해야한다
BookDao.java
package com.example.demo.dao;

import java.util.List;

import org.springframework.stereotype.Repository;

import com.example.demo.db.BookManager;
import com.example.demo.vo.BookVo;

@Repository
public class BookDao {

	public List<BookVo> findAll(){
		return BookManager.findAll();
	}
	
	public BookVo selectBook(int no) {
		return BookManager.selectBook(no);
	}
}

 


Controller 작성

  • Controller에 ModelAndView 객체로 상태유지하여, sql문을 수행한 값을 View페이지로 전송하기
  • 이때도 매개변수의 유무를 확인해야한다
  • !! 주의 !! method가 여러개 즉. 하나의 컨트롤러안에 여러개의 상태를 전송하는 경우 
    • 상태를 유지하여 ModelAndView객체를 보내는 id이름을 유의한다! 
    • addObject 함수를 통해 전달한 ModelAndView 객체의 id가 View페이지에서 사용되기 때문!
BookController.java
package com.example.demo.controller;

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;

import com.example.demo.dao.BookDao;

@Controller
public class BookController {

	@Autowired
	private BookDao dao;

	public void setDao(BookDao dao) {
		this.dao = dao;
	}
	
	@RequestMapping("/listBook.do")
	public ModelAndView listBook() {
		ModelAndView mav = new ModelAndView();
		mav.addObject("list", dao.findAll());
		return mav;
	}
	
	@RequestMapping("/detailBook.do")
	public ModelAndView detailBook(int no) {
		ModelAndView mav = new ModelAndView();
		// ModelAndView객체로 상태유지하여 보내는 id가 book이다
		// 따라서, View 페이지에서 객체를 받아서, 출력할 때 book.no 와같은 형태로 불러야한다
		mav.addObject("book", dao.selectBook(no));
		return mav;
	}
}

 


View 페이지 작성

 

  • Controller에서 sql문을 수행하여, 결과를 상태유지하여 보내는 객체를 받아와서, 출력하기
detailBook.jsp
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
	<h2>도서 상세보기</h2>
	<hr>
	<table border="1" width="80%">
		<tr>
			<th>도서번호</th>
			<th>도서이름</th>
			<th>출판사명</th>
			<th>도서가격</th>
		</tr>
			<tr>
				<td>${book.no }</td>
				<td>${book.name }</td>
				<td>${book.publisher }</td>
				<td>${book.price }</td>
			</tr>
	</table>
</body>
</html>

 


server 가동

  1. server를 가동하여, listBook.do 페이지를 요청한다
  2. listBook.do페이지에서 도서이름에 설정한 a 태그(링크)를 통해 detailBook.do 를 요청한다
    • 이때, 상세보기할 책번호가 쿼리스트링으로 전달된다

 

  • localhost:8080/listBook.do 요청
  • 3000번 jsp 도서의 정보를 상세보기 하기 위해 클릭

  • detailBook.do?no=요청한도서번호
  • queryString으로 도서번호 3000이 전달되어,
  • 3000번 도서의 정보를 상세보기 할 수 있다