1. Java 네트워크 프로그래밍


혹시 Java로 네트워크(소켓) 프로그래밍해보신 적 있으신가요? 

다음은 Java를 이용해서 간단한 TCP 서버 프로그램을 만드는 코드입니다.

class SocketServer {

    public static void main(String[] args) {
        try {
            // 1. 12000 port 번호로 소켓 객체를 생성한다.
            ServerSocket server = new ServerSocket(12000);
            
            while (true) {
                // 2. 해당 소켓으로 요청이 들어올 때까지 대기 상태로 기다린다.
                Socket s = server.accept();
                
                try (BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
                		PrintWriter out = new PrintWriter(new OutputStreamReader(s.getOutputStream()), true);
            
                // 3. 클라이언트로부터 받은 요청 내용을 콘솔에 출력한다.
            	String str = "";
                while (!(str = in.readLine()).equals("")) {
                    System.out.println(str);
                }
                
                out.println("HTTP/1.0 200 OK");
                out.println("Server: HTTP Server 1.0");
                out.println("Content-Type: text/html; charset=UTF-8");
                out.println();
                out.println("<h1>안녕하세요</h1>");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 

브라우저에서 12000번 포트로 위의 서버에 접근하면 서버에선 HTTP 프로토콜에 맞춰 응답 데이터를 보내주기 때문에 브라우저는 이를 해석해 화면에 보여주게 됩니다. HTTP 프로토콜 형식의 데이터를 요청으로 받아 응답을 주는 웹 서버의 동작 방식을 담고 있습니다.

 

2. 서블릿이란?


웹 초창기 시절에는 모든 웹 페이지가 정적이었습니다. 말그대로 단순한 '문서'의 역할만 했습니다.

그러다가, 다음과 같은 고민을 하기 시작했습니다.

웹 페이지를 동적으로 구성할 수는 없을까?

 

동적인 웹 페이지라 하믄, <input> 태그에 id와 pw를 넣은 후 서버로 전송해 서버에서는 해당 id-pw에 대응되는 사용자 정보를 불러와 해당 사용자 정보를 이용해 웹 페이지를 구성하는 것과 같은 것을 말합니다.

 

DB를 조회해서 동적인 데이터를 만들기 위해 Java가 사용되고, 구성한 데이터를 가지고 HTML 페이지를 만들어야할 것입니다.

서블릿은 Java의 표준 웹 API로 이 안에 HTML 코드를 같이 구성하는 방식을 이용했습니다.

@WebServlet(name = "HelloServlet", value = "/hello")
public class HelloServlet extends HttpServlet {

    private String message;
    
    @Overriding
    public void init() { message = "안녕하세요"; } 
    
    @Overriding
    public void doGet(HttpServletRequest req, HttpServletResponse res) throws Exception {
        res.setContentType("text/html");
        
        PrintWriter out = res.getWriter();
        out.println("<html><head><title>타이틀</title></head><body>");
        out.println("<h1>" + message + "</h1>");
        out.println("</body></html>");
    }
}

 

위 코드를 보면 Java 코드 내에서 HTML 코드를 만들고 있는데 괜찮아 보이시나요?

위와 같이 Java 코드 안에 HTML 코드를 넣게되니 유지보수가 여간 힘들었던게 아니었습니다. 그 당시 동적인 웹 페이지를 구성하는데 이용되었던 PHP, ASP는 HTML 코드 안에 PHP나 ASP 코드를 넣었고 이것이 각광받았다고 합니다. 그래서 Java 진영도 HTML 코드 안에 Java 코드를 넣자해서 만든게 JSP입니다.

 

3. JSP란?


위와 같이 Java 코드 안에 HTML 코드를 넣는게 싫어서 나온 기술로 HTML 코드 내에 Java 코드를 넣는 기술입니다.

즉, 서블릿에 반대하여 나온 기술인데요, 코드는 다음과 같습니다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8" import="com.demo.Student"%>
    
<!DOCTYPE html>
<html>
<head>
  <% Student student = (Student) request.getAttribute("studentInfo");
     if (student == null) { %>
     <script>
       alert("학생 정보가 없습니다.");
     </script>
  <% } else { %>
     <meta charset="UTF-8">
     <title>학생정보</title>
</head>
<body>
<span>학번: <%= student.getStudentNum() %></span>
</body>
} %>

 

보기 어떠신가요? (코드치기 너무 힘들었습니다)

지금 시점에서 보면 서블릿, JSP 둘다 별로인거 같지만, 당시에는 JSP가 좋았나봅니다. 어쨋든, JSP가 나오고 위에서 보시는것과 같이 HTML 태그와 JSP 태그와 구분이 너무 힘들었습니다. 그래서 el이라고 불리는 표현식이 나왔고, 이건 아직도 많이 잔존한다 합니다.

 

그런데, 어떻게 위 코드가 동작을 하는 것일까요?

결국에 JSP도 HTML 안에 있는 Java 코드이기 때문에 컴파일이 필요합니다. 즉, JSP --> 서블릿 Java 파일로 변환이 됩니다.

즉, 내부적으로는 위에서 살펴봤던 서블릿 Java 코드 안에서 HTML 코드를 만들어내는 모습이 되는겁니다. 이렇게 서버에서 동적인 데이터를 구성해 HTML 페이지를 만들어 클라이언트 측으로 주는 것을 서버 사이드 렌더링이라고 합니다.

 

4. MVC 패턴


이건 디자인 패턴과 관련된 이야기지만, 서블릿/JSP를 배운 후 다음으로 배우게되는 필수 코스(?)입니다.

쉽게 말하면, 위와 같이 100% 서블릿로 만들거나, 100% JSP로 만들거나 하지말고 둘다 적절히 이용하자가 되겠습니다.

 

클라이언트의 요청을 받는 부분은 Controller단인 서블릿으로, DB에 접근해서 데이터를 조회해오고, 조회해온 데이터를 가공하는 등의 비즈니스 로직은 Model단에서, 최종적으로 화면에 보여주는 HTML 코드는 View단인 JSP에서 담당합니다.

 

MVC 패턴의 구조는 다음과 같습니다.

[그림 1] Model2 구조 (MVC 패턴)

 

위 그림을 잘 보면, Servlet 입장에서는 해당 요청에 대해 어떤 비즈니스 로직을 호출할지, 어떤 JSP 파일로 포워딩시킬지만 알면 됩니다.

이처럼 요청이 들어왔을 때 어디로 보내줄지를 앞 단에서 판단해 포워딩해주는 것을 Front Controller라고 합니다.

 

'Web > Servlet JSP' 카테고리의 다른 글

[Web/Servlet JSP] 필터 (Filter)  (0) 2020.08.09
[Web/Servlet JSP] Servlet 매핑에서 /와 /* 차이  (0) 2019.10.04