웹 기술을 활용한 클라이언트·서버(C/S)의 또 다른 진화형태인 웹 애플리케이션 서버구조를 알아본다.
웹 애플리케이션을 작성하기 위한 web01이라는 이름의 새 프로젝트를 생성하고 웹 애플리케이션을 배포할 서버를 설정했다. 서버는 Tomcat v8.5 Server를 사용하고 포트번호는 9999로 했다. 웹 애플리케이션 서버를 실행하기 위해 톰캣 서버에 배치(deployment) 했다. 배치란, 클라이언트에서 서비스를 요청했을 때 톰캣 서버가 애플리케이션을 실행할 수 있도록 설치하는 것이다.
이후 Github에 연동하기 위해 web01프로젝트를 Git 저장소에 추가하였고 Github저장소에 Commit했다(순서 1~3).
배치의 관점에서, 기존의 C/S환경은 비즈니스 처리 부분을 서버에, UI 처리 부분을 클라이언트에 배치하여 업무가 변경되면 그에 따라 클라이언트 프로그램을 다시 설치해야 하는 문제가 있었다. 또한 개발 관점에서, 클라이언트에 네트워크 프로그래밍, 서버에 네트워크 프로그래밍과 멀티 스레드 프로그래밍을 해야 했다.
하지만 웹 환경에서는 UI 로직과 비즈니스 로직을 서버에 배치하기 때문에 기능이 추가되거나 변경되어도 서버쪽만 바꾸면 된다. 따라서 사용자는 재설치 없이 추가되거나 변경된 기능을 이용할 수 있다. 또한 웹 브라우저와 웹 서버가 네트워크 프로그래밍과 멀티스레드 프로그래밍을 대신 처리하여 개발자는 어떤 업무를 처리하고 무엇을 출력할 것인가에 대해서만 고민하면 된다.
Tomcat 서버를 실행한 후 웹 브라우져를 열어 http://localhost:9999/web01/calculator.html를 실행하면 계산기 입력 화면이 출력된다.
실행했던 웹 애플리케이션의 소스를 분석한다. 먼저 클라이언트 소스다.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>계산기</h1>
<form action="calc" method="post">
<input type="text" name="v1" style="width: 50px;">
<select name="op">
<option value="+">+</option>
<option value="-">-</option>
<option value="*">*</option>
<option value="/">/</option>
</select>
<input type="text" name="v2" style="width: 50px;">
<input type="submit" value="=">
</form>
</body>
</html>
HTML을 이용하여 UI를 만들면 자바로 만드는 것보다 훨씬 간단하게 만들 수 있다. 또한 복잡한 네트워크 프로그래밍을 할 필요도 없다.
서버 소스다.
package lesson01.servlets;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
@WebServlet("/calc")
@SuppressWarnings("serial")
public class CalculatorServlet extends GenericServlet {
@Override
public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
//선언
String operator = request.getParameter("op");
int v1 = Integer.parseInt(request.getParameter("v1"));
int v2 = Integer.parseInt(request.getParameter("v2"));
int result = 0;
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
//연산
switch (operator) {
case "+":
result = v1 + v2;
break;
case "-":
result = v1 - v2;
break;
case "*":
result = v1 * v2;
break;
case "/":
if (v2 == 0) {
out.println("0 으로 나눌 수 없습니다!");
return;
}
result = v1 / v2;
break;
}
out.println(v1 + " " + operator + " " + v2 + " = " + result);
}
}
HttpServlet 클래스를 상속받고 있고 상속받은 doGet()메소드를 재정의(overriding)한다. 이 코드에서도 클라이언트와 연결을 수행하는 네트워크 관련 코드를 찾을 수 없고, 여러 클라이언트의 요청을 동시에 처리하는 멀티 스레드 관련 코드도 찾을 수 없다. 이것은 모두 웹 서버와 톰캣 애플리케이션 서버가 대신 처리하기 때문이다.
이러한 웹 애플리케이션 아키텍처도 문제가 있는데 매번 출력 화면을 서버에서 만들고, 클라이언트는 이 화면을 내려받아야 한다는 점이다. 사용자가 화면을 이리저리 옮긴다면 서버는 같은 화면을 계속 만들어야 하고 클라이언트는 반복해서 내려받게 되어 서버 및 네크워크 자원에 대한 오버헤드(특정 기능을 수행하기 위해 추가로 사용되는 자원)를 발생시킨다.
이를 해결하고자 AJAX라는 기술이 등장하는데, 같은 화면에서 데이터만 바뀔 때 서버에서 UI전체를 받아오기보다 화면은 그대로 두고 데이터만 받아오는 방식이다.
기업용 애플리케이션을 개발하는 경우 비즈니스 변화에 유연하게 대응하는 구조로 애플리케이션을 설계하는데 MVC 아키텍처나 빈 관리 컨테이너, 의존 객체 주입 등이 그 예이다.
참고도서 : https://freelec.co.kr/book/1674/
[열혈강의] 자바 웹 개발 워크북
[열혈강의] 자바 웹 개발 워크북
freelec.co.kr
'교재 실습 > 자바 웹 개발 워크북' 카테고리의 다른 글
8. HTTP 프로토콜의 이해 (2) (0) | 2022.01.03 |
---|---|
7. HTTP 프로토콜의 이해 (1) (0) | 2022.01.02 |
5. 클라이언트·서버 아키텍처의 진화 (0) | 2021.12.30 |
4. 다중 클라이언트의 요청 처리 (1) | 2021.12.29 |
3. 클라이언트·서버 애플리케이션 (0) | 2021.12.28 |
댓글