스프링(퀵 스타트) 1일차(DAO)

Lucy in the Sky with Diamond·2023년 8월 4일

스프링 정리

목록 보기
2/5

선 요약정리

I. 비즈니스 컴포넌트 정리

  1. DB 테이블
//스프링 퀵 스타트 예제
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
)
  1. VO 클래스
    위의 예시인 DB의 데이터를 저장하는 객체를 의미함.
    getter를 정의한 클래스,불변성을 보장한다.
    (여기서 싱글톤,불변성,캡슐화와 살짝 헷갈린다면 다음 링크를 참조하자)
//스프링 퀵 스타트 예제
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는 getter,setter가 존재하며 VO는 오직 getter만 존재함
  • DTO는 데이터를 전송하는거 자체에 의의를 두며 VO는 객체의 값을 담는것 자체에 의미를 둔다

고로 위의 예시는 사실 DTO에 더 가깝다. 하지만 예시 코드에서 VO로 정의해놨기에 VO로 냅두기로 한다.)

  1. DAO 클래스
    DAO 클래스는 DB에 접속하여 특정 데이터에 접근,조작하기 위한 클래스이다.
    DAO 클래스에서 일반적으로 CRUD작업을 실행한다.
    (※ CRUD란 Create,Read,Update,Delete의 약어로써 데이터 처리기능의 기초적인 4가지 기능을 이야기한다.)
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;
	}
}
  1. JDBC API
    JDBC는 데이터베이스와의 연결 그 자체를 위해 만들어진 API이다.
    SQL문을 실행할 수 있게 해주는 함수 호출 인터페이스이다.
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;
			}
		}
	}
}
  1. BoardService & BoardServiceImpl
    BoardService를 구현화 한 클래스.
    BoardService의 구현화를 통하여 DI를 이루어냈으며
    boardDAO에 있는 메소드들을 호출해서 BoardVO vo의 데이터들을 처리하고 반환하는 역할을 수행함.
    다형성과 DI에 대한 이야기는 옆의 링크를 참고하자
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);
	}
}
  1. Client
    말 그대로 클라이언트 객체.
    Request와 Respond를 주고 받는 역할을 한다.
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();
	}
}

0개의 댓글