스프링 JDBC

 

  • update()

→ insert, update, delete

  • queryForInt()
  • queryForObject() : 실행결과를 자바 객체(VO)로 매핑하여 리턴
  • query() : 검색된 데이터의 row(레코드) 수 만큼 RowMapper객체의 MapRow()메소드가 실행된다. 그리고 매핑된 VO객체 여러개를 List컬렉션에 저장하여 리턴한다.

-> select

 

▼ applicationContext.xml

더보기
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">

    <!-- 패키지를 스캔해준다. 다 해주는 것은 아니고 표시되어진 클래스만 스캔해준다 -> 이것이 어노테이션 -->
	<!-- <context:component-scan base-package="polymorphism"></context:component-scan> -->
	<context:component-scan base-package="com.springbook.biz"></context:component-scan>
	
	<!-- database.properties 의 파일을 읽어올 수 있게 해준다 -->
	<context:property-placeholder location="classpath:config/database.properties"/>
	
	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
	<property name="driverClassName" value="${jdbc.driver}"></property>
	<property name="url" value="${jdbc.url}"></property>
	<property name="username" value="${jdbc.username}"></property>
	<property name="password" value="${jdbc.password}"></property>

	</bean>
	
	<!--JdbcTemplate 클래스를 통해 DB에 접근 (crud) -->
	<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
		<property name="dataSource" ref="dataSource"></property>
	</bean>
	

</beans>

 

BoardDAOSpring

package com.springbook.biz.board.impl;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

import com.springbook.biz.board.BoardVO;

// 비즈니스 계층에서 사용할 수 있도록 빈에 등록
@Repository
public class BoardDAOSpring {

	@Autowired
	private JdbcTemplate jdbcTemplate;
	
	// 상수형태로 만들어 두었다.
	private final String BOARD_INSERT = " insert into board(seq, title, writer, content) values "
			+ " ((select nvl(max(seq),0) + 1 from board), ?, ?, ?)";

	private final String BOARD_UPDATE = "update board set title=?, content=? where seq=?";
	private final String BOARD_DELETE = "delete board where seq=?";
	private final String BOARD_GET = "select * from board where seq=?";
	private final String BOARD_LIST = "select * from board order by seq desc";
	
	// ---------- update() 구문 사용 ----------
	
	// 글 등록
	public void insertBoard(BoardVO vo) {
		System.out.println("===> springJDBC로 insertBoard() 기능 처리");
		// insert를 springJDBC에서는 update가 처리, try catch문 사용 안해도 됨.
		// 기존 jdbc 에서 사용한 '?' 대신 순서대로 객체를 가지고 와 적어준다.
		jdbcTemplate.update(BOARD_INSERT, vo.getTitle(), vo.getWriter(), vo.getContent());
	}
	
	// 글 수정
	public void updateBoard(BoardVO vo) {
		System.out.println("===> springJDBC로 updateBoard() 기능 처리");
		jdbcTemplate.update(BOARD_UPDATE, vo.getTitle(), vo.getContent(), vo.getSeq());
	}
	
	// 글 삭제
	public void deleteBoard(BoardVO vo) {
		System.out.println("===> springJDBC로 deleteBoard() 기능 처리");
		jdbcTemplate.update(BOARD_DELETE, vo.getSeq());
	}
	
	// ---------- queryForObject(), query() 구문 사용 ----------
	
	// 글 상세 조회
	public BoardVO getBoard(BoardVO vo) {
		System.out.println("===> springJDBC로 getBoard() 상세 보기  처리");
		
		// 배열로 값을 받기 때문에 배열에 넣어준다
		Object[] args= {vo.getSeq()};
		
		// return jdbcTemplate.queryForObject(sql, args, rowMapper);
		return jdbcTemplate.queryForObject(BOARD_GET, args, new BoardRowMapper());
	}
	
	// 글 목록 조회
	public List<BoardVO> getBoardList(BoardVO vo) {
		System.out.println("==> springJDBC로 getBoardList() 기능 처리");
		// '?' 가 없다. 글 목록 전체 조회이기 때문에 모든 글들을 다 불러오면 된다.
		return jdbcTemplate.query(BOARD_LIST, new BoardRowMapper());
		
	}
	

}

 

BoardRowMapper

package com.springbook.biz.board.impl;

import java.sql.ResultSet;
import java.sql.SQLException;

import org.springframework.jdbc.core.RowMapper;

import com.springbook.biz.board.BoardVO;

public class BoardRowMapper implements RowMapper<BoardVO> {
// BoardDAO 의 resultSet의 역할을 수행한다.
	
	@Override
	public BoardVO mapRow(ResultSet rs, int rowNum) throws SQLException {
		
		BoardVO board = new BoardVO();
		
		board.setSeq(rs.getInt("SEQ"));
		board.setTitle(rs.getString("TITLE"));
		board.setWriter(rs.getString("WRITER"));
		board.setContent(rs.getString("CONTENT"));
		board.setRegDate(rs.getDate("REGDATE"));
		board.setCnt(rs.getInt("CNT"));
		
		return board;
	}
	
	
	
}

 

BoardServiceImpl 에서 BoardDAOSpring 의존 주입

private BoardDAOSpring boardDAO;

 

 

▼ BoardServiceImpl

더보기
package com.springbook.biz.board.impl;

import java.util.List;

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

import com.springbook.biz.board.BoardService;
import com.springbook.biz.board.BoardVO;
import com.springbook.biz.common.Log4jAdvice;
import com.springbook.biz.common.LogAdvice;


@Service("boardService")
public class BoardServiceImpl implements BoardService {

	// boardDAO를 의존 주입해야 한다.
	@Autowired
	private BoardDAOSpring boardDAO;
	
	
	public BoardServiceImpl() {
	}

	@Override
	public void insertBoard(BoardVO vo) {
		// @Autowired를 했기 때문에 사용가능, @Autowired로 객체를 생성한거다.
		boardDAO.insertBoard(vo);

	}

	@Override
	public void updateBoard(BoardVO vo) {
		boardDAO.updateBoard(vo);
	}

	@Override
	public void deleteBoard(BoardVO vo) {
		boardDAO.deleteBoard(vo);
	}

	@Override
	public BoardVO getBoard(BoardVO vo) {
		return boardDAO.getBoard(vo);
	}

	@Override
	public List<BoardVO> getBoardList(BoardVO vo) {
		return boardDAO.getBoardList(vo);
	}

}

 

BoardServiceClient에서 실행하면 ‘===> springJDBC로 insertBoard() 기능 처리’ 라고 뜨며 springJDBC가 실행되는 것을 볼 수 있다.

 

 

 

Spring 트랜잭션

데이터 수정 삭제, 등 일련의 작업들이 연결되어 있다.

실제 데이터 베이스에 반영하는 것. 잘 처리가 되면 커밋, 롤백 등 작업처리.

어떤 메소드의 동작에 의해서 그 메소드가 실행하는 동작 처리에 트랜잭션이 일어나야 한다. 이 트랜잭션은 공통관심사 (AOP) → DAO

 

트랜잭션을 위한 라이브러리 사용

tx 선택하기

 


트랜잭션(Transaction) : 더 이상 쪼갤 수 없는 최소 작업 단위

 

트랜잭션 마무리 작업

  • 커밋 : 작업이 마무리 됨
  • 롤백 : 작업을 취소하고 이전의 상태로 되돌림

 

스프링에서 제공하는 트랜잭션 기술

  1. 트랜잭션 동기화
  2. 트랜잭션 추상화
  3. AOP를 이용한 트랜잭션 분리 ← 우리가 사용해본 것.

 

 

스프링으로 웹 만들기 model1 방식

 

login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<center>
		<form action="login_proc.jsp" method="post">
			<table border="1" callpadding="0" cellspacing="0">
				<tr>
					<td bgcolor="orange">아이디</td>
					<td>
						<input type="text" name="id">
					</td>
				</tr>
				<tr>
					<td bgcolor="orange">비밀번호</td>
					<td>
						<input type="password" name="password">
					</td>
				</tr>
				<tr>
					<td colspan="2" align="center">
						<input type="submit" value="로그인"></td>
				</tr>
			</table>
		</form>
	</center>
</body>
</html>

실행해보면 이렇게 나온다.

 

주소를 의미있게 설정하기 위해 server.xml 파일의 Context부분을 수정해준다.

그 후 톰캣 서버를 다시 리스타트해 실행하면

 

주소가 이렇게 바뀐 것을 확인할 수 있다.

 

 

 

login_proc.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@page import="com.springbook.biz.user.*" %>
<%@page import="com.springbook.biz.user.impl.*" %>
<%
   String id = request.getParameter("id");
   String password = request.getParameter("password");
   
   UserVO vo = new UserVO();
   vo.setId(id);
   vo.setPassword(password);
   
   UserDAO dao = new UserDAO();
   UserVO user = dao.getUser(vo);
   
   if(user != null) {
      response.sendRedirect("getBoardList.jsp");
      
   }else{
      response.sendRedirect("login.jsp");
   }
   
%>

 

아이디와 비밀번호가 일치하면 사이트 이동이 일어나게 만들어준다.

 

getBoardList.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@page import="com.springbook.biz.board.*"%>
<%@page import="com.springbook.biz.board.impl.*"%>
<%@page import="java.util.*"%>
<%
  
	BoardVO vo = new BoardVO();
	BoardDAO dao = new BoardDAO();
	
	List<BoardVO> boardList = dao.getBoardList(vo);
    
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<center>
		<h1>글 목록</h1>
		<h3>
			테스트님! 게시판에 오신 걸 환영합니다! <a href="logout_proc.jsp">log-out</a>
		</h3>

		<form action="getBoardList.jsp" method="post">
			<table border="1" callpadding="0" cellspacing="0" width="700">
				<tr>
					<td align="right">
					<select name="searchCondition">
							<option value="TITLE">제목</option>
							<option value="CONTENT">내용</option>
					</select>
					<input name="searchKeyword" type="text" /> 
					<input type="submit" value="검색" /> 
					</td>
				</tr>
			</table>
		</form>

		<table border="1" callpadding="0" cellspacing="0" width="700">
			<tr>
				<th bgcolor="orange" width="100">번호</th>
				<th bgcolor="orange" width="200">제목</th>
				<th bgcolor="orange" width="150">작성자</th>
				<th bgcolor="orange" width="150">등록일</th>
				<th bgcolor="orange" width="100">조회수</th>
			</tr>

			<% 
				for (BoardVO board : boardList) {
					
				%>

			<tr>
				<td>
					<%=board.getSeq() %>
				</td>
				<td>
				<a href="getBoard.jsp?seq=<%=board.getSeq() %>">
					<%=board.getTitle() %>
				</a>
				</td>
				<td>
					<%=board.getWriter() %>
				</td>
				<td>
					<%=board.getRegDate() %>
				</td>
				<td>
					<%=board.getCnt() %>
				</td>
			</tr>

			<%
				}
				%>
		</table>

		<br> <a href="insertBoard.jsp">새글 등록</a>
	</center>
</body>
</html>

 

상세보기 - getBoard.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@page import="com.springbook.biz.board.*"%>
<%@page import="com.springbook.biz.board.impl.*"%>
<%
	String seq = request.getParameter("seq");

	BoardVO vo = new BoardVO();
	BoardDAO dao = new BoardDAO();
	
	vo.setSeq(Integer.parseInt(seq));
	
	BoardVO board = dao.getBoard(vo);
	
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<center>
		<h1>글 상세</h1>
		<a href="logout_proc.jsp">Log-out</a>
		<hr>
		<form action="">
			<table border="1" callpadding="0" cellspacing="0">
				<tr>
					<td bgcolor="orange" width="70">제목</td>
					<td align="left">
					<input name="title" type="text" value="<%=board.getTitle() %> ">
					</td>
				</tr>
				
				<tr>
					<td bgcolor="orange" width="70">작성자</td>
					<td align="left">
					<%=board.getWriter() %>
					</td>
				</tr>
				
			    <tr>
					<td bgcolor="orange" width="70">내용</td>
					<td align="left">
					<textarea name="content" cols="40" rows="10" ><%=board.getContent() %></textarea>
					</td>
				</tr>
				
				<tr>
					<td bgcolor="orange" width="70">등록일</td>
					<td align="left">
					<%=board.getRegDate() %>
					</td>
				</tr>
				
				<tr>
					<td bgcolor="orange" width="70">조회수</td>
					<td align="left">
					<%=board.getCnt() %>
					</td>
				</tr>
				
				<tr>
					<td colspan="2" align="center">
					<input type="submit" value="글 수정"/> 
					</td>
				</tr>
			</table>
		</form>
		<hr>
		<a href="insertBoard.jsp">글 등록</a>
		<a href="deleteBoard.jsp">글 삭제</a>
		<a href="getBoardList.jsp">글 목록</a>
		
	</center>
</body>
</html>

 

글 등록 - insertBoard.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<center>
		<h1>글 등록</h1>
		<a href="logout_proc.jsp">Log-out</a>
		<hr>
		<form action="insertBoard_proc.jsp" method="post">
			<table border="1" callpadding="0" cellspacing="0">
				<tr>
					<td bgcolor="orange" width="70">제목</td>
					<td align="left"><input type="text" name="title" /></td>
				</tr>

				<tr>
					<td bgcolor="orange">작성자</td>
					<td align="left"><input type="text" name="writer" size="10" /></td>
				</tr>

				<tr>
					<td bgcolor="orange">내용</td>
					<td align="left"><textarea name="content" cols="40" rows="10"></textarea></td>
				</tr>

				<tr>
					<td colspan="2" align="center">
					<input type="submit" value="새 글 등록" />
					</td>
				</tr>
			</table>
		</form>
		<hr>
		<a href="getBoardList.jsp">글 목록 가기</a>
	</center>
</body>
</html>

 

insertBoard_proc.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@page import="com.springbook.biz.board.*"%>
<%@page import="com.springbook.biz.board.impl.*"%>
<%
	request.setCharacterEncoding("UTF-8");
	
	String title = request.getParameter("title");
	String writer = request.getParameter("writer");
	String content = request.getParameter("content");
	
	BoardVO vo = new BoardVO();
	BoardDAO dao = new BoardDAO();
	
	vo.setTitle(title);
	vo.setWriter(writer);
	vo.setContent(content);
	
	dao.insertBoard(vo);
	
	response.sendRedirect("getBoardList.jsp");
%>

글이 잘 올라가는 것을 확인 할 수 있다. 

 

글 등록 - insertBoard.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<center>
		<h1>글 등록</h1>
		<a href="logout_proc.jsp">Log-out</a>
		<hr>
		<form action="insertBoard_proc.jsp" method="post">
			<table border="1" callpadding="0" cellspacing="0">
				<tr>
					<td bgcolor="orange" width="70">제목</td>
					<td align="left"><input type="text" name="title" /></td>
				</tr>

				<tr>
					<td bgcolor="orange">작성자</td>
					<td align="left"><input type="text" name="writer" size="10" /></td>
				</tr>

				<tr>
					<td bgcolor="orange">내용</td>
					<td align="left"><textarea name="content" cols="40" rows="10"></textarea></td>
				</tr>

				<tr>
					<td colspan="2" align="center">
					<input type="submit" value="새 글 등록" />
					</td>
				</tr>
			</table>
		</form>
		<hr>
		<a href="getBoardList.jsp">글 목록 가기</a>
	</center>
</body>
</html>

 

insertBoard_proc.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@page import="com.springbook.biz.board.*"%>
<%@page import="com.springbook.biz.board.impl.*"%>
<%
	request.setCharacterEncoding("UTF-8");
	
	String title = request.getParameter("title");
	String writer = request.getParameter("writer");
	String content = request.getParameter("content");
	
	BoardVO vo = new BoardVO();
	BoardDAO dao = new BoardDAO();
	
	vo.setTitle(title);
	vo.setWriter(writer);
	vo.setContent(content);
	
	dao.insertBoard(vo);
	
	response.sendRedirect("getBoardList.jsp");
%>

 

 

따로 수정하는 페이지가 있는것이 아니라 글 상세보기 안에서 바로 수정하기 가능

updateBoard_proc.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@page import="com.springbook.biz.board.*"%>
<%@page import="com.springbook.biz.board.impl.*"%>
<%

request.setCharacterEncoding("UTF-8");

String seq = request.getParameter("seq");
String title = request.getParameter("title");
String content = request.getParameter("content");

BoardVO vo = new BoardVO();
BoardDAO dao = new BoardDAO();

vo.setSeq(Integer.parseInt(seq));
vo.setTitle(title);
vo.setContent(content);

dao.updateBoard(vo);

response.sendRedirect("getBoardList.jsp");

%>

 

로그아웃 - logout_proc.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	session.invalidate();

	response.sendRedirect("login.jsp");
	
%>

 

 

 

스프링으로 웹 만들기 model2 방식

중간에 경비역할의 컨트롤러

 

프론트 컨트롤러 (jsp)

DispatcherServlet

package com.springbook.view.controller;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

// @WebServlet("*.do") 라고 쓰는 매핑정보가  web.xml에 들어 있다.
public class DispatcherServlet extends HttpServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		process(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		process(request, response);
	}

	private void process(HttpServletRequest request, HttpServletResponse response) {
		// request, response를 받아서 필요한 작업 처리
		// getRequestURI() 포트번호를 제외하고 뒤의 값을 반환
		String uri = request.getRequestURI();
		String path = uri.substring(uri.lastIndexOf("/")); // /login.do <- 이렇게 '/' 뒤의 주소를 가지고 온다

		System.out.println(path);

		if (path.equals("/login.do")) {
			System.out.println("로그인 처리");
		} else if (path.equals("/logout.do")) {
			System.out.println("로그아웃 처리");
		} else if (path.equals("/insertBoard.do")) {
			System.out.println("글 등록 처리");
		} else if (path.equals("/updataBoard.do")) {
			System.out.println("글 수정 처리");
		} else if (path.equals("/deleteBoard.do")) {
			System.out.println("글 삭제 처리");
		} else if (path.equals("/getBoard.do")) {
			System.out.println("글 상세 조회 처리");
		} else if (path.equals("/getBoardList.do")) {
			System.out.println("글 목록 검색 처리");
		}

	}
}

+ Recent posts