이전 글에 이어서 JDBC 를 활용한 DML 문의 실전활용을 정리했다.

 

오라클에서 정보를 JDBC 로 가져올 때 우리는 프로그램 구성을 어떻게 해야 할까? 먼저 우리는 MCV 패턴 중 DAO, DTO 개념을 먼저 잡고 가는 것이 좋을 것 같다.

 

 

그림에서처럼 Main 실행 클래스를 시작으로 실행 메뉴들을 관리하는 Controller 그리고 SQL문을 실행하고, 세부 메서드를 다루는 DAO 로 나눌 수 있다. 이 때 객체의 속성 값을 전달하는 DTO 가 존재하게 된다. 이는 하나의 소프트웨어 디자인 형식이다.

그렇다면 DAO, DTO 는 무엇일까?

 

DAO Data Access Object / DTO Data Transfer Object (= VO  Value Object)

 

DAO 는 DB 에서 정보를 가져오는 connection 이 일어날 때 매번 연결을 하는 것이 아니라 일종의 Connection Pool 을 갖춘 객체로 오버헤드를 방지하기 위한 하나의 수단입니다. 쉽게 말해서, 예시로 DAO 는 사용자가 보는 메뉴에서 실행하는 값이 회원조회라고 한다면 DB와 연결해서 회원목록을 가져오는 메서드들이 담긴 객체라고 할 수 있다.

 

반면, DTO 는 계층간 데이터 교환을 위한 자바빈즈라고 한다. 계층간 데이터 연결을 위한 전달할 속성값과 getter 와 setter 로 구성된 객체이다. 

 


 

그렇다면 실제 오라클에 있는 DB를 활용해서 JBDC 의 회원정보를 보고 싶다면 코드 구성을 어떻게 해야 할까?

각 클래스별로 코드 구성을 보면서 설명해보고자 한다.

(이하 예시는 설명을 돕기 위한 것이므로 클래스별 코드 구성은 개발자가 자유롭게 작성하면 된다.)

 


 

위 그래프에 따라 설명하자면, Main 에서는 실행부의 메뉴가 존재할 것이다. 코드 구성은 대략 다음과 같은데, Controller 객체를 만들고 Controller 메서드가 실행될 수 있도록 한다. 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import java.util.*;
 
public class Main {
 
    public static void main(String[] args) {
        Controller ct = new Controller();
        Scanner sc = new Scanner(System.in);
        
        ct.menu(sc);
 
        sc.close();
    }
}
 
cs

 


 

여기서 중요한 것은 Controller 객체이다. 대부분의 대략적 메서드가 연결될 수 있도록 하며, 전반적인 프로그램 구성이 여기서 만들어진다.

이하 코드에서 입력값에 대한 변수 처리(Y, N 이외의 문자입력 등)는 제외하고 핵심부분만 작성했다. Main 에서 실행된 Controller 의 메서드 menu(sc); 는 회원을 조회할지 물어보는 메뉴이다. 여기서 Y 를 입력받으면 다음 메서드인 showInfo(sc); 가 실행된다. showInfo(sc); 메서드는 그 아래에서 정의하고 있는데 DTO 에서 값을 리스트 형식으로 받아서(getter) 출력해주는 것이다.

 

List<userDTO> userList = udao.showInfo();

여기에서 udao 는 userDAO 의 객체인데 return 값이 List<userDTO> 형식인 것을 알 수 있다.

 

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
import java.util.*;
 
public class Controller {
 
    interUserDAO udao = new userDAO();
 
    String menuNo;
 
    public void menu(Scanner sc) {
        
        System.out.println("회원을 조회하시겠습니까? [Y/N] ");
        String answer = sc.nextLine();    
 
        switch(answer) {
            case "Y":
                showInfo(sc);
            case "N":
                showMenu(sc);
        }
            
    }
 
 
    private void showInfo(Scanner sc) {       
        List<userDTO> userList = udao.showInfo();
      
        if(userList.size()>0) {
            for(userDTO udto : userList) {
                 System.out.println("회원명   나이    성별    전화번호     이메일");
                System.out.println(udto.getName()  udto.getAge()     udto.getGender()    udto.getMobile()      udto.getEmail());
            }
           } else
            System.out.println("회원이 없습니다.")
    }
}    
cs

 


 

전달 객체의 속성과 getter, setter 값을 가지고 있는 DTO 에는 아래와 같이 구성된다. 각 속성 값을 static 접근제어를 하고 다른 클래스에서 접근할 수 있도록 getter 와 setter 처리로 값을 처리한다.

 

 

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
public class userDTO {
 
    static String name;
    static int age;
    static String gender;
    static String mobile;
    static String email;
    
    public static String getName() {
        return name;
    }
    public static void setName(String name) {
        userDTO.name = name;
    }
    public static int getAge() {
        return age;
    }
    public static void setAge(int age) {
        userDTO.age = age;
    }
    public static String getGender() {
        return gender;
    }
    public static void setGender(String gender) {
        userDTO.gender = gender;
    }
    public static String getMobile() {
        return mobile;
    }
    public static void setMobile(String mobile) {
        userDTO.mobile = mobile;
    }
    public static String getEmail() {
        return email;
    }
    public static void setEmail(String email) {
        userDTO.email = email;
    }
    
}
 
cs

 


 

interfaceDAO 를 간략하게 보면, Controller 에서 userDAO 객체 생성시 구현을 위한 클래스 interDAO 로 만들었다. 즉, Controller 에서 메서드를 만들주면 interface 에 그 메서드를 정의하는 추상메서드가 생성되는데 아래와 같다.

 

1
2
3
public interface interUserDAO {
       List<userDTO> showInfo(Scanner sc);
}     
cs

 


 

이제 드디어 DAO 에서 interface 의 추상메서드를 오버라이드 할 차례이다. 실질적인 SQL 문과의 연결이 이뤄지는 클래스이다.

 

먼저, List<userDTO> showInfo(Scanner sc); 메서드 실행을 위한 SQL 문을 떠올려보면 아래와 같이 입력될 것이다. (아래 예시는 모두 임의의 값이다.) select 문이므로 명령 제어어인 DML 문이다. 이 SQL 문은 1개 이상의 값이 될 것이고, JDBC 에서 String 값으로 가져와서 각 속성값으로 저장해 줄 수 있을 것이다. 저장은 DTO 에서 setter로 출력은 Controller 에서 getter 로 이뤄질 것이다. 

 

1
2
3
select name, age, gender, moblie, email 
from tbl_info
order by name;
cs

 

그렇다면 DAO 클래스의 코드 구성을 알아보자. 이하 이전글 링크에서 알 수 있듯이, 이클립스에 SQL 문을 적용하는 코드가 짜여지게 된다. 

 

2021.03.16 - [백엔드 개발자 공부/Java + JDBC] - [JDBC] SQL문을 이클립스에서 적용하기 (DML, DDL, DCL, TCL)

 

 

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
@Override
public  List<userDTO> showInfo() {
    List<userDTO> udto = null;
             
     try {
          conn = dbConnection.getConn();
          
          String sql = " select name, age, gender, moblie, email "
                     + " from tbl_info order by name ";
     
         
          pstmt = conn.prepareStatement(sql);
          rs = pstmt.executeQuery();
                     
          while(rs.next()) {
              udto.setName(rs.getString(1));
              udto.setAge(rs.getString(2));
              udto.setGender(rs.getString(3));
              udto.setMobile(rs.getString(4));
              udto.setEmail(rs.getString(5));
          }    
 
     } catch (SQLException e) { 
          e.printStackTrace();
     } finally {
        rs.close();
        pstmt.close();
        conn.close();
     }      
     return udto;
  }
cs
댓글