JDBC는 자바와 DB를 연결하여 사용하는 Java DataBase Connectivity의 약자로 자바에서 DB 프로그래밍을 하기 위해 사용되는 API입니다. (그러므로 DB종류에는 상관이 없습니다.)
USB, 마우스, 모니터 등 장치를 연결할때 연결을 시도하자마자 바로 시작하는 작업! 바로 드라이버 설치입니다.
JAVA와 DB를 연결할 때 역시 드라이버를 먼저 설정 해주고 작업을 시작합니다.
이번 JDBC에서는 MVC패턴을 사용하여 진행하기 위해 MVC를 잘 모르시는 분들은 아래의 링크를 통해 큰 틀을 보고 오시는 것이 조금더 좋을것 같습니다!
M(Model) : DB에서 조회된 결과 값을 담기 위한 변수들이 선언된 클래스 (VO)
즉, 테이블의 데이터를 가져고오 이 내용은 컬럼의 정보를 기준으로 두면 값을 제대로 가져올 수 있기 때문에
데이터를 가져올 테이블의 컬럼 속성을 변수로 선언해 줍니다.
데이터 직접 조작을 하면 안되기 때문에 접근권한자를 private로 한후 getter/setter로 값을 가져와 사용하는 Class를 만들어준다
// VO [이전 작업용 내용중 일부 발췌]
package vo;
//USERNUMBER NUMBER NOT NULL,
//ID VARCHAR2(300),
//PW VARCHAR2(300),
//NAME VARCHAR2(300),
//AGE NUMBER,
//PHONENUMBER VARCHAR2(20),
public class TBL_USER_VO {
// 디비의 테이블 데이터와 동일하게 만들기
// DB에서 조회된 결과 값을 담기위한 변수들이 선언된 클래스
private int userNumber;
private String id;
private String pw;
private String name;
private int age;
private String phoneNumber;
private int status;
// 기본생성자 만들어 주기
public TBL_USER_VO() {;}
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
public int getUserNumber() {
return userNumber;
}
public void setUserNumber(int userNumber) {
this.userNumber = userNumber;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPw() {
return pw;
}
public void setPw(String pw) {
this.pw = pw;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getPhoneNumber() {
return phoneNumber;
}
public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
}
V(View) : 사용자에게 보여질 화면을 구성하는 부분
View에서 테이블을 삽입, 삭제, 수정, 복구 등의 작업을 사용자에게 작업의 선택을 할 수 있도록 기능을 표현해 줍니다.
// VIEW [이전 작업용 내용중 일부 발췌]
package view;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.stream.Collectors;
import dao.TBL_USER_DAO;
import vo.TBL_USER_VO;
public class UserForm {
//// view단 사용자에게 보여주는 화면과, DAO에서 작업하기 애매한 내용들을
//// 여기서 해결한다.
public static void main(String[] args) {
// 로그인
if(!dao.checkSignOut("lss5555")) {
if(dao.login("lss5555", "1111")) {
System.out.println("로그인 성공");
}else {
System.out.println("로그인 실패");
}
}else {
System.out.println("회원탈퇴된 계정입니다.");
}
// 회원탈퇴
if(TBL_USER_DAO.session != 0) {
System.out.print("회원탈퇴\n비밀번호 : ");
if(dao.delete(sc.next())) {
System.out.println("회원탈퇴 성공");
}else {
System.out.println("회원탈퇴 실패");
}
}else {
System.out.println("로그인 후 이용 가능한 서비스입니다.");
}
// 회원가입
TBL_USER_VO vo = new TBL_USER_VO();
vo.setId("lss5555");
vo.setAge(10);
vo.setName("순신이");
vo.setPhoneNumber("01011112222");
vo.setPw("1111");
if(dao.checkId("lss5555")) {
System.out.println("중복된 아이디");
}else {
dao.join(vo);
System.out.println("회원가입 성공");
}
}
}
C(Controller) : DB에 접근할 수 있는 메소드들이 선언된 클래스 (dao, DBConnecter)
1. dao : Controller DB에 접근할 수 있는 메소드들이 선언된 클래스
- Model(VO)과 차이가 있다면, Model은 DB에 받아오는 데이터들의 양식 관점
(쿼리문을 전달하는 작업은 DAO에서 해준다)
- Controller(DAO)는 데이터 요청하여 받아오고, 추가 가공하여 view단에 표시 작업 관점
// DAO [이전 작업용 내용중 일부 발췌]
// 작업 했던 DAO내용에서 DB Connect작업과 쿼리를 보내기위한 작업 (샘플)
public class TBL_USER_DAO {
//// Controller DB에 접근할 수 있는 메소드들이 선언된 클래스
//// Model과 차이가 있다면, Model은 DB에 받아오는 데이터들의 양식 관점
//// Controller는 데이터 요청하여 받아오고, 추가 가공하여 view단에 표시 작업 관점
//// 현재 USERNUMBER에 대한 값 ( 로그인 시 세션을 가지고 있는다.)
//// session은 로그인이 되어있는지에 대한 0,1이 아닌 그 USER의 USERNUMBER를 가지고 있고, 1부터 시작하기 때문에
//// 리셋할때는 0으로 초기화 시켜준다.
public static int session;
//// 공유용 전화인증용 임시번호
public static String number;
//// 공유용 패스워드 임시비밀번호
public static String tempPw;
//// 공유용 usernumber
public static int userNumber;
//// 커넥션 클래스 : 선언한 DBConnect의 get~으로 DB를 연결
//// 기능 마다 연결을 계속 해주어야 하기때문에 이런 작업을 줄이기 위해 DBConnect를 만든것!!
Connection conn; // DB와 연결된 객체
//// 쿼리문을 담는 객체 (?를 사용해 변수에 있는 값을 넣을예정이며, pstm.getxxx를 사용해, ?의 내용을 넣어준다.
PreparedStatement pstm; // SQL문을 담는 객체
//// 쿼리문이 select라면 조회된 내용을 받아와야 하기 때문에 결과를 담는 객체
ResultSet rs; // SQL문 결과를 담는 객체
// 아이디 중복검사
//// View에서 어떤 id를 검사할지 받기 위해 매개변수로 String id를 받아옴
public boolean checkId(String id) {
//// 받아온 id를 사용하여 SELECT문 사용예정
//// 있는지만 확인 하면 되기 때문에 count를 사용하여 조회 (결과값이 0 또는 1로 항상 결과값이 나오기 때문에 null이 나올수
//// 없다.)
String query = "SELECT COUNT(ID) FROM TBL_USER WHERE ID = ?";
//// 중복된 값이 있으면 있다고 해주기 위해 사용하는 flag, 중복때만 리턴이 true이기 때문에 default는 false
boolean check = false;
//// DB연결 작업
try {
//// Connectrion 클래스로 DB연결
conn = DBConnecter.getConnection();
//// 연결된 DB에 쿼리문을 보내기위해 pstm에 쿼리문 담기
//// SQLException이 뜨기 때문에 작업 전체를 try-catch문으로 감싸준다.
pstm = conn.prepareStatement(query);
//// DB에 보내기전 ?로 되어있는 부분을 변수로 담기위해 setString사용하여 쿼리문 완성
pstm.setString(1, id);
//// select문으로 결과 값을 받아와야하기때문에 executeUpdate가 아닌 executeQuery로 값을 받아온다.
rs = pstm.executeQuery();
//// 받아온 결과값의 행을 찾기 위해 rs.next를 사용
rs.next(); // 행
//// 가져온 결과값의 열을 골라서 값을 확인 할 수 있다.
//// 1행 1열의 count 값이 나오기 때문에 next를 한번만 사용하고, 1열의 getInt를 사용하여 값을 확인
if (rs.getInt(1)/* 열 */ == 1) {
check = true;
}
//// 쿼리문 오류에 대한 catch문
} catch (SQLException e) {
System.out.println("checkId SQL문 오류");
//// 나머지 오류에 대한 catch문
} catch (Exception e) {
e.printStackTrace();
//// 오류처리 완료 후 모든 작업(try)이 끝났다며 finally에서
} finally {
try {
//// DBConnecter에서 열었던 순서대로 닫아주어야 한다.
if (rs != null) {
rs.close();
}
if (pstm != null) {
pstm.close();
}
if (conn != null) {
conn.close();
}
//// 닫을때도 pstm을 작업하기 때문에 SQLException을 컨트롤 해주어야 한다.
//// 이때는 오류나면 바로 멈추면 나머지를 못닫고 프로세스가 끝날 수 있기 때문에 runtime에러를 발생시켜준다.
} catch (SQLException e) {
throw new RuntimeException(e.getMessage());
}
}
return check;
}
2. DBConnecter
- View에서 사용자가 원하는 하나의 작업을 해결할때마다 DB를 연결하기 위해 필요한 정보를 담아 시도를 해야합니다 (계정정보, url, 드라이버, 연결 시도 완료 후 연결된 객체 등)
=> 이러한 작업이 계속 반복 되기 때문에 하나의 메소드로 묶어(DB연결 기능) 코드를 간략하게 사용할 수 있게 하기 위해 만들어 놓습니다.
// DBConnecter [이전 작업용 내용중 일부 발췌]
package dao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class DBConnecter {
// DB와 연결을 위한 클래스
// DB접근시 필요한 내용(계정, 비번, url등 접근할때마다 사용해야 하기 때문에
// 하나의 클래스도 만들어서 사용
public static Connection getConnection() {
Connection conn = null;
try {
//연결에 필요한 정보
String user = "hr";
String pw = "hr";
String url = "jdbc:oracle:thin:@localhost:1521:XE";
//드라이버를 메모리에 할당
Class.forName("oracle.jdbc.driver.OracleDriver");
//연결된 객체 가져오기
conn = DriverManager.getConnection(url, user, pw);
} catch (ClassNotFoundException e) {
System.out.println("드라이버 로딩 실패");
} catch (SQLException e) {
System.out.println("연결 실패");
} catch (Exception e) {
System.out.println("알 수 없는 오류");
}
return conn;
}
}
'프로그래밍 공부 > Java' 카테고리의 다른 글
[Lesson] list만 순서가 있다고? Map도 순서가 있다! (0) | 2023.01.10 |
---|---|
[lesson] Java 프로그래밍 언어 - 디자인 패턴 ( MVC, 싱글톤) (0) | 2021.08.22 |
[lesson] Java 프로그래밍 언어 - 파일 입출력 (0) | 2021.08.11 |
[lesson] Java 프로그래밍 언어 - 스레드(Thread) (0) | 2021.08.07 |
[lesson] Java 프로그래밍 언어 - Collection (0) | 2021.08.04 |