티스토리 뷰



요즘 프로젝트들은 대부분 프레임워크 기반으로 개발을 진행한다. 프레임워크 사용법만 익히면 웬만한 기능들을 큰 오류없이, 성능의 큰 손실 없이, 빠르게 개발할 수 있기 때문이다.


그런데, 프레임워크란 무엇인가?


라이브러리가 개발에 필요한 도구들을 단순히 나열해 놓은 것이라면, 프레임워크는 동작에 필요한 구조를 어느정도 완성해 놓은 반제품 형태의 도구라고 할 수 있다.

(스프링 프레임워크는 단순히 빈 관리를 위한 IoC 컨테이너를 넘어서 웹 MVC 아키텍처와 보안, 모바일 등 다양한 분야의 기반 기술을 제공한다고 하는데, 지금은 일단 넘어가자)

따라서 프레임워크를 제대로 사용하기 위해서(그리고 프레임워크로 해결할 수 없는 요구사항들을 해결하기 위해서는) ‘동작’에 대해 알아야 하고, 이를 구현하는 ‘구조’ 들이 갖는 장/단점 들을 알아야 한다. ‘열혈강의 웹 개발 워크북’은 그런 취지에서 만들어진 듯 싶다.


우선, 프로그램을 만든다고 할 때, 데스크톱 애플리케이션 형태를 생각해볼 수 있다. 이 경우에 예상되는 문제점은 무엇인가? 

제품 출시 후에 기능을 추가하거나 변경할때마다 다시 배포해야 한다. 기업간의 경쟁이 심화되어 제품의 생산주기가 짧아져 자주 애플리케이션을 배포해야할 경우 비효율적인 구조이다. (물론 이는 자동 갱신 등을 통해 해결할 수 있다.) 또한 DB에 접속해야 하는 경우 애플리케이션 소스코드 안에 접속정보가 들어가게 되므로 보안상 취약하다.


이러한 문제들은, 비즈니스/데이터 로직은 서버에, 프레젠테이션 로직은 클라이언트에 두어 해결할 수 있다. 이 구조에서는 서버에서 계산을 수행하고 그 결과를 클라이언트에 넘겨주므로 신규 기능이 추가되더라도 서버 쪽만 변경하면 된다. 그리고 클라이언트가 DB에 직접 접속하지 않기 때문에 DB 접속정보가 노출되는 사고를 막을 수 있다.


그러나 이 구조는 프로그래밍하기가 복잡하다. 데이터 통신을 위한 네트워크 프로그래밍도 해야하고 다중 클라이언트의 요청을 처리하기 위한 스레드 프로그래밍도 해야한다. 또한, DB 연결을 관리하거나 트랜잭션, 보안, 자바 빈 등 다양한 애플리케이션 자원을 관리하기 위한 프로그래밍도 필요하다.


웹 애플리케이션 구조에서는 클라이언트와의 통신을 웹 서버가 전담함으로써 네트워크 및 멀티 스레드 프로그래밍으로부터 탈출할 수 있다. 그리고 표준 웹 프로토콜인 HTTP를 이용하여 데이터를 송수신함으로써 이기종 플랫폼간에 매끈한 연결을 지원하여 스마트 폰, 스마트 패드, 스마트 TV 등 다양한 멀티 스크린 환경에 대해 일관되고 유연하게 대응할 수 있다. 즉, 개발자는 어떤 업무를 처리하고 무엇을 출력할 것인가에 대해서만 고민하면 되며, 작성한 웹 애플리케이션을 WAS에 배치하면 된다.


이 구조에서 예상되는 문제점은, 매번 출력화면을 서버에서 만들어 클라이언트(웹 브라우저)에서 이 화면을 내려받게 되어 오버헤드가 발생할 수 있는 부분인데, 같은 화면에서 데이터만 바뀔 때는 Ajax를 사용하여 데이터만 받아오도록 하여 해결할 수 있다.

이 구조는 결국 사용자가 웹 서버를 통해 간접적으로 웹 애플리케이션을 실행시키는 구조라고 볼 수 있다. 웹 서버는 클라이언트가 요청한 프로그램을 찾아서 실행하고, 해당 프로그램은 작업을 수행한 후 그 결과를 웹 서버에 돌려준다. 그러면 웹 서버는 그 결과를 HTTP 형식에 맞추어 웹 브라우저에게 보낸다.


이제 웹 애플리케이션 아키텍처를 좀 더 자세히 살펴보자.



웹 서버와 웹 애플리케이션 사이에는 데이터를 주고받기 위한 규칙이 있는데 이것을 ‘CGI(Common Gateway Interface)’라고 한다. 그래서 보통 웹 애플리케이션을 ‘CGI 프로그램’이라고 한다. 특히 자바로 만든 웹 애플리케이션을 Servlet이라고 부르는다. 서블릿 명칭은 Server와 Applet의 합성어이다. 즉 ‘클라이언트에게 서비스를 제공하는 작은 단위의 서버 프로그램’이라는 뜻으로, 사용자의 요청에 대한 처리와 처리 결과에 따른 응답을 담당한다. 즉, 웹 개발자가 실질적인 구현을 담당할 부분이다. 자바 서블릿이 다른 CGI 프로그램과 다른 점은, 웹 서버와 직접 데이터를 주고받지 않으며, 전문 프로그램에 의해 관리된다는 점이다.

서블릿 컨테이너는 서블릿의 생성에서 실행, 소멸까지 서블릿의 생명주기를 관리하는 프로그램이다. (스프링의 빈 컨테이너는 빈의 라이프사이클을 관리한다.) 인스턴스를 생성하고 관리하는 것은 개발자가 하는 것이 아니라 컨테이너가 한다. (IoC. 제어의 역전)

그리고 서블릿 개발자는 더 이상 CGI 규칙에 대해 알 필요 없이 Servlet 규칙을 알아야 한다. 클라이언트로부터 요청이 들어오면, 서블릿 컨테이너는 호출 규칙에 따라 서블릿의 메서드를 호출한다. 서블릿 호출 규칙은 javax.servlet.Servlet 인터페이스에 정의되어 있다. 따라서 서블릿을 만들 때는 반드시 Servlet 인터페이스를 구현해야만 한다.






Servlet이라는 규칙 외에 JSP를 만들고 실행하는 규칙, EJB(Enterprise JavaBeans)라는 분산 컴포넌트에 관한 규칙, 웹 서비스에 관한 규칙 등 기업용 애플리케이션 제작에 필요한 기술들의 사양을 정의한 것을 Java EE라고 한다. Java EE는 기능 확장이 쉽고, 이기종 간의 이식이 쉬우며, 신뢰성과 보안성이 높고, 트랜잭션 관리와 분산 기능을 쉽게 구현할 수 있는 기술을 제공한다.

Java EE 사양 중에서 Servlet과 JSP 기술만 구현한 서버를 서블릿 컨테이너라 하며, 자바로 웹 애플리케이션을 개발한다는 것은 이 두 기술을 이용하여 애플리케이션을 개발한다는 것을 의미하기도 한다. 그리고 서블릿과 서블릿 컨테이너와 같이 웹 기술을 기반으로 동작하는 애플리케이션 서버를 WAS(Web Application Server)라고 부른다. Tomcat, Jetty 등은 서블릿 컨테이너 기능을 가지고 있어 WAS라고 한다.


결국 서블릿이 하는 일이란, 클라이언트가 요청한 데이터를 다루는 일이다.



만약, 서블릿을 실행하기 전이나 후에 특별한 작업을 수행하고자 한다면 필터를 사용하면 된다. 주로 Servlet에서 발생하는 중복들을 제거하는 용도로 사용되며, 이는 transaction 처리나 캐싱 등에서도 사용된다. 


일반적으로 doFilter() 사후 작업들(암호화, 압축 등)은 apache, nginx 등에서 작업한다.


스프링 프레임워크에 이르기까지 <2> MVC






참조 : 열혈강의 웹 개발 워크북



댓글
링크
최근에 달린 댓글
«   2024/04   »
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
Total
Today
Yesterday