서버란 프로그램이다. 이 프로그램은 지정된 포트, 예를 들어 8080포트에 소켓을 열고 클라이언트가
연결할 때까지 무한 대기하며 기다린다. 그러다가 클라이언트가 연결하면 해당 클라이언트 소켓에서 요청을 받아와
수행하고 응답을 작성해 전달한다.
아주간단한 서버 예를 보자
package org.spring.config;
import java.net.ServerSocket;
import java.net.Socket;
public class WebServer {
public static void main(String[] args) {
new WebServer().run();
}
public void run() {
try {
ServerSocket serverSoket = new ServerSocket(8080);
while (true) {
try {
Socket client = serverSoket.accept();
new Thread(() -> handleClient(client)).start();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
private static void handleClient(Socket client) {
// TODO Auto-generated method stub
}
}
아주 간단한 서버에서 클라이언트에게 요청을 읽어올 때 또는 응답을 작성할 때 파일 트랜스퍼 프로토콜을 사용한다면
FTP서버가 되는 것이고, 하이퍼텍스트 트랜스퍼 프로토콜을 사용한다면 HTTP서버가 되는 것이다.
물론 실제 서버는 위의 코드보다 훨씬 복잡하다.
혹시 서버를 어떻게 구현하는지 전혀 모르는 사람들에게 감을 잡도록 아주 간단한 개념만 구현한 것이다.
어쨌든 중요한 것은 서버는 네트워크 오퍼레이션을 수행하는 프로그램이라는 것이다.
정적 웹서버
정적 웹서버란 HTTP서버 중에서도 리소스 파일을 리턴하는 서버를 의미한다. 예를들어 그림 1-9는 정적 웹서버가
주로 하는 일을 나타낸다.
위의 그림은 서버호스트 8080에서 실행되고 있는 local호스트라고 가정해보자.
localhost:8080/file.html HTTP 요청을 서버로 보내면 정적 웹서버인 이 서버는 지정된 디렉터리 경로에서 file.html을
찾아 그 내용을 HTTP 응답 바디에 넣어 전송한다.
이때 서버는 해당 html 파일에 아무 작업도 하지 않고 파일을 있는 그대로 리턴한 다. 그래서 정적 웹서버인 것이다.
이런 정적 웹서버의 예로 아파치나 Nginx등 이 있다.
아파치나 Nginx를 설치하고 지정된 경로에 원하는 리소스 파일을 저장하면 자동으로 해당 리소스는 웹 서버를 통해 접근 할 수 있게 된다.
그래서 서버를 설치 및 설정하고 원하는 리소스를 경로에 지정하는 것 말고는 개발자가 따로 할 일이 없다.
동적 웹 서버
동적 웹서버는 조금 다르다. 동적 웹서버는 파일을 있는 그대로 리턴하지 않는다.
동적 웹 서버는 요청을 처리한 후 처리한 결과에 따라 응답 바디를 재구성하거나 HTML템플릿 파일에 결과를 대체해 보낸다.
위를 보면 동적 웹 서버의 예이다. 클라이언트는 요청에 매개변수를 보낼 수 있다.
그림에서는 name=Engineer 라는 매개변수와 값을 보낸다.
이를 확인한 서버는 요청과 매개변수에 맞는 작업을 수행한 후 그 자리에서 html 파일을 구성하거나 템플릿 html
파일에서 적잘한 값을 대체하는 방식으로 html을 구성해 리턴한다. 따라서 어떤 클라이언트가 요청하든
같은 응답을 리턴하는 정적 웹 서버와 달리 동적 웹 서버는 클라이언트가 누군지, 어떤 매개변수를 보내는지에 따라
같은 요청이라도 다른 응답을 받을 수 있다.
각 요청과 매개변수에 따라 로직을 작성하는 것이 대부분 백엔드 개발자가 해야할 일이다.
그러나 유추할 수 있듯이 비즈니스 요구사항에 따라 이 로직은 변한다. 그러므로
개발자들은 아파치나 Nginx 같은 서버 프로그램을 사용하지 못한다.
그렇다면 백엔드, 개발자들은 처음부터 끝까지 소켓 프로그래밍, HTTP 파싱, 스레드 풀 관리 등 모든 것을
새로 다 작성해야 한다는 말인가?
다행히 자바 프로그램 중 동적 웹 서버 구현을 도와주는 프로그램이 있다. 바로 서블릿 엔진이다.
아파치 톰캣이 서블릿 엔진에 해당한다.
자바 서블릿 컨테이너 / 엔진
서블릿 컨테이너 또는 서블릿 엔진은 서버 프로그램이다.
이 프로그램이 하는 일은 정적 웹서버가 하는 일보다 좀 더 복잡하다.
개발자들은 서블릿 엔진을 설치한 후 서블릿 엔진에게 자기가 개발한 비즈니스 로직, 즉 클래스 파일과
해당 클래스 파일을 어느 요청에서 실행햐난 하는지 알려줘야 한다.
이때 우리는 서블릿 엔진이 이해할 수 있는 형태로 클래스 파일을 작성해야한다.
구체적으로 서블릿 엔진이 이해할 수 있는 클래스란 javax.servlet.gttp.JttpServlet의 상속을 받는
서브 클래스를 의미한다.
우리는 HttpServlet을 상속받는 클래스를 작성해 특정 형식에 맞춰 압축해 전달해 준다.
이렇게 서블릿 엔진을 이용해 개발자는 서버를 청므부터 구현하지 않고도 각기 다른 비즈니스 로직을
구현하고 배포할 수 있다.
우리가 사용할 스프링 부트도 내부적으로는 서블릿 엔진의 사용을 위해 서블릿을 상속 및 구현한다.
정리
구체적으로는 웹서버 기술에 대한 내용을 설명하고 공부를 했다. HTTP, JSON이나 웹서버의 전반적인 동작 과정을 개념적으로 익히고 시작해보자
'Spring boot 프로젝트 기록 > 기본적인 기초 공부' 카테고리의 다른 글
REST API (0) | 2021.11.23 |
---|---|
레이어드 아키텍처 (0) | 2021.11.23 |
빌드 자동화 툴 : Gradle과 라이브러리~! (0) | 2021.11.19 |
배경지식(2) - 자바스크립트 오브젝트 노테이션 (0) | 2021.11.16 |
배경지식(1) - HTTP (0) | 2021.11.16 |
댓글