자바 네트워크 프로그래밍은 네트워크를 통해 데이터를 주고받는 애플리케이션을 개발하는 것을 의미. 자바에서는 java.net
패키지를 통해 네트워크 프로그래밍을 지원.
IP 주소: 인터넷 상의 각 기기를 식별하기 위한 주소. 자바에서는 InetAddress
클래스를 사용하여 IP 주소를 표현.
포트: 컴퓨터 내의 특정 프로세스를 식별하는 논리적인 번호. 자바에서는 Socket
클래스를 통해 특정 포트로 통신.
네트워크 프로그래밍에서 가장 일반적인 모델로, 클라이언트가 서버에 요청을 보내고, 서버는 이에 응답하는 구조. 자바에서는 Socket
클래스를 클라이언트와 서버 간의 통신을 구현하는 데 사용하며, ServerSocket
클래스를 통해 서버를 구현.
클라이언트 소켓: Socket
클래스를 사용하여 서버에 연결하고, 데이터를 전송.
서버 소켓: ServerSocket
클래스를 사용하여 클라이언트의 연결을 받고, 클라이언트와의 통신을 처리.
클라이언트 소켓 예제:
import java.io.*;
import java.net.*;
public class ClientExample {
public static void main(String[] args) {
try {
// 서버에 연결
Socket socket = new Socket("localhost", 12345);
// 데이터 전송을 위한 스트림 생성
OutputStream outputStream = socket.getOutputStream();
PrintWriter writer = new PrintWriter(outputStream, true);
// 데이터 전송
writer.println("Hello, Server!");
// 연결 종료
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
서버 소켓 예제:
import java.io.*;
import java.net.*;
public class ServerExample {
public static void main(String[] args) {
try {
// 서버 소켓 생성 및 포트 바인딩
ServerSocket serverSocket = new ServerSocket(12345);
while (true) {
// 클라이언트의 연결 대기
Socket clientSocket = serverSocket.accept();
// 클라이언트와의 통신을 위한 스트림 생성
InputStream inputStream = clientSocket.getInputStream();
BufferedReader reader =
new BufferedReader(new InputStreamReader(inputStream));
// 데이터 수신
String message = reader.readLine();
System.out.println("Received from client: " + message);
// 연결 종료
clientSocket.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
URL 클래스: 자바에서는 URL
클래스를 통해 웹상의 리소스에 접근.
HttpURLConnection 클래스: HTTP 프로토콜을 사용하는 웹 서버와 통신하기 위한 클래스.
URL 및 HttpURLConnection 예제:
import java.io.*;
import java.net.*;
public class HttpExample {
public static void main(String[] args) {
try {
// URL 생성
URL url = new URL("https://www.example.com");
// HttpURLConnection 열기
HttpURLConnection connection =
(HttpURLConnection) url.openConnection();
// 요청 방법 설정 (GET, POST 등)
connection.setRequestMethod("GET");
// 응답 코드 확인
int responseCode = connection.getResponseCode();
System.out.println("Response Code: " + responseCode);
// 응답 데이터 읽기
BufferedReader reader = new BufferedReader
(new InputStreamReader(connection.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
// 연결 종료
connection.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
}
}
네트워크
프로그래밍에서는 일반적으로 여러 클라이언트와의 동시 접속을 처리하기 위해 스레드를 사용. 각 클라이언트는 별도의 스레드에서 처리되며, 서버는 여러 클라이언트의 요청을 병렬적으로 처리.
javax.net.ssl
패키지를 사용하여 소켓 통신에 SSL을 적용.
SSL을 사용하면 데이터의 암호화와 서버 인증이 가능해져 보안이 강화.
JDBC(Java Database Connectivity)는 자바 프로그램에서 데이터베이스에 접속하고 SQL 문을 실행하는 데 사용되는 API(프로그래밍 인터페이스). JDBC는 데이터베이스에 대한 표준 인터페이스를 제공하여 여러 데이터베이스에 대한 일관된 접근을 가능하게 한다.
드라이버(Driver): JDBC 드라이버는 특정 데이터베이스와 통신하기 위한 라이브러리로서, 해당 데이터베이스를 지원하는 JDBC 드라이버를 사용해야 한다.
JDBC URL: JDBC URL은 데이터베이스에 연결하기 위한 주소로, 데이터베이스 종류와 연결 정보를 포함한다.
Connection 객체: 데이터베이스에 연결을 나타내는 객체로, DriverManager.getConnection()
메서드를 통해 얻을 수 있다.
Statement 객체: SQL 문을 실행하기 위한 객체로, Connection.createStatement()
메서드를 통해 생성한다.
ResultSet 객체: 쿼리 결과를 저장하고 조회하기 위한 객체로, Statement.executeQuery()
메서드를 통해 생성한다.
JDBC 드라이버를 사용하기 위해서는 해당 드라이버를 로드해야 한다. 드라이버는 데이터베이스 공급업체에서 제공하는 JAR 파일에 포함되어 있다.
// MySQL 드라이버 로드 예제
Class.forName("com.mysql.cj.jdbc.Driver");
DriverManager.getConnection()
메서드를 사용하여 데이터베이스에 연결한다. 연결 정보는 JDBC URL, 사용자 이름, 비밀번호 등을 포함한다.
String url = "jdbc:mysql://localhost:3306/mydatabase";
String user = "username";
String password = "password";
Connection connection = DriverManager.getConnection(url, user, password);
Statement statement = connection.createStatement();
String sql = "SELECT * FROM mytable";
ResultSet resultSet = statement.executeQuery(sql);
String sql = "INSERT INTO mytable (column1, column2) VALUES (?, ?)";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1, "value1");
preparedStatement.setInt(2, 42);
preparedStatement.executeUpdate();
while (resultSet.next()) {
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
System.out.println("ID: " + id + ", Name: " + name);
}
JDBC를 사용하여 트랜잭션을 관리할 수 있다. connection.setAutoCommit(false)
을 호출하여 자동 커밋을 해제하고, connection.commit()
또는 connection.rollback()
을 호출하여 트랜잭션을 완료하거나 롤백할 수 있다.
try {
connection.setAutoCommit(false);
// 여러 SQL 문 실행
connection.commit();
} catch (SQLException e) {
connection.rollback();
e.printStackTrace();
} finally {
connection.setAutoCommit(true);
}
JDBC를 사용한 후에는 반드시 자원을 해제해야 한다. close()
메서드를 호출하여 연결, 스태이트먼트, 리절트셋 등의 자원을 해제한다.
if (resultSet != null) {
resultSet.close();
}
if (statement != null) {
statement.close();
}
if (connection != null) {
connection.close();
}
JDBC 메서드는 SQL 예외를 던질 수 있으므로, 예외 처리가 필요한다. try-catch
블록을 사용하여 예외를 처리한다.
try {
// JDBC 코드
} catch (SQLException e) {
e.printStackTrace();
}