2022-03-04(금)

Jeongyun Heo·2022년 3월 4일
0

com.eomcs.jdbc.ex1.Exam0210.java

통신을 하려면 프로토콜을 알아야 함

공개하지 않음? 왜? 기술 특허
프로토콜의 취약점을 찾아서 공격할 수도 있음

DBMS API가 대신 통신을 한다

API는 C/C++로 만들어져 있다

java에서 native api 호출..

JNI
https://ko.wikipedia.org/wiki/%EC%9E%90%EB%B0%94_%EB%84%A4%EC%9D%B4%ED%8B%B0%EB%B8%8C_%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4

이미 운영체제에 종속적인 거라 다른 거에서 안 돌아감

DBMS API는 DBMS마다 다름
DBMS마다 프로그램을 다르게 짜야 됨. 번거로움.

ODBC Driver : ODBC API에 따라 만든 거

DBMS API = Vendor API = Native API


② ODBC Driver가 다이렉트로 DBMS랑 통신
드라이버 제조사 마음

App을 java로 짠 경우에는 어떻게 하냐

Java App

ODBC를 흉내내서 JDBC 만듦

JDBC Driver : JDBC API 구현한 거

JRE에 기본으로 포함되어 있음
이 드라이버를 부르기를 Type1 제 1유형

직접 DBMS랑 통신하는 게 Type4 드라이버

중계서버가 DBMS랑 통신하는 게 Type3 드라이버

Type2,3,4 -> JDBC 드라이버를 따로 다운로드 받아야 됨

META-INF : jar 파일에는 클래스에 대한 부가적인 설명하는 정보를 담은 폴더가 항상 있다

파일명 자체가 인터페이스명
🔹 fully-qualified class name : 패키지명을 포함한 클래스명
완전하게 설명된 이름

이 인터페이스를 구현한 클래스 이름이 들어 있다
드라이버를 찾을 때 이게 자동으로 로딩된다

DBMS에 연결하기

jdbcURL : jdbc 자원의 위치를 가리키는

DB 연결을 Driver 구현체에게 위임한다.
즉, Driver 객체의 connect()를 호출한다.

java.sql.Connection 인터페이스를 구현한 객체를 리턴한다

java.sql.Connection 규칙에 따라서 작성된 클래스의 인스턴스 주소

Connection 객체

Connection 인터페이스를 구현한 클래스가 있고 그 클래스의 객체를 리턴한다

System.out.println(con.getClass().getName());
// org.mariadb.jdbc.Connection

getConnection(jdbc URL, username, password) ----> DriverManager
mariadb 드라이버를 찾아서 거기 있는 connect()를 호출
org.mariadb.jdbc.Driver
이 객체에 대해서 connect()를 호출
그러면 얘가 org.mariadb.jdbc.Connection 객체를 생성한다
생성해서 리턴한다

파일과 마찬가지로 DBMS에 연결한 후 더이상 사용하지 않으면 연결을 해제해야 한다.

연결 요청
DBMS는 스레드를 생성
그 스레드와 연결이 된다
그 스레드와 통신한다
Connection 객체를 썼으면 close() 해야 됨
close() 해야 연결을 끊고 스레드를 삭제함
일정시간 동안 메모리 유지
타임아웃이 될 때까지 유지된다
설정된 시간 동안 유지된다
그 시간 동안 연락이 없으면 자동으로 삭제된다
문제
DBMS에 연결되는 클라이언트가 하나가 아니라 동시에 연결되는 게 수십개에서 수백개
또는 수천개까지 연결됨
DBMS는 24시간 365일 실행된다
DBMS도 동시에 처리할 수 있는 정해놓고 있음
정해진 수 이상의 요청이 들어오면 서버에서 거절한다
자원의 한계가 있음
메모리, 스레드, 파일이 다 자원
다른 클라이언트를 위해서 자원을 해제해야 한다

SQL 실행하기

com.eomcs.jdbc.ex1.Exam0310.java

① createStatement()
java.sql.Statement 인터페이스를 구현한
org.mariadb.jdbc.Statement 클래스 객체를 생성해서 리턴한다

1) INSERT/UPDATE/DELETE 등 DML 관련 SQL문 전송
=> executeUpdate()
=> 리턴값: 변경(insert/update/delete)된 데이터의 개수

2) SELECT 등 DQL 관련 SQL문 전송
=> executeQuery()
=> 리턴값: 서버에서 데이터를 가져오는 일을 할 객체

jdbc-programming-ddl.sql

세미콜론
메서드를 통해서 sql문을 실행하는 거니까 세미콜론 안 붙여도 됨

Statement 객체 ----SQL 전송----> DBMS

com.eomcs.jdbc.ex1.Exam0320.java

SQL 실행하기 - select

java.sql.ResultSet 인터페이스를 구현한

org.mariadb.jdbc.client.result.CompleteResult

rs.next();
한 개의 레코드 요청

ResultSet이 내부적으로 결과를 갖고 있다
그리고 리턴

모든 가져오는 ResultSet 객체를 리턴해다오
ResultSet는 서버에서 결과를 가져올 때 사용할 도구를 리턴한다

가져왔으면 true, 가져올 게 없다면 false

컬럼의 순서는 1부터

*를 쓰게 되면 테이블을 처음에 정의했을 때 나열한 순서로 가져온다

com.eomcs.jdbc.ex1.Exam0330.java

번호 대신 컬럼의 이름을 사용한다.

com.eomcs.jdbc.ex1.Exam0340.java

getDate() 하면 시간은 안 나옴

getString() 은 시간도 나옴

x_board_file
1번 게시글의 PK를 참조하는 데이터가 있다

부모 테이블의 PK를 참조하는 자식 테이블의 데이터가 존재한다면 삭제 할 수 없다

부모 테이블의 데이터를 지우려면,
부모 테이블의 데이터를 참조하는 자식 테이블의 데이터를 먼저 지워야 한다.

소셜 로그인마다 다른 아이디로 간주함

임시저장
게시판
공개여부 0, 1

0개의 댓글