03.17 학습&숙제

한강섭·2025년 3월 17일
0

학습 & 숙제

목록 보기
45/103
post-thumbnail

03.17 학습! JDBC! 🟥🟧🟨🟩🟦🟪🟫⬜⬛🫢🔔😎😊🤔😭⭐

DB.4🟥

MyBatis Framework (SQL Mapping Framework)

MVC - Service(Tx 관리), Data

JDBC 🟧

Java DataBase Connectivity -> 인터페이스의 집합!

만약 Oracle DBMS, MySql DBMS, DB2 DBMS 이렇게 있는데

같은 코드 DATABASE를 사용하는데 DBMS만 바뀔 때 하드코딩이 나타난다

자바 애플리케이션에서의 DB 접근 및 사용 방법에 대한 표준화 필요성 부각

자바 애플리케이션과 DB와의 독립성 필요!

JDBC는 표준을 제시한다! 하지만 구멍이 뚫려있음 거기에 각각의 DBMS에 맞는 코드 추가하여 작동!

😎개발자 관점 - DB와의 통신을 하기 위해 Java Application에서 사용하는 방법
각 DB 접속 방법 및 구현에 대한 상세한 정보를 알 필요 없음

DataBase 관점 - 표준화된 통신 기능을 제공하기 위해 구현해야 하는 약속, 명세
표준화된 인터페이스를 준수하는 DBMS만의 고유한 클래스 구현

JDBC Driver 🟨

JDBC 인터페이스에 대한 DB 벤더들이 구현한 클래스 라이브러리

구현체 -> JDBC Driver -> 클래스 라이브러리

드라이버 없이 동작할 수 없다! -> java Application 개발 후 실행 시에 반드시 필요하다!

JDBC API 🟩

⭐⭐⭐ JDBC를 이용한 DB 연동 6단계 ⭐⭐⭐

🔔1. JDBC Driver Class 로딩 (JDBC 4.0 이후 버전부터 생략 가능)

DBMS와 연결을 수립해주는 역할 JDBC Driver Class 메모리에 로딩 및 등록

명시적 로딩

Class.forName("com.mysql.cj.jdbc.Driver");

🔔2. Connection 생성

DBMS와 연결 생성

String url = "jdbc:mysql://localhost:3306/ssafydb";// DB URL
String user = "ssafy";
String password = "ssafy";
Connection conn = DriverManager.getConnection(url,user,password);

Connection은 모든 Connection들의 부모

java.sql.Connection

🔔3. Statement 생성 (통로)

통로 생성 (쿼리 준비)

Statement stmt = conn.createStatement();

가장 기본이 되는 Statement
생성 시 실행할 SQL이 정해지지 않은 Statement
매 실행 마다 실행할 SQL 전송
SQL Injection 공격에 취약 (or 1==1 넣으면 다 뚤림)

java.sql.Statement

String sql = "SELECT * FROM emp WHERE empno = ?";
PreparedStatement stmt = conn.prepareStatement(sql);
stmt.setInt(1, empNo);

java.sql.PreparedStatement

반복적인 SQL 작업을 최적화하여 통로 생성시 실행할 SQL을 미리 결정하는 Statement
인젝션 공격도 막음

CallableStatement cstmt = conn.prepareCall("{CALL processReturn(?, ?)}");
cstmt.setInt(1, 250303001);
cstmt.setString(2, "ssafy");
cstmt.execute();

java.sql.CallableStatement

속도는 가장 빠름 DBMS에 종속적

🔔4. SQL 실행

stmt는 sql를 전달해야하지만

⭐pstmt는 파라미터를 넣으면 안된다! 에러난다!⭐
이미 작성을 해놓음 Prepared!

SQL유형
SELECT - executeQuery -> ResultSet
INSERT, UPDATE, DELETE - executeUpdate -> int
모든 SQL - execute -> boolean

🔔5. 결과 집합 처리 (실행한 SQL이 SELECT문)

String sql = "SELECT empno, ename FROM emp";
ResultSet rs = stmt.executeQuery(sql);
while (rs.next()) {
	EmpDTO emp = new EmpDTO();
    emp.setEmpNo(rs.getInt("empno"));
}

rs = 메타데이터 (이터레이터)
ResultSet은 커서라고 생각!

java.sql.ResultSet

ResultSet 처리

커서는 항상 record 이전에 있다가 next() 함수를 통해 내려간다 true or false

🔔6. 자원 반납

rs.close(), stmt.close(), conn.close();

AutoClosable -> try~ with

명시적 반납 -> finally

DAO 디자인 패턴 🟦

Data Access Object 디자인 패턴

데이터 처리 로직과 애플리케이션의 비즈니스 로직을 분리하는 디자인 패턴

CRUD 작업을 캡슐화

장점
비즈니스 로직과 데이터 액세스 분리, 코드 재사용성 증가, 유지 보수성 향상

service + DAO
DAO 없이는 못살아~ -> 둘의 협업!

JDBC와 트랜잭션 🟪

⭐ 이것만 기억! 이 구조를 통해 트랜잭션을 만드는 것! ⭐

try
conn.setAutoCommit(false);
작업들~~
conn.commit();
catch
conn.rollback();

숙제

백엔드 학습하고 집에서는 알고리즘 1일 1문제 풉시다!

profile
기록하고 공유하는 개발자

0개의 댓글