네트워크 통신과 DMBS 구조도
네트워크 통신과 DMBS의 기본 관계도
위 그림은 네트워크 통신과, 데이터베이스 관리 시스템 (DBMS) 그리고 서버 클라이언테 아키텍처를 좀 더 쉽게 이해하기위해서 만든 그림이다. 이런 개념이 코드작성 전에 탑재가 되어있어야 좀 더 원활하게 일하며 가독성이 높은 구조를 짤 수가 있다.
클라이언트 코드 예시
public class BankApp {
public static void main(String[] args) {
Connection conn = DBConnection.getInstance();
try {
String insert = "insert into account_tb(password, balance, created_at) values(?,?,now())";
String delete = "delete from account_tb where number = ?";
String update = "update account_tb set balance = balance + ? where number = ?";
// 쿼리용 버퍼 PreparedStatement
PreparedStatement pstmt = conn.prepareStatement(delete);
pstmt.setInt(1,1);
pstmt.executeUpdate();
int num = pstmt.executeUpdate();
System.out.println(num);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
Java
복사
서버 코드 예시
public class DBConnection {
public static Connection getInstance() {
String username = "root";
String password = "1234";
String url = "jdbc:mariadb://localhost:3306/cosdb";
// 프로토콜이 적용된 소켓
try {
Connection conn = DriverManager.getConnection(url, username, password);
System.out.println("db connect success");
return conn;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
Java
복사
DBMS 코드 예시
CREATE DATABASE cosdb;
USE cosdb;
CREATE TABLE account_tb(
number int PRIMARY KEY auto_increment,
password varchar(100) not null,
balance int not null,
created_at timestamp not null
) ENGINE=INNODB DEFAULT CHARSET=UTF8MB4;
SQL
복사
클라이언트 요청 단계
•
클라이언트에서 DBMS와 연결하기 위해서는 몇가지 필수 절차가 있다.
클라이언트에서 서버 LISTENING 포트 연결 시도
클라이언트가 서버랑 연결을 시도할 때 필요한 것이 IP주소 , Port번호 , Protocol방식 이다. 서버와 통신을 할려면 무조건 알아야되는 정보라고 할 수 있다. 이를 위해서 URL을 사용한다. 자세히 살펴보면 우리가 익히들었던 URL이 우리에게 필요한 모든 정보를 담고 있다.
•
URL (Uniform Resources Location) 구성요소
// URL 구조
"jdbc:mariadb://localhost:3306/cosdb"
//구성요소 ↓↓↓↓
"프로토콜//아이피주소:포트넘버/DB이름"
Java
복사
1.
스키마 (프로토콜) :
•
http : 하이퍼텍스트 프로토콜
•
https : 보안된 http 프로토콜
•
ftp : 파일 전송 프로토콜
•
jdbc:mariadb : MariaDB DBMS 프로토콜
2.
IP 주소 :
•
또는 도메인 이름
3.
포트번호 :
•
포트가 80이라면 생략된다. 기본포트이기 때문이다.
서버에서 연결 후 DB까지 접속할려면 ID, Passwords도 필요하다.
//DiverManger클래스를 통해 Url 과 인가를 받을 수 있는 ID와 비번을 함께 전달한다.//
Connection conn = DriverManager.getConnection(url, username, password);
SQL
복사
•
Connection클래스를 통해서 클라이언트으로부터 요청된 내용을 바탕으로 통신을 위한 소켓이 Connection 클래스의 객체로 생성된다.
•
연결이 완료가 되면 클라이언트는 서버의 리스너 포트를 비워주고 새로 생성된 소켓과 연결 한다.
소켓 연결이 완료가 되면 스트림을 통한 정보교환이 시작된다.
•
그림안에 보이는 숫자 번호대로 정보가 요청되고 응답된다.
•
MariaDB에서 사용하는 버퍼스트림 클래스는 이름이 자바랑 틀리다.
// 쿼리용 버퍼스트림 PreparedStatement
PreparedStatement 변수명 = 소켓명.prepareStatement();
// 클라이언트 측에서 버퍼Writing을 할때 쿼리 문법 -> int값을 리턴한다.
PreparedStatement.executeUpdate();
SQL
복사
◦
excuteUpdate() 메소드를 실행하면 MariaDB에서 표현되는 영향을 받은 행 : 정수 가 반환된다.
▪
0을 반환하면 영향을 받은 행이 없다.
▪
1을 반환하면 영향을 받은 행이 하나이다.
▪
-1을 반환하면 정상적으로 처리가 되지 못했다는 뜻이다.
•
DBMS에서 자료들을 테이블로 보관하고 있기 때문에, 정보는 각 타입이 혼합된 테이블로 받는 일이 흔하다.
◦
그러므로 대부분의 경우 클라이언트는 정보를 받기위한 객체, class를 준비해야 된다.
◦
타입이 같다면 vector로 arrayList에 담아도 된다.
◦
문자열로 받는다면 따로 파싱할 필요는 없다.
•
한 클라이언트 마다 한 소켓이 배정이 된다고 생각하면 된다.
◦
즉, 3명의 클라이언트가 접속이 되었다면 서버는 4개의 스레드가 돌아가고 있다.
▪
한개는 전체 스레드를 관리하는 메인스레드, 나머지 3개는 소켓용 스레드
•
클라이언트가 DBMS에 요청하는 쿼리는 주로 4가지가 있다.
◦
SECECT : 데이터 조회
◦
INSERT : 새로운 데이터 삽입
◦
UPDATE : 기존 데이터를 수정한다.
▪
내부적으로 찾아서 select
▪
그다음 delete
▪
그 다음 insert
▪
UPDATE안에 이 세가지 행동이 묶어져 있다.
◦
DELETE : 데이터를 삭제한다.
▪
DBMS가 delete를 write한다는 개념이다.
▪
즉, write라는 것은 변경한다는 뜻.
선생님이 전해주신 지혜들..
•
하드디스크랑 IO는 애플리 케이션이 아니다. 개발자는 그것만 알면된다.
•
DBMS는 각 잡고 공부해야 된다. 쿼리만 다뤄서는 알 수 없다.
•
테이블을 설계할 수 있는 능력이 있어야 된다.
•
인증을 통해서 문이 열리면 세션이 만들어 졌다고 표현한다.
•
세션이 만들어 졌다는 말은 연결이 되었다는 말이다.