ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • TIL #28 - 데이터베이스 Insert
    프로그래밍/TIL(국비과정) 2020. 5. 11. 19:08

    # JDBC (Java Database Connectivity)
    Java 안에서 데이터베이스 관련 작업을 할 수 있도록 Java와 데이터베이스를 연결해주는 Java API이다. 

    JDBC를 실행하기 위해서는 아래의 단계를 거친다. 

    1. Driverloading(설치)

    driver는 sql의 종류에 따라 고르며 driver의 설정은 한 번 만 진행한다. 

    (본 포스팅의 경우엔 OracleDriver인 ojdbc8.jar을 사용한다)

    2. Connection (접속)

    접속을 위해서는 오라클에 접속할 주소인 URL, 계정, 비밀번호가 필요하다. 

    3. PreparedStatement 

    preparedStatement는 데이터베이스의 쿼리문을 자바도 알아볼 수 있게 번역해주는 역할을 한다 

     

    DB에는 총 네번의 변화가 생긴다. 

     

    InsertTest.java

    아래의 코드를 실행하기 전에 먼저 sqlDeveloper에 dbtest 를 생성해준다.

    create table dbtest(
    name varchar2(15),
    age number, 
    height number(10, 2),
    logtime date);

    varchar2 는 가변형으로 정해 놓은 공간을 다 쓰지 않으면 남은 공간을 다시 메모리에 돌려준다. 

    고정형으로는 char가 있는데 char는 남는 공간도 그대로 가지고 간다. 

     

    number의 경우엔 정수, 실수 다 받는 형이다. 

    number(10, 2) 는 공간 10을 가지되 소수점 둘째 자리까지만 가지고 간다는 뜻이다. 

    logtime은 시간을 받는다.  

     

    오라클은 문자와 문자열을 가리지 않는다. 

    가리는 것은 오직 고정이냐 아니냐 이다. 

    그래서 오라클은 무조건 싱글로 처리한다 >> '문자'/ '문자열'

     

    package com.dao;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.SQLException;
    import java.util.Scanner;
    
    public class InsertTest {
    	private String driver = "oracle.jdbc.driver.OracleDriver";
    	private String url = "jdbc:oracle:thin:@localhost:1521:xe"; 
    	private String username = "c##java";
    	private String password = "bit";
    	
    	private Connection conn;
    	private PreparedStatement pstmt;

     위의 필드 driver, url, username, password, conn, pstmt 는 아래에서 설명하도록 한다. 

    먼저 JDBC를 실행하기 위해 driverLoading을 설치한다. 

    driverloading은 생성자에 설치해주었다. 

    단, 생성자에 접속시 한 번 밖에 접속이 되지 않기 때문에 

    로그인과 로그아웃과 같이 수시로 이루어져야하는 작업은 생성자에 하지 않도록 한다. 

     

    driver를 설치해주기 위해서는 OracleDriver.class를 생성해야하는데 OracleDriver.class는 현재 파일명 밖에 파악할 수 없는 클래스이다. 즉, 인터페이스인지 추상메서드인지 전혀 모른다. 

    이럴 땐 무조건 new 해줄 수는 없다. 

    그런 경우에는 클래스의 몽타주를 딴다. 

    	public InsertTest() {
    	
    		try {
    			Class.forName(driver); // "OracleDriver.class" 생성
    			System.out.println("드라이버 로딩 성공");
    		} catch (ClassNotFoundException e) {
    			e.printStackTrace();
    		}
    
    	}

    여기까지가 드라이버 로딩의 과정이다. 

    다음은 접속이다. 

    접속을 위해서는 getConnection()을 이용해야하는데 Connection은 interface이다. 

    interface를 불러오는 방법은 아래와 같다. 

    1. implements

    2. 익명이너클래스 

    3. 모든 추상 메서드 Override 해주는 클래스

     

    그런데 위의 3가지 방법은 해당 인터페이스가 가지고 있는 메서드를 전부 Override 해주어야하는 단점이 있다. 

    Connection은 아주 많은 오버라이드 메서드들을 가지고 있기 때문에 위의 3가지 방법은 사용하기 어렵다. 

    대신, Connection 은 DriverManager라는 클래스를 통해 불러낼 수 있다. 

    그 클래스를 통해 getConnection을 부른다. 

    		try {
    			conn = DriverManager.getConnection(url, username, password);
    			
    			System.out.println("접속 성공");
    		} catch (SQLException e) {
    
    			e.printStackTrace();
    		}
    
    	}

    getConnection 안에는 위에 필드로 선언한 url(오라클의 드라이버 이름) , username (id), password 를 각각 넣어준다. 

     

    여기까지 해서 접속까지 완료했다면 본격적으로 db insert 작업에 들어간다. 

    java는 oracle의 insert를 읽어낼 수 없다. 

    그렇기 때문에 java가 읽을 수 있는 방법으로 insert 해준다. 

     

    	public void insertArticle() {
        	Scanner scan = new Scanner(System.in);
    		System.out.print("이름 입력 : ");
    		String name = scan.next();
    		System.out.print("나이 입력 : ");
    		int age = scan.nextInt();
    		System.out.print("키 입력 : ");
    		double height = scan.nextDouble();
            
          	this.getConnection();

     먼저 각각의 정보를 scanner를 통해 입력받는다. 

    그런 후 getConnection()를 불러 접속을 시도한다. 

    String sql = "insert into dbtest values(name, age, height)";

    쿼리문을 작성해준다. 

    그런데, 위와 같이 name, age, height 를 직접적으로 넣어주면 웹보안에 문제가 생긴다. 

    웹에서 역컴파일을 해서 정보를 볼 수도 있는 문제가 생기는 것이다. 

    따라서 데이터가 들어갈 자리를 ? 로 대체한다. 

    String sql = "insert into dbtest values(?, ?, ?, sysdate)";
    try {
    		pstmt = conn.prepareStatement(sql); // 생성
    		pstmt.setString(1, name);
    		pstmt.setInt(2, age);
    		pstmt.setDouble(3, height);

    이제 prepareStatement를 불러 쿼리문을 java가 읽을 수 있게 해준다. 

    오라클은 java와 다르게 인덱스가 1부터 시작하므로 1, 2, 3 차례대로 받은 데이터를 넣어준다. 

    int su = pstmt.executeUpdate();
    System.out.println(su + "개의 행이 만들어졌습니다. ");

    oracle문을 실행하고 행이 만들어졌다는 메시지를 띄운다. 

    } catch (SQLException e) {
    			e.printStackTrace();
    		} finally {
    			// 에러가 있건 없건 무조건 실행
    			try {
    				if(pstmt != null) pstmt.close();
    				if(conn != null) conn.close();
    				// 끊어줄 땐 반대로 끊어주기 
    			} catch (SQLException e) {
    				
    				e.printStackTrace();
    			}
    		}
    		
    		
    	}

    사용을 다했다면 close 해주는데 접속한 순서와 반대로 닫아준다. 

    	public static void main(String[] args) {
    	
    		InsertTest insertTest = new InsertTest();
    		insertTest.insertArticle(); 
    	}
    }

     

    '프로그래밍 > TIL(국비과정)' 카테고리의 다른 글

    TIL #30 - Servlet, 톰캣  (0) 2020.05.25
    TIL #29 - 데이터베이스 Update  (0) 2020.05.13
    TIL #27 - 채팅 프로그램  (2) 2020.05.06
    TIL #26 - 서버와 클라이언트  (0) 2020.05.04
    TIL #25 - 네트워크, I/O  (0) 2020.05.01

    댓글

Designed by Tistory.