티스토리 뷰

웹에 대해 학습하다 보면 어떤 규칙 위에서 클라이언트와 서버 사이 데이터 전달이 발생하게 된다는 것을 알게 됩니다. 서버에는 웹 서버와 웹 애플리케이션 서버가 존재하는데 각각은 무엇을 의미하고 어떤 차이점이 있는지 알아보기 위해 글을 작성하게 되었습니다.

웹 서버(Web Server)

웹 서버는 하드웨어 개념과 소프트웨어 개념으로 나눌 수 있다.

  1. 하드웨어: 웹 서버가 설치되어 있는 컴퓨터를 의미한다.
  2. 소프트웨어: 클라이언트로부터 요청을 받아들여 html, jpeg, css 등과 같은 정적인 콘텐츠를 반환하는 프로그램을 의미한다.

웹 서버의 기능

웹 서버는 HTTP 프로토콜을 기반으로 클라이언트 요청에 알맞은 동작을 수행하는데, 크게 2가지 기능을 수행한다.

  1. 클라이언트로부터 요청 데이터를 받아 처리하여 저장하거나 요청에 알맞은 정적 콘텐츠를 반환한다.
  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
댓글
최근에 올라온 글
최근에 달린 댓글
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Total
Today
Yesterday