Programming/Computer Science Fundamentals

[JSP] 1. 웹과 자바

Sujin Lee (Daisy) 2021. 9. 17. 17:27

웹 관련 기본용어 

* 웹의 의미 

 - 팀 버너스 리가 제안

 - 인터넷 기반의 정보 공유 서비스

   ㄴ World Wide Web, WWW 또는 W3라고도 함 

   ㄴ 인터넷 상에 분산되어 존재하는 다양한 정보를

       통일된 방법으로 찾아볼 수 있게 하는 정보 서비스 

 

* 인터넷 기반의 전 세계적 정보 공유 공간 

 - 분산된 웹 서버에 존재하는 하이퍼텍스트(hypertext) 문서들이 

   서로 연결된 시스템. 

 

* 하이퍼텍스트 (hypertext)

 - 웹 상에 존재하는 문서 형태로서,

    텍스트 외에 이미지, 동영상 등의 멀티미디어 요소를 포함.

 - 하이퍼링크(hyperlink)를 통해 다른 하이퍼텍스트와 연결된다.

   ㄴ 문서와 문서가 연결된 구조.

 - 웹 브라우저를 이용해서 하이퍼텍스트를 볼 수 있다.

 - HTML로 표현되며, HTTP 프로토콜을 사용하여 전송된다.

 

* W3C

 - World Wide Web Consortium의 약자.

 - 국제 웹 표준화 기구. 

    ㄴHTML, HTTP, XML 등의 웹 관련 기술을 관리함. 

 

* 정적 웹 문서

 - 정적인 텍스트. 문서의 내용 바뀌지 X. 

 - 클라이언트가 서버에게 정적 웹 문서를 요청하면, 

   서버는 해당 문서를 찾아서 전달함.

 - 정적 웹 문서를 요청하면 항상 동일한 결과가 전달됨. 

 - ex) 아래와 같은 HTML 

<HTML>
	<HEAD>
    	<title>쑤의 웹 스터디 노트 :)</title>
	</HEAD>
	<BODY>
    	<h1>방문을 환영합니다</h1>
	</BODY>
</HTML>

 

* 동적 웹 문서

 - 동적 웹 문서를 사용하여 최종 결과가 동적으로 만들어짐. 

    ㄴ 클라이언트 측 처리와 서버 측 처리 방식이 있음.

        ㄴ 클라이언트 측 처리) 

            : 웹서버가 동적인 요소를 결과 문서로 전달할 때, 

              그 문서 안에 포함시켜 클라이언트에 전달. 

              클라이언트는 이 동적인 요소를 받아서 브라우저 상에서 실행해서 결과를 만든다. 

              즉, 클라이언트가 동적인 요소를 받아서 브라우저 상에서 실행, 결과를 만든다. 

         ㄴ 서버 측 처리) 

              : 서버 쪽에서 동적인 프로그래밍 요소를

                서버 쪽에서 다 실행시키고, 결과를 다 만들어서

                최종 결과를 클라이언트에게 보낸다. 

 - JSP는 동적 웹 문서를 작성하는 기술임. 

     ㄴ JSP는 서버 측 처리 동적 웹문서이다. 

 - ex) 아래의 JSP

<%@ page language="java" contentType="text/html; charset=euc-kr"%>
<HTML>
	<HEAD>
		<title> 안녕하세요! :) </title>
	</HEAD>
	<BODY>
    	<p>지금 시간은 : 
        	<% out.print(new java.util.Date()); %>
           입니다. 
		</p>
	</BODY>
</HTML>

 ㄴ 이 JSP 요소들이, 서버 쪽에서 실행되고 결과가 만들어져서, 그 결과를 클라이언트에게 전송한다. 

 

 

 


 

웹 애플리케이션의 실행과 구성 요소 

* 웹 애플리케이션

 - 웹에서 실행되는 응용 프로그램

 

* 웹 애플리케이션의 구분

 - 클라이언트 측 실행/서버 측 실행

 - 컴파일 방식/비컴파일 방식 

    ㄴ 비컴파일 방식 : '인터프리터 방식'이라고도 한다. 

 

 

웹 서비스의 제공과 구성 요소 

1. 웹 클라이언트 

 - 웹 브라우저는 웹 서버에 요청을 보내고 응답 결과를 출력.

 

2. 웹 서버 

 - 클라이언트의 요청을 처리하도록 프로세스를 관리.

 - 요청을 처리한 결과를 클라이언트에 보냄.

 - 정적 웹문서 : 클라이언트가 웹 문서를 요청하면 웹 서버는 그것을 찾아서 보내줌. 그럼 끝. 

    ㄴ 클라이언트 요청 ---> 웹서버 : 정적 웹문서 찾아서 보냄 --> 클라이언트. 

 - 동적 웹문서 : WAS를 거친 후에 웹 서버로 가고, 클라이언트로 간다.

    ㄴ 클라이언트 요청 ---> WAS ---> 웹 서버 ---> 클라이언트.  

    ㄴ 1) 클라이언트측 처리  

        2) 서버측 처리 

 

3. WAS (= 웹 애플리케이션 서버 ⊃ 웹 컨테이너)

 - 웹 애플리케이션의 실행 환경

 - 동적인 웹 서비스를 전담하는 서버. 

 - JSP 프로그램을 실행시키고 결과를 웹 서버에 전달

    ㄴ WAS는 JSP나 서블릿의 실행을 관리한다. 

 - 주기능 : 웹 애플리케이션을 처리해서 동적으로 결과를 만듦.(비즈니스 로직 처리) 

 - 부기능 : 동시성 관리, 보안 제어, 부하 관리 (로드 밸런싱), 장애 처리 등... (포괄적 의미...)

 - 주기능만 --> 웹 컨테이너. 

 - 주기능 + 부기능 --> WAS. 

 - 이 강의에서는 그냥 WAS랑 웹 컨테이너를 혼용해서 쓰겠다 :) 

 

4. 데이터 베이스 

 - 웹 서비스 수행에 필요한 데이터를 저장하고 제공 

 

 

 

 

* 웹 애플리케이션과 실행 위치

클라이언트 측 실행 서버 측 실행 
 - 웹 문서에 동적 요소를 포함시켜 
   클라이언트에 전송
 - 웹 브라우저가 해석하여 페이지를 생성
 - 애플릿, JavaScript, 플래시, Ajax, CSS
 - 보안에 문제 있음 
 - 서버에서 실행되어 
   응답 문서를 동적으로 생성
 - 웹 애플리케이션 서버가 수행한 결과가
    브라우저에 전달됨
 - 서블릿, JSP, ASP, PHP, CGI 방식
 - 서버에 부담이 감 
   ( ∵ 프로그램이 서버에서 실행되니까...)

 

* 웹 애플리케이션의 구현 방식 

컴파일 방식 비컴파일 방식
 - 컴파일 과정을 통해 
   실행 파일이나 바이트 코드가
   만들어져 사용됨 
 - Java, 서블릿, JSP 
 - Perl, C, C++을 이용한 CGI 방식
 - 응답 속도가 빠르다 : 서버 자원을
   효율적으로 활용할 수 있기 때문. 
 - 매 요청마다 스크립트를 해석/실행 
    (중간 코드 만들어지지 X)
 - JavaScript는 클라이언트에서 실행되는
   스크립트 언어 

컴파일 방식

 - ex) JSP --> 서블릿 --> 바이트 코드... 

 

 

<CGI와 WAS>

 - 둘 다 동적 웹 서비스를 담당하는데, 방식이 다르다

 - 요새는 CGI는 사용X. WAS 사용한다. 

 

* CGI 

 - Common Gateway Interface

 - CGI : 웹 서버가 응용 프로그램을 직접 호출

   ---> 클라이언트의 요청이 많아지면 급격히 성능이 저하됨. 

 1) 동적으로 웹 페이지를 실행하기 위한 방식 중 하나.

  - 고급 언어 프로그램(C, C++ 등)을 실행시켜 HTML 코드를 생성한 후 클라이언트에 전달

  - 초기에 많이 사용되었던 기술. 

  - CGI : 웹 서버와 최종 결과를 만들기 위한 프로그램 사이에 정보를 주고 받는 인터페이스 또는 그 규약. 

    --> 그러한 표준에 맞춰 프로그램이 작성됐을 때 그것을 'CGI 스크립트'라고 한다. 

    --> 고급 프로그래밍 언어 사용 가능. 

 2) 클라이언트의 요청이 있으면 해당 프로그램을 실행시키기 위해서 매번 개별 프로세스를 생성해서 처리한다. 

     --> 동일한 CGI를 요청해도, 요청의 개수만큼 프로세스를 생성한다

     --> (클라이언트의 요청이 많아지면) 웹 서버에 부하를 준다 

     --> 성능저하. 

  - 이러한 문제점 때문에 요즘에는 CGI 쓰지 않고 WAS 쓴다. 

 3) CGI 스크립트 예시)  

printf("<html>\n\n<head><title> CGI 문서 </title></head/\n\n");
printf("<body>\n");
printf("<h2> 제 블로그를 방문해 주셔서 감사합니다. </h2>");
...
printf("</body>\n\n</html>");

 4) 기타 

  - CGI 스크립트는 옛날에 쓰였지만 요즘은 잘 사용되지 않음.

 - 보통 .cgi cgi-bin 이라는 디렉토리 아래에 .cgi  라는 확장자를 가진다. 

 

 

 

* WAS 

 - Web Application Server

 - WAS : 동적 웹 서비스를 담당하는 서버. 

    ㄴ 스레드 방식을 사용함. 

    ㄴ 웹 응용 프로그램을 실행시킬 때, 웹 서버가 처리하지 않고, 별도의 WAS를 두어서 

        WAS에게 처리를 위임한다. 

1) 웹 애플리케이션을 실행하고 관리하는 별도의 전담 프로그램 

 - CGI와 WAS 둘 다 동적으로 웹 페이지를 만드는 방식이지만,

   아래의 이유로 요새는 WAS를 사용한다.  

 - 모든 요청에 대해 매번 프로세스를 생성하지 않고

   하나의 자바 가상 기계(JVM) 내에서 수행. 

 - 요청을 처리하기 위해 스레드를 생성함

   ㄴ 상세설명) 요청을 처리하기 위해서 그 하나의 프로세스 안에서

                       스레드를 만들어서 처리한다. 

                       즉, 프로세스를 여러개 만드는 게 아니라 

                       하나의 프로세스 안에서,

                       요청이 들어올 때마다 그 하나의 프로세스 안에서 스레드로 처리한다. 

                        --> CGI에 비해 효율적. 

                               요청이 많아지더라도 성능이 급격히 저하되지 않는다. 

2) 웹 페이지 생성 외에도 많은 기능을 수행함.

 - API 제공, 부하 균형(load balancing), 고장 조치, 동시성 제어, 보안 제어 등등. 

3) 기타

 -  Java 기술을 이용해서 존재

 - 경우에 따라서는 닷넷을 지원하는 WAS도 있다. 

 

 

 

* 웹 서버  (≒ HTTP 서버) 

1) 클라이언트로부터 요청을 받고 결과를 전달하는 기능

 - Apache HTTP Server, IIS, Nginx(엔진엑스)

   ㄴ Apache HTTP Server : 

        ㄴ 보통 줄여서 'Apache'라고 부르는 애의 정식 명칭.

        ㄴ 아파치 소프트웨어 재단(ASF)에서 만든 무료 공개 소프트웨어. 

    ㄴ IIS : MS에서 만들었음. --> Windows에서만 동작함. 

    ㄴ Nginx :

        ㄴ 러시아의 이고르 시쇼브가 만들었음. 

        ㄴ 최근 각광받고 있음. 얘도 무료 공개 소프트웨어. 

2) HTTP 프로토콜을 사용하여 클라이언트와 통신함

 ---> 웹 서버를 HTTP 서버라고 함.

         ㄴ 이 둘이 정확히 같은 개념은 아니지만, 이 강의에서는 '웹서버=HTTP서버' 라고 치자. 

 - HTTP는 클라이언트와 웹 서버 간 웹 문서를 전송하기 위한 통신 규약임. 

3) 웹 서버의 구체적 기능

 - 클라이언트가 요청한 웹 문서를 찾아 전달

 - 클라이언트 요청에 대한 기본적 사용자 인증을 처리

 - 문제가 있으면 정해진 코드 값으로 응답

 - 프로그램 실행 요청이 있으면 처리 후 그 결과를 전달 

 

 

* WAS (웹 애플리케이션 서버) 

 - 서버의 성능을 개선하기 위해 웹 서버의 기능을 분리

 - 웹 서비스의 처리를 위해 동적 페이지를 만들거나 비즈니스 로직을 처리 

    : 이것만 하면 '웹 컨테이너'임. 

      부가기능까지 해야 'WAS'임.

      하지만 우리는 이 강의에서 '웹 컨테이너'와 'WAS'를 같은 거라고 치겠다. 

 

 


JSP와 웹 컨테이너  

 

서블릿

 1) Server + Applet의 합성어.

      ㄴ Applet : 클라이언트에서 동작하는 자바 프로그램을 '애플릿'이라고 한다. 

          ---> 서버 쪽에서 동작하는 자바 프로그램(클래스)을 '서블릿'이라고 하는 것! :) 

   - 웹 페이지를 동적으로 생성하기 위한 서버 측 Java 클래스 

 - Java 언어에 기초한 웹 프로그램 개발 기술

     ㄴ 정확히는, Java로 서버 쪽에서 동작하는 웹 프로그램을 만들기 위한 규약을 일컫는 것.

     ㄴ 그 규약에 따라서 개발한 자바 클래스를 우리가 '서블릿' 또는 '서블릿 클래스'라고 이야기한다.  

 2) Java 언어로 서블릿 클래스를 만들고, 컴파일된 바이트 코드를 서버에 탑재하여 웹 서비스를 제공.

   - 소스를 수정하면 다시 컴파일해서 서버에 탑재해야함. 

      ---> 번거로움 ㅠㅠ 

      ---> JSP의 등장 : 

               ㄴ JSP는 소스가 수정되면 WAS가 자동으로 컴파일 해준다! :) 

                   (WAS가 자동으로 바이트 코드를 만들어줌) 

                   (개발자가 직접 일일히 컴파일 할 필요 X!) 

                <---> Servlet : 

                           ㄴ 만약 서블릿으로 코딩했다면, 서블릿 소스가 수정되면

                               개발자가 직접 컴파일 다시 해야한다. 

   - 서블릿 클래스(Java) -- 컴파일 ---> 바이트 코드 -- 서버에 탑재 --> WAS ---> 웹 서버 ---> 서비스. 

 3) Servlet 예시 

public class HelloServlet extends HttpServlet{

	public void doGet(HttpServletRequest request, HttpServlet Response response)
    	throws ServletException, IOException{
        
        response.setContentType("text/html; charset=EUC-KR");
        java.io.PrintWriter out = response.getWriter();
        out.println("<HTML> <HEAD> <TITLE> 로그인 </TITLE> </HEAD>");
        out.println("<BODY> <H2> 헬로 서블릿 </H2>");
        out.println("오늘의 날짜와 시간은 : " + new java.util.Date());
        out.println("</BODY> </HTML>");
        }
}

    ㄴ HelloServlet 이라는 자바 서블릿 클래스를 작성. 

 

JSP 예시 : JSP로 위와 동일한 프로그램을 만들 경우 

<%@ page language="java" contentType="text/html; charset=euc-kr"%>
<HTML>
	<HEAD>
		<title> 헬로 JSP </title>
	</HEAD>
	<BODY>
		<p> 오늘의 날짜와 시간은 : 
        	<% out.print(new java.util.Date()); %>
		</p>
	</BODY>
</HTML>

 

 

JSP

1) 서블릿 대신 사용할 수 있는 스크립트 형식의 언어.

 - HTML 내에 삽입됨.

2) JSP는 서블릿으로 변환됨

 - WAS가 자동으로 JSP를 변환하고 컴파일하여 웹 서비스를 제공함. 

    ㄴ JSP --- WAS ---> Servlet

3) Java EE를 구성하는 기술 중의 하나. 

 - EE(엔터프라이즈 에디션) : SE(스탠다드 에디션)의 확장판.

   복잡한 거 구현 시 사용. ex) 전산용, 은행 프로그램 개발 등...

4) 특징

 - 스크립트 언어로 HTML에 삽입됨

 - Java 언어의 특성을 활용 

 - 표현 언어, 표현식, 액션 태그 등의 스크립트적 요소를 제공

 - 다양한 개발 환경이 오픈 소스로 제공됨

   ㄴ JSP는 오픈 소스 형태로 운영되므로 다양한 기술이 지원됨

 - JSP 기술은 플랫폼에 독립적 

   ㄴ 반면에 .NET 기술은 개발과 운용 환경에 제약이 있음 (Windows에서만 사용 가능) 

5) JSP의 처리 과정

 - ※ 변환 = 번역 = 번안 

 

 

웹 컨테이너 (≒ 서블렛 컨테이너)

 - 이 수업에서는 '웹 컨테이너'와 'WAS'를 혼용해서 쓰겠다. 

1) 웹 컴포넌트(ex. JSP, Servlet 등)를 저장하고 서블릿의 생명주기를 관리

 - 클라이언트의 서블릿 요청을 실행시키는 역할

2) 서블릿 컨테이너 라고도 함

     ㄴ 사실 완전히 똑같은건 아닌데, 이 강의에서는 그냥 같은 거라고 치자.. :) 

 - Java로 구현된 서블릿 엔진 (서블릿 실행 환경)

 - JSP를 서블릿으로 변환하는 기능을 포함 --> JSP 컨테이너 기능을 가진다. 

3) Tomcat, WildFly, WebLogic, WebSphere, JBoss 등 

4) 웹 서버에서 서블릿이 실행되기 위한 환경

 - 웹 서버, 자바 실행 환경(JDK), 서블릿 컨테이너(ex. Tomcat)

5) JSP 컨테이너

 - JSP 페이지를 서블릿 프로그램으로 변환

 - 대부분의 서블릿 컨테이너는 JSP 컨테이너 기능을 포함함

 - JSP 컨테이너 자체가 서블릿으로 구현되어 있음

    ㄴ 서블릿 컨테이너에 의해 실행됨 

 

 


HTTP 프로토콜

 

HTTP 프로토콜의 이해 

1) HTTP 프로토콜의 정의

 - 웹 서버와 클라이언트가 통신하는 규약

   ㄴ TCP 프로토콜에 기초한 애플리케이션 계층 프로토콜(=응용 계층 프로토콜)

2) Connection oriented & Stateless 특성

 - Connection oriented : 클라이언트가 요청을 보내려면 먼저 서버와 네트워크 접속을 해야 한다. 

    ㄴ 네트워크 접속 : TCP 접속. 정확히는, 서버의 어떤 특정 포트에 대해 그 접속 연결이 처리되어야 한다. 

 - Stateless : 서버가 응답한 후에 서버는 클라이언트의 상태를 유지하지 X

 - 웹 서버의 부담이 줄어들지만, 상태 관리를 위해서 쿠키세션이 필요하다.

3) HTTP 요청과 응답 절차

 - 연결 설정, 요청 메시지 전송, 응답 메시지 전송, 연결 끊기 

 

 

HTTP 요청 메시지 

구조 

1. 시작라인 

1) 시작 라인 : 요청방식, URI, 버전 번호

2) 예시

GET /index.html HTTP/1.1  <-- 시작라인 
Host: www.example.com <-- 요청 헤더
....

 - GET : 웹 서버에게 요청 대상에 대해 처리 방식을 지정 

 - /index.html : 서버에 존재하는 파일의 URI

 - HTTP/1.1 : HTTP의 버전 

 

2. 요청 헤더 

 - 한 라인에 하나씩 헤더 정보를 기술

 - 각 라인은 "헤더필드이름:값" 형식으로 구성됨

 - 요청 헤더의 끝에 공백 라인을 둠 

 - 요청 헤더 예시) 

 - 각각의 헤더필드 이름과 기능 자세히 알 필요X 

  --> 궁금한면 W3C 사이트 가서 보면 된다. 

 - 요청헤더 : 클라이언트에서 서버 쪽으로 가는 데이터. 

    ㄴ 클라이언트(브라우저)가 서버한테 요청을 보내면서 요청 헤더를 보낼 수 있음 

 

3. 요청 메시지의 몸체 

 - POST 요청 방식에서만 의미 있음

   ㄴ GET 방식의 요청일 때는 요청 메시지 몸체가 쓰이지 않는다. 

 - HTML 폼에서 작성한 데이터를 POST 방식으로 전송할 때 사용됨 

 

 

 

HTTP 응답 메시지 

구조

 

1. 시작라인

 - 구성 : HTTP 버전, 서버의 응답코드, 설명 

 - 서버의 응답 코드 및 뜻 

200 OK - 클라이언트 요청이 성공적으로 끝남
400 Bad Request - 잘못된 요청 
401 Unauthorized - 인증 오류 
403 Forbidden - 사용자 허가 모드 오류 
404 Not Found - 요청한 문서가 존재하지 않음 
405 Method Not Allowed - 요청한 방식을 지원하지 않음 
500 Internal Server Error - 서버에서의 실행 오류 
503 Server Unavailable - 일시적으로 요청을 처리할 수 없음 

  ㄴ 400번대 : 요청에 문제가 있다. 

  ㄴ 500번대 : 서버 쪽에 문제가 있다.  

 

2. 응답헤더 

 - 응답헤더 : 서버에서 클라이언트 쪽으로 가는 데이터. 

     ㄴ 서버가 어떤 데이터를 클라이언트쪽으로 보내면서, 

         내가 이런 데이터 정보를 줄 테니까 브라우저가 이 응답 헤더를 가지고 

         내가 보낸 이 응답 몸체를 브라우저로 화면 출력 시 활용해라. 

    <--> 요청헤더 : 클라이언트에서 서버 쪽으로 가는 데이터.

             ㄴ 클라이언트(브라우저)가 서버한테 요청을 보내면서 요청 헤더를 보낼 수 있음 

 

3. 응답 몸체 

 - 브라우저가 받아서 화면 상에 출력하는 내용. 

 

4. 응답 메시지 예) 

 

 


참고글

[웹 프로그래밍] 정적 웹 문서와 동적 웹 문서의 차이점 

[Servlet] 웹서버 vs 애플리케이션 서버 vs 서블릿 컨테이너

반응형