[java] 서블릿과 웹 소켓 통신

서블릿과 웹 소켓은 웹 개발에서 중요한 요소로 사용됩니다. 서블릿은 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 요청을 처리하고 응답을 생성하며, 웹 소켓을 통해 실시간 데이터를 주고받을 수 있습니다.

더 자세한 내용은 다음의 참고 자료를 참고할 수 있습니다.