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

김주희's avatar
Apr 21, 2025
[Java] 23. JDBC (2) - JDBC 연결

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명
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()동작과 사용이유
 

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