JSP(JavaServer Pages)

JSP(JavaServer Pages)는 서버 측에서 동적으로 HTML, XML 등의 문서를 생성할 수 있는 Java 기반의 웹 기술입니다. JSP는 웹 애플리케이션을 개발할 때 주로 프런트엔드와 백엔드 간의 연결을 담당하며, HTML 코드 내에 Java 코드를 포함할 수 있는 특징을 가지고 있습니다. JSP는 서블릿(Servlet) 기술의 확장된 형태로, 서블릿보다 HTML을 더 직관적으로 작성할 수 있어 웹 페이지 개발에 많이 사용됩니다.

JSP의 주요 특징

  1. 동적 콘텐츠 생성:
    • JSP는 정적인 HTML 코드에 Java 코드를 포함하여 서버에서 동적으로 콘텐츠를 생성할 수 있습니다.
    • 예를 들어, 데이터베이스에서 데이터를 불러와 웹 페이지에 표시하거나, 사용자 입력에 따라 다른 페이지를 생성할 수 있습니다.
  2. 서버 측 처리:
    • JSP 페이지는 서버에서 실행되며, 브라우저에는 JSP가 렌더링한 HTML 파일만 전달됩니다. 즉, 클라이언트는 Java 코드를 볼 수 없습니다.
    • JSP 페이지는 Java 서블릿으로 변환되어 실행되며, 웹 서버에서 자바 바이트코드로 컴파일되어 처리됩니다.
  3. JSP 태그:
    • JSP는 Java 코드를 페이지에 포함하기 위해 다양한 태그를 제공합니다. 기본적으로 스크립트 태그를 사용하며, 이 외에도 여러 가지 표준 태그커스텀 태그를 사용할 수 있습니다.

JSP 코드 구조

JSP 파일은 기본적으로 HTML 문서의 구조를 따르며, 여기에 Java 코드를 삽입할 수 있습니다. 대표적인 JSP 태그에는 스크립트릿(Scriptlet), 표현식(Expression), 선언(Declaration) 등이 있습니다.

1. 스크립트릿 (Scriptlet)

  • <% ... %>: JSP 페이지에서 Java 코드를 작성하는 가장 기본적인 방식입니다.
  • 예시: 
  • <html> <body> <% String name = "John"; out.println("Hello, " + name); %> </body> </html>
  • 스크립트릿 내에서 선언한 코드는 실행되어 결과가 페이지에 출력됩니다.

2. 표현식 (Expression)

  • <%= ... %>: Java 표현식의 결과값을 출력할 때 사용합니다.
  • 예시:
    <html>
    <body>
        Welcome, <%= name %>
    </body>
    </html>
  • 이 태그는 Java 표현식의 결과값을 HTML로 출력하는 역할을 합니다.

3. 선언 (Declaration)

  • <%! ... %>: JSP에서 메서드나 변수를 선언할 때 사용합니다.
  • 예시:
    <html>
    <body>
        <%! 
            public String greetUser(String name) {
                return "Hello, " + name;
            }
        %>
        <%= greetUser("John") %>
    </body>
    </html>

JSP 라이프사이클

JSP는 웹 서버에서 특정한 라이프사이클을 따릅니다. JSP 페이지는 요청을 받을 때마다 서블릿으로 변환되어 실행됩니다. JSP의 라이프사이클은 다음과 같습니다:

  1. JSP 페이지 요청: 클라이언트가 JSP 페이지를 요청합니다.
  2. 컴파일: JSP 페이지가 처음 요청될 때 서블릿으로 컴파일됩니다.
  3. 인스턴스화: JSP 서블릿 객체가 인스턴스화됩니다.
  4. 서비스 요청 처리: JSP 페이지가 처리되어 결과를 HTML로 변환한 후 클라이언트에 반환합니다.
  5. 파괴: JSP 서블릿 객체가 필요 없을 경우 메모리에서 제거됩니다.

JSP의 장점

  1. 서블릿에 비해 직관적:
    • JSP는 서블릿처럼 Java 코드를 사용하지만, HTML 문서 내에 Java 코드를 쉽게 삽입할 수 있어 서블릿보다 직관적입니다.
  2. 동적 웹 페이지 생성:
    • JSP는 서버 측에서 HTML을 동적으로 생성하여 사용자 맞춤형 페이지를 제공할 수 있습니다.
  3. 재사용성:
    • JSP 태그 라이브러리를 통해 여러 JSP 페이지에서 공통으로 사용할 수 있는 모듈화된 코드를 작성할 수 있습니다.
  4. Java의 강력한 기능 사용:
    • JSP는 Java 기반이므로, Java의 강력한 라이브러리와 API를 사용할 수 있어 복잡한 비즈니스 로직을 처리할 수 있습니다.

JSP의 단점

  1. 유지보수 문제:
    • 많은 Java 코드가 JSP 파일에 포함되면 유지보수가 어려워질 수 있습니다. 그래서 MVC 패턴에서 JSP는 주로 뷰(View) 역할로 사용되며, 비즈니스 로직은 서블릿이나 다른 클래스에서 처리하는 것이 일반적입니다.
  2. 컴파일 오버헤드:
    • JSP는 처음 요청될 때 서블릿으로 변환되고 컴파일되므로, 첫 번째 요청 시 시간이 걸릴 수 있습니다.
  3. 복잡한 구조:
    • Java 코드가 HTML 코드와 뒤섞이면 가독성이 떨어질 수 있어, 이를 방지하기 위해 JSP 태그 라이브러리나 JSTL(JavaServer Pages Standard Tag Library) 같은 기술을 활용해야 합니다.

JSP의 대안 기술

  • Thymeleaf: 최근에는 JSP 대신에 Thymeleaf와 같은 템플릿 엔진이 많이 사용됩니다. Thymeleaf는 HTML 파일을 유지하면서 서버 측에서 동적 데이터를 바인딩할 수 있어, JSP보다 더 직관적이고 깔끔한 코드 작성이 가능합니다.
  • FreeMarker: 또 다른 템플릿 엔진으로, 서버에서 HTML을 생성할 때 많이 사용됩니다.

결론

JSP는 Java 기반의 웹 애플리케이션에서 동적으로 콘텐츠를 생성하는 데 유용한 기술입니다. 서블릿을 기반으로 하여 좀 더 쉽게 웹 페이지를 개발할 수 있게 해 주지만, 복잡한 애플리케이션에서는 비즈니스 로직과 뷰 로직의 분리를 위해 MVC 패턴을 적용하는 것이 권장됩니다.

프로젝트 생성하기

maven repository 사이트에서 JSTL

사용자 수가 많은 2번째 JSTL을 선택

        <!-- https://mvnrepository.com/artifact/javax.servlet/jstl -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-jasper</artifactId>
        </dependency>

application.properties 애플리케이션이 돌아가기 위한 설정을 해주는 곳

# App name
spring.application.name=exJSP

# Server port
server.port=8080

# Context path
server.servlet.context-path=/exJSP

# Restart WAS
spring.devtools.livereload.enabled=true

# Spring Datasource
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
spring.datasource.url=jdbc:mariadb://localhost:3306/db7
spring.datasource.username=db7
spring.datasource.password=1234

# JPA
spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.show-sql=true

# JSP
spring.mvc.veiw.prefix=/WEB-INF/views
spring.mvc.view.suffix=.jsp

# File upload setting for Servlet
spring.servlet.multipart.enabled=true
spring.servlet.multipart.location=C:\\upload
spring.servlet.multipart.max-request-size=30MB
spring.servlet.multipart.max-file-size=10MB

# File upload setting for Application
com.example.upload.path=c:\\upload

#log level ALL < DEBUG < INFO < WARN < ERROR < FATAL < OFF
#logging.level.org.springframework.security.web=trace
#logging.level.com.example=debug

# OAuth2 include
# spring.profiles.include=oauth

server.error.whitelabel.enabled=false
server.error.path=/error

OAuth2 를 사용하기 위해서 구글클라우드 플랫폼 에서 URL를 추가해줌

 

웹 애플리케이션의 클라이언트 ID

JSP는 템플릿 관련으로 View에 관련되어있음

views 폴더안에 index.jsp 파일을 생성해준다

jsp를 사용하기 위해서는

<%@ page contentType="text/html; charset=UTF-8" language="java"%> 를 선언 해주어야 함

<%@ page contentType="text/html; charset=UTF-8" language="java"%>
<!DOCTYPE html>
<html lang="ko" xmlns:th="http://www.thymeleaf.org">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>
    <h1>JSP index<h1>
</body>
</html>

src/main/java/com/example/exJSP/ExJspApplication.java 에서 JPA 를 설정해줌

@SpringBootApplication
@EnableJpaAuditing //BasicEntity를 사용하기 위함.
@EnableJpaRepositories(basePackages = "com.example.exJSP.repository")
public class ExJspApplication {

    public static void main(String[] args) {
        SpringApplication.run(ExJspApplication.class, args);
    }
}