# JSP 동작원리와 내부객체
정적 페이지 동적으로 만드는 JSP!
HTML은 단순히 정적페이지만을 생성하지만 JSP는 HTML태그와 함께 웹페이지를 동적으로 만들어줍니다.
<a name="web-service"></a>
---
### 웹서비스 동작원리
JSP의 원리를 알기위해서는 기본적인 웹서비스의 구조와 원리를 알아야합니다.
다들 웹서핑 해보셨지요? 보통 웹브라우저를 실행후 원하는 사이트의 주소를 적어서 해당 페이지로 이동하실 겁니다. 또는 구글, 네이버, 다음 등의 대형 포털에서 원하는 정보를 찾아 이동하셨을 겁니다. 당연하게만 사용해오던 웹서비스.. 어떠한 원리로 동작을 하는 것일까요?
웹서비스는 [클라이언트-서버 구조](https://goo.gl/uaJJ10)로 구성되어있습니다. **서버**는 웹서비스를 제공하는 컴퓨터이고, **클라이언트**는 서비스를 이용하는 사용자(또는 단말기)입니다. 웹서비스는 이러한 구조로 요청과 응답이라는 메커니즘을 통해 동작합니다.
![Imgur](https://i.imgur.com/kvuq6xA.png)
링크를 클릭하면 다른 페이지로 넘어가는 경우를 예를 들면, 링크를 클릭한 행위가 **요청**이 되고 새로운 페이지가 열려지는 것은 **응답**이 되는 것입니다.
<a name="jsp-tag"></a>
---
### JSP 태그
HTML만으로 작성된 웹페이지는 정적입니다. 몇 번을 보아도 같은 내용을 출력합니다. 우리는 동적인 페이지를 원합니다. 이를 위해 JSP에서는 **태그**와 **내부객체**를 제공합니다. JSP태그는 정적인 HTML문서 사이에 기술되어 서버측에서 재해석 및 변환됩니다. 그결과 다양한 변환이 제공되어 동적인 페이지가 생성이 됩니다. JSP 태그중 `스크립트릿`의 형식은 아래와 같습니다.
```
<% .. 이곳에 JSP 문법을 적어줍니다 .. %>
```
다음은 JSP 내부객체 `out`을 통한 출력예제입니다.
```
<% out.println("Hello JSP!"); %>
```
JSP는 이 외에도 여러가지 태그들을 제공합니다.
| 종 류 | 사 용 용 도 | 형 식 |
|:-------|:------------------------|:-------------------------:|
| 지 시 자 | 페이지 속성 지정 | <%@ ... %> |
| 주 석 | 페이지 설명 작성 | <%-- ... --%> |
| 선 언 | 변수/메쏘드 선언 | <%! ... %> |
| 표 현 식 | 결과를 문자열로 출력 | <%= ... %> |
| 스크립트릿 | 자바 코드를 기술함 | <% ... %> |
| 액션 태그 | 자바빈 또는 애플릿 모듈과 연동| ⟨jsp:action⟩ ⟨/jsp:Action⟩ |
<a name="jsp-principle"></a>
---
### JSP 동작원리
JSP 서버는 (~~클라이언트로부터 요청받은~~) JSP 페이지를 순수한 HTML 페이지로 변환하여 줍니다. 이 과정에서 jsp 태그들은 추출되어 재해석되어지고, 결과적으로 순수한 HTML파일이 만들어지게 됩니다.
![Imgur](https://i.imgur.com/kV314tG.png)
예제를 작성하며 학습해 봅시다. 이클립스를 통해 Dynamic Web Project를 생성해줍시다. 프로젝트 생성법을 잘 모르겠다면 이전 수업을 참고하여주세요. (링크: [프로젝트 생성 및 실행](http://cloudstudying.kr/lectures/57#hello-jsp))
![Imgur](https://i.imgur.com/xGF01ji.png)
다음으로 `WebContent` 폴더에 `welcome.jsp` 파일을 생성하고 아래와 같이 작성해줍니다.
`welcome.jsp`
```
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>JSP 동작원리</title>
</head>
<body>
<h1>JSP 태그와 동작원리</h1>
<% out.println("Hello JSP!"); %>
</body>
</html>
```
실행 결과는 아래와 같습니다.
![Imgur](https://i.imgur.com/IZdVSIs.png)
해당 페이지의 소스보기를 해봅시다.
![Imgur](https://i.imgur.com/4VvqJWZ.png)
`<% out.println("Hello JSP!"); %>`코드가 텍스트로 변환되어 HTML파일이 만들어 졌음을 알 수 있습니다.
여기에 for문을 추가해볼까요??
`welcome.jsp`
```
...
<body>
<h1>JSP 태그와 동작원리</h1>
<% for (int i = 0; i < 5; i++) { %>
<% out.println("Hello JSP!"); %>
<% } %>
</body>
</html>
```
![Imgur](https://i.imgur.com/iDuZ278.png)
for문이 잘 동작하는군요.. 다시한번 웹페이지의 소스코드를 확인해봅시다.
![Imgur](https://i.imgur.com/h73IF4z.png)
클라이언트의 웹브라우저 소스코드를 확인하면 JSP 태그 내용들이 HTML 텍스트로 변환되었음을 알 수 있습니다.
<a name="jsp-inner-instance"></a>
---
### JSP 내부객체
내부객체란 JSP상에서 객체 생성과정 없이 바로 사용할 수 있는 객체입니다. 앞서 코드의 예시로 `<% out.println(); %>`을 보면, `out`객체를 바로 사용하였음을 알 수 있습니다. 내부객체는 총 9개가 있습니다.
+ 입출력 관련 객체
- request
- response
- out
+ 서블릿 관련 객체
- page
- config
+ 외부환경 관련 객체
- session
- application
- pageContext
+ 예외 관련 객체
- exception
<a name="practice-elements"></a>
---
### 실습: JSP 구성요소를 확인하는 간단 실습
---
### 핵심 키워드
+ [웹서비스 동작원리](#web-service)
+ [JSP 태그](#jsp-tag)
+ [JSP 동작원리](#jsp-principle)
+ [JSP 내부객체](#jsp-inner-instance)
+ [실습: JSP 구성요소](#practice-elements)
---
### Next..