📌웹 프로그래밍이란?
우리는 브라우저를 통해서 앉은자리에서 전 세계의 정보와 상품을 검색하고 구입할 수 있고 인터넷을 통해서 할 수 없는 일이 없을 정도로 자주 사용하고 유용하다. 그럼 우리가 브라우저를 통해 접할 수 있는 많은 사이트들은 어떻게 만들어졌을까? 예를 들어 google이나 네이버, 11번가 개인 쇼핑몰 등 대체로 모든 사이트들은 모두 웹 프로그래밍 언어를 통해서 구축되었다 할 수 있다. 웹 상에서 사용자와 기업 또는 사용자들간의 연결을 가능하게 하는 프로그래밍 언어이다.
웹 프로그래밍 동작 방식
일반적으로 웹 프로그래밍은 클라이언트(Client) / 서버(Server)의 방식으로 구축된다.
클라이언트(사용자)가 웹 브라우저를 통해 어떤 결과를 보여달라는 요청(Request)을 웹 서버에 보내게 되면 서버는 그 요청을 받아들여서 데이터를 처리한 후 결과를 웹 브라우저의 응답(Response) 형태로 클라이언트에 보내게 되고 사용자는 웹 브라우저를 통해서 그 결과를 받아 보게 된다.
📌JSP & Servlet의 출현
JSP
웹 기반의 언어로 가장 먼저 HTML이 개발되었다. HTML은 텍스트 기반의 웹 문서 작성이나 정적인 데이터들을 처리하는 데에는 편하지만 동적인 데이터를 처리할 수는 없다. 따라서 이러한 한계점을 극복하기 위해 CGI, ASP, PHP, JSP 등의 기술들이 개발되었다.
그 중 최근 각광받고 있는 웹 프로그램이 기술인 JSP/Servlet는 Java를 기반으로 만들어졌기 때문에 철저히 객체 지향적이며 플랫폼 독립적인 자바의 장점을 그대로 웹에서 구현할 수 있으며 스레드 기반의 요청 처리 방식을 채택했기에 사용자가 많을수록 효율적으로 동작하는 강력한 기술이다. 또한 JSP는 ASP, PHP처럼 스크립트 기반으로 개발되어 서버 페이지를 보다 쉽게 작성할 수 있으며 Servlet, JavaBeans, EJB 등과 함께 개발함으로써 유연하고 확장성이 좋으며 유지/보수 효율이 뛰어난 웹 프로젝트의 개발 언어이다. 또한 JSTL을 지원하게 되면서 웹 프로그래밍의 가독성이 좋아지고 유지 및 보수가 훨씬 더 쉬워지는 장점을 가지게 되었다.
JSP는 Java를 이용하여 동적인 웹 페이지를 만들기 위해 Sun Microsystems사가 개발한 기술이다. 브라우저는 기본적으로 HTML 형식의 문서만을 표시할 수 있기 때문에 동적인 웹 페이지, 즉 사용자의 요청에 맞는 결과를 동적으로 표시해주는 웹 페이지를 웹 서버 측에서 사용자에게 전송해 주기 위해서는 요청의 처리 결과에 따라서 자동으로 응답을 생성할 수 있는 역할을 하는 프로그램이 필요하다.
정적 & 동적 예시
정적과 동적 이해를 위해 예시를 들어보도록 하겠다 . 현재 시각을 표시해주는 웹 페이지를 만든다고 해보자. 만약 정적인 웹 페이지만 사용할 수 있다면 웹 서버쪽에 올려져 있는 웹 페이지에는 고정된 하나의 시간만이 적혀 있을 것이고 사용자는 현재 시각이 아닌 항상 같은 시간만을 볼 수 있을 것이다. 하지만 동적인 웹 페이지를 만들 수 있는 기술(JSP 등)을 사용한다면 사용자가 요청을 보낼 때마다 서버가 그때의 시간을 표시해 줄 수 있게 된다.
클라이언트가 JSP 페이지 요청을 하면 JSP 페이지 코딩 내용이 HTML 페이지 형태로 변환되면 HTML 형태로 변환된 내용이 최종적으로 브라우저에서 해석되어 사용자에게 보여지는 구조이다.
Servlet
브라우저는 기본적으로 HTML 형식의 문서만을 표시할 수 있기 때문에 사용자의 요구에 맞는 동적인 웹 페이지의 표시에는 한계가 있다. 그러므로 웹 서버측에서 사용자의 요구에 따라 자동으로 생성된 HTML 형식의 페이지를 생산해 전송해 줄 수 있는 여러 기술이 개발되었고 그중 자바 진영의 기술이 바로 서블릿(Servlet)이다.
Servlet은 웹 서버 상에서 실행되는 자바의 클래스 파일로 일반적인 자바 클래스와 비교해 볼 때 서블릿은 반드시 javax.servlet.Servlet 인터페이스를 구현(Implements)해서 작성해야만 하며 입력과 출력을 HTTP프로토콜의 요청(Request)과 응답(Response)의 형태로 다룬다는 점만이 다를 뿐이다. 따라서 서블릿은 Java의 모든 강력한 기능을 사용할 수 있으며 Java를 공부한 사람은 빠르게 익힐 수 있다.
근데 왜 갑자기 JSP 이야기를 하다가 Servlet이야기를 할까? 라는 생각이 들 수 있다. 또한 JSP를 얕게 접해본 사람이라면 JSP를 이용하는데 Servlet이 필요한가라는 의문을 가질 수 있다. 사실 JSP로 요청이 전송되어 오면 컨테이너는 JSP 파일을 서블릿 형태의 자바 코드로 자동 변환한 후 서블릿의 라이프사이클을 거치면서 클라이언트의 요청을 처리해주는 것이다. 결국, JSP에 대한 요청도 서블릿의 요청 처리 방식으로 처리해 주는 것이다. 따라서 Servlet에 대한 내용을 이해한다면 JSP를 이해하는데 도움이 될 것이다.
아래 링크를 같이 참고하여 읽으면 더욱 도움됩니다
https://yeo-computerclass.tistory.com/224
📌서블릿 생명 주기(동작 원리) 간단 설명
- 배포 서술자를 통해 서블릿 요청인지 확인 후 웹 컨테이너로 요청 전달
한 사용자의 URL 요청이 서블릿 요청이라는 것을 웹 서버가 알기 위해서는 사전에 웹 서버측에 URL과 서블릿 클래스를 미리 mapping 시켜놓은 배포 서술자(Deployment Descriptor) (ex) web.xml)가 필요하다. 배포 서술자가 어떤 것이고 어떤 식으로 작성하는지는 뒤에 말하도록 하겠다. 웹 서버가 배포 서술자를 통해 지금 받은 요청이 서블릿 요청이라는 것을 알게 되면 서블릿을 담당하는 웹 컨테이너로 그 요청을 전달한다.
JSP2.3 부터 서블릿 설정이 web.xml에서 설정하지 않아도 어노테이션 기반으로 설정할 수 있다. - 웹 컨테이너에서 request/response 객체 생성
웹 컨테이너는 받은 요청을 처리하기 위해 HTTP 요청(Request)을 처리하기 위한 request 객체와 HTTP 응답(Response)을 위한 response 객체를 생성한다. request 객체는 javax.servlet.http.HttpServletRequest객체 타입으로 생성되며 response객체는 javax.servlet.http.HttpServletResponse 객체 타입으로 생성된다. - 서블릿 인스턴스 생성
request, response 객체가 생성된 뒤 사용자의 URL 요청이 어떤 서블릿 클래스를 필요로 하는지 배포 서술자를 통해 알아낸다. 만일 그 클래스가 웹 컨테이너에서 한 번도 실행된 적이 없거나 현재 메모리에 생성된 인스턴스(프로세스)가 없다면 새로 인스턴스를 생성하고(메모리에 로드하고) init() 메서드를 실행하여 초기화한 뒤 스레드를 하나 생성한다. 이미 인스턴스가 존재할 경우에는 새로 인스턴스를 생성하지 않고 기존의 인스턴스에 스레드만 하나 새로 생성한다. 각 서블릿 인스턴스는 웹 컨테이너당 하나만 존재하기 때문에 init() 메서드는 각 서블릿 당 한 번씩만 호출된다.
※init 메서드 안에는 주로 서블릿 전체에서 공유되는 자원을 생성한다. init 메서드는 첫 번째 클라이언트의 요청이 들어올 때만 서블릿 생에 주기 중 단 한 번만 호출되며 두 번 다시 호출되지 않는다. - 동적인 웹 페이지 생성(service() 메서드 호출)
스레드가 생성되면 각 스레드에서 service() 메서드가 호출된다. service() 메서드가 호출되면 HTTP 요청 방식이 GET방식일 경우에는 서블릿 클래스의 doGet()메서드가 POST 방식일 경우에는 서블릿 클래스의 doPost() 메서드가 request , response 객체를 인자로 자동으로 호출된다. 따라서 개발자가 실제로 동적인 웹 페이지 생성을 할 수 있는 코드를 만들어야 하는 부분은 doGet()과 doPost() 메서드 부분이다.
※첫 번째 요청에 init()메서드가 호출됐다면 두 번째 요청부터는 service 메서드가 반복적으로 호출되면서 요청을 처리한다. 즉 요청 하나당 service 메서드가 한 번 호출된다. - 결과
doGet()또는 doPost()메서드가 호출되어 사용자의 요청에 따른 동적인 웹 페이지를 생성하면 그 결과물이 담긴 response객체를 웹 컨테이너가 HTTP 응답(Response) 형태로 바꾸어 웹 서버로 전송하게 된다. 그리고 사용이 끝난 request와 response객체를 소멸시키고 스레드를 종료하게 된다. 웹 서버는 전송받은 HTTP 응답 메시지를 사용자의 브라우저로 전송하게 되고 사용자는 브라우저를 통해서 동적으로 생성된 페이지를 받아보게 된다.
📌참고
※스레드 기반 Servlet
이에 대해 설명하기 앞서 프로세스와 스레드에 대한 설명부터 하도록 하겠다.
프로세스 & 스레드
프로세스란 실행 중인 프로그램을 나타내는 말로 디스크에 저장되어 있는 프로그램이 실행되면 그 프로그램은 자신의 고유한 메모리 공간에 프로그램의 코드가 읽힐 것이고 CPU는 메모리에 로드된 프로그램의 명령어를 하나하나 읽어서 실행하게 된다. 우리는 이 실행된 프로그램을 프로세스라 부른다.
Window 같이 멀티태스킹을 지원하는 OS에서는 동시에 실행되고 있는 여러 프로세스에 대하여 CPU와 메모리 자원을 안정되게 분배 할당해주어야 한다. 이러한 역할은 OS의 성능을 결정하는 데 있어서 주요한 요소이다. 예를 들어 한 사용자가 똑같은 프로그램을 두 개 실행시킨다고 생각해보자. OS는 같은 프로그램이더라도 서로 다른 자원을 할당하여 두 개의 다른 프로세스를 만들 것이다. 즉 한 시스템에 수많은 사용자가 접속해 모두 같은 프로그램을 실행하더라도 OS는 일일이 모든 사용자에게 서로 다른 자원을 할당하여 수많은 프로세스를 생성해야 할 것이다. 반면 스레드란 하나의 프로세스 내에서 해당 프로세스가 할당받은 자원을 공유하며 실행되는 독립적인 작업 단위로 프로세스의 자원을 참조할 뿐 새로 할당받을 필요가 없기 때문에 프로세스를 생성하는 것보다 훨씬 빠른 생성 속도를 가진다.
스레드(Thread)기반의 Servlet
웹 관점에서도 살펴보면 같은 페이지에 대해 항상 다른 자원을 할당해야 하므로 자원 관리에 있어서 대단히 비효율적이게 된다. 위 단점을 극복하고자 나온 기술이 스레드(Thread) 기반의 Servlet이다. 웹 환경처럼 같은 페이지에 대해 많은 사용자가 요청을 보낼 경우 서블릿처럼 스레드 기반으로 처리하면 이미 메모리에 생성되어 있는 프로세스(서블릿 인스턴스)의 자원을 참조하기만 하면 되므로 획기적인 성능의 향상을 가져올 수 있다. 물론 하나의 프로세스 내에 무한정 많은 수의 스레드를 생성할 수는 없기 때문에 Servlet 컨테이너가 이러한 스레드 수와 프로세스 수를 적절히 조절한다.
특히 최근 많이 사용되고 있는 디자인 패턴인 MVC 패턴 (Model2) 을 사용할 경우 JSP(View)와 자바 빈즈(Model) 그리고 Servlet(Controller)을 이용해 효율적으로 구현할 수 있다. 따라서 프로젝트의 규모가 커지더라도 View부분과 Model부분의 분업으로 훨씬 더 효율적으로 구현할 수 있다. 또한 자바 빈즈를 사용한 비즈니스 로직을 분리하여 컴포넌트화 할 경우 공통되는 로직의 재사용이 가능하게 되어 생산성이 매우 높아지게 된다.
※웹 서버의 구성
웹 서버는 크게 1. URL 주소의 해석을 맡아주는 HTTP 서버와 2. 서블릿 클래스 또는 JSP 파일의 실행 요청을 처리해주는 웹 컨테이너로 구성된다.
- HTTP 서버
HTTP 서버는 단순히 URL 요청이 들어왔을 경우 그 주소에 미리 매핑되어 있는 컨텐츠(HTML파일이나 이미지 등)를 사용자의 브라우저에 응답 형태로 전송하는 역할을 한다. 하지만 이때 요청된 URL이 서블릿 클래스 또는 JSP 파일일 경우 HTTP 서버는 이를 웹 컨테이너에서 처리하도록 클라이언트의 요청을 넘겨준다. - 웹 컨테이너
웹 컨테이너에서는 요청된 URL에 맞는 미리 설정된 서블릿 클래스 또는 JSP파일을 실행하여 그 결과를 HTTP서버에 넘겨주게 되고 이는 응답 메시지의 형태로 사용자의 브라우저에 전송된다. 즉, 웹 컨테이너란 웹 서버의 내부에서 서블릿 클래스 또는 JSP 파일을 실행하기 위한 실행 환경을 제공하는 역할을 하며 대표적인 웹 컨테이너로서 자카르타 톰캣, 웹로직, Resin 등이 있다.
아래 링크를 참고하면 HTTP 프로토콜과 웹 컨테이너, 서블릿에 관한 내용을 쉽게 이해할 수 있다.
https://yeo-computerclass.tistory.com/212
※GET 방식의 요청 / POST 방식의 요청 간단한 차이
여기서는 간단하게 기술할 것이고 후에 자세히 기술 하도록 하겠다.
HTTP 요청 메시지
= HTTP 메서드 + URL 정보 + 데이터 폼 파라미터
HTTP 요청 메시지는 기본적으로 HTTP 메서드와 접근할 주소(URL) 정보 그리고 서버에 전달할 데이터 폼 파라미터로 구성된다. 이 중 HTTP메서드는 클라이언트가 웹 서버가 해야 할 행동을 정해주는 정보라 할 수 있는데 대표적으로 GET 메서드와 POST 메서드가 있다. 일반적으로 GET메서드를 사용하는 요청 메시지를 GET 방식의 요청, 마찬가지로 POST 방식의 요청이라 한다.
GET 방식의 경우 전송할 파라미터 값들을 시작 라인의 URL 정보에 붙여서 같이 전송하며 파라미터의 길이가 256바이트를 넘을 수 없는 제약이 있지만 본문(body)이 필요 없기 때문에 전송 속도가 POST 방식에 비해 빠르다고 할 수 있다. 따라서 전송해야 할 데이터가 적을 경우에 유용하다.
- GET 방식
메시지 예 : GET /myhome/mpahe.jsp?name='yeo-seung-chul'&email='yeo@tistory.com' HTTP1.1
요청 라인에 전송할 파라미터 값이 확인됨을 볼 수 있다. 추가적으로 GET 방식은 URL 뒤에 ?를 사용하여 파라미터를 표시하며 전송해야 할 파라미터 값이 여러 개인 경우 &를 사용하여 추가한다.
POST 방식은 파라미터 값들을 요청 메시지의 본문(Body)에 담아서 전송하기 때문에 길이의 제약이 없다. 또한 GET 방식의 경우 파라미터가 URL뒤에 붙여서 전송되므로 사용자가 브라우저의 주소 창에 전송되는 파라미터를 실제로 확인할 수 있는데 비해 POST 방식은 파라미터를 사용자가 확인할 수 없으므로 보안상 더 유용한 전송방식이라 볼 수 있다.
- POST 방식
메시지 예 : POST /myhome/mypage.jsp HTTP/1.1
본문(Body) : name='yeo-seung-chul'
전송할 파라미터 값이 본문에 포함되어 있어 보안상 더 유용한 전송 방식임을 확인할 수 있다.
이 부분이 이해가 되지 않는다면 HTTP 프로토콜의 구조를 살펴보는 것이 좋을 거 같다.
https://yeo-computerclass.tistory.com/107
'JSP & Servlet > 개념' 카테고리의 다른 글
[JSP & Servlet] 세션(Session) (0) | 2022.03.25 |
---|---|
[JSP & Servlet] 여러 개 파라미터 값(ex. 배열) 받기 - getParameterValues() (0) | 2022.03.25 |
[JSP] 한글 깨짐 (0) | 2022.03.25 |
[JSP] GET POST 차이 (0) | 2022.03.25 |
[JSP] 이클립스 톰캣(Tomcat) 서버 추가 (0) | 2022.03.25 |