Java

[MVC 패턴] Java로 MVC패턴 구현하기 (4) - 응집도 높이기

콩스프 2022. 12. 28. 16:59
  • 높은 응집도 ➡ 같은 로직이라면 묶어서 관리
  • 모듈화

 

 

횡단관심

 

 

[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) 을 수행할 때 호출하여 사용

 

 

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;
    }
}