티스토리 뷰
웹에 대해 학습하다 보면 어떤 규칙 위에서 클라이언트와 서버 사이 데이터 전달이 발생하게 된다는 것을 알게 됩니다. 서버에는 웹 서버와 웹 애플리케이션 서버가 존재하는데 각각은 무엇을 의미하고 어떤 차이점이 있는지 알아보기 위해 글을 작성하게 되었습니다.
웹 서버(Web Server)
웹 서버는 하드웨어 개념과 소프트웨어 개념으로 나눌 수 있다.
- 하드웨어: 웹 서버가 설치되어 있는 컴퓨터를 의미한다.
- 소프트웨어: 클라이언트로부터 요청을 받아들여 html, jpeg, css 등과 같은 정적인 콘텐츠를 반환하는 프로그램을 의미한다.
웹 서버의 기능
웹 서버는 HTTP 프로토콜을 기반으로 클라이언트 요청에 알맞은 동작을 수행하는데, 크게 2가지 기능을 수행한다.
- 클라이언트로부터 요청 데이터를 받아 처리하여 저장하거나 요청에 알맞은 정적 콘텐츠를 반환한다.
- 동적으로 데이터나 콘텐츠를 생성하는 요청은 처리하기 어렵기에 해당 요청을 웹 애플리케이션 서버에게 전달한다. 웹 애플리케이션 서버로부터 만들어진 동적 데이터나 콘텐츠를 받아 클라이언트에게 반환한다.
웹 서버의 대표적인 예로는 Apache Server, Nginx 등이 존재한다.
웹 애플리케이션 서버(Web Application Server)
웹 서버에서 동적인 데이터나 콘텐츠를 만들기 위해서는 이를 처리하기 위한 프로그램이 필요하다. 또한 프로그램에서 요청을 처리하기 위해서는 요청을 전달하기 위한 중간 매개체도 필요하다. 중간 매개체를 CGI라고 한다.
CGI(Common Gateway Interface)
CGI는 웹 서버에서 동적인 콘텐츠를 보여 주기 위해 임의의 프로그램을 실행할 수 있도록 하는 기술 중 하나이다. 다시 말해서 CGI는 웹 서버와 프로그램 사이 요청과 응답을 위한 표준 인터페이스라고 볼 수 있다. PHP, Python, Java 등 다양한 언어로 CGI를 구현할 수 있다. CGI는 언어, 플랫폼에 독립적이고 단순하며 재사용할 수 있는 라이브러리가 충분하다. 또한 코드를 수행하는데 특정 라이브러리가 필요하지 않기에 가볍다는 점도 장점이 될 수 있다. 단점으로는 요청이 올 때마다 새로운 프로세스를 만들기에 메모리를 많이 사용하고 DB 커넥션도 새로 연결하기에 느리다. 이를 위해 Java에서는 CGI보다 조금 더 발전한 기술인 서블릿을 사용한다.
서블릿(Servlet)
자바 서블릿은 자바를 사용하여 웹 페이지를 동적으로 생성하는 서버 측 프로그램 혹은 그 사양을 말하며, 웹 서버의 성능을 향상하기 위해 사용하는 자바 클래스의 일종이다. 간단히 말하면 자바를 사용하여 웹을 만들기 위한 기술이다. 자바 서블릿은 다른 CGI 프로그램과 달리 웹 서버와 직접 데이터를 주고받지 않으며, 전문 프로그램에 의해 관리된다.
서블릿의 생성과 실행, 소멸 등 생명주기를 관리하는 프로그램을 서블릿 컨테이너(Servlet Container)라고 한다. 대표적인 서블릿 컨테이너로는 흔히 접할 수 있는 Tomcat이 존재한다. 서블릿 개발자는 CGI 규칙을 알지 않아도 되지만 서블릿 컨테이너와 서블릿 사이의 규칙을 알아야 한다.
서블릿 특징
- 서버 쪽에서 실행되면서 기능을 수행한다.
- 동적인 여러 가지 기능을 제공한다.
- 스레드 방식으로 실행된다.
- 자바로 만들어져 자바의 특징을 가진다.
- 컨테이너에서 실행된다.
- 플랫폼에 독립적으로 실행된다.
- 보안 기능을 적용하기 쉽다.
- 웹 브라우저에서 요청 시 기능을 수행한다.
마치며
웹 서버에서 동적 콘텐츠를 제공할 수 없을까
웹 서버에 CGI를 설정하여 웹 서버만으로도 동적 요청 처리가 가능하다. 하지만 CGI만으로는 규모가 큰 웹 서비스를 구현하기 어렵기 때문에 동적 처리를 WAS에 위임하여 사용한다.
웹 애플리케이션 서버로 정적 콘텐츠를 제공할 수 있지 않을까
웹 애플리케이션 서버에서도 정적 콘텐츠를 클라이언트에게 제공할 수 있다. 하지만 자원 이용의 효율성 및 장애 극복, 배포 및 유지보수의 편의성을 위해 웹 서버와 웹 애플리케이션 서버를 분리한다. 분리를 통해 아래와 같은 장점을 생각해 볼 수 있다.
1. 기능을 분리하여 서버 부하를 방지한다.
웹 애플리케이션 서버에서는 DB 조회나 다양한 로직을 수행하게 된다. 만약 동적 콘텐츠까지 웹 애플리케이션 서버가 제공하게 된다면 자원이 분할되어 동적 콘텐츠에 사용될 자원의 부하가 증가하게 된다. 따라서 수행 속도가 느려지게 될 것이다. 이를 방지하기 위해 정적 콘텐츠는 웹 서버에서 클라이언트에게 빠르게 제공하는 것이 좋다.
2. 물리적으로 분리하여 보안을 강화한다.
웹 애플리케이션 서버 앞단에 웹 서버가 존재하게 되는데 웹 서버에서 보안 처리를 하도록 하여 보안을 강화할 수 있다.
3. 여러 대의 웹 애플리케이션 서버 연결이 가능하다.
하나의 웹 서버를 두고 여러 개의 웹 애플리케이션 서버를 연결하여 사용할 수 있다. 이를 통해 Python Application, Java Application 등 언어에 국한되지 않은 웹 애플리케이션 서버 사용이 가능하다. 또한 트래픽이 많아져 서버를 늘리거나 트래픽이 적어져 서버를 줄이는 경우에도 쉽게 처리할 수 있으며, 로드 밸런싱을 통해 무중단 배포와 유연한 장애 처리가 가능하다.
참고
'Etc' 카테고리의 다른 글
[MyBatis] org.apache.ibatis.binding.BindingException 해결 (0) | 2022.12.04 |
---|---|
아스키코드와 유니코드 (2) | 2022.11.27 |