inblog logo
|
jay0628
    Java

    [Java] 23. JDBC (2) - JDBC 연결

    김주희's avatar
    김주희
    Apr 21, 2025
    [Java] 23. JDBC (2) - JDBC 연결
    Contents
    1. DB 더미데이터 세팅2. Java 프로젝트 생성3. DB 연결 테스트3.1. 에러가 발생하는 경우4. Gradle 한글 설정5. 조회 실습5.1. 에러가 발생하는 경우

    1. DB 더미데이터 세팅

    -- root로 접속한다. -- DB를 생성한다. create database store; -- store db를 선택한다 use store; CREATE TABLE store_tb( id int primary key auto_increment, name varchar(20), price int, qty int ); insert into store_tb(name, price, qty) values('사과', 1000, 50); insert into store_tb(name, price, qty) values('딸기', 2000, 50); commit;
     

    2. Java 프로젝트 생성

    1. Store Project 생성

    • Build system : Gradle로 설정
      • Gradle? 프로젝트에 필요한 라이브러리를 자동으로 다운로드하고 관리하는 빌드 도구
    • Gradle DSL : Groovy로 설정
      • DSL? 특화된 프로그래밍 언어 (예 - sql, html / Java는 아님)
    notion image
     

    2. MVN Repo에서 MySQL 라이브러리 가져오기

    notion image
     
    ❗
    설치한 mysql 버전 이하로 선택!
    notion image
     
    notion image
     

    3. MySQL 라이브러리를 위한 의존성 선언

    • build.gradle의 dependencies에 mvn repo에서 복사한 의존성 추가
    • 우측 상단에 뜨는 코끼리 모양 클릭 → sync
     
    sync
    sync
     
    notion image
     

    3. DB 연결 테스트

    1. 실행 전

    ❗
    반드시 Java 실행 전 MySQL이 실행되어있어야 한다.
    • MySQL의 시작 유형이 자동일 경우, 컴퓨터가 켜지면 자동으로 MySQL도 켜지지만, 수동일 경우에는 직접 실행해줘야 한다.
    • ‘작업 관리자 → 서비스 → 서비스 열기’를 통해 확인 및 설정 가능하다.
    notion image
     

    2. DB 연결

    1. main에서도 실행 가능하지만 따로 함수로 빼서 사용 가능
    1. Connection
    1. JDBC url 프로토콜 - jdbc:mysql://IP주소:포트번호/DB명
    1. …
    import java.sql.Connection; import java.sql.DriverManager; public class DBConnection { // 다른 db 만들고 싶으면 매개변수로 url,username,password 받으면 됨 public static Connection getConnection() { String url = "jdbc:mysql://localhost:3306/store"; String username = "root"; String password = "bitc5600!"; try { Class.forName("com.mysql.cj.jdbc.Driver"); // conn = 프로토콜이 적용된 소켓 Connection conn = DriverManager.getConnection(url, username, password); return conn; } catch (Exception e) { throw new RuntimeException(e); } } }
    TISTORYTISTORYJDBC Class.forName()동작과 사용이유
    JDBC Class.forName()동작과 사용이유

    JDBC Class.forName()동작과 사용이유

    자바 파일(Java file), 클래스 파일(Class file)자바 파일은 확장자가 .java 인 파일로서 자바 언어로 소스 코드를 작성하는 파일입니다.그리고 이 자바 파일을 자바 컴파일러로 컴파일한 파일이바로 .class 확장자를 가진 클래스 파일입니다.우리가 흔히 이클립스와 같은 IDE 혹은 커맨드 라인에서javac 명령어를 통해 컴파일했을 때 나오는 파일이죠.이 클래스 파일을 가지고 자바의 클래스 로더(Class Loader)가JVM으로 클래스 파일을 로딩합니다.Java에서 클래스의 로딩 과정은 클래스 로더(Class Loader)가 확장자가.class 클래스 파일의 위치를 찾아그것을 JVM위에 올려놓는 과정을 뜻합니다.   동적 로딩JVM이 클래스파일을 로드할 때 기본적으로 동적으로 로드합니다...

    TISTORYTISTORY
     

    3.1. 에러가 발생하는 경우

    notion image

    1. 포트번호 불일치

    notion image

    2. DB명 불일치

    notion image

    3. username 불일치

    notion image

    4. password 불일치

    notion image

    5. password 누락

    notion image
     

    4. Gradle 한글 설정

    ❗
    한글 깨짐 문제 해결
    정확한 이해는 나중에~
    notion image
     

    5. 조회 실습

        import java.sql.*; public class StoreApp { public static void main(String[] args) { // 1. DB 연결 - 세션 만들어짐 Connection conn = DBConnection.getConnection(); // BW try { // 2. 버퍼 // sql문에 ';' 필요X String sql = "select id, name, price, qty from store_tb where id = ?"; // ? = 준비되지 않은 sql문장 = 그래서 prepareStatement // 프로토콜이 적용된 버퍼 -> 클래스명이 중요하지 않다..? PreparedStatement psmt = conn.prepareStatement(sql); // 괄호 안에 query를 담는다 = 버퍼에 쓰는 것과 같다 psmt.setInt(1, 2); // ?의 위치(?가 여러개일수도 있으니까) - 0(X) 1(O)부터 시작 // 이제 전송해야됨 (flush) // 3. flush (rs = table 조회 결과 즉 view) ResultSet rs = psmt.executeQuery(); //read - select / DQL 전용 함수 / 쿼리의 결과(뷰)를 return // 뷰를 클래스 오브젝트로 담아서 // executeUpdate : write - insert update delete / DML 전용 함수 boolean isThere = rs.next(); // cursor 한 칸 내리기 - 직접 해야됨 / 행이 있으면 true System.out.println("isThere: " + isThere); // 로그 찍는 연습 if (isThere){ // 프로젝션이 시작됨 // java에서도 프로젝션 // 버퍼로 받을 때는 문자열이니까 모두 string으로 받아도 됨 int id = rs.getInt("id"); // '프로젝션 해서, String -> int로 캐스팅'까지 해줌 String name = rs.getString("name"); int price = rs.getInt("price"); int qty = rs.getInt("qty"); System.out.println(id + " " + name + " " + price + " " + qty); } } catch (SQLException e) { // 백그라운드프로세스가 메타데이터를 보고 에러 판단..? throw new RuntimeException(e); } } }
        notion image
         

        5.1. 에러가 발생하는 경우

        notion image
         

        1. store_tb에 들어있는 데이터의 행을 초과

        • 원래는 아무것도 출력되지 않지만 System.out.println("isThere: " + isThere); 를 통해 로그로 확인
          • ⇒ rs.next() 의 cursor가 아무것도 가리키고 있지 않기 때문에 false가 리턴되었음을 알 수 있다.
        notion image
         

        2. MySQL의 컬럼명과 불일치

        notion image
        Share article

        jay0628

        RSS·Powered by Inblog