🍒 네트워크 통신과 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); } } }
서버 코드 예시
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); } } }
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;
이 단계 이전에 MariaDB Gradle을 적용해야된다.
아래 링크를 클릭하면 적용하는 방법이 있다.
🥝 클라이언트 요청 단계
- 클라이언트에서 DBMS와 연결하기 위해서는 몇가지 필수 절차가 있다.
1️⃣ 클라이언트에서 서버 LISTENING 포트 연결 시도
클라이언트가 서버랑 연결을 시도할 때 필요한 것이
IP주소
, Port번호
, Protocol방식
이다. 서버와 통신을 할려면 무조건 알아야되는 정보라고 할 수 있다. 이를 위해서 URL을 사용한다. 자세히 살펴보면 우리가 익히들었던 URL이 우리에게 필요한 모든 정보를 담고 있다.- URL (Uniform Resources Location) 구성요소
// URL 구조 "jdbc:mariadb://localhost:3306/cosdb" //구성요소 ↓↓↓↓ "프로토콜//아이피주소:포트넘버/DB이름"
- 스키마 (프로토콜) :
http
: 하이퍼텍스트 프로토콜https
: 보안된 http 프로토콜ftp
: 파일 전송 프로토콜jdbc:mariadb
: MariaDB DBMS 프로토콜
- IP 주소 :
- 또는 도메인 이름
- 포트번호 :
- 포트가 80이라면 생략된다. 기본포트이기 때문이다.
2️⃣서버에서 연결 후 DB까지 접속할려면 ID
, Passwords
도 필요하다.
//DiverManger클래스를 통해 Url 과 인가를 받을 수 있는 ID와 비번을 함께 전달한다.// Connection conn = DriverManager.getConnection(url, username, password);
- Connection클래스를 통해서 클라이언트으로부터 요청된 내용을 바탕으로 통신을 위한 소켓이 Connection 클래스의 객체로 생성된다.
- 연결이 완료가 되면 클라이언트는 서버의 리스너 포트를 비워주고 새로 생성된 소켓과 연결 한다.
3️⃣ 소켓 연결이 완료가 되면 스트림을 통한 정보교환이 시작된다.
- 그림안에 보이는 숫자 번호대로 정보가 요청되고 응답된다.
- MariaDB에서 사용하는 버퍼스트림 클래스는 이름이 자바랑 틀리다.
// 쿼리용 버퍼스트림 PreparedStatement PreparedStatement 변수명 = 소켓명.prepareStatement(); // 클라이언트 측에서 버퍼Writing을 할때 쿼리 문법 -> int값을 리턴한다. PreparedStatement.executeUpdate();
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는 각 잡고 공부해야 된다. 쿼리만 다뤄서는 알 수 없다.
- 테이블을 설계할 수 있는 능력이 있어야 된다.
- 인증을 통해서 문이 열리면 세션이 만들어 졌다고 표현한다.
- 세션이 만들어 졌다는 말은 연결이 되었다는 말이다.
Share article