Postman
Postman 사용하는 방법
HTTP API 테스트 도구
웹 개발에서 사용하는 대표적인 클라이언트는 브라우저입니다. 브라우저는 서버에 HTTP 요청을 보낼 수 있는 훌륭한 도구이지만, 주로 웹 페이지를 받아오는 GET 요청에 사용합니다. 브라우저의 주소창에 URL을 입력하면, 해당 URL의 root-endpoint로 GET 요청을 보냅니다. 테스트를 위해 GET이 아닌 다른 요청을 보내려면, 개발자 도구의 콘솔 창에서 내장 함수 fetch를 사용해야 합니다.
매번 코드를 작성할 수는 있습니다. 그러나 테스트를 위해 매번 코드를 작성하는 건 상당히 번거로운 작업입니다. 매번 코드를 작성하는 것 대신에, HTTP 요청을 테스트할 수 있는 다양한 도구가 있습니다. 많은 API가 HTTP 프로토콜을 이용하므로, API 테스트 도구라고 부릅니다. 이러한 API 테스트 도구는 클라이언트 입장에서 서버 API를 테스트하거나, API를 만드는 과정에서도 매우 유용합니다.
HTTP API 테스트 도구 (CLI)
- curl (대부분의 리눅스 환경에 내장되어 있습니다.)
- wuzz
HTTP API 테스트 도구 (GUI)
이번 콘텐츠에서는 가장 사용하기 쉬운 Postman을 소개합니다.
Postman 사용하기
먼저, 이미 만들어져 있는 API 서버가 주어지는 경우를 생각해 보겠습니다. HTTP로 소통하기 위해서는 API 서버의 endpoint가 URL로 주어져야 합니다. 예를 들어, 다음과 같은 API 문서가 있다고 가정하겠습니다.
GET 요청하기
URL
http://3.36.72.17:3000/
메시지 조회
Request
GET /kimcoding/messages
[요청] kimcoding이 작성한 모든 메시지를 조회합니다.
추가적인 파라미터를 사용할 수 있습니다.
Response
응답은 다음과 같은 JSON 형식입니다.
[
{
"id": 1,
"username": "김코딩",
"text": "안녕하세요",
"roomname": "로비",
"date": "2021-04-02 12:00:00"
}
// ...여러 개의 메시지
]
[데이터] Request에 따른 Response 예시
메시지에서 사용하는 속성은 다음과 같습니다.
Postman 화면 보기
다음 그림을 보고 포스트맨의 화면 구성을 확인합니다.
[그림] 포스트맨 화면 구성
- 새로운 탭 오픈
- 요청/응답을 여러 개 확인할 수 있습니다.
- HTTP 메서드 선택
- GET, POST, DELETE 등과 같은 메서드 중 하나를 선택합니다.
- API 문서상 GET 메서드를 사용하므로, GET으로 선택합니다.
- GET, POST, DELETE 등과 같은 메서드 중 하나를 선택합니다.
- URL 입력 창
- URL과 Endpoint를 입력합니다.
- API 문서에 따르면, http://3.36.72.17:3000/kimcoding/messages와 같이 입력하면 됩니다.
- URL과 Endpoint를 입력합니다.
- HTTP 요청 버튼
- 요청을 보냅니다.
- HTTP 요청 시 설정할 수 있는 각종 옵션
- 추가적인 파라미터나, 요청 본문(body)을 추가할 수 있습니다.
- API 문서에서 확인할 수 있듯이, roomname이라는 파라미터를 사용할 수 있습니다. 필수는 아니지만, 파라미터를 사용하려면 Params 탭의 KEY, VALUE에 각각 roomname과 필요한 값을 입력합니다.
- 추가적인 파라미터나, 요청 본문(body)을 추가할 수 있습니다.
- HTTP 응답 화면
- 요청을 보낸 후 응답을 확인하세요.
POST 요청하기
GET 요청은 브라우저로도 충분히 테스트할 수 있습니다. POST 요청은 GET 요청과 다르게 **본문(body)**를 포함하는 경우가 많습니다.
본문을 설정하는 방법은, 위 그림에서 (5) 번 - HTTP 요청 설정 화면에서 본문을 입력하면 됩니다. POST를 사용하는 API 문서를 먼저 확인해 봅시다.
URL
http://3.36.72.17:3000/
메시지 추가
Request
POST /kimcoding/messages
[요청] kimcoding이 새로운 message를 작성합니다.
요청 본문에는 다음의 내용을 반드시 포함해야 합니다.
- 요청 형식: JSON
<center>
Response
응답은 다음과 같은 JSON 형식입니다.
{
"id": 5
}
[데이터] Request에 따른 Response 예시
id는 숫자 형식이며, 새로 생성된 메시지의 고유한 ID 값입니다.
다음 그림을 참고하여 POST 요청에 본문을 함께 보냅니다.
[그림] POSTMAN에서 새로운 메시지를 본문에 담아 POST 요청을 보내는 화면
- 본문의 형식 선택 (1)
- JSON 형식으로 보낼 때에는, raw를 선택합니다.
- 본문의 형식 선택 (2)
- 보낼 형식에 맞게 정확한 타입을 선택합니다.
- JSON 형식으로 보낼 때에는, JSON을 선택합니다.
- 앞서 1번 및 2번 과정은 HTTP 요청 헤더에 다음과 같이 작성하는 것과 동일합니다.
Content-Type: application/json
- 보낼 형식에 맞게 정확한 타입을 선택합니다.
- 본문 내용
- 본문을 입력합니다. 앞서 JSON을 선택했으므로, 유효한 JSON을 적어주어야 합니다.
- API 문서에 따르면 username, text, roomname을 형식에 맞게 적어주어야 합니다.
- 본문을 입력합니다. 앞서 JSON을 선택했으므로, 유효한 JSON을 적어주어야 합니다.
모든 요청 본문 입력이 완료되었다면, 요청을 보냅니다. URL과 Endpoint, 그리고 HTTP 메서드를 정확하게 입력했는지 한 번 더 확인하세요!
응답 살펴보기
한 번에 응답을 확인할 수 있다면 매우 기쁘겠지만, 그렇지 않을 수도 있습니다. 다음과 같은 상황이 발생할 수 있습니다.
Q. 요청이 끝나지 않아요!
일반적으로 서버가 요청에 대한 응답을 하지 않는 경우, 요청이 끝나지 않습니다. 이것은 서버의 문제입니다. 만약 여러분이 서버를 만드는 중이라면, 응답 처리를 했는지 확인해 보세요! 이 경우에는 timeout이라는 응답을 받게 됩니다.
Q. 기대했던 응답이 오지 않아요!
결과에 아무것도 나오지 않거나, 기대했던 값이 나오지 않나요? HTTP 응답 코드를 확인해 보세요!
[그림] POSTMAN에서 응답의 상태코드를 확인할 수 있습니다.
위 그림의 우측 상단에 HTTP 응답 코드가 표시됩니다. 400 Bad Request라고 되어 있다면, 잘못된 요청을 한 경우입니다.
무엇이든지 결과가 나왔다면, 그 결과를 잘 읽어보세요. 문제 해결의 실마리를 찾을 수 있습니다.
실습 / Postman으로 API 테스팅하기
Getting Started
1. 가입 및 설치
Postman에 회원가입을 한 후, 프로그램을 설치합니다.
2. 환경 설정
- Postman을 설치하면 다음과 같은 환경을 마주하게 됩니다. Workspaces에서 My Workspace를 클릭한 후 +를 눌러 테스팅을 시작합니다. 기존에 사용한 적이 있거나, 3번째 이미지로 시작된다면 바로 테스트를 시작하세요.
[그림] POSTMAN 실행화면 1
[그림] POSTMAN 실행화면 2
[그림] POSTMAN 실행화면 3
3. 테스팅 시작
- Postman을 활용하여 HTTP 요청을 합니다.
실습 / Postman으로 날씨 받아오기
Postman with Open API
- Open Weather Map의 API Docs를 보고 Open API를 사용하여 서울(혹은 거주 지역)의 날씨를 요청하고, 응답을 확인합니다.
Getting Started
1. 접속
- 먼저 https://openweathermap.org/ 에 접속합니다.
2. 로그인
- 로그인합니다.
- 아이디가 없다면, 회원가입 후 로그인합니다.
3. 인증
- 회원가입 후 메일 주소로 인증 메일을 받고, 인증 절차를 진행합니다.
4. API 발급
- 로그인 후에 다음과 같이 API Keys 탭을 누르시면 기본 Default API 키가 발급된 것을 확인할 수 있습니다.
[그림] Open Weather Map의 API Key 예시
위 그림에서 확인할 수 있는 API Key는 OpenWeather에서 기본으로 제공합니다.
추가로 키를 발급하고 싶다면 Create key에 새로 발급할 API Key 이름을 추가해 Generate을 누르면 됩니다.
5. 원하는 API 탐색
- 상단 내비게이션 바의 API를 클릭하면, 사용할 수 있는 API 리스트를 확인할 수 있습니다.
[그림] 내비게이션 바에서 API 탭을 선택합니다.
Current Weather Data 카드에 있는 API Doc을 눌러 문서를 확인할 수 있습니다.
[그림] API doc 버튼을 눌러 API 문서를 확인할 수 있습니다.
'By city ID'라는 소제목의 글을 보면, 다음과 같이 URI를 확인할 수 있습니다.
[그림] 요청을 보낼 URI를 확인할 수 있습니다.
api.openweathermap.org/data/2.5/weather?id={city id}&appid={your api key}
[요청] 'By city ID'에서는 URI를 제공합니다
주어진 URI와 발급받은 API 키로 날씨 데이터에 접근할 수 있습니다. 중괄호 안에 있는 city id에는 OpenWeather에서 도시마다 부여한 ID 중 하나를 입력할 수 있습니다. your api key에는 발급받은 API Key를 입력합니다. 서울의 city id는 1835848입니다.
6. API 호출
6.1. URI로 확인
데이터를 정상적으로 받아올 수 있는지, URI는 작동을 하는지 확인하기 위해 브라우저에 다음과 같이 입력합니다.
api.openweathermap.org/data/2.5/weather?id=1835848&appid=fbef67d755daba1dcdb167895f17b25c
[요청] 'city id'에 서울의 id를, 'your api key'에 발급받은 api key를 입력하고, 브라우저의 검색창에 입력합니다.
다음과 같은 결과가 나타난다면, 데이터를 잘 받고 있는 겁니다.
[그림] 브라우저의 검색창에 요청 URI를 입력한 결과
브라우저에서 JSON 형식의 데이터를 정리해서 보여주는 기능을 사용하면, 다음과 같이 구조적으로 데이터를 확인할 수 있습니다. 여기에서 사용된 기능 이름은 JSON Viewer입니다.
[그림] 크롬의 확장 프로그램 JSON Viewer를 설치하면, JSON 데이터 타입에 알맞은 형식으로 데이터를 확인할 수 있습니다.
6.2. Postman으로 확인
- Postman으로 날씨 데이터를 받아옵니다. URI로 확인한 데이터와 같다면 성공입니다.
데이터가 보이지 않나요?
이 API를 사용하기 위해 회원가입을 진행한 경우, 정상적인 이용을 위해 조금의 시간이 필요합니다. API 응답을 받아볼 수 없고, 30분 ~ 2시간 정도의 시간이 지난 후 다시 시도하세요.
시작하기
이번 챕터는 Postman으로 API를 직접 테스트합니다.
REST API 문서를 읽는 법과 요청을 사용하는 법, message states Server의 API 문서까지 살펴보았습니다. 이 경험을 참고하여 HTTP 요청을 보내고 결과를 확인하세요.
Bare minimum Requirements
- Open Weather Map에 날씨를 요청(GET)하고, 응답을 확인합니다.
- HTTP 응답 코드(Status code)와 응답이 어떤 방식으로 나오는지 직접 확인합니다.
Web Backend Base Knowledge
자바 웹 프레임워크의 역사
자바 웹 프레임워크의 역사를 설명하기 위해서는 먼저 서블릿과 JSP를 알아야 합니다.
서블릿(Servlet)
- 서블릿은 자바로 웹 애플리케이션을 만드는 기술 중 하나입니다.
- 서블릿은 웹 서버에서 실행되는 자바 클래스로, HTTP 요청을 처리하고, 동적인 웹 페이지를 생성하는 기술입니다.
- 서블릿은 자바 표준 API인 Servlet API를 제공합니다.
- 단점: 서블릿의 기반이 자바 클래스라서 자바코드와 HTML코드를 같이 쓰는데 HTML코드의 작성이 너무 번거롭고 힘들다.
- 자바코드 베이스 + HTML 자바스타일로 삽입
JSP(Java Server Pages)
- JSP는 HTML 문서 내부에 자바 코드를 삽입하여 웹 페이지를 동적으로 생성하는 기술입니다.
- JSP는 자바 코드를 일반 텍스트와 함께 작성하며, 서블릿으로 변환되어 웹 애플리케이션에서 실행됩니다.
- JSP는 자바 표준 API인 JSP API를 제공합니다.
- HTML 코드 베이스 + 자바코드 삽입
자바 웹 프레임워크의 역사
- 1997년 - 자바 서블릿(Servlet)이 처음 등장했습니다. 이후 자바 웹 개발의 패러다임이 서블릿 중심으로 바뀌었습니다.
- 1999년 - 자바 서버 페이지(JSP)가 등장했습니다. JSP는 서블릿의 확장 기술로, HTML 문서 안에 자바 코드를 삽입할 수 있는 기능을 제공합니다.
- 2001년 - 스트러츠(Struts) 프레임워크가 등장했습니다. 스트러츠는 MVC(Model-View-Controller) 아키텍처를 기반으로 한 자바 웹 프레임워크입니다.
- 2004년 - 스프링(Spring) 프레임워크가 등장했습니다. 스프링은 자바 기반의 엔터프라이즈 애플리케이션 개발을 위한 오픈소스 프레임워크입니다.
- 서블릿과 JSP를 직접 다루는 것은 개발자들에게 부담스러운 작업이었습니다. 이에 따라 2000년대 중반에는 Struts, Spring 등의 프레임워크가 등장하면서 개발자들은 이를 활용하여 더욱 쉽게 웹 애플리케이션을 개발할 수 있게 되었습니다.
- Struts는 2000년대 초에 개발된 프레임워크로, Model 2 아키텍처를 기반으로 하고 있습니다. 이후 Spring이 2004년에 등장하면서 많은 개발자들이 Spring을 사용하게 되었고, 현재까지도 많이 사용되는 대표적인 자바 웹 프레임워크 중 하나입니다.
- Spring은 DI(Dependency Injection)와 AOP(Aspect-Oriented Programming) 등의 기능을 제공하여 개발자들이 더욱 편리하게 웹 애플리케이션을 개발할 수 있도록 도와주었습니다.
MVC 아키텍처
https://gmlwjd9405.github.io/images/web/servlet-jsp-model2.png
서블릿(Servlet)
서블릿이란?
웹 페이지를 자바 언어로만 구성한다고 생각하면 된다.
JSP 파일도 웹 서버 내에서 Servlet으로 변환되어 실행된다.
자동 변환되는 코드를 사용해도 되지만, 직접 Servlet을 작성하는 것 또한 가능하다.
서블릿 맵핑 (Servlet Mapping)
자바 클래스로 요청을 받아 처리할 수 있어야 하기 때문에
지정된 url을 통해 맵핑 처리를 진행해야 한다.
맵핑한 url로 요청이 들어왔을 때, 특정 서블릿 객체를 생성해서 컴파일을 진행하고
요청에 대한 응답을 보내주는 방식을 사용한다.
또한 서버 내부 경로가 노출되어 보안에 위험이 생기는 것을 방지해 주기도 한다.
URL 맵핑 방법 두가지
웹 서버의 전반적인 설정을 담당하는 web.xml 파일에 직접 등록하는 방식이다. 서블릿 클래스를 먼저 등록하고, 해당 서블릿이 어떤 url에 동작하게 할 지를 맵핑하는 방식.
서블릿의 기본 구조
서블릿은 HttpServlet 클래스를 상속받아 구현됩니다. 주요 메서드는 다음과 같습니다:
- doGet(HttpServletRequest request, HttpServletResponse response): GET 요청을 처리합니다.
- doPost(HttpServletRequest request, HttpServletResponse response): POST 요청을 처리합니다.
예제
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class HelloWorldServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<h1>Hello, World!</h1>");
}
}
서블릿 맵핑
서블릿 맵핑은 특정 URL 요청이 해당 서블릿으로 전달되도록 설정하는 과정입니다. 이는 주로 web.xml 파일을 통해 설정하거나 어노테이션을 사용하여 지정할 수 있습니다.
web.xml을 통한 설정
<servlet>
<servlet-name>HelloWorldServlet</servlet-name>
<servlet-class>HelloWorldServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloWorldServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
어노테이션을 통한 설정
@WebServlet("/hello")
public class HelloWorldServlet extends HttpServlet {
// doGet 메서드 구현
}
서블릿 생명주기
서블릿의 생명주기는 다음과 같습니다:
- 로드와 초기화: 서블릿이 처음 호출될 때 init() 메서드가 실행됩니다.
- 요청 처리: 각 요청마다 service() 메서드가 호출되고, 이 메서드는 요청 유형에 따라 doGet(), doPost() 등을 호출합니다.
- 종료: 서버가 종료되거나 서블릿이 언로드될 때 destroy() 메서드가 호출됩니다.
예제
public class LifecycleServlet extends HttpServlet {
public void init() throws ServletException {
// 초기화 작업
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 요청 처리
}
public void destroy() {
// 종료 작업
}
}
HTTP 요청과 응답
서블릿은 다양한 HTTP 요청(GET, POST 등)을 처리할 수 있으며, 클라이언트에게 다양한 형식의 응답을 보낼 수 있습니다.
HTTP 요청 방식
- GET: 데이터를 URL에 포함하여 전송.
- POST: 데이터를 요청 본문에 포함하여 전송.
응답 설정 예제
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<h1>Response from Servlet</h1>");
}
실습 과제
- HelloWorldServlet을 작성하고, 이를 웹 브라우저에서 호출하여 동작을 확인해 보세요.
- POST 요청 처리를 위해 간단한 폼을 만들어 데이터를 전송하고, 서블릿에서 이를 처리해 보세요.
서블릿 실습과정
1. 개발 환경 설정
- Java JDK 설치: JDK 다운로드
- IntelliJ IDEA 설치: IntelliJ 다운로드
- Apache Tomcat 설치: Tomcat 다운로드
톰캣 설치 및 실행 (Mac)
1. Apache Tomcat 화면이 나오면 왼쪽 Download 항목에서 원하는 톰캣 버전을 클릭해 줍니다!
- 페이지 가운데 부분의 Binary Distributions 에서Window 에서는 ~Windows.zip 을 클릭해서 압축 파일을 다운받습니다.
- Linux 나 macOS 에서는 tar.gz 를,
- Window 에서는 ~Windows.zip 을 클릭해서 압축 파일을 다운받습니다.
- 다음으로 Finder 및 탐색기에서 압축파일이 다운로드 된 것을 확인 후, 원하는 위치에 설치합니다. (c:\ 위치에 설치하는것이 이후 관리 및 실행을 편하게 진행할 수 있습니다.
톰캣 (tomcat) 실행
톰캣 (tomcat) 설치가 끝났으면 잘 설치되었는지 실행을 해봐야겠죠?
터미널(terminal) 앱을 실행해 주세요.
톰캣 (tomcat) 이 설치된 경로/bin 으로 들어가 줍니다.
cd 톰캣 경로/apache-tomcat-8.5.43/bin
./startup.sh 서버를 시작합니다.
Tomcat started. 라는 메세지가 나오면 chrome 이나 safari 앱을 이용해서 localhost:8080 으로 접속해서
Apache Tomcat 페이지가 표시되면 성공!
그럼 서버를 다시 중지할게요.
./shutdown.sh 를 입력하여 서버를 중지합니다.
2. 새로운 Gradle 프로젝트 생성
- IntelliJ 실행: File > New > Project
- 프로젝트 유형 선택: Gradle > Java
- 프로젝트 이름 입력: 예: HelloWorldServletProject
- Group ID와 Artifact ID 입력
3. build.gradle 파일 설정
plugins {
id 'java'
id 'war'
}
group = 'org.example'
version = '1.0-SNAPSHOT'
repositories {
mavenCentral()
}
dependencies {
implementation group:'javax.servlet', name: 'javax.servlet-api', version: '3.1.0'
testImplementation platform('org.junit:junit-bom:5.9.1')
testImplementation 'org.junit.jupiter:junit-jupiter'
}
test {
useJUnitPlatform()
}
tasks.withType(JavaCompile) {
options.encoding = 'UTF-8'
}
4. HelloWorldServlet 작성
- 패키지 생성: src/main/java 폴더에서
- Servlet 클래스 생성: New > Java Class
- 코드 작성:
- import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.annotation.WebServlet; @WebServlet("/hello") public class TestServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<h1>Hello, World!</h1>"); } }
5. web.xml 설정 (필요시)
- webapp/WEB-INF 폴더 생성: src/main/webapp/WEB-INF
- web.xml 파일 생성:
ServletTest index.html TestServlet TestServlet TestServlet /hello
- ServletTest
추가 실습: POST 요청 처리 및 필터 작성
POST 요청 처리
1. PostHandlerServlet.java 작성:
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.WebServlet;
@WebServlet("/postHandler")
public class PostHandlerServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getParameter("name");
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<h1>Hello, " + name + "!</h1>");
}
}
2. HTML Form 작성:
<!DOCTYPE html>
<html>
<head>
<title>Post Request</title>
</head>
<body>
<form action="postHandler" method="post">
<label for="name">Name:</label>
<input type="text" id="name" name="name">
<input type="submit" value="Submit">
</form>
</body>
</html>
3. 실행 및 확인: HTML 폼을 통해 POST 요청 전송 후 응답 확인
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<display-name>ServletTest</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>TestServlet</servlet-name>
<servlet-class>TestServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>TestServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
JSP 태그
JSP 태그 종류
JSP는 HTML에 Java 코드를 삽입하여 동적인 문서를 만듭니다.
하지만 이 내용을 그대로 브라우저에게 전달하면, 브라우저는 Java 언어를 알지 못하기 때문에
화면을 표현할 수 없고, 기능을 구현해 낼 수 없습니다.
그렇기 때문에 JSP 파일은 웹 서버에서 Servlet으로 변환한 후에 실행됩니다.
JSP 파일을 Servlet으로 변환할 때, 어떤 부분이 텍스트/HTML인지, Java 코드인지를 구분하게
하기 위해서 JSP 태그를 사용합니다.
Scriptlet
- JSP 페이지에서 Java 언어를 사용하기 위한 요소 중 가장 흔하게 사용하는 태그
- Scriptlet에 작성한 내용은 Servlet 변환 시 메서드 내에 존재하게 된다.
- 메서드 내에서 사용할 수 있는 문법은 가능, 메서드 외부 문법은 작성 불가능
Expression
- JSP 페이지 내에서 사용되는 변수의 값 또는 메서드 호출 결과 값을 출력하기 위해 사용.
- 결과 값의 데이터 타입은 String이며, 세미콜론은 작성하지 않습니다.
- Servlet에서 out.println(); 메서드로 변환됩니다. out.println()은 브라우저에 출력을 담당하는 JspWriter라는 객체의 메서드입니다.
Declaration
- JSP 페이지 내에서 사용되는 변수 또는 메서드를 선언할 때 사용.
- Declaration에 선언된 내용은 Servlet 변환 시 클래스 블록에 위치함.
- 클래스 블록에 선언할 수 있는 문법은 모두 가능.
- 파일명으로 객체가 생성되고, 객체가 유지 되는 동안에 사용할 내용들을 선언합니다.
Directive
- JSP 페이지의 전체적인 속성을 지정할 때 사용합니다.
page
- jsp 페이지에 대한 정보를 지정합니다. JSP가 생성하는 문서의 타입, 임포트, 에러 페이지 등 페이지에서 필요로 하는 정보를 설정합니다.
include
- JSP 페이지의 특정 영역에 다른 문서를 포함시킵니다.
taglib
- 외부 태그 라이브러리를 지정해서 사용할 때 선언합니다.
Comments
- 주석 기능입니다.
- HTML과 JSP 주석이 각각 별도로 저장됩니다.
- HTML 주석은 웹 브라우저에서 페이지 소스보기를 하면 주석도 같이 표기되지만 JSP 주석은 웹 브라우저에서 소스 보기를 진행해도 드러나지 않습니다.
JSP 파일을 실행했을 때 처리 순서
JSP 파일을 실행하면 웹 서버에서 일단 JSP 파일을 Java 코드로 변환합니다.
변환 과정에서 작성한 JSP 태그에 따라 코드를 배치 시킵니다.
HTML과 텍스트 등도 전부 자바 코드화 시킵니다.
그 후 파일을 컴파일 하고 HTML로 응답 시킵니다.
JSP 내장 객체
JSP 내장 객체란?
개발자가 JSP 파일 내에 객체를 생성하지 않고 바로 사용할 수 있는 객체.
JSP에서 제공되는 내장 객체는 JSP 파일이 서블릿으로 변환될 때 자동으로 객체가 생성됩니다.
JSP 내장 객체의 종류는 다음과 같습니다.
request 객체의 이해
- 웹 브라우저를 통해 서버에 어떠한 정보를 요청하는 것을 request라고 합니다.
- 이러한 정보가 담기고 관리되는 곳이 request 객체 입니다.
- 클라이언트(웹 브라우저)와 관련된 정보 읽기 기능, 서버와 관련된 정보 읽기 기능, 클라이언트가 전송한 요청 파라미터 읽기 기능, 클라이언트가 전송한 쿠키 읽기 기능 등을 사용할 수 있습니다.
response 객체의 이해
- 웹 브라우저의 요청에 응답하는 것을 response라고 합니다.
- 이러한 응답의 정보를 가지고 있는 객체를 response 객체라고 합니다.
out 객체의 이해
- JSP 페이지가 생성하는 모든 내용은 out 기본 객체를 통해 전송됩니다.
- JSP 페이지 내에서 사용하는 비스크립트 요소(HTML 코드와 text)들이 out 객체에 전달됩니다.
- JspWriter 객체에 의해 브라우저로 응답하는 영역을 담당합니다.
- 대표적인 메서드는 out.println() 입니다.
쿠키와 세션
쿠키란 무엇인가?
- 쿠키(Cookie)는 웹 서버가 클라이언트(브라우저)에게 정보를 저장하고 관리하기 위해 사용되는 작은 텍스트 파일입니다.
- 클라이언트 측에서 로컬에 저장되며, 클라이언트가 웹 서버에 요청을 보낼 때 해당 정보를 함께 전송하여 상태를 유지하거나 필요한 데이터를 저장하는 데 사용됩니다.
- 쿠키는 클라이언트에 의해 생성되어 브라우저에 저장되며, 웹 서버로의 요청이 있을 때마다 해당 쿠키가 웹 서버로 전송 됩니다.
- 서버는 전송된 쿠키를 읽어 클라이언트의 정보를 확인하고, 필요한 경우 서버 측에서 데이터를 수정하거나 새로운 쿠키를 생성하여 클라이언트에게 전송할 수 있습니다.
- 쿠키는 다양한 용도로 사용될 수 있습니다. 예를 들어,
- 로그인 정보를 유지하기 위해 사용자의 인증 상태를 확인하거나,
- 사용자의 선호 언어, 테마, 글꼴 등의 개인화된 설정을 저장하거나,
- 사용자의 방문 기록을 추적하거나,
- 광고 타겟팅을 위해 사용될 수 있습니다.
- 쿠키는 보안과 개인 정보 보호 측면에서 주의해야 합니다. 중요한 개인 정보를 저장하지 않도록 주의해야하며, 필요한 경우 암호화나 안전한 전송을 위한 HTTPS를 사용하는 등 보안을 강화해야 합니다. 또한, 사용자의 개인 정보를 수집하거나 추적하는 쿠키의 경우에는 개인 정보 보호 관련 법률 및 규정을 준수해야 합니다.
세션이란 무엇인가?
- 세션도 쿠키와 마찬가지로 서버와의 관계를 유지하지 위한 수단입니다.
- 단, 쿠키와 달리 클라이언트의 특정 위치에 저장되는 것이 아니라, 서버상에 객체 형태로 존재합니다.
- 서버당 하나의 세션 객체를 가질 수 있습니다. (브라우저 별로 서로 다른 세션을 사용)
- 세션 객체는 브라우저 창을 종료하면 소멸합니다.
- 따라서 세션은 서버에서만 접근이 가능하여 쿠키보다 보안이 좋고, 저장할 수 있는 데이터에 한계가 없습니다.
- 세션은 클라이언트의 요청이 발생하면 자동생성되어 고유한 ID값을 클라이언트에게 넘겨주며, 이것은 쿠키에 저장됩니다.
- JSP에서는 session이라는 내장 객체를 지원하여 세션의 속성을 설정할 수 있습니다.
쿠키 VS 세션
Application 내장 객체
- 특정 웹 어플리케이션에 포함된 모든 JSP 페이지는 하나의 application 기본 객체를 공유합니다.
- application 객체는 웹 어플리케이션 전반에 걸쳐서 사용되는 정보를 담고 있습니다.
- 생명 주기
- request 객체는 요청 영역마다 생성되고 소멸됩니다.
- session 객체는 브라우저별로 생성되고 소멸됩니다.
- application 객체는 서버가 실행될 때 생성되고, 서버가 꺼질 때 소멸됩니다.
실습 진행하기
이번 실습 과제에서는 쿠키와 세션을 사용하여 사용자 정보를 저장하고 관리하는 방법을 배우겠습니다. 서블릿과 JSP를 사용하여 웹 애플리케이션을 구축하고, 쿠키와 세션을 통해 사용자 정보를 유지하는 방법을 실습합니다.
1. 개발 환경 설정
- Apache Tomcat 설치: Tomcat 다운로드
톰캣 설치 및 실행 (Mac)톰캣 설치 및 실행 (Windows)
2. 새로운 Gradle 프로젝트 생성
- IntelliJ 실행: File > New > Project
- 프로젝트 유형 선택: Gradle > Java
- 프로젝트 이름 입력: 예: CookieSessionProject
- Group ID와 Artifact ID 입력
3. build.gradle 파일 설정
plugins {
id 'java'
id 'war'
}
group = 'org.example'
version = '1.0-SNAPSHOT'
repositories {
mavenCentral()
}
dependencies {
implementation group:'javax.servlet', name: 'javax.servlet-api', version: '3.1.0'
testImplementation platform('org.junit:junit-bom:5.9.1')
testImplementation 'org.junit.jupiter:junit-jupiter'
}
test {
useJUnitPlatform()
}
tasks.withType(JavaCompile) {
options.encoding = 'UTF-8'
}
4. JSP 페이지 및 서블릿 작성
4.1 index.jsp 작성
- 파일 생성: src/main/webapp/index.jsp
- 코드 작성:
<!DOCTYPE html>
<html>
<head>
<title>Login Page</title>
</head>
<body>
<h2>Login</h2>
<form action="login" method="post">
<label for="username">Username:</label>
<input type="text" id="username" name="username">
<br>
<label for="password">Password:</label>
<input type="password" id="password" name="password">
<br>
<input type="checkbox" id="rememberMe" name="rememberMe">
<label for="rememberMe">Remember Me</label>
<br>
<input type="submit" value="Login">
</form>
</body>
</html>
4.2 LoginServlet.java 작성
- 패키지 생성: src/main/java/com/example/servlet
- 서블릿 클래스 생성: New > Java Class
- 코드 작성:
package com.example.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
String password = request.getParameter("password");
String rememberMe = request.getParameter("rememberMe");
HttpSession session = request.getSession();
session.setAttribute("username", username);
if ("on".equals(rememberMe)) {
Cookie cookie = new Cookie("username", username);
cookie.setMaxAge(60 * 60 * 24); // 1 day
response.addCookie(cookie);
}
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html><body>");
out.println("<h1>Welcome, " + username + "</h1>");
out.println("<a href='profile'>Go to Profile</a>");
out.println("</body></html>");
}
}
4.3 ProfileServlet.java 작성
- 서블릿 클래스 생성: New > Java Class
- 코드 작성:
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/profile")
public class ProfileServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession(false);
String username = null;
if (session != null) {
username = (String) session.getAttribute("username");
}
if (username == null) {
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
if ("username".equals(cookie.getName())) {
username = cookie.getValue();
break;
}
}
}
}
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html><body>");
if (username != null) {
out.println("<h1>Profile Page</h1>");
out.println("<h2>Welcome back, " + username + "</h2>");
} else {
out.println("<h1>No user information found. Please <a href='index.jsp'>login</a>.</h1>");
}
out.println("</body></html>");
}
}
5. web.xml 설정
- webapp/WEB-INF 폴더 생성: src/main/webapp/WEB-INF
- web.xml 파일 생성:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<display-name>CookieSessionExample</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>com.example.servlet.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>ProfileServlet</servlet-name>
<servlet-class>com.example.servlet.ProfileServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ProfileServlet</servlet-name>
<url-pattern>/profile</url-pattern>
</servlet-mapping>
</web-app>
예외(에러)페이지(error page)
예외 페이지란?
- 예외 상황이 발생했을 경우 웹 컨테이너(톰캣)에서 제공되는 기본적인 예외 페이지가 보여집니다.
- 개발 과정에서는 이러한 예외 페이지를 보고 어떤 에러가 발생했는지 알 수 있기 때문에 오류를 수정하는 데 도움이 됩니다.
- 그러나 사용자에게 상용 서비스를 제공하고 있는데 이러한 딱딱한 페이지가 보여진다면 사용자로 하여금 불쾌감을 일으키고, 해당 사이트에 대한 신뢰도가 하락하게 됩니다.
- 또한 코드의 일부가 노출되어 보안 측면에도 좋지 않습니다.
- 그래서 개발자가 따로 만들어 둔 에러 페이지로 유도하여 사용자에게 친숙한 페이지를 보여줍니다.
HTTP 주요 응답 상태 코드
- 404: 요청한 URL을 찾을 수 없는 경우.
- 500: 서버측 내부 오류로 인해 페이지가 나타나지 않는 경우(java, JSP 페이지 내의 코드오류)
- 200: 요청을 성공적으로 처리함.
- 307: 임시로 페이지를 리다이렉트함.
- 400: 클라이언트의 요청이 잘못된 구문으로 작성됨.
- 405: 요청 방식을 허용하지 않음(GET, POST 등)
- 503: 서버가 일시적으로 서비스를 제공할 수 없음(일시적 서버과부하, 서버 임시 보수 등)
예외 처리 방법
1. 직접 예외를 처리하기
- 자바의 키워드인 try - catch를 사용하여 개발자가 직접 예외를 처리합니다.
2. 에러를 처리할 페이지를 따로 지정하기
- JSP는 실행 도중 예외가 발생할 때 톰캣 기본 에러화면 대신 개발자가 지정한 JSP페이지를 보여줄 수 있는 기능을 제공하고 있습니다.
- 에러가 발생하면 보여줄 JSP페이지는 페이지 지시자(directive)의 errorPage 속성을 사용하여 지정합니다.
- 예외가 발생할 것으로 예상되는 페이지에 예외가 발생했을 때 보여줄 페이지를 지정.
<%@ page errorPage = "에러가 발생했을 때 보여줄 페이지.jsp" %>
- 에러 발생시 유도된 페이지에는 페이지 지시자태그로 isErrorPage 속성을 사용하여 true로 값을 설정.
<%@ page isErrorPage="true" %>
3. 응답 상태 코드별로 에러페이지 지정하기
- JSP는 에러 코드별 또는 예외 타입 별로 사용할 에러 페이지를 web.xml 파일에 지정할 수 있습니다.
- 이렇게 지정한 에러페이지는 일반 JSP 파일과 동일하게 작성하면 됩니다.
에러 페이지의 우선 순위
- 에러 페이지를 여러 방법으로 지정한 경우 다음의 우선순위에 따라 사용할 에러 페이지를 선택합니다.
- 페이지 지시자 태그의 errorPage속성에 지정한 페이지.
- web.xml에 지정한 에러 타입에 따른 페이지.
- web.xml에 지정한 응답 상태 코드에 따른 페이지.
- 위 3항목에 해당하지 않을 경우 톰캣이 제공하는 에러 페이지.
실습 과제
1. 개발 환경 설정
- Apache Tomcat 설치: Tomcat 다운로드
톰캣 설치 및 실행 (Mac)톰캣 설치 및 실행 (Windows)
2. 새로운 Gradle 프로젝트 생성
- IntelliJ 실행: File > New > Project
- 프로젝트 유형 선택: Gradle > Java
- 프로젝트 이름 입력: 예: ErrorHandlingProject
- Group ID와 Artifact ID 입력
3. build.gradle 파일 설정
plugins {
id 'java'
id 'war'
}
group = 'org.example'
version = '1.0-SNAPSHOT'
repositories {
mavenCentral()
}
dependencies {
implementation group:'javax.servlet', name: 'javax.servlet-api', version: '3.1.0'
testImplementation platform('org.junit:junit-bom:5.9.1')
testImplementation 'org.junit.jupiter:junit-jupiter'
}
test {
useJUnitPlatform()
}
tasks.withType(JavaCompile) {
options.encoding = 'UTF-8'
}
4. JSP 페이지 및 서블릿 작성
4.1 index.jsp 작성
- 파일 생성: src/main/webapp/index.jsp
- 코드 작성:
<!DOCTYPE html>
<html>
<head>
<title>Exception Handling Example</title>
</head>
<body>
<h2>Enter a Number</h2>
<form action="calculate" method="post">
<label for="number">Number:</label>
<input type="text" id="number" name="number">
<input type="submit" value="Submit">
</form>
</body>
</html>
4.2 CalculateServlet.java 작성
- 패키지 생성: src/main/java/com/example/servlet
- 서블릿 클래스 생성: New > Java Class
- 코드 작성:
package com.example.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/calculate")
public class CalculateServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String numberStr = request.getParameter("number");
try {
int number = Integer.parseInt(numberStr);
int result = 100 / number; // ArithmeticException 발생 가능
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html><body>");
out.println("<h1>Result: " + result + "</h1>");
out.println("</body></html>");
} catch (NumberFormatException | ArithmeticException e) {
throw new ServletException("Invalid input or division by zero", e);
}
}
}
4.3 error.jsp 작성
- 파일 생성: src/main/webapp/error.jsp
- 코드 작성:
<%@ page isErrorPage="true" %>
<!DOCTYPE html>
<html>
<head>
<title>Error Page</title>
</head>
<body>
<h1>An error occurred:</h1>
<p><%= exception.getMessage() %></p>
</body>
</html>
5. web.xml 설정
- webapp/WEB-INF 폴더 생성: src/main/webapp/WEB-INF
- web.xml 파일 생성:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<display-name>ErrorHandlingExample</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>CalculateServlet</servlet-name>
<servlet-class>com.example.servlet.CalculateServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CalculateServlet</servlet-name>
<url-pattern>/calculate</url-pattern>
</servlet-mapping>
<error-page>
<exception-type>java.lang.Exception</exception-type>
<location>/error.jsp</location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/error.jsp</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/error.jsp</location>
</error-page>
</web-app>
EL, JSTL
EL이란?
EL(표현 언어, Expression Language)은 JSP(JavaServer Pages)에서 사용되는 스크립트 언어로,
변수나 속성에 접근하고 값을 표현하기 위한 간단한 표현 언어입니다.
EL은 JSP 페이지에서 자바 코드를 더 간결하고 효율적으로 작성하고 처리하는 데 도움을 주는
도구입니다. 특히 내장 객체에서 값을 꺼내 올 때 유용하게 사용할 수 있습니다.
EL의 문법 및 사용 예시
EL은 ${} 형식의 표현식을 사용하여 변수나 속성에 접근하고 값을 표현합니다. ${} 안에는 변수, 속성, 연산자, 리터럴 등이 올 수 있습니다. 다음은 EL의 기본 문법입니다.
- 변수나 속성 접근: ${변수명} 또는 ${객체명.속성명}
- 연산자: 산술 연산자(+, **, **, /), 비교 연산자(==, !=, <, >, <=, >=), 논리 연산자(&&, ||, !) 등을 사용할 수 있습니다.
- 삼항 연산자 또한 사용이 가능합니다.
- 리터럴: 문자열('문자열' 또는 "문자열"), 숫자(숫자) 등을 사용할 수 있습니다.
EL은 JSP의 내장 객체와 함께 사용될 수 있어 더 효율적인 JSP 페이지를 작성할 수 있도록 도와줍니다. 예를 들어, ${requestScope}, ${sessionScope}, ${applicationScope} 등의 내장 객체를 사용하여 각각의 범위에서 속성에 접근할 수 있습니다.
또한, ${param}, ${paramValues}, ${header}, ${headerValues} 등의 내장 객체를 사용하여 요청 파라미터, 헤더 정보에 접근할 수 있습니다.
<!-- requestScope 내장 객체를 사용하여 request 범위의 속성에 접근하는 예시 -->
<p>이름: ${requestScope.name}</p>
<p>나이: ${requestScope.age}</p>
위 코드에서 ${requestScope.name}과 ${requestScope.age}는 request 범위에서의
name과 age 속성에 접근하는 것입니다.
<!-- param 내장 객체를 사용하여 요청 파라미터에 접근하는 예시 -->
<p>이름: ${param.name}</p>
<p>나이: ${param.age}</p>
위 코드에서 ${param.name}과 ${param.age}는 요청 파라미터 name과 age의 값을 표현하는 것입니다.
<!-- EL을 사용한 예시 -->
<h1>${user.name}님의 정보</h1>
<p>나이: ${user.age}</p>
<p>이메일: ${user.email}</p>
위 코드에서 ${user.name}, ${user.age}, ${user.email} 은 EL을 사용하여 user객체의 속성에 접근하는 것입니다.
이를 통해 자바의 getter 메서드를 따로 부르지 않아도 간단하게 값을 불러올 수 있습니다.
EL의 장점
EL은 JSP 페이지에서 자바 코드를 더 간결하고 효율적으로 작성할 수 있도록 도와줍니다.
다음은 EL의 장점입니다.
- 간결한 문법: 복잡한 자바 코드 대신 간결한 ${} 표현식을 사용하여 변수나 속성의 값을 표현할 수 있습니다.
- 재사용성: EL은 JSP 페이지에서 사용되는 다양한 객체의 값을 표현할 수 있어 코드의 재사용성을 높일 수 있습니다.
- 안전성: EL은 자동으로 데이터 타입 변환을 처리하여 타입 불일치에 따른 오류를 방지합니다.
- 가독성: EL을 사용하면 JSP 페이지의 코드가 더 간결하고 가독성이 높아집니다.
JSTL이란?
JSP Standard Tag Library (JSTL)은 JSP 페이지에서 자주 사용되는 로직을 태그 형태로 제공하여
JSP 개발을 편리하게 해주는 라이브러리입니다.
JSTL은 JSP 페이지에서 자바 코드를 대체하고 비즈니스 로직과 표현 로직을 분리하여
유지보수성을 향상시킬 수 있는 강력한 기능을 제공합니다.
JSTL의 경우 우리가 사용하는 Tomcat 기본 컨테이너에 포함되어 있지 않으므로, 별도의 라이브러리
를 설치하고 사용합니다.
JSTL에서 제공되는 라이브러리 종류. 아무래도 핵심 기능인 Core를 가장 많이 사용한다.
JSTL Core Tags
Core 태그는 기본적인 태그로 출력, 제어문, 반복문 같은 기능이 포함되어 있습니다.
JSTL을 사용할 때는 항상 JSP 파일 내에 지시자 태그를 이용하여
<%@ taglib uri="<http://java.sun.com/jsp/jstl/core>" prefix="c" %>
를 명시해 주어야 합니다.
- 출력 태그 <c:out value="출력값">
- 변수 선언 태그
- 변수 태그는 JSTL이 지원하는 태그에서 사용할 수 있는 변수를 설정하기 위해 사용합니다.
- var: 값을 저장할 EL 변수의 이름을 지정함.
- value: 변수의 값을 지정함. 표현식, EL, 텍스트를 사용하여 지정가능.
- scope: 변수를 저장할 영역을 지정함. page, request, session, application 중 하나를 지정해야 하며 지정하지 않을 경우 page를 기본 값으로 사용.
- EL 변수를 생성합니다. <c:set var="변수명" value="설정값" scope="범위">
3. 변수 제거 태그
remove 태그를 사용할 때 주의점은 삭제할 변수의 scope을 지정하지 않으면 동일한 이름으로 저장된 모든 영역의 변수를 삭제합니다.
<c:remove var="변수명" scope="범위">
4. 조건문(if) 태그
- if 태그는 자바 언어의 if 블록과 비슷한 기능을 제공합니다.
- 중첩된 if~else 문과 같은 효과를 낼 수는 없지만 단순한 if 블록을 쉽게 대체할 수 있기 때문에
- 많이 사용합니다. <c:if test="조건식" var="조건 처리 변수명">
5. 조건문(choose) 태그
choose 태그는 자바의 switch 구문과 if~else 구문을 혼합한 형태로 다수의 조건문을 하나의 블록에서 수행할 때 사용합니다.
<c:choose>
<c:when test="조건식"> 처리 내용 </c:when>
<c:when test="조건식"> 처리 내용 </c:when>
<c:otherwise> 처리 내용 </c:otherwise>
</c:choose>
6. 반복문 태그
- <c:forEach items="객체명" begin="시작값" end="끝 값" step="증감식" var="변수명">
- forEach 태그는 배열, 컬렉션 또는 맵에 저장되어 있는 값들을 순차적으로 처리할 때 사용합니다.
- 배열의 경우는 객체의 배열뿐만 아니라 기본 데이터 타입의 배열도 알맞게 처리를 하며 기본 데이터 타입은 래퍼 클래스를 통해 처리합니다.
JSTL Formatting Tags
포맷팅 태그(Formatting Tags): JSTL은 날짜, 숫자, 메시지 등의 포맷팅을 처리하는
태그를 제공합니다.
이를 통해 다국어 지원, 날짜와 숫자의 형식화 등을 간편하게 처리할 수 있습니다.
<!-- JSTL을 사용한 날짜와 숫자의 포맷팅 -->
<p>가입일: <fmt:formatDate value="${user.joinDate}" pattern="yyyy-MM-dd" /></p>
<p>평균 점수: <fmt:formatNumber value="${user.avgScore}" pattern="#.##" /></p>
위 코드에서 <fmt:formatDate> 태그를 사용하여 날짜를 원하는 형식으로 포맷팅하고, **<fmt:formatNumber>**태그를 사용하여 평균 점수를 소수점 둘째 자리까지 표시하는 형식으로
포맷팅하고 있습니다.
JSTL Function Tags
- 함수 태그(Function Tags): JSTL은 자주 사용되는 함수들을 태그 형태로 제공하여
JSP 페이지에서 쉽게 사용할 수 있게 해줍니다.
이를 통해 문자열 처리, 수학 연산 등을 간편하게 처리할 수 있습니다.
<!-- JSTL을 사용한 문자열 처리와 수학 연산 -->
<p>대문자: <c:out value="${fn:toUpperCase(user.name)}" /></p>
<p>나이 제곱: <c:out value="${fn:pow(user.age, 2)}" /></p>
위 코드에서 <fn:toUpperCase> 함수를 사용하여 user.name 값을 대문자로 변환하고,
<fn:pow> 함수를 사용하여 user.age 값을 제곱하여 출력하고 있습니다.
JSTL은 <%@ taglib %> 디렉티브를 사용하여 JSP 페이지에서 사용할 태그 라이브러리를 선언하고,
태그를 사용할 때에는 해당 라이브러리의 접두사(prefix)를 사용하여 태그를 호출합니다.
JSTL은 다양한 기능을 제공하여 JSP 개발을 더 효율적이고 유지보수성 높은 코드로
작성할 수 있게 해주는 강력한 라이브러리입니다.