본문 바로가기
Back-End/Java

Java 복습, 예습

by newny 2023. 3. 26.
반응형

네트워크 기초

LAN (좁은범위) → MAN → WAN (넓은 범위)
WAN : 우리가 흔히 말하는 인터넷
서버 : 서비스를 제공하는 프로그램
클라이언트 : 서비스를 요청하는 프로그램
클라이언트(브라우저) → request(요청) → 서버(웹서비스)
서버 → response(응답) → 클라이언트

IP주소

IP주소는 네트워크 어댑터마다 할당됨
명령 프롬프트에서 ipconfig(IP구성) 명령어를 이용해 ip 주소를 알 수 있음
컴퓨터의 네트워크 어댑터까지만 갈 수 있는 정보

DNS (Domain Name System)

IP 네트워크에서 사용하는 시스템
도메인 이름으로 IP를 등록하는 저장소
도메인주소로 검색 → (DNS) → IP추출

Port번호

운영체제가 관리하는 서버 프로그램의 연결번호
서버
특정 포트번호에 바인딩함
웹 서버 → 80포트
FTP 서버 → 21포트
DBMS →1521 포트
클라이언트
서버에서 보낸 정보를 받기위해서는 포트번호가 필요함
운영체제가 자동으로 부여하는 번호를 사용함
이 번호는 클라이언트가 서버로 요청할 때 함께 전송되어 서버가 클라이언트로 데이터를 보낼 때 사용됨

IP주소 얻기

자바는 IP 주소를 java.net 패키지의 InetAddress로 표현

getHostAddress()

IP주소를 문자열타입으로 리턴함
로컬 컴퓨터의 getLocalHost() 메소드를 이용하여 InetAddress객체를 간접적으로 얻은 후 이용

InetAddress ia = InetAddress.getLocalHost();
String ip = ia.getHostAddress();

인터넷 전송용 프로토콜

TCP(Transmission Control Protocol)

IP와 함께 사용되기 때문에 TCP/IP라고도 부름
연결형 프로토콜 : 상대방이 연결된 상태에서 데이터를 주고받음
ex) 채팅 프로그램
클라이언트 연결 요청 → 서버가 연결 수락 → 통신회선 고정 → 고정회선을 통해 데이터 전달
보낸 데이터가 순서대로 전달되며, 손실이 발생하지 않음
java.net 패키지의 ServerSocket과 Socket 클래스를 이용함
클라이언트는 서버의 IP주소와 Port번호로 연결 요청함

TCP 서버

ServerSocket serversocket = new ServerSocket(포트번호);
// 또는 -----------------------------------------------

//서버의 여러 IP중 특정 IP에서만 서비스를 원할 때
ServerSocket serversocket = new ServerSocket();
serversocket.bind(new InetSocketAddress("IP주소", 포트번호));
package tcpNetworking;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

public class ServerExample {
    private static ServerSocket serverSocket;

    public static void main(String[] args) {
        System.out.println("-----------------------------------------------------");
        System.out.println("서버를 종료하려면 q 또는 Q를 입력하고 Enter 키를 입력하세요.");
        System.out.println("-----------------------------------------------------");

        startServer();

        Scanner scanner = new Scanner(System.in);
        while (true) {
            String key = scanner.nextLine();
            key.toLowerCase();
            if (key.equals("q")) {
                break;
            }
        }
        scanner.close();

        stopServer();
    }

    public static void startServer() {
        Thread thread = new Thread() {
            @Override
            public void run() {
                try {
                    serverSocket = new ServerSocket(50001);
                    System.out.println("[서버] 시작됨");

                    while (true) {
                        System.out.println("\\n[서버] 연결 요청을 기다림\\n");
                        Socket socket = serverSocket.accept();

                        InetSocketAddress isa = (InetSocketAddress) socket.getRemoteSocketAddress();
                        System.out.println("[서버] " + isa.getHostName() + "의 연결 요청을 수락함");

                        DataInputStream dis = new DataInputStream(socket.getInputStream());
                        String message = dis.readUTF();

                        DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
                        dos.writeUTF(message);
                        dos.flush();
                        System.out.println("[서버] 받은 메세지를 다시 보냄: " + message);

                        socket.close();
                        System.out.println("[서버] " + isa.getHostName() + "의 연결을 끊음");
                    }
                } catch (IOException e) {
                    System.out.println("[서버]" + e.getMessage());
                }
            }
        };
        thread.start();
    }

    public static void stopServer() {
        try {
            serverSocket.close();
            System.out.println("[서버] 종료됨");
        } catch (IOException e1) {}
    }
}

TCP 클라이언트

package tcpNetworking;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;

public class ClientExample {
    public static void main(String[] args) {
        try {
            Socket socket = new Socket("localhost", 50001);
            System.out.println("[클라이언트] 연결 성공");

            DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
            dos.writeUTF("나는 잔태가 죠앙");
            dos.flush();

            DataInputStream dis = new DataInputStream(socket.getInputStream());
            String message = dis.readUTF();
            System.out.println("[클라이언트] 데이터 받음: " + message);

            socket.close();
            System.out.println("[클라이언트] 연결 끊음");
        } catch (UnknownHostException e) {
            // IP 표기방법이 잘못되었을 경우
        } catch (IOException e) {
            // 해당 포트의 서버에 연결할 수 없는경우
        }
    }
}

JDBC

DB연결

  1. JDBC Driver 등록

JDBC Driver 클래스를 path에서 찾고, 메모리 로딩
→ 이 과정에서 JDBC Driver 클래스의 static 블록이 실행되면서 DriverManager에 JDBC객체를 등록하게됨

Class.forName("oracle.jdbc.OracleDriver");
  1. 클래스를 찾지 못할경우 ClassNotFoundException 예외가 발생할 수 있기 때문에 예외처리 해야함
  2. getConnection() 메소드로 DB와 연결
Connection conn = DriverManager.getConnection("연결 문자열", "사용자", "비밀번호")
// 연결문자열
// jdbc:oracle:thin:@IP주소:포트번호/DB명
  1. 연결이 실패할 경우 SQLException이 발생하므로 예외처리를 해야함

[전체 코드]

package oracle;

import java.sql.*;

public class ConnectionExample {
    public static void main(String[] args) {
        Connection conn = null;
        try {
            Class.forName("oracle.jdbc.OracleDriver");

            conn = DriverManager.getConnection(
                    "jdbc:oracle:thin:@IP주소:포트번호/DB명",
                    "사용자",
                    "비밀번호"
            );

            System.out.println("연결 성공");
 
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            if (conn != null) {
                try {
                    conn.close();
                    System.out.println("연결끊기");
                } catch (SQLException e) {}
            }
        }
    }
}

INSERT문 실행

  1. String 타입으로 INSERT문 준비하기
  2. → ?(물음표)를 사용하여 매개변수화된 INSERT문으로 변경할 수도 있음
String sql = new StringBuilder();
sql.append("INSERT INTO users (userid, username, userpassword, userage, useremail)")
.append("VALUES (?, ?, ?, ?, ?)")
.toString();

// 또는 -----------------------------------------------------------------------------

String sql = "" +
"INSERT INTO users (userid, username, userpassword, userage, useremail)" +
"VALUES (?, ?, ?, ?, ?)"
  1. Connection 클래스의 prepareStatement() 메소드에 매개변수로 INSERT문을 넣은 PreparedStatement 타입의 변수 생성
PreparedStatement pstmt = conn.prepareStatement(sql);
  1. PreparedStatement 클래스의 Setter메소드를 이용해 ?(물음표) 에 들어갈 값을 지정
  2. → ?(물음표)는 순서에따라 1번부터 번호가 부여됨
pstmt.setString(1, "winter");
pstmt.setString(2, "한겨울");
pstmt.setString(3, "12345");
pstmt.setInt(4, 25);
pstmt.setString(5, "winter@mycompany.com");
  1. 값을 지정한 후 executeUpdate() 메소드를 호출하여 SQL 문을 실행
  2. → executeUpdate() 메소드의 리턴값은 저장된 행 수(int) 임
int rows = pstmt.executeUpdate();
System.out.println("저장된 행 수:" + rows);
  1. PreparedStatement를 더이상 사용하지 않을 경우에는 close()메소드를 호출해서 메모리 해제 시켜줌
pstmt.close();

[전체 코드]

package oracle;

import java.sql.*;

public class ConnectionExample {
    public static void main(String[] args) {
        Connection conn = null;
        try {
            Class.forName("oracle.jdbc.OracleDriver");

            conn = DriverManager.getConnection(
                    "jdbc:oracle:thin:@IP주소:포트번호/DB명",
                    "사용자",
                    "비밀번호"
            );

            System.out.println("연결 성공");
// String sql = "" + "INSERT INTO users (userid, username, userpassword, userage, useremail) " + "VALUES (?, ?, ?, ?, ?)";
            String sql = new StringBuilder()
                    .append("INSERT INTO users (userid, username, userpassword, userage, useremail) ")
                    .append("VALUES (?, ?, ?, ?, ?)")
                    .toString();

            PreparedStatement pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, "winter");
            pstmt.setString(2, "한겨울");
            pstmt.setString(3, "12345");
            pstmt.setInt(4, 25);
            pstmt.setString(5, "winter@mycompany.com");

            int rows = pstmt.executeUpdate();
            System.out.println("저장된 행 수:" + rows);

            pstmt.close();
 
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            if (conn != null) {
                try {
                    conn.close();
                    System.out.println("연결끊기");
                } catch (SQLException e) {}
            }
        }
    }
}
반응형

'Back-End > Java' 카테고리의 다른 글

JDBC(1)  (0) 2023.03.27
Java 과제 - 성적표 파일 입출력  (0) 2023.03.23
Java(9)  (0) 2023.03.23

댓글