스프링 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) : 더 이상 쪼갤 수 없는 최소 작업 단위
트랜잭션 마무리 작업
- 커밋 : 작업이 마무리 됨
- 롤백 : 작업을 취소하고 이전의 상태로 되돌림
스프링에서 제공하는 트랜잭션 기술
- 트랜잭션 동기화
- 트랜잭션 추상화
- 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("글 목록 검색 처리");
}
}
}
'2024_UIUX 국비 TIL' 카테고리의 다른 글
UIUX _국비과정 0722 [웹소켓 채팅, 스프링 컨트롤러 사용하기] (0) | 2024.07.31 |
---|---|
UIUX _국비과정 0719 [스프링 model2방식 웹만들기] (0) | 2024.07.30 |
UIUX _국비과정 0717 [스프링 3대 요소, AOP] (0) | 2024.07.29 |
UIUX _국비과정 0716 [스프링 게시판, 사용자 로그인 여부 알리기] (0) | 2024.07.29 |
UIUX _국비과정 0716 [스프링 3대 요소, 게시판 기본 구조 만들기] (0) | 2024.07.29 |