본문 바로가기
국비교육기관/수업

28일차_자바_JDBC

by 밀키스 2021. 4. 21.

@21.04.21

JAVA - JDBC 

@.sql 파일 만들어 구동 

  => 27일차의 JDBC 부분에서 오라클과 연동하는 부분에 기록해두었다. 참고

 

%ClassNotFoundException - 왜 줘야하나.

JAVA 프로그램을 개발할 때 에러의 종류는
   1. 컴파일 에러 : 문법적인 오류
   2. 런타임 오류 : 실행을 시켜봐야지만 알 수 있는 오류.

 

인데, 해당 에러는 런타임 오류에 해당한다. 실행하기 전에 Class가 있는지 없는지 JAVA가 구별을 못하는 것이다.

try {
  Class.forName("oracle.jdbc.driver.OracleDrive");
  // 2. lib 파일 안에서 Java와 연결을 해주는 Class 파일을 동적로딩
  // 동적로딩을 하는 이유
  //	JAVA는 개발자가 어떤 DBMS를 사용할지 모름
  } catch (Exception e) {
  System.out.println("try문 안에 오류가 있음");
  e.printStackTrace();}

 

%동적로딩을 하는 이유. 

  => Java는 개발자가 어떤 DBMS를 사용할지 모름. (  Class.forname 과 같이 어떤 DBMS를 쓸지 지정.)

 

@DB연결 - DriverManager 

  - 여기서  oracle:thin  은 내가 다운받은 오라클6의 JAR 파일안에 있는 클래스 명이다.

  - 결국은 내가 돌릴 Driver 이름이란 뜻이다.

  - 뒤에 있는 주소는 해당 시스템의 주소??... 뭐 그런거라는데 저거 말고"localhost"라는 것도 있다

  - 뭐 2개의 차이는... 하나는 직접 쓴거고 하나는 음... 나 예전에 RPI3 쓸 때 무선으로 연결할때면

    명령어 같은 주소와 숫자로 이루어진 기본 주소쓰지 않았나?? 뭐 그정도 차이?? 가볍게 넘기자

  - 위는 Connection할 때에 import할 클래스인데.... 음 그냥 알고만 있자.

 

뭐 무튼 JDBC 쓸 때 뭘 쓰던 위 4개는 어지간하면 변하지 않는다고 한다. 내부적으로 이해하진 못해도, 외우고는 있을 것.

asd

@SQL문 준비 

// 4. SQL문에 오류가 없는지 확인하고 실제 SQL문을 실행할 수 있는
//	   PrepareStatement 객체 리턴
//		--------------------SQL문 준비하는 단계--------------------
String sql = "insert into doyeon values(?,?,?)";
PreparedStatement psmt = conn.prepareStatement(sql);
psmt.setString(1, name);
psmt.setInt(2, age);
psmt.setString(3, tel);
cnt = psmt.executeUpdate();

  -  PrepareStatement  라는 클래스(psmt)를 사용하여 SQL문을 실행한다.

  - 뭐 보면 알 수 있듯이, sql이라는 변수에 쿼리문을 작성하고, 대입하고픈 부분은 ?를 집어 넣어 나중에 set 구문을

    통해 값을 순서대로 집어 넣는다.

  - 그리고 마지막 int형인 cnt라는 변수에  psmt.executeUpdate( ) 라는 명령어름 담음으로써 내가 대입한 SQL문

    을 실행한다.

@SQL Select 파일 만들기 

  => insert, delete, update -> executeUpdate() : 리턴값 정수형

  => select -> executeQuery() : 검색된 데이터가 담겨있는 ResultSet 리턴

 

무튼 위에서 말했던 명령문들은 실행 결과에 대한 값을  executeUpdate  명령어를 통해 int 형으로 받았다.

단순히 리턴 값이 정수형이니까.

하지만, Select를 명령으로써 보냈을 때는 Return 값은 ResultSet라는 객체로써,  executeQuery  명령문으로 받는다.

try {
  String url = "jdbc:oracle:thin:@127.0.0.1:1521:xe";
  String dbid = "hr";
  String dbpw = "hr";
  Class.forName("oracle.jdbc.driver.OracleDriver");
  Connection conn =  DriverManager.getConnection(url, dbid, dbpw);

  String sql = "select * from doyeon";
  PreparedStatement psmt = conn.prepareStatement(sql);

  ResultSet rs = psmt.executeQuery();
  // insert, delete, update -> executeUpdate() : 리턴값 정수형
  // select -> executeQuery() : 검색된 데이터가 담겨있는 ResultSet 리턴

  while(rs.next()) {
    String name = rs.getString(1);
    String age = rs.getString(2);
    String tel = rs.getString(3);
    System.out.print("이름 > "+name);
    System.out.print(" / 나이 > "+age);
    System.out.print(" / 전화 번호 > "+tel);
    System.out.println();
  }

  } catch (Exception e) {
    System.out.println("try문 안에 오류가 있음");
    e.printStackTrace();
}

  - while문의 rs.next()는 Boolean 형태로 반환

  - 조금 더 정확하게 말하면 쿼리라는 명령어로 실행하여 받은 rs라는 변수에는 select문을 통해 입력 받은

    모든 행을 갖고있다.

  -  rs.next( ) 라는 명령어는 반환한 행 다음에 정보값이 있다면 true를 아니면 false를 반환한다.

  - 즉, 오라클의 시퀀스에서 nextval이라는 기능과 같다. 설령 select문으로 값을 입력하는게 아닌 보려고 했다해도,

    currval과 같이 현재값을 반환하지는 않지 않은가?? rs.next( ) 또한 똑같다. while문으로 확인한 순간 다음 행으로

    넘어가게 된다.

  - 위 사진의 보기에서는 숫자를 통해 칼럼의 값을 가져오게 했지만, 내가 해본 결과 그냥 Column 이름을 숫자 대신 써주는게 더 정확하게 불러온다. 대체 무슨 차이인지 모르겠지만... 뜻대로 안되는 경우가 많더라 숫자로 하면...

@SQL Main 클래스 생성 

지금까지 데이터의 입력, 삭제, 조회 각각의 클래스 파일을 생성했다. 해당 실습은 하나의 "Main" 클래스를 생성하여 단 하나로 3개의 기능을 모두 구동할 수 있도록 View의 역할을 하는 파일을 만든다.

 

솔직히, MVC 패턴에 대해서는 아직도 완벽히는 이해 못했다. 23일차에 대한 부분을 참고하자.

public static void main(String[] args) {
// Main 파일에서 insert, delete, select 자바파일을 호출해보시오.
  System.out.println("===회원관리시스템===");
  Scanner sc = new Scanner(System.in);
  boolean sw = true; // 스위칭변수
  while(sw) {
    System.out.println("1.회원입력 2.회원삭제 3.회원전체검색 4.종료");
    String input = sc.next();
    switch (input) {
      case "1":
      System.out.println("회원 입력 기능 실행");
      //ex01Insert.java 실행 -> 입력하는 기능 실행
      ex01Insert in = new ex01Insert(); // 객체 생성
      in.insert(); // 메소드 호출
      break;
      case "2":
      System.out.println("회원 삭제 기능 실행");
      ex02Delete de = new ex02Delete();
      de.delete();
      break;
      case "3":
      System.out.println("회원 전체검색 기능 실행");
      ex03Select se = new ex03Select();
      se.select();
      break;
      case "4":
      sw = false;
      break;
  }
  }
}

  - 그냥 보면 알 수 있듯이 사용자가 조절하는 부분에 딱 맞지 않는가??... 음... 근데 또 보면 User가 Controller를

    조작한다 그러고... 잘은 모르나 보다.. 무튼 이를 조작하여 DAO나, 다른 기능들이 수행된다.

 

@ .File 생성 

 그냥 일종의 메모장 같은 파일을 만든다. 프로그래밍적으로 아무 기능도 구현하지 않고 그냥 메모장 하나 만들어서 코드를 저장하는것 뿐, 그 이외의 역할을 하지는 않는것 같다.

@자바개발환경변경 

뭐.. 자바 개발환경을 바꾸는 방법이라는데... 이를 통해서 뭐 나타나는 자동완성이라던지 그런것들이 바뀐다고 한다.. 그데 나는 해봐도 딱히 변하는것은 없더라...이다.

@DAO 실습 및 사용이유 

  => JDBC 작성 중 중복되는 코드를 모두 하나로 모아 작업을 단순화하기 위해 사용한다.

  => 실습에서 SQL문 즉, DB와 연관되어있는 코드는 모두 DAO 파일로 옮겨 작성 진행하였다.

  => MVC 패턴으로 실습을 진행할텐데, 실습에서 Model, View, Controller에 해당하는 클래스 파일은 위 사진과 같다.

@DAO 실습 

DAO 코드 

더보기
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
public class DAO {
	public int DAO_insert(String name, int age, String tel) {
		int cnt=0;
		try {
			String url = "jdbc:oracle:thin:@127.0.0.1:1521:xe";
			String dbid = "hr";
			String dbpw = "hr";
			Class.forName("oracle.jdbc.driver.OracleDriver");
			Connection conn =  DriverManager.getConnection(url, dbid, dbpw);
			// =================DB연결=================
			String sql = "insert into doyeon values(?,?,?)";
			PreparedStatement psmt = conn.prepareStatement(sql);
			psmt.setString(1, name);
			psmt.setInt(2, age);
			psmt.setString(3, tel);
			// =================SQL문 명령=================
			cnt = psmt.executeUpdate();
			
		} catch (Exception e) {
			System.out.println("try문 안에 오류가 있음");
			e.printStackTrace();}
		return cnt;}
        
	public int DAO_delete(String name) {
		int cnt=0;
		try {
			String url = "jdbc:oracle:thin:@127.0.0.1:1521:xe";
			String dbid = "hr";
			String dbpw = "hr";
			Class.forName("oracle.jdbc.driver.OracleDriver");
			Connection conn =  DriverManager.getConnection(url, dbid, dbpw);
			// =================DB연결=================
			String sql = "delete from doyeon where name = ?";
			PreparedStatement psmt = conn.prepareStatement(sql);
			// =================SQL문 명령=================
			cnt = psmt.executeUpdate();
			
		} catch (Exception e) {
			System.out.println("try문 안에 오류가 있음");
			e.printStackTrace();}
		return cnt;}}

DAO_INSERT 코드 

더보기
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.util.Scanner;

public class ex01Insert {
	public void insert(){
		Scanner sc = new Scanner(System.in);
		System.out.println("이름 > ");
		String name = sc.next();
		System.out.println("나이 > ");
		int age = sc.nextInt();
		System.out.println("전화번호 > ");
		String tel = sc.next();
		
		DAO dao = new DAO();
		int cnt = dao.DAO_insert(name, age, tel);
		
		if(cnt>0) {
			System.out.println("입력 성공");
		}else {
			System.out.println("입력 실패");}}}

DAO_DELETE 코드 

더보기
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.util.Scanner;

public class ex02Delete {
	public void delete() {
		// 사용자에게 이름값을 입력받아 해당 데이터를 삭제하시오.
		
		Scanner sc = new Scanner(System.in);
		System.out.print("이름 > ");
		String name = sc.next();
		DAO dao = new DAO();
		int cnt = dao.DAO_delete(name);
		
		if(cnt>0) {
			System.out.println("삭제 성공");
		}else {
			System.out.println("삭제 실패");}}}

 

%Close( )는 왜?? 

한번 DB를 열어 SQL문을 실행하면, 명령문... 예로 insert나 delete를 진행하며 입력했던 정보들이 잔존한다는 것. 이들이 후에 연결되거나 쌓이는 등의 일을 방지하기 위해  Close( )  를 통해 닫아주고 새로 열어주는 것.

%DTO  

VO(Value Object)라고도 하는데, 보통 VO라는 표현을 많이 쓴다. 차이는... 비슷한 개념이나 DTO의 경우 직역대로 단순히 데이터 전달만을 위한거라면 VO는 값에 관한 모든것?? 을 총괄해서 표현하는듯 하다.

 

간단한 예로 Select를 예로 든다. insert와 delete의 경우  int  값을 return해줬다.

하지만 Select의 경우 ( 위의 실습에서 ) "name, age, tel"을 Return해줘야 한다.

 

하지만 이름 같이 합쳐서 반환하면 구분이 안되지 않겠는가?? 때문에 "구별할 수 있는", "우리가 원하는 형태의" 반환값을 갖는 객체를 만들어준다. 이를 DTO 라고 할 수 있겠다.

 

예로  ArrayList<Table_Name_DTO>  라는 객체를 갖는 배열리스트를 만들면 getter 명령어를 통해 원하는 Column을 불러들일 수 있다.. 이를 위함??

반응형

'국비교육기관 > 수업' 카테고리의 다른 글

36일차_VSC_HTML  (0) 2021.04.30
35일차_ 정처기필기 / HTML  (0) 2021.04.29
27일차_자바_GUI_StaticMain살짝 / JDBC_DAO_DTO  (0) 2021.04.20
26일차_자바_GUI_JDBC  (0) 2021.04.19
25일차_자바_GUI  (0) 2021.04.16

댓글