이전 글에 이어서 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 |
'Database' 카테고리의 다른 글
[MSSQL] 트랜잭션 격리수준(TRANSACTION ISOLATION LEVEL) (1) | 2023.02.20 |
---|---|
[Redis] Redis for Java Developers (0) | 2023.02.07 |
[Redis] Redis에 대해서 - 용어, DB차이점, 데이터타입, 설치 및 스프링부트 연결까지 (2) | 2023.01.17 |
[JDBC] SQL문을 이클립스에서 적용하기 (DML, DDL, DCL, TCL) (0) | 2021.03.16 |
[JDBC] 이클립스(자바)와 오라클 연동하는 방법 (0) | 2021.03.16 |
- 정보처리기사 실기
- 웹페이지만들기
- java
- LifecycleException
- gradle build
- 호스팅영역
- gradle
- putty
- ubuntu
- 정보처리기사
- 개발도서
- 배포
- AWS
- git연동
- 정보처리기사 필기
- EC2
- 노개북
- 북클럽
- 오늘의코딩
- SQLD
- 실용주의프로그래머
- jdbc
- filezila
- IT 5분 잡학사전
- JIRA
- 기술블로그
- spring
- intellij
- 노마드코더
- 독서후기
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |