JDBC : 자바 프로그래밍 언어로 데이터베이스에 접근 할 수 있도록 하는 JAVA API (중요)
※ JDBC API 를 이용하여 DB에 연동할 수 있으며 , 데이터베이스에서 자료를 쿼리하거나 업데이트할 수도 있다 . !
JDBC API 사용단계
- JDBC 드라이버 로드
- Connection 객체 생성
- STATEMENT 객체 생성
- SQL 문 전송(쿼리 실행)
- ResultSet 객체로부터 데이터 조회
- ResultSet 객체 Close
- Statement 객체 close
- Connection 객체 Close
- 각 단계별 자세히 설명
- JDBC 드라이버 로딩 : 사용하고자 하는 JDBC 드라이버를 로딩한다. JDBC 드라이버는 DriverManager 클래스를 통해 로딩된다.
- Connection 객체 생성 : JDBC 드라이버가 정상적으로 로딩되면 DriverManager를 통해 데이터베이스와 연결되는 세션(Session)인 Connection 객체를 생성한다.
- Statement 객체 생성 : Statement 객체는 작성된 SQL 쿼리문을 실행하기 위한 객체로 정적 SQL 쿼리 문자열을 입력으로 가진다.
- Query 실행 : 생성된 Statement 객체를 이용하여 입력한 SQL 쿼리를 실행한다.
- ResultSet 객체로부터 데이터 조회 : 실행된 SQL 쿼리문에 대한 결과 데이터 셋이다.
- ResultSet, Statement, Connection 객체들의 Close : JDBC API를 통해 사용된 객체들은 생성된 객체들을 사용한 순서의 역순으로 Close 한다.
- https://ittrue.tistory.com/250
- 커넥션 객체를 생성하는 과정
- 애플리케이션에서 DB 드라이버를 통해 커넥션을 조회한다.
- DB 드라이버는 DB와 TCP/IP 커넥션을 연결한다. (3 way handshake와 같은 네트워크 연결 동작 발생)
- DB 드라이버는 TCP/IP 커넥션이 연결되면 아이디와 패스워드, 기타 부가 정보를 DB에 전달한다.
- DB는 아이디, 패스워드를 통해 내부 인증을 거친 후 내부에 DB를 생성한다.
- DB는 커넥션 생성이 완료되었다는 응답을 보낸다.
- DB 드라이버는 커넥션 객체를 생성해서 클라이언트에 반환한다.
- https://ittrue.tistory.com/250
커넥션 객체 생성에는 작업비용이 많이든다고 한다.
그래서 커넥션 객체를 미리 생성해서 필요할 때만 꺼내서 사용할 수 있도록 관리해주는 Connection Pool 이라는것이 등장한다.
커넥션 풀이란 ?
자바 애플리케이션을 시작할 때 , 커넥션 풀은 필요한만큼만 커넥션을 미리 생성해서 보관한다. (DB당 1 개의 커넥션 객체)
커넥션 풀 안에 커넥션 객체는 넷통신으로 DB 와 연결되어 있어서 즉시 SQL 을 DB에 전달할 수 있다.
※ 즉 , 커넥션 풀로 인해서 미리 생성되어 있는 커넥션을 참조하여 사용하게 된다. 그러면 커넥션 풀은 자신이 소유한 커넥션 객체 중 하나를 반환한다.
//DB CONN DATA
String id = "root"; //ID가 ROOT 인
String pw = "1234"; //비밀번호 1234
String url = "jdbc:mysql://localhost:3306/testdb";
jdbc:mysql: mysql에 연결함
//localhost:3306/testdb = 3306포트의 로컬호스트인 testdb 데이터베이스 연결
//JDBC 참조변수
Connection conn = null; //커넥션 객체생성
PreparedStatement pstmt = null; statement 객체생성
ResultSet rs = null; //resultset객체 생성
jdbc를 사용하기 위해서는 mySql 홈페이지에서 드라이버를 설치해야 한다.
설치 후 mysql-connector-java-버전-bin.jar 파일을 mysql_connector 파일을 이클립스 외부 jar파일이 모여있는 Referenced Libraries 폴더에 넣는다.
try {
Class.forName("com.mysql.cj.jdbc.Driver"); //jdbc 드라이버 클래스 로드
System.out.println("Driver Loading SueCC");
conn = DriverManager.getConnection(url,id,pw); //특정 db 와 연결이 되면 커넥션 객체가 생김 (매개변수로 값) url , id ,pw 가 맞으면 연결이 된다 !
//접속되면 db 연결됨
System.out.println("DB Connected..!"); //연결 성공했다고 뜸 !
}catch(Exception e) { //예외처리
e.printStackTrace();
}finally {
try {
conn.close();
} catch(SQLException e) {
e.printStackTrace();
지정한 url , id , 비밀번호를 사용하여 데이터베이스에 연결 후 , 연결 된 Connection 객체를 반환받는다.
pstmt = conn.prepareStatement("insert into tbl_std values(?,?,?)"); //여기서 ? 가 바인딩변수라고 하는데 들어갈 값을 ?로 나타낸다.
pstmt.setString(1, "야길동");
pstmt.setInt(2, 12);
pstmt.setString(3, "서울"); //각 열 다 맞춰서 값을 넣어야함 안그러면 파라미터 에러 ? 같은거 뜸
int result = pstmt.executeUpdate();
여기서 pstmt 는 PreparedSteatement 객체를 참조하는 변수이다.
사전에 컴파일된 SQL 문을 나타내고 반복적으로 사용할 수 있는 SQL 문을 준비.
위 코드에서 ?,?,? 는 실제 값을 바인딩할 수 있게 한다.
conn은 커넥션 객체 참조변수명.
setString(인덱스, value값) ; : 지정 인덱스위치에 문자열을 설정할 수 있다.
(setInt 도 똑같다.)
excuteUpdate 메소드 : SQL 문을 DB에 전송후 , 실행 결과를 DB에 반영한다. 후에 실행된 SQL 문에 영향을 받은 행의 개수를 INT값으로 RETURN 한다.
※ 주의 . 이 작업을 할 때는 예외가 많이 발생하기 때문에 예외처리를 잘 해주어야 한다.
소켓,소켓통신이란 ?
네트워크 통신에서 데이터 송수신의 마지막 접점.
소켓통신 은 이러한 소켓을 통해 SERVER - CLIENT 간 데이터를 주고받는 양방향 연결 지향성 통신을 말한다.
대충 실시간 통신 말하는듯.. !
소켓통신은 보통 실시간으로 데이터를 주고받아야 하는 경우에 사용한다.
소켓통신을 할 때에는 서버와 클라이언트가 존재한다.
서버가 데이터를 제공, 클라이언트가 데이터를 받는(요청)하는 쪽이다.
서버소켓 구현하기
//서버 소켓 생성
ServerSocket server = new ServerSocket(7000);
System.out.println("[INFO] SERVER SOCKET LISTENING");
Socket client = server.accept();클라이언트의 접속을 받기위해 serverSocket.accept(); 를 해서 접속을 허용(동의)한다.
System.out.println("[INFO] ㅎㅇ : " + client.getInetAddress() );
DataInputStream din = new DataInputStream(client.getInputStream());
DataOutputStream dout = new DataOutputStream(client.getOutputStream());
데이터를 송수신하기 위해 In/Out 스트림을 생성한다.
Scanner sc = new Scanner(System.in);
String send = null;
String recv = null;
while(true) {
//수신
recv = din.readUTF();
if(recv==null || recv.equals('q')) //q를 누른다면 종료
break;
System.out.println("[CLIENT] : " + recv);
// 송신
System.out.print("[ME(q:종료)] : ");
send = sc.nextLine(); //문자 입력
dout.writeUTF(send); // UTF형식으로 문자 보냄
dout.flush(); //buffer 를 비운다
if(send.equals('q'))
break;
}
System.out.println("[INFO] 서버 종료");
dout.close();
din.close();
client.close();
server.close(); //모든 객체를 다 닫아준다
- 7000번대 포트를 사용하는 서버소켓 객체를 생성한다.
- 클라이언트의 접속을 받기위해 serverSocket.accept(); 를 해서 접속을 허용(동의)한다.
- 데이터를 송수신하기 위해 In/Out 스트림을 생성한다.
- Input 스트림으로 데이터를 수신 (클라이언트 → 서버)
- output 스트림으로 데이터를 송싱 (서버 → 클라이언트)
- 통신을 종료함. (객체를 모두 닫아준다.(close () )
'Developer Note > 국비과정 수업내용 정리&저장' 카테고리의 다른 글
24년 10월 4일 (0) | 2024.10.08 |
---|---|
24년 10월 2일 (0) | 2024.10.08 |
24년 09월 30일 (1) | 2024.10.03 |
24년 09월 27일 (1) | 2024.10.03 |
24년 09월 26일 (1) | 2024.10.03 |