Developer Note/국비과정 수업내용 정리&저장

24년 10월 1일

DH_PARK 2024. 10. 7. 22:53

JDBC : 자바 프로그래밍 언어로 데이터베이스에 접근 할 수 있도록 하는 JAVA API (중요)

※ JDBC API 를 이용하여 DB에 연동할 수 있으며 , 데이터베이스에서 자료를 쿼리하거나 업데이트할 수도 있다 . !

JDBC API 사용단계

  1. JDBC 드라이버 로드
  2. Connection 객체 생성
  3. STATEMENT 객체 생성
  4. SQL 문 전송(쿼리 실행)
  5. ResultSet 객체로부터 데이터 조회
  6. ResultSet 객체 Close
  7. Statement 객체 close
  8. 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 한다.
    출처:[IT is True:티스토리]
  • https://ittrue.tistory.com/250
  • 커넥션 객체를 생성하는 과정
    • 애플리케이션에서 DB 드라이버를 통해 커넥션을 조회한다.
    • DB 드라이버는 DB와 TCP/IP 커넥션을 연결한다. (3 way handshake와 같은 네트워크 연결 동작 발생)
    • DB 드라이버는 TCP/IP 커넥션이 연결되면 아이디와 패스워드, 기타 부가 정보를 DB에 전달한다.
    • DB는 아이디, 패스워드를 통해 내부 인증을 거친 후 내부에 DB를 생성한다.
    • DB는 커넥션 생성이 완료되었다는 응답을 보낸다.
    • DB 드라이버는 커넥션 객체를 생성해서 클라이언트에 반환한다.
    출처:[IT is True:티스토리]
  • 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();   //모든 객체를 다 닫아준다
  1. 7000번대 포트를 사용하는 서버소켓 객체를 생성한다.
  2. 클라이언트의 접속을 받기위해 serverSocket.accept(); 를 해서 접속을 허용(동의)한다.
  3. 데이터를 송수신하기 위해 In/Out 스트림을 생성한다.
  4. Input 스트림으로 데이터를 수신 (클라이언트 → 서버)
  5. output 스트림으로 데이터를 송싱 (서버 → 클라이언트)
  6. 통신을 종료함. (객체를 모두 닫아준다.(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