선 요약정리

//스프링 퀵 스타트 예제 CREATE TABLE BOARD ( SEQ INT PRIMARY KEY, TITLE VARCHAR(200), WRITER VARCHAR(20), CONTENT VARCHAR(2000), REGDATE DATETIME DEFAULT NOW(), CNT INT DEFAULT 0 );
//토비의 스프링 예제 create table users ( id varchar(10) primary key, name varchar(20) not null, password varchar(10) not null )
//스프링 퀵 스타트 예제 package com.springbook.biz.board; import java.sql.Date; public class BoardVO { private int seq; private String title; private String writer; private String content; private Date regDate; private int cnt; public int getSeq() { return seq; } public void setSeq(int seq) { this.seq = seq; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getWriter() { return writer; } public void setWriter(String writer) { this.writer = writer; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } public Date getRegDate() { return regDate; } public void setRegDate(Date regDate) { this.regDate = regDate; } public int getCnt() { return cnt; } public void setCnt(int cnt) { this.cnt = cnt; } @Override public String toString() { return "BoardVO [seq=" + seq + ", title=" + title + ", writer=" + writer + ", content=" + content + ", regDate=" + regDate + ", cnt=" + cnt + "]"; } }
(※ DTO또한 VO클래스와 거의 기능적으로 유사한데 차이점이 있다면 다음과 같다.
고로 위의 예시는 사실 DTO에 더 가깝다. 하지만 예시 코드에서 VO로 정의해놨기에 VO로 냅두기로 한다.)
package com.springbook.biz.board.impl;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import org.springframework.stereotype.Repository;
import com.springbook.biz.board.BoardVO;
import com.springbook.biz.common.JDBCUtil;
@Repository("BoardDAO") //자동으로 객체 생성
public class BoardDAO {
//JDBC 관련 변수
private Connection conn = null;
private PreparedStatement stmt = null;
private ResultSet rs = null;
//SQL 관련 명령어
// 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_INSERT = "INSERT INTO studydb.BOARD(SEQ, TITLE, WRITER, CONTENT) "
+ "VALUES((SELECT IFNULL(MAX(SEQ), 0) + 1 FROM BOARD A), ?, ?, ?)";
private final String BOARD_UPDATE = "UPDATE studydb.BOARD SET TITLE = ?, CONTENT = ? WHERE SEQ =?";
private final String BOARD_DELETE = "DELETE FROM studydb.BOARD WHERE SEQ =?";
private final String BOARD_GET = "SELECT * FROM studydb.BOARD WHERE SEQ = ?";
private final String BOARD_LIST = "SELECT * FROM studydb.BOARD ORDER BY SEQ DESC";
//CRUD 기능의 메소드 구현
//글 등록
public void insertBoard(BoardVO vo) {
System.out.println("====> JDBC로 insertBoard() 기능 처리");
try {
conn = JDBCUtil.getConnection();
stmt = conn.prepareStatement(BOARD_INSERT);
stmt.setString(1, vo.getTitle());
stmt.setString(2, vo.getWriter());
stmt.setString(3, vo.getContent());
stmt.executeUpdate();
} catch(Exception e) {
e.printStackTrace();
} finally {
JDBCUtil.close(stmt, conn);
}
}
//줄 수정
public void updateBoard(BoardVO vo) {
System.out.println("====> JDBC로 updateBoard() 기능 처리");
try {
conn = JDBCUtil.getConnection();
stmt = conn.prepareStatement(BOARD_UPDATE);
stmt.setString(1, vo.getTitle());
stmt.setString(2, vo.getContent());
stmt.executeUpdate();
} catch(Exception e) {
e.printStackTrace();
} finally {
JDBCUtil.close(stmt, conn);
}
}
//글 삭제
public void deleteBoard(BoardVO vo) {
System.out.println("====> JDBC로 deleteBoard() 기능 처리");
try {
conn = JDBCUtil.getConnection();
stmt = conn.prepareStatement(BOARD_DELETE);
stmt.setInt(1, vo.getSeq());
stmt.executeUpdate();
} catch(Exception e) {
e.printStackTrace();
} finally {
JDBCUtil.close(stmt, conn);
}
}
//글 상세 조회
public BoardVO getBoard(BoardVO vo) {
System.out.println("====> JDBC로 getBoard() 기능 처리");
BoardVO board = null;
try {
conn = JDBCUtil.getConnection();
stmt = conn.prepareStatement(BOARD_GET);
stmt.setInt(1, vo.getSeq());
rs = stmt.executeQuery();
if(rs.next()) {
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"));
}
} catch(Exception e) {
e.printStackTrace();
} finally {
JDBCUtil.close(stmt, conn);
}
return board;
}
//글 목록 조회
public List<BoardVO> getBoardList(BoardVO vo) {
System.out.println("====> JDBC로 getBoard() 기능 처리");
List<BoardVO> boardList = new ArrayList<BoardVO>();
try {
conn = JDBCUtil.getConnection();
stmt = conn.prepareStatement(BOARD_LIST);
rs = stmt.executeQuery();
while(rs.next()) {
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"));
boardList.add(board);
}
} catch(Exception e) {
e.printStackTrace();
} finally {
JDBCUtil.close(rs, stmt, conn);
}
return boardList;
}
}
package com.springbook.biz.common; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; public class JDBCUtil { public static Connection getConnection() { try { //ojdbc.jar파일에서 오라클드라이버 클래스 로딩 Class.forName("oracle.jdbc.driver.OracleDriver"); //MySql Class.forName("com.mysql.cj.jdbc.Driver"); //오라클 DB 커넥션 // return DriverManager.getConnection("jdbc:oracle:thin@localhost:1521:xe", "study", "study"); //MySql 커넥션 return DriverManager.getConnection("jdbc:mysql://localhost:3306/studydb", "study", "study"); } catch(Exception e) { e.printStackTrace(); } return null; } public static void close(PreparedStatement stmt, Connection conn) { if(stmt != null) { try { if(!stmt.isClosed()) { stmt.close(); } } catch(Exception e) { e.printStackTrace(); } finally { stmt = null; } } if(conn != null) { try { if(!conn.isClosed()) { conn.close(); } } catch(Exception e) { e.printStackTrace(); } finally { conn = null; } } } public static void close(ResultSet rs, PreparedStatement stmt, Connection conn) { if(rs != null) { try { if(!rs.isClosed()) { rs.close(); } } catch(Exception e) { e.printStackTrace(); } finally { rs = null; } } if(stmt != null) { try { if(!stmt.isClosed()) { stmt.close(); } } catch(Exception e) { e.printStackTrace(); } finally { stmt = null; } } if(conn != null) { try { if(!conn.isClosed()) { conn.close(); } } catch(Exception e) { e.printStackTrace(); } finally { conn = null; } } } }
package com.springbook.biz.board; import java.util.List; public interface BoardService { //CRUD 기능의 메소드 구현 //글 등록 void insertBoard(BoardVO vo); //글 수정 void updateBoard(BoardVO vo); //글 삭제 void deleteBoard(BoardVO vo); //글 상세 조회 BoardVO getBoard(BoardVO vo); //글 목록 조회 List<BoardVO> getBoardList(BoardVO vo); }
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; @Service("boardService") /* * Service 클래스는 jsp/servlet할 때 안 배웠음 * 업무로직 처리를 담당하는 클래스 * ex) 계좌이체 기능 처리할 때 DB입력은 DAO에서 하게 되는데 * DB 입력 전에 필요한 작업들(계좌 암호화, 금액 컴마 추가...) 하는 로직들을 ServiceImpl클래스에서 처리해주면 됨 * */ public class BoardServiceImpl implements BoardService{ @Autowired BoardDAO boardDAO; public void insertBoard(BoardVO vo) { boardDAO.insertBoard(vo); } public void updateBoard(BoardVO vo) { boardDAO.updateBoard(vo); } public void deleteBoard(BoardVO vo) { boardDAO.deleteBoard(vo); } public BoardVO getBoard(BoardVO vo) { return boardDAO.getBoard(vo); } public List<BoardVO> getBoardList(BoardVO vo) { return boardDAO.getBoardList(vo); } }
package com.springbook.biz.board; import java.util.List; import org.springframework.context.support.AbstractApplicationContext; import org.springframework.context.support.GenericXmlApplicationContext; public class BoardServiceClient { public static void main(String[] args) { //1. Sprig 컨테이너를 구동한다. AbstractApplicationContext container = new GenericXmlApplicationContext("applicationContext.xml"); //2. Spring 컨테이너로부터 BoardServiceImpl 객체를 Lookup한다. BoardService boardService = (BoardService) container.getBean("boardService"); //3. 글 등록 테스트 BoardVO vo = new BoardVO(); vo.setTitle("임시 제목"); vo.setWriter("홍길동"); vo.setContent("임시 내용"); boardService.insertBoard(vo); //4. 글 목록 조회 테스트 List<BoardVO> boardList = boardService.getBoardList(vo); for(BoardVO board : boardList) { System.out.println("---> " + board.toString()); } //5. Spring 컨테이너 종료 container.close(); } }