※ 본문은 혼자 공부한 내용을 기록한 글입니다. 오개념이 있다면 댓글로 알려주세요!
[ 1 ] JSP란?
Servlet은 자바 코드 내에 HTML 코드가 있기 때문에 HTML 출력이 많은 결과 페이지를 나타내는 데 적합하지 못하다(모든 HTML 코드를 out.write()로 감싸줘야 하기 때문).
이와 달리 JSP는 HTML 코드 내에 자바 소스코드가 들어가기에 HTML 코드를 작성하는 데 간편하다는 장점이 있다.
그렇다면 간편한 JSP만 사용하면 될텐데, 지금까지 왜 Servlet을 학습했던 것일까? 그 이유는 JSP는 결국 Servlet으로 변환되기 때문이다. 클라이언트가 JSP를 요청하면, JSP 컨테이너는 JSP를 Servlet으로 변환하는 작업을 수행한다.
실제로 간단한 JSP 파일 생성 후 변환된 Servlet 파일을 확인할 수 있다. (eclipse로 작업했을 경우 eclipse workspace의 .metadata/.../jsp 폴더 내에 변환된 Servlet 확인 가능)
만약 아래와 같은 기본적인 JSP(main.jsp라고 가정)가 있다면
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
</body>
</html>
해당 jsp 파일은 아래 구조의 Servlet으로 변환된다.
public final class main_jsp extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent,
org.apache.jasper.runtime.JspSourceImports {
...
...
...
public void _jspService(final javax.servlet.http.HttpServletRequest request,
final javax.servlet.http.HttpServletResponse response)
throws java.io.IOException, javax.servlet.ServletException {
out.write("<!DOCTYPE html>\n");
out.write("<html>\n");
...
out.write("</html>");
}
물론 더 많은 코드들이 있지만 핵심적인 구조는 위와 같다.
(1) 우선, Jsp는 Servlet으로 변환된다. (ex. main.jsp는 main_jsp.java로 변환)
(2) Jsp 내부의 HTML 코드는 변환된 Servlet의 _jspService() 메서드에서 out.write()로 감싸진다.
즉, Jsp 내부의 HTML 코드는 Servlet 변환 과정에서 자동으로 out.write()로 감싸지기에 HTML 출력이 많은 결과 페이지를 나타내는 데 적합하다.
그렇다면 Jsp 내부에 Java 코드는 어떻게 추가할 수 있을까?
[ 2 ] Jsp 코드 블록
Jsp는 HTML 내에 자바 소스코드가 들어가며 이때 코드 블록이란 것을 활용한다. 코드 블록은 <% %> 이며, 코드 블록 내부의 소스코드는 Servlet 변환 시 out.write()로 감싸지지 않는다.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<% for(int i = 0; i < 10; i++) { %>
Servlet! <br>
<% } %>
</body>
</html>
Jsp 내부에 for문을 추가한 예제이다. 반복문이나 조건문을 추가할 때 반드시 { } 를 코드 블록으로 감싸줘야 한다.
public void _jspService(final javax.servlet.http.HttpServletRequest request,
final javax.servlet.http.HttpServletResponse response)
throws java.io.IOException, javax.servlet.ServletException {
out.write("<!DOCTYPE html>\n");
out.write("<html>\n");
...
for(int i = 0; i < 10; i++ {
out.write("\n")
out.write("Servlet! <br>\n");
out.write(" ");
}
...
}
변환된 Servlet에서 코드 블록으로 감싸진 for문은 out.write()로 감싸지지 않고 자바 소스코드로 작동했음을 확인할 수 있다.
하지만, 일반적인 코드 블록 <% %>은 다음과 같은 문제가 있다.
(1) 변수 출력 시 코드 블록 내에 out.print(변수); 를 해야 한다.
(2) <% %> 내부의 자바 코드는 변환된 Servlet의 _jspService() 메서드 내부로 들어간다. 자바에서는 메서드 내에 메서드를 선언할 수 없으므로 <% %> 내부에는 새로운 메서드를 선언할 수 없다.
(3) contentType이나 pageEncoding 등 가장 먼저 실행되어야 하는 설정들을 Jsp 파일 제일 상단 <% %>에 추가하더라도 이보다 먼저 실행되는 코드가 있어 에러가 발생한다.
이러한 문제들을 해결하기 위해 Jsp에는 여러 코드 블록이 존재한다.
<% %> | _jspService() 메서드 내에 자바 소스코드 추가 |
<%= %> | 변수 출력 코드 블록. out.print() 작성할 필요 없음. |
<%! %> | 메서드를 선언할 수 있는 코드 블록. |
<%@ %> | 초기 설정을 위한 page 지시자 |
예시)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<% int y = 3; %>
<% out.print(y); >
<%= y %>
<%!
public int sum(int x, int y) {
return x+y;
}
[ 3 ] 스파게티 코드 문제
Jsp는 HTML 코드 내에 자바 소스코드가 들어가기에 Servlet과 달리 HTML 코드를 작성하는 데 간편하다는 장점이 있다. 하지만, 자바 소스코드가 들어가는 코드 블록이 Jsp 내부 어느 곳에든 위치할 수 있기 때문에 스파게티 코드 문제가 발생할 수 있다.
즉, 코드 블록을 HTML 코드와 나눠서 만들지 않아도 되므로 자바 코드만 모아서 보기 어려움을 의미하고 그로 인해 에러 발생 시 어디에서 문제가 발생했는지 찾기 어려워질 수 있다.
이를 해결하기 위해 MVC 패턴을 활용할 수 있다.
[ 참고자료 ]
https://javacpro.tistory.com/43
[JSP] JSP (JavaServer Pages ) 란 무엇인가?
JSP (JavaServer Pages ) 란 무엇인가? JSP 란 JavaServer Pages 의 약자이며HTML 코드에 JAVA 코드를 넣어 동적웹페이지를 생성하는 웹어플리케이션 도구이다.JSP 가 실행되면 자바 서블릿(Servlet) 으로 변환되며
javacpro.tistory.com
https://velog.io/@tsun0705/JSP%EC%9D%98-%EC%BD%94%EB%93%9C-%EB%B8%94%EB%A1%9D-%EC%A2%85%EB%A5%98
JSP의 코드 블록 종류
velog.io
'Programming > Servlet&Jsp' 카테고리의 다른 글
[Servlet & Jsp] MVC 패턴, Model 1, Model 2 (1) | 2023.01.12 |
---|---|
[Servlet & Jsp] Servlet 생명주기, service, doGet, doPost (1) | 2023.01.04 |
[Servlet & Jsp] Application, Session, Cookie (1) | 2022.11.26 |