본문 바로가기
프로그래밍 공부/Java

[lesson] Java 프로그래밍 언어 - JDBC

by Luna_lua 2021. 8. 22.
반응형

JDBC는 자바와 DB를 연결하여 사용하는 Java DataBase Connectivity의 약자로 자바에서 DB 프로그래밍을 하기 위해 사용되는 API입니다. (그러므로 DB종류에는 상관이 없습니다.)

 

USB, 마우스, 모니터 등 장치를 연결할때 연결을 시도하자마자 바로 시작하는 작업! 바로 드라이버 설치입니다.

JAVA와 DB를 연결할 때 역시 드라이버를 먼저 설정 해주고 작업을 시작합니다.

 

이번 JDBC에서는 MVC패턴을 사용하여 진행하기 위해 MVC를 잘 모르시는 분들은 아래의 링크를 통해 큰 틀을 보고 오시는 것이 조금더 좋을것 같습니다!

https://luna-lua.tistory.com/entry/lesson-Java-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%EC%96%B8%EC%96%B4-%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4-MVC-%EC%8B%B1%EA%B8%80%ED%86%A4

 

[lesson] Java 프로그래밍 언어 - 디자인 패턴 ( MVC, 싱글톤)

<소프트웨어 디자인 설계 패턴> 패턴이란 중복이 있는것! 안방벽지에 꽃패턴을 넣자 이랬으면 꽃이 하나? 여러개? 여러개가 먼저 떠올리게 될것입니다. 패턴은 개발자들끼리의 약속 어딜가도 같

luna-lua.tistory.com

 

 

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

 

 

반응형