Backend/Web

JSP(Java Server Page)/Sevelt

해로몬 2024. 11. 7. 12:10

Servlet 이란?

Servlet은 Java 클래스의 일종으로, 웹 서버에서 실행되는 서블릿 컨테이너(Servlet Container) 내에서 동작하며, 클라이언트(주로 웹 브라우저)의 요청을 처리하고 응답을 생성합니다. Servlet은 HTTP 요청 및 응답을 처리하기 위해 HTTP 프로토콜을 사용하며, 데이터베이스와의 상호작용, 비즈니스 로직 처리, 데이터 연산 등을 수행하여 클라이언트에게 동적인 HTML 페이지나 JSON 데이터를 전달할 수 있습니다.

Servlet의 주요 개념

  • 서블릿 컨테이너: Servlet은 서블릿 컨테이너(Servlet Container)라고 불리는 서버 환경에서 동작합니다. 서블릿 컨테이너는 웹 서버와 함께 작동하며, 클라이언트의 요청을 받아 적절한 서블릿 인스턴스를 호출하고, 응답을 생성하여 클라이언트에게 전달하는 역할을 합니다. Tomcat, Jetty 등이 대표적인 서블릿 컨테이너입니다.
  • 라이프 사이클: Servlet은 일정한 **생명주기(Lifecycle)**를 갖습니다. 컨테이너는 Servlet이 처음 요청을 받을 때 생성하고, 종료 시점에 삭제합니다.
  • HttpServlet: 대부분의 웹 애플리케이션에서 사용하는 Servlet 클래스는 HttpServlet 클래스입니다. HttpServlet은 javax.servlet.http.HttpServlet을 상속하여 생성하며, HTTP 요청을 처리하기 위해 주로 doGet()과 doPost() 메서드를 오버라이드하여 요청을 처리합니다.

Servlet의 주요 특징

  • HTTP 요청 및 응답 처리: Servlet은 HTTP GET, POST, PUT, DELETE 등의 요청을 처리하여 다양한 응답을 생성할 수 있습니다.
  • Java 코드로 구현: Servlet은 Java 코드로 작성되며, javax.servlet과 javax.servlet.http 패키지를 통해 요청과 응답 객체를 사용할 수 있습니다.
  • 컨트롤러 역할: Servlet은 클라이언트의 요청을 받아 필요한 로직을 처리한 뒤, JSP와 같은 뷰 페이지로 데이터를 전달합니다. 따라서 MVC 패턴에서 컨트롤러 역할을 수행할 수 있습니다.

Servlet의 기본 구조

Servlet은 Java 클래스이기 때문에 HttpServlet을 상속받아 만들어지며, 요청을 처리하기 위해 doGet()과 doPost() 메서드를 오버라이드합니다.

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MyServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html");
        response.getWriter().println("<h1>Hello, Servlet!</h1>");
    }
}

Servlet의 동작 과정

Servlet은 클라이언트 요청이 있을 때마다 컨테이너에 의해 호출되고, 다음과 같은 절차로 동작합니다.

  1. 클라이언트 요청: 사용자가 웹 브라우저에서 특정 URL로 요청을 보냅니다. 이 요청은 웹 서버를 통해 서블릿 컨테이너로 전달됩니다.
  2. 요청 처리: 서블릿 컨테이너는 URL 매핑을 통해 요청을 처리할 적절한 서블릿을 찾고, service() 메서드를 호출합니다. 이때 요청 방식에 따라 doGet() 또는 doPost() 메서드를 호출하여 요청을 처리합니다.
  3. 응답 생성: Servlet은 요청에 따라 데이터를 처리하고, HTML, JSON 등 형식의 응답을 생성하여 클라이언트에게 전송합니다.
  4. 응답 반환: 클라이언트는 Servlet에서 생성된 응답을 웹 페이지 또는 데이터로 받아 볼 수 있습니다.




Servlet과 JSP의 관계

Servlet은 주로 비즈니스 로직과 데이터를 처리하는 컨트롤러 역할을 수행하며, JSP는 사용자에게 보여줄 프론트엔드 화면을 생성하는 역할을 수행합니다. 이러한 구조에서 Servlet은 데이터를 처리한 후 JSP 페이지로 전달하여 최종 HTML 응답을 생성하는 방식으로, MVC 패턴을 통해 역할을 분리하는 것이 일반적입니다.




 

JSP (JavaServer Pages) 란?

JSP는 HTML 내에 Java 코드를 삽입하여 동적인 웹 페이지를 생성하는 기술입니다. JSP는 웹 페이지의 레이아웃이나 디자인을 정의하는 동시에 Java 코드를 삽입하여 서버에서 데이터를 처리하고 표시할 수 있게 합니다. JSP는 Servlet으로 변환되어 실행되기 때문에, 기본적으로 Servlet의 기능을 확장한 형태로 볼 수 있습니다.

JSP의 주요 특징

  • HTML과 Java의 결합: JSP는 HTML 내에 Java 코드를 삽입할 수 있는 방식으로, 동적인 콘텐츠를 HTML에 손쉽게 통합할 수 있습니다. 이를 통해 정적인 HTML과 동적인 데이터를 함께 표현할 수 있습니다.
  • 서버 측에서 동작: JSP는 클라이언트가 요청을 보내면 서버에서 실행되고, 최종적으로 HTML 형태로 클라이언트에게 전송됩니다. 클라이언트는 JSP 페이지가 아닌 JSP가 생성한 HTML 페이지를 받아보게 됩니다.
  • Servlet으로 변환: JSP는 실제로 Servlet으로 변환되어 실행됩니다. 즉, JSP 파일은 최초 요청 시 서블릿 코드로 컴파일되고, 그 이후에는 컴파일된 서블릿이 사용됩니다. 따라서 JSP와 Servlet은 본질적으로 동일한 기능을 수행할 수 있으며, JSP는 Servlet의 문법을 좀 더 간편하게 만든 형식이라고 볼 수 있습니다.
  • MVC 패턴에서 View 역할: JSP는 MVC 패턴에서 주로 View 역할을 수행합니다. 컨트롤러(Servlet)가 데이터를 처리하고, 그 데이터를 JSP로 전달하면, JSP는 HTML 페이지를 생성하여 사용자에게 데이터를 표시합니다.

 

JSP의 기본 구조

JSP 페이지에서는 HTML과 함께 <% %> 문법을 사용하여 Java 코드를 작성할 수 있습니다.

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>JSP Example</title>
</head>
<body>
    <h1>Hello, JSP!</h1>
    <% 
        String name = "홍길동";
        out.println("<p>안녕하세요, " + name + "님!</p>");
    %>
</body>
</html>

JSP의 기본 문법 요소

JSP는 HTML 코드 내에 Java 코드를 삽입할 수 있도록 여러 가지 특별한 태그를 제공합니다. 이 태그들을 통해 Java 코드를 작성하고, 동적인 콘텐츠를 HTML에 삽입할 수 있습니다.

 

1. 스크립트릿(Scriptlet) <% ... %>

스크립트릿은 JSP에서 Java 코드를 작성할 때 사용되는 기본 문법입니다. <%와 %> 사이에 Java 코드를 삽입하여, 서버에서 실행할 수 있습니다.

<%
    String name = "홍길동";
    out.println("안녕하세요, " + name + "님!");
%>

 

2. 표현식(Expression) <%= ... %>

표현식은 값을 출력할 때 사용하며, 표현식 내의 값을 HTML로 바로 출력합니다. out.println() 메서드 없이 간단하게 사용할 수 있습니다.

<p>현재 시간: <%= new java.util.Date() %></p>

 

3. 선언문(Declaration) <%! ... %>

선언문은 JSP 페이지에서 사용될 메서드나 변수를 선언할 때 사용합니다. 선언된 변수나 메서드는 JSP 페이지 내에서 사용할 수 있습니다.

<%! 
    public String getGreeting() {
        return "Hello, JSP!";
    }
%>

<p><%= getGreeting() %></p>

 

4. 주석(Comment) <%-- ... --%>

JSP 주석은 HTML 소스 코드에 포함되지 않고 서버에서만 보이는 주석입니다.

<%-- 이 부분은 주석으로, HTML 소스에 나타나지 않습니다 --%>

 

5. JSP 페이지 디렉티브 (Directives) <%@ ... %>

디렉티브는 JSP 페이지의 설정을 정의하는 데 사용됩니다. JSP 페이지 상단에 작성되며, 페이지의 속성을 설정하거나 다른 리소스를 포함하는 등의 역할을 합니다.

page 디렉티브

page 디렉티브는 JSP 페이지의 전반적인 속성을 정의합니다.

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

 

include 디렉티브

include 디렉티브는 다른 JSP 페이지나 HTML 파일을 포함할 때 사용됩니다. 주로 헤더나 푸터와 같은 공통 영역을 포함할 때 유용합니다.

<%@ include file="header.jsp" %>

 

taglib 디렉티브

taglib 디렉티브는 커스텀 태그 라이브러리를 사용할 때 필요합니다. JSP 표준 태그 라이브러리(JSTL)과 같은 외부 태그 라이브러리를 JSP 페이지에서 사용하기 위해 선언합니다.

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

 


JSP 내장 객체 (Implicit Objects)

JSP는 개발자가 자주 사용하는 객체들을 기본적으로 제공하여 편리하게 사용할 수 있게 합니다. 이러한 객체들은 내장 객체라고 하며, JSP 페이지에서 직접 사용할 수 있습니다.

request

  • 클라이언트의 요청 정보를 담고 있는 객체로, 폼 데이터와 쿼리 파라미터 등을 가져올 수 있습니다.
<p>사용자 이름: <%= request.getParameter("username") %></p>
  • 요청 파라미터 가져오기
  • 요청 헤더 가져오기
  • 클라이언트 정보 가져오기
  • 요청 디스패칭과 포워딩




response: 서버의 응답 정보를 담고 있는 객체로, 클라이언트에게 전송할 정보나 응답 상태를 설정할 수 있습니다.

response.setContentType("text/html;charset=UTF-8");

 

out: 클라이언트에게 데이터를 출력하는 데 사용되는 객체로, HTML 콘텐츠를 출력할 수 있습니다.

out.println("Hello, JSP!");

 

session: 사용자 세션을 관리하는 객체로, 사용자별로 데이터를 저장하고 유지할 수 있습니다.

session.setAttribute("username", "홍길동");

 

application: 애플리케이션 전역에서 사용할 수 있는 객체로, 모든 사용자에게 공유되는 데이터를 저장할 수 있습니다.

application.setAttribute("appName", "MyJSPApp");
  • config, pageContext, exception: JSP에서 페이지와 애플리케이션 설정을 가져오거나 예외를 처리할 때 사용하는 객체들입니다.

 

내장 객체 설명
request 클라이언트 요청 정보 (HTTP 요청 데이터, 폼 데이터 등)
response 서버 응답 정보 (HTTP 응답 데이터, 리다이렉트 등)
out 클라이언트에게 데이터 출력
session 사용자 세션 관리
application 애플리케이션 전역 데이터 관리
config 서블릿 설정 정보
pageContext JSP 페이지의 컨텍스트 관리
page 현재 JSP 페이지 (this와 동일)
exception 예외 정보 (오류 페이지에서 사용)

 


 

JSP 폼 데이터 처리

기본적인 JSP 폼 데이터 처리 과정

  1. HTML 폼 작성: 클라이언트 측에서 데이터를 입력할 수 있는 HTML 폼을 만듭니다.
  2. 폼 데이터 전송: 사용자가 폼을 제출하면 서버로 데이터가 전송됩니다.
  3. JSP에서 데이터 받기: JSP 페이지에서 request.getParameter()를 사용하여 데이터를 가져와 처리합니다.

 

예제: JSP에서 폼 데이터 처리

1. HTML 폼 작성 (form.jsp)
아래는 사용자가 이름과 나이를 입력하고 제출할 수 있는 HTML 폼입니다. 이 폼은 hello.jsp 페이지로 데이터를 전송합니다.

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <title>폼 데이터 전송</title>
</head>
<body>
    <h2>폼 데이터 전송</h2>
    <form action="hello.jsp" method="post">
        이름: <input type="text" name="username"><br>
        나이: <input type="number" name="age"><br>
        <input type="submit" value="제출">
    </form>
</body>
</html>

 

2. JSP 페이지에서 데이터 받기 (hello.jsp)
아래는 form.jsp에서 전송된 데이터를 받아 출력하는 hello.jsp 페이지입니다.

<%@ page contentType="text/html;charset=UTF-8" %>
<!DOCTYPE html>
<html lang="ko">
<head>
    <title>폼 데이터 처리 결과</title>
</head>
<body>
    <h2>폼 데이터 처리 결과</h2>

    <%
        // 폼 데이터 가져오기
        String username = request.getParameter("username"); // 이름 가져오기
        String age = request.getParameter("age");           // 나이 가져오기
        
        // 폼 데이터가 없는 경우 기본 값 설정
        if (username == null || username.isEmpty()) {
            username = "손님";
        }
        if (age == null || age.isEmpty()) {
            age = "알 수 없음";
        }
    %>

    <p>안녕하세요, <%= username %>님!</p>
    <p>나이: <%= age %>세</p>
</body>
</html>

폼 데이터 처리 시 유의 사항

  1. 빈 값 확인: 사용자가 입력하지 않거나 잘못된 데이터를 입력했을 때 기본값이나 오류 메시지를 출력하는 로직을 추가하는 것이 좋습니다.
  2. 데이터 타입 변환: getParameter() 메서드는 모든 데이터를 문자열로 반환합니다. 숫자와 같은 데이터를 처리할 때는 형변환이 필요합니다. 예를 들어, 나이를 int로 변환하려면 Integer.parseInt(request.getParameter("age"))를 사용할 수 있습니다.
int age = Integer.parseInt(request.getParameter("age"));

1. POST와 GET 방식 차이: method="post"와 method="get"은 전송 방식이 다릅니다. POST 방식은 데이터가 HTTP 메시지의 본문에 포함되기 때문에 URL에 노출되지 않으며, 주로 로그인이나 개인정보 입력 시 사용됩니다. 반면 GET 방식은 데이터를 URL 쿼리 스트링으로 전송하기 때문에, URL에 노출되며 데이터 전송량이 제한적입니다.

 

2. Apache-Tomcat 9 이전 버전 다국어처리 : Tomcat 9 이전 버전에서는 다국어 처리를 위해 서버와 애플리케이션의 문자 인코딩 설정을 수동으로 지정해야 했습니다. Tomcat 10 이후 버전에서는 기본 인코딩 설정이 UTF-8로 개선되어, 다국어 처리 시 인코딩 문제 발생 가능성이 줄어들었습니다. `

request.setCharacterEncoding("utf-8");

'Backend > Web' 카테고리의 다른 글

인텔리제이 Apache Tomcat 설정하기  (0) 2024.11.08
[JSP] JDBC 연동  (3) 2024.11.08
[JavaScript] DOM 폼  (1) 2024.11.06
[JavaScript]배열 / 객체 / 내장클래스  (3) 2024.11.06
[JavaScript] 기본문법 / 함수 / 이벤트  (1) 2024.11.06