EL (Expression Language)과 스코프 개념 설명

EL (Expression Language) 개요

Expression Language (EL)은 JSP(JavaServer Pages)에서 데이터 접근을 쉽게 하기 위해 사용하는 언어입니다.
EL은 간단한 표현식으로 JSP 페이지에서 자바 객체의 속성 값을 참조할 수 있게 해줍니다.

스코프 객체

스코프(scope)는 웹 애플리케이션에서 변수나 객체가 저장되는 영역을 나타냅니다. EL에서는 다음과 같은 스코프를 사용할 수 있습니다:

1. Page Scope

  • EL 표현: pageScope
  • Servlet 표현: 지역 변수
  • 설명:
    • 페이지 내에서만 유효한 변수나 객체를 저장합니다.
    • 예: JSP 페이지 내에서 선언된 변수

2. Request Scope

  • EL 표현: requestScope
  • Servlet 표현: HttpServletRequest
  • 설명:
    • 요청이 처리되는 동안 유효한 변수나 객체를 저장합니다.
    • 예: 서블릿에서 클라이언트 요청을 처리할 때 사용되는 변수

3. Session Scope

  • EL 표현: sessionScope
  • Servlet 표현: HttpSession
  • 설명:
    • 세션이 유지되는 동안 유효한 변수나 객체를 저장합니다.
    • 예: 로그인한 사용자 정보를 세션에 저장

4. Application Scope

  • EL 표현: applicationScope
  • Servlet 표현: ServletContext
  • 설명:
    • 애플리케이션이 종료될 때까지 유효한 변수나 객체를 저장합니다.
    • 예: 애플리케이션 전체에서 공유하는 설정 정보

스코프 객체를 지정하지 않은 경우 속성 찾는 순서

EL에서 특정 스코프를 지정하지 않고 속성을 참조할 때, 속성을 찾는 순서는 다음과 같습니다:
1. Page Scope
2. Request Scope
3. Session Scope
4. Application Scope

예를 들어, ${username}이라는 표현식이 있을 때, EL은 다음 순서로 username 속성을 찾습니다:

  • Page Scope에서 username을 찾습니다.
  • Page Scope에서 찾을 수 없으면 Request Scope에서 찾습니다.
  • Request Scope에서도 찾을 수 없으면 Session Scope에서 찾습니다.
  • Session Scope에서도 찾을 수 없으면 Application Scope에서 찾습니다.

스코프 개념 요약

  • Page Scope: 한 페이지 내에서만 유효 (지역 변수)
  • Request Scope: 요청이 처리되는 동안 유효 (HttpServletRequest)
  • Session Scope: 세션이 유지되는 동안 유효 (HttpSession)
  • Application Scope: 애플리케이션이 종료될 때까지 유효 (ServletContext)

이를 통해 개발자는 적절한 스코프를 사용하여 웹 애플리케이션의 데이터와 상태를 효율적으로 관리할 수 있습니다.


실습

각 파일의 코드와 개념 설명

1. ScopeServlet.java

이 서블릿은 클라이언트 요청을 받아 다양한 스코프에 데이터를 설정하고,
데이터를 포함한 요청을 JSP페이지로 포워딩하는 역할을 합니다.

포워딩 (Forwarding)개념 설명
웹 애플리케이션에서 "포워딩"이란 클라이언트의 요청을 서버 내에서 다른 리소스(예: 서블릿, JSP페이지)로 전달하는 것을 의미한다. 포워딩은 클라이언트가 인식하지 못하는 서버 내부의 동작이다.

<포워딩 주요 특징>
1. 서버 내에서 발생 : 클라이언트는 요청을 한번만 보낸다. 포워딩은 서버 내에서 발생하며, 클라이언트는 요청이 다른 리소스로 전달된 사실을 알지 못한다. 
2. URL 변경 없음 : 클라이언트의 브라우저 URL은 처음 요청한 URL 그대로 유지된다. 포워딩은 서버 내부의 동작이기 때문에 클라이언트 측에서는 URL이 바뀌지 않는다. 
3. 요청 및 응답 객체 재사용 : 원래의 HttpServletRequest와 HttpServletResponse 객체가 그대로 전달되므로, 초기 요청의 모든 데이터와 속성이 유지된다. 
@WebServlet("/scope")
// /scope URL 패턴에 매핑됨.

public class ScopeServlet extends HttpServlet {
    ServletContext sc;
    // 애플리케이션 범위의 정보를 저장 및 제공하는 객체

    @Override
    public void init(ServletConfig config) throws ServletException {
        sc = config.getServletContext();
    }
    // init(ServletConfig config): 서블릿이 초기화될 때 호출된다. 여기서는 ServletContext 객체를 가져온다. 
    
    
    
    
    

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    // HTTP GET 요청을 처리하는 메소드 .
            throws ServletException, IOException {
        sc.setAttribute("scopeName", "applicationScope 값"); 
        // Application Scope.  ServletContext 객체에 scopeName 속성을 설정한다. 이는 애플리케이션 범위의 속성이다.

        HttpSession session = request.getSession(); 
        // Session Scope.  현재 요청과 관련된 세션을 가져온다. 
        
        
        
        session.setAttribute("scopeName", "sessionScope 값");
        // 세션 범위의 scopeName 속성을 설정한다.

        request.setAttribute("scopeName", "requestScope 값"); 
        // Request Scope.  요청 범위의 scopeName속성을 설정한다. 
        
        
        Member member = new Member("홍길동", "hong");
        //Member 객체 생성.
        
        request.setAttribute("member", member);
        // 요청 범위의 member 속성을 설정. 
        
        
        request.getRequestDispatcher("scope.jsp").forward(request, response);
        //요청을 scope.jsp로 포워딩한다. 이는 서블릿이 처리한 데이터를 JSP로 전달한다. 
    }
}
  • Servlet:
    서블릿은 자바 기반 웹 애플리케이션에서 클라이언트의 요청을 처리하고 응답을 생성하는 서버측 컴포넌트입니다.

  • ServletContext:
    애플리케이션 전체에서 공유되는 컨텍스트입니다.
    여기서는 scopeName 속성을 applicationScope에 저장합니다.

  • HttpSession:
    특정 클라이언트와 서버 간의 세션을 유지하기 위해 사용됩니다.
    여기서는 scopeName 속성을 sessionScope에 저장합니다.

  • HttpServletRequest:
    클라이언트의 요청 정보를 담고 있습니다.
    여기서는 scopeName 속성과 member 객체를 requestScope에 저장합니다.
  • RequestDispatcher:
    요청을 다른 리소스(JSP 등)로 전달하는 데 사용됩니다.
    여기서는 scope.jsp로 요청을 포워딩합니다.

2. scope.jsp

JSP 페이지는 EL(Expression Language)을 사용하여
서블릿에서 설정한 다양한 스코프의 속성값을 출력한다.

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
// JSP페이지의 설정을 지정한다. 여기서는 컨텐츠 타입을 text/html로, 문자 인코딩을 UTF-8로 설정.


<html>
<head>
    <title>Title</title>
</head>



<body>
<h1>scope 데이터 보기 </h1>

pageScope의 속성값은 : ${pageScope.scopeName}<br>
                   // EL을 사용하여 페이지 범위의 scopeName 속성 값을 출력한다.
requestScope의 속성값은 : ${requestScope.scopeName}<br>
                      // EL을 사용하여 요청 범위의 scopeName 속성 값을 출력한다.
sessionScope의 속성값은 : ${sessionScope.scopeName}<br>
                      // EL을 사용하여 세션 범위의 scopeName 속성 값을 출력한다.
applicationScope의 속성값은 : ${applicationScope.scopeName}<br>
                          // EL을 사용하여 애플리케이션 범위의 scopeName 속성 값을 출력한다.
scopeName 자동 찾기: ${scopeName} <br>
                  //EL을 사용하여 지정된 스코프 순서대로 scopeName 속성 값을 자동으로 찾는다.
member: ${member.name}(${member.userid})<br>
// EL을 사용하여 member 객체의 name과 userid 속성 값을 출력한다.
</body>
</html>
  • JSP (JavaServer Pages): 서버 측에서 동적으로 생성된 HTML을 포함한 웹 페이지를 만들기 위한 기술입니다.

  • EL (Expression Language): JSP에서 간단하게 자바 객체의 속성을 참조하기 위해 사용됩니다. 예를 들어, ${requestScope.scopeName}requestScope에서 scopeName 속성의 값을 가져옵니다.

  • 스코프:

    • pageScope: 페이지 내에서만 유효한 속성.
    • requestScope: 요청 내에서 유효한 속성.
    • sessionScope: 세션 내에서 유효한 속성.
    • applicationScope: 애플리케이션 전체에서 유효한 속성.

3. Member.java

Member 클래스는 사용자의 이름과 아이디를 저장하는 자바 빈 객체이다.

package org.scoula.ex05.domain;


public class Member {
    private String name;
    private String userid;
    // 사용자 이름과 아이디를 저장하는 두 개의 속성.

    public Member() {
    }
    // 기본 생성자. 

    public Member(String name, String userid) {
        this.name = name;
        this.userid = userid;
    } // 이름과 아이디를 매개변수로 받아 초기화 하는 생성자.
    
    
   

    public String getName() {
        return name;
    } 
     public void setName(String name) {
        this.name = name;
    }
      //name 속성의 getter와 setter 메소드.
      
      
      
    public String getUserid() {
        return userid;
    }
    public void setUserid(String userid) {
        this.userid = userid;
    }
      //userid 속성의 getter와 setter 메소드.
}
  • Java 클래스: Member 클래스는 사용자의 이름과 아이디를 저장하는 단순한 자바 빈 객체입니다.
  • 속성 및 메소드:
    • nameuserid 속성.
    • 기본 생성자와 매개변수를 받는 생성자.
    • getName, setName, getUserid, setUserid 메소드.

Getter와 Setter 메소드 개념
<개념>

•	Getter 메소드: 객체의 속성(필드) 값을 반환하는 메소드입니다. 주로 getFieldName() 형태로 명명됩니다.
•	Setter 메소드: 객체의 속성(필드) 값을 설정하는 메소드입니다. 주로 setFieldName(value) 형태로 명명됩니다.


<사용 목적>

1.	캡슐화: 객체지향 프로그래밍의 중요한 원칙 중 하나로, 객체의 내부 상태(속성 값)를 외부에서 직접 접근하지 못하게 하고, 메소드를 통해 접근하도록 합니다. 이를 통해 데이터의 무결성을 보장하고, 객체의 내부 구현을 숨길 수 있습니다.
2.	데이터 보호: 속성 값에 대한 직접 접근을 막아 잘못된 값이 설정되지 않도록 합니다. setter 메소드에서 값의 유효성을 검사할 수 있습니다.
3.	유연성: 속성 값을 읽거나 쓸 때 추가 로직을 구현할 수 있습니다. 예를 들어, 속성 값을 설정할 때 로그를 남기거나, 특정 조건에 따라 다른 속성 값도 변경할 수 있습니다.
4.	변경 용이성: 속성의 구현을 변경하더라도 getter와 setter 메소드의 인터페이스는 변경되지 않으므로, 다른 코드에 영향을 주지 않고 수정할 수 있습니다.


<Getter 메소드>
•	목적: 객체의 속성 값을 **반환**합니다.
•	형태: 반환 타입이 속성의 타입과 동일합니다.
•	명명 규칙: get 접두사에 속성 이름의 첫 글자를 대문자로 한 형태를 사용합니다.


<Setter 메소드>
•	목적: 객체의 속성 값을 **설정**합니다.
•	형태: 매개변수 타입이 속성의 타입과 동일합니다.
•	명명 규칙: set 접두사에 속성 이름의 첫 글자를 대문자로 한 형태를 사용합니다.

논리적 구조 및 과정

  1. 클라이언트 요청: 클라이언트가 /scope URL로 요청을 보냅니다.

  2. 서블릿 초기화: ScopeServlet이 초기화되고 ServletContext 객체를 가져옵니다.

  3. doGet 메소드 실행:

    • applicationScopescopeName 속성을 설정합니다.
    • 현재 세션을 가져와서 sessionScopescopeName 속성을 설정합니다.
    • requestScopescopeName 속성을 설정하고 member 객체를 추가합니다.
  4. 요청 포워딩: scope.jsp로 요청을 포워딩합니다.

  5. JSP 처리:

    • EL을 사용하여 각각의 스코프에서 scopeName 값을 출력합니다.
    • member 객체의 nameuserid 속성을 출력합니다.

이 과정을 통해 각 스코프에 저장된 데이터가 어떻게 JSP 페이지에서 표현되는지를 보여줍니다. 이러한 구조는 웹 애플리케이션의 상태 관리와 데이터 접근을 효율적으로 처리할 수 있게 합니다.

0개의 댓글