프로그래밍/MVC pattern

MVC 패턴에서 쓰이는 DAO, 서비스의 개념 및 구현방법

Jay Tech 2017. 1. 13. 17:12
반응형

- 웹 어플리케이션의 주요 구성 요소


Service 클래스 : 사용자의 요청을 처리하는 기능을 제공한다. 기능을 제공하기 위한 로직을 구현하고 있으며 DAO 클래스를 통해서 DB연동을 처리한다. 가입 신청 처리, 글 목록 제공 등의 기능을 수행한다.


DAO 클래스 : DB와 관련된 CRUD 작업을 처리한다. Service 클래스들은 데이터를 DB에서 읽어오거나 DB에 데이터를 저장할 때 DAO 클래스를 사용한다.


JSP(뷰) : Service 클래스가 실행한 결과를 화면에 출력하거나 Service가 기능을 수행하는 데 필요한 데이터를 전달한다. 



** 데이터 접근 객체 (Data Access Object)의 구현


일반적으로 한 개의 DB 테이블 당 한 개의 DAO 클래스를 작성한다. 각 DAO 클래스는 INSERT, SELECT, UPDATE, DELETE 쿼리를 실행해 주는 메소드를 제공한다.

DAO클래스는 테이블로 부터 데이터를 읽어와 자바 객체로 변환하거나 또는 자바 객체의 값을 테이블에 저장해주므로, 테이블의 칼럼과 매핑되는 프로퍼티를 갖는 자바 클래스를 작성해 주어야 한다.


1) DAO에서 Connection에 접근하는 방식


DAO가 쿼리를 실행하려면 statement나 PreparedStatement가 필요한데 이 두객체는 Connection 객체로 부터 구할 수 있다. 3가지 방식 중 택하면 된다.


- DAO 클래스 메서드에서 직접 Connection 생성

메서드 실행시 매번 커넥션 생성 (만약 2개를 호출하는데 커넥션이 두번 생기는 문제가 있다. jdbc 기반의 트랜잭션은 한 개의 커넥션 객체에서만 유효하다)


- DAO 객체를 생성할 때 생성자에서 Connection을 전달받기

하나의 커넥션 객체를 사용하지만 매번 새로운 DAO 객체를 생성해야 한다.


- DAO 클래스의 메서드 파라미터로 Connection을 전달받기

한개의 커넥션을 상용하고 매번 DAO 객체를 생성하지 않아도 되지만 메서드를 실행할 때마다 커넥션을 파라미터로 전달해 주어야 한다.



close와 rollback을 편하게 하기위해 하나의 클래스로 빼는 보조클래스의 작성모습이다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
package mvjsp.jdbc;
 
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
 
public class JdbcUtil {
 
    public static void close(ResultSet rs) {
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException ex) {
            }
        }
    }
 
    public static void close(Statement stmt) {
        if (stmt != null) {
            try {
                stmt.close();
            } catch (SQLException ex) {
            }
        }
    }
 
    public static void close(Connection conn) {
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException ex) {
            }
        }
    }
 
    public static void rollback(Connection conn) {
        if (conn != null) {
            try {
                conn.rollback();
            } catch (SQLException ex) {
            }
        }
    }
}
 
cs




** 서비스 클래스의 구현


DAO가 데이터에 접근할 때 사용되는 기능을 제공한다면 서비스 클래스는 사용자의 요청을 처리하기 위한 기능을 제공한다. 서비스 클래스는 주로 DAO를 통해서 데이터에 접근하고 기능을 수행하는데 필요한 로직을 수행한다. 

예를들어 게시판 글 조회를 할 때를 생각해보자.

1) DAO 의 select를 이용해 테이블에서 지정한 값을 읽어온다. (없으면 익셉션, 있으면 해당하는 article객체 리턴)

2) article객체의 조회수를 1증가시킨다.

3) DAO의 update() 메서드를 이용해서 변경된 조회수 값을 테이블에 반영한다.


- 한 개의 서비스 클래스는 한 개의 기능을 제공하는 것이 구현이나 유지보수하는데 좋다. 



- 서비스 클래스와 트랜잭션 처리


서비스 클래스는 내붑적으로 발생한 익셉션 뿐 아니라 논리적으로 잘못된 경우에도 익셥션을 날려야한다.  예를들어 존재하지않는 글을 삭제하려고 할때 알맞은 반응을 알려주어야 한다.



** 싱글톤 패턴을 이용한 서비스의 구성


1
2
3
4
5
6
7
8
9
10
11
public class SendArticleService {
    private static SendArticleService instance = new SendArticleService();
 
    public static SendArticleService getInstance() {
        return instance;
    }
 
    private SendArticleService() {
    //...
    }
}
cs




싱글톤 패턴을 사용하면 생성자의 접근 제어 수식어가 private이기 때문에 외부 클래스에서는 생성자를 이용해서 객체를 생성할 수 없게 된다. 단 싱글톤 패턴은 유일한 객체에 접근할 수 있는 정적 메서드 getInstance를 제공하고 있다.

반응형