서블릿과 웹 소켓은 웹 개발에서 중요한 요소로 사용됩니다. 서블릿은 HTTP 요청을 처리하고 응답을 생성하는 데 사용되는 Java 클래스이며, 웹 소켓은 서버와 클라이언트 간의 양방향 통신을 제공하는 프로토콜입니다.
서블릿 개발
서블릿을 개발하기 위해서는 javax.servlet
패키지의 HttpServlet
클래스를 상속받아야 합니다. 이 클래스는 doGet()
또는 doPost()
메서드를 오버라이딩하여 요청을 처리하고 응답을 생성하는 로직을 구현할 수 있도록 해줍니다.
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class MyServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
response.setContentType("text/html");
response.getWriter().println("<h1>Hello, Servlet!</h1>");
}
}
위의 예제는 doGet()
메서드에서 HTML 응답을 생성하는 간단한 서블릿입니다. HttpServletResponse
객체를 사용하여 응답의 타입과 내용을 설정할 수 있습니다.
웹 소켓 개발
웹 소켓을 개발하기 위해서는 javax.websocket
패키지의 Endpoint
클래스를 상속받아야 합니다. 이 클래스는 @ServerEndpoint
어노테이션을 사용하여 웹 소켓 엔드포인트를 정의하는 데 사용됩니다.
import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
@ServerEndpoint("/websocket")
public class MyWebSocket {
@OnOpen
public void onOpen(Session session) {
System.out.println("WebSocket connection opened");
}
@OnMessage
public void onMessage(String message, Session session) throws IOException {
System.out.println("Received message: " + message);
session.getBasicRemote().sendText("Echo: " + message);
}
@OnClose
public void onClose(Session session) {
System.out.println("WebSocket connection closed");
}
@OnError
public void onError(Throwable error) {
System.out.println("WebSocket error: " + error.getMessage());
}
}
위의 예제는 @ServerEndpoint("/websocket")
어노테이션을 사용하여 /websocket
경로의 웹 소켓 엔드포인트를 정의하는 것을 보여줍니다. @OnOpen
, @OnMessage
, @OnClose
, @OnError
어노테이션을 사용하여 해당 이벤트가 발생할 때 호출될 메서드를 정의할 수 있습니다.
서블릿과 웹 소켓 통신
서블릿과 웹 소켓은 동일한 웹 애플리케이션 내에서 상호작용할 수 있습니다. 다음 예제는 서블릿에서 웹 소켓으로 메시지를 보내는 방법을 보여줍니다.
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.websocket.ContainerProvider;
import javax.websocket.WebSocketContainer;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
public class MyServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
String message = "Hello, WebSocket!";
try {
// 웹 소켓 연결 생성
WebSocketContainer container = ContainerProvider.getWebSocketContainer();
MyWebSocket socket = new MyWebSocket();
URI uri = new URI(request.getRequestURL().toString().replace("http", "ws") + "/websocket");
container.connectToServer(socket, uri);
// 웹 소켓으로 메시지 전송
socket.getSession().getBasicRemote().sendText(message);
// 응답 반환
response.setContentType("text/html");
response.getWriter().println("<h1>Message sent: " + message + "</h1>");
// 웹 소켓 연결 종료
socket.getSession().close();
} catch (URISyntaxException | DeploymentException | IOException e) {
e.printStackTrace();
}
}
}
위의 예제는 doGet()
메서드에서 웹 소켓을 사용하여 메시지를 보내고, 응답으로 전송된 메시지를 표시하는 간단한 서블릿입니다. ContainerProvider.getWebSocketContainer()
메서드를 사용하여 웹 소켓 컨테이너를 얻고, connectToServer()
메서드를 사용하여 웹 소켓 연결을 생성합니다.
서블릿과 웹 소켓 통신을 위해서는 로컬 또는 원격 환경에서 웹 애플리케이션을 실행해야 합니다.
결론
서블릿과 웹 소켓은 웹 개발에서 중요한 요소로서 양방향 통신을 위해 사용됩니다. 서블릿을 통해 HTTP 요청을 처리하고 응답을 생성하며, 웹 소켓을 통해 실시간 데이터를 주고받을 수 있습니다.
더 자세한 내용은 다음의 참고 자료를 참고할 수 있습니다.