- 높은 응집도 ➡ 같은 로직이라면 묶어서 관리
- 모듈화
횡단관심
[MVC 패턴] Java로 MVC 패턴 구현하기 (3) - DB 연결
테이블 생성 회원 테이블 생성 CREATE TABLE MEMBER( NUM INT PRIMARY KEY, NAME VARCHAR(20) NOT NULL, AGE INT DEFAULT 20 ); MemberVO 테이블의 Column와 VO의 필드가 매칭되도록 작성 public class MemberVO { private int num; private Stri
bean-soup-99.tistory.com
- 여기서 작성한 코드를 보면 각각의 비즈니스 로직 (CRUD)에서 동일한 코드가 반복되고 있음을 볼 수 있음
- DB 연결 로직 / 해제 로직 / 인증 로직을 따로 만들어야 함
⭐ 이러한 로직은 '서비스'라고 부르지 않음
➡ 횡단관심, 공통로직, 어드바이스 라고 부름
💡 (가로방향) 같은 로직이 등장했을 때, 따로 메서드화 / 클래스로 묶어
(세로방향) 핵심로직 (비즈니스 메서드, 서비스 CRUD) 을 수행할 때 호출하여 사용
(세로방향) 핵심로직 (비즈니스 메서드, 서비스 CRUD) 을 수행할 때 호출하여 사용
Util 클래스
- 같은 로직을 묶어 응집도를 높임
JDBCUtil
- DB에 연결하고 해제하는 로직을 묶은 클래스
- model.common 패키지내에 생성
- 객체와 상관없이 메소드를 사용할 수 있도록 static 메소드로 정의
package model.common;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
public class JDBCUtil {
static final String url = "jdbc:oracle:thin:@localhost:1521:xe";
static final String user = "subin";
static final String passwd = "1234";
static final String driverName = "oracle.jdbc.driver.OracleDriver";
//DB 연결
public static Connection connect() {
Connection conn = null;
try {
Class.forName(driverName);
conn = DriverManager.getConnection(url, user, passwd);
} catch (Exception e) {
e.printStackTrace();
} finally {
System.out.println("\t로그 : connect()");
}
return conn;
}
//DB 연결 해제
public static void disconnect(Connection conn, PreparedStatement stmt) {
try {
stmt.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
System.out.println("\t로그: disconnect()");
}
}
}
BoardDAO
- DAO에서 핵심로직을 수행할 때 JDBCUtil 클래스의 메소드를 호출
package model.board;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import model.common.JDBCUtil;
public class BoardDAO {
Connection conn;
PreparedStatement pstmt;
final String SELECTALL = "SELECT * FROM BOARD";
final String INSERT = "INSERT INTO BOARD VALUES((SELECT NVL(MAX(NUM),0)+1 FROM BOARD), ?, ?)";
final String SELECT_TITLE = "SELECT * FROM BOARD WHERE TITLE LIKE '%'||?||'%' ORDER BY NUM ASC";
final String SELECT_WRITER = "SELECT * FROM BOARD WHERE WRITER LIKE '%'||?||'%' ORDER BY NUM ASC";
final String SELECT = "SELECT * FROM BOARD WHERE TITLE = ? AND WRITER = ?";
public boolean insert(BoardVO bvo) {
try {
conn = JDBCUtil.connect();
pstmt = conn.prepareStatement(INSERT);
pstmt.setString(1, bvo.getTitle());
pstmt.setString(2, bvo.getWriter());
pstmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
System.out.println("\t로그 : INSERT 성공");
return false;
} finally {
JDBCUtil.disconnect(conn, pstmt);
}
System.out.println("\t로그 : INSERT 실패");
return true;
}
public ArrayList<BoardVO> selectAll(BoardVO bvo) {
ArrayList<BoardVO> boards = new ArrayList<BoardVO>();
try {
conn = JDBCUtil.connect();
if (bvo == null) {
//null이면 전체 목록
pstmt = conn.prepareStatement(SELECTALL);
} else if (bvo.getSearchCondition().equals("제목")) {
//SearchCondition이 제목이면 제목 검색
pstmt = conn.prepareStatement(SELECT_TITLE);
pstmt.setString(1, bvo.getSearchContent());
} else if (bvo.getSearchCondition().equals("내용")) {
//SearchCondition이 내용이면 내용 검색
pstmt = conn.prepareStatement(SELECT_WRITER);
pstmt.setString(1, bvo.getSearchContent());
}
ResultSet rs = pstmt.executeQuery();
while (rs.next()) {
BoardVO vo = new BoardVO();
vo.setNum(rs.getInt("NUM"));
vo.setTitle(rs.getString("TITLE"));
vo.setWriter(rs.getString("WRITER"));
boards.add(vo);
}
} catch (SQLException e) {
e.printStackTrace();
System.out.println("\t로그 : SELECTALL 실패");
return null;
} finally {
JDBCUtil.disconnect(conn, pstmt);
}
return boards;
}
}