멀티캠퍼스

[2026.06.02] - TIL 42일차 Scope, EL, JSTL 정리

buckwheat 2026. 6. 3. 21:28
목차
1 Scope
2 request, session, application 영역
3 forward와 redirect의 Scope 차이
4 EL
5 EL에서 객체 값 출력하기
6 JSTL
7 JSTL core 태그
8 JSTL formatting 태그
9 오늘 실습의 핵심 정리

 

1 Scope

1) Scope의 개념

    (1) Scope
    Scope는 JSP나 Servlet에서 데이터를 저장하고 공유할 수 있는 범위를 의미한다.
    데이터를 어느 범위까지 사용할 수 있는지 정하는 개념이라고 볼 수 있다.

    (2) Scope를 사용하는 이유
    웹 페이지는 여러 JSP와 Servlet이 서로 연결되어 동작한다.
    이때 한 페이지에서 만든 데이터를 다른 페이지나 Servlet에서도 사용해야 하는 경우가 있다.
    Scope를 사용하면 데이터를 필요한 범위에 맞게 저장하고 꺼내 쓸 수 있다.

    (3) Scope의 종류
    JSP에서 주로 사용하는 Scope에는 page, request, session, application 영역이 있다.
    각각 데이터가 유지되는 범위가 다르기 때문에 상황에 맞게 사용해야 한다.

2) page 영역

    (1) page 영역
    page 영역은 하나의 JSP 페이지 안에서만 데이터를 공유하는 영역이다.
    pageContext.setAttribute로 값을 저장하고, pageContext.getAttribute로 값을 꺼낼 수 있다.

    (2) 특징
    page 영역에 저장한 값은 현재 JSP 페이지 안에서만 사용할 수 있다.
    다른 JSP로 이동하면 같은 이름의 값을 찾을 수 없다.

    (3) 사용 상황
    특정 JSP 안에서만 잠깐 사용할 데이터가 있을 때 page 영역을 사용할 수 있다.
    하지만 다른 페이지로 데이터를 전달해야 한다면 request, session, application 영역을 사용해야 한다.

2 request, session, application 영역

1) request 영역

    (1) request 영역
    request 영역은 하나의 요청이 처리되는 동안 데이터를 공유하는 영역이다.
    request.setAttribute로 값을 저장하고, request.getAttribute로 값을 꺼낼 수 있다.

    (2) 특징
    request 영역은 forward 방식으로 이동할 때 유지된다.
    하나의 요청 안에서 Controller가 데이터를 담고 JSP로 넘길 때 많이 사용한다.

    (3) 사용 상황
    Servlet에서 DB 조회 결과를 request에 담고 JSP로 forward하면, JSP에서 그 데이터를 꺼내 화면에 출력할 수 있다.
    게시판 목록, 상세 정보, 회원 정보처럼 한 번의 요청에서만 필요한 데이터를 전달할 때 적합하다.

2) session 영역

    (1) session 영역
    session 영역은 같은 브라우저에서 유지되는 데이터 공유 영역이다.
    Servlet에서는 request.getSession으로 session 객체를 얻을 수 있다.

    (2) 특징
    session에 저장한 값은 여러 요청이 바뀌어도 같은 브라우저 안에서는 유지된다.
    브라우저를 닫거나 session이 만료되거나 session.invalidate를 실행하면 삭제된다.

    (3) 사용 상황
    로그인 정보처럼 여러 페이지에서 계속 유지해야 하는 데이터에 사용한다.
    로그인 성공 후 회원 정보를 session에 저장하면 다른 JSP에서도 로그인한 사용자의 정보를 사용할 수 있다.

3) application 영역

    (1) application 영역
    application 영역은 하나의 웹 애플리케이션 전체에서 공유되는 영역이다.
    JSP에서는 application 객체를 사용하고, Servlet에서는 getServletContext로 ServletContext 객체를 얻어 사용할 수 있다.

    (2) 특징
    application 영역에 저장한 값은 같은 웹 애플리케이션 안의 모든 사용자와 모든 페이지에서 공유될 수 있다.
    request나 session보다 훨씬 넓은 범위이다.

    (3) 사용 상황
    전체 사용자에게 공통으로 필요한 설정값이나 애플리케이션 단위로 공유할 데이터가 있을 때 사용할 수 있다.
    다만 모든 사용자에게 공유되므로 사용자 개인 정보 저장에는 적합하지 않다.

3 forward와 redirect의 Scope 차이

1) forward 방식

    (1) forward
    forward는 서버 내부에서 request와 response 객체를 유지한 채 다른 페이지로 이동하는 방식이다.
    사용자의 브라우저가 새 요청을 보내는 것이 아니라, 서버 안에서 흐름이 이어진다.

    (2) request 유지
    forward를 사용하면 request 영역에 저장한 값이 다음 JSP에서도 유지된다.
    ScopeController에서 request.setAttribute로 저장한 reqId 값을 res.jsp에서 확인할 수 있다.

    (3) 사용 상황
    Servlet에서 처리한 결과를 JSP로 전달해야 할 때 forward를 사용한다.
    Controller에서 View로 데이터를 넘기는 MVC 흐름에서 자주 사용한다.

2) redirect 방식

    (1) redirect
    redirect는 클라이언트에게 새로운 주소로 다시 요청하라고 지시하는 방식이다.
    브라우저가 새 요청을 보내기 때문에 기존 request 객체는 유지되지 않는다.

    (2) request 소멸
    redirect를 사용하면 request 영역에 저장한 값은 다음 페이지에서 사용할 수 없다.
    대신 session이나 application 영역의 값은 유지될 수 있다.

    (3) forward와의 차이
    request에 담은 데이터를 다음 JSP에서 사용해야 하면 forward를 사용해야 한다.
    단순 페이지 이동만 필요하다면 redirect를 사용할 수 있다.

3) ScopeController 실습 흐름

    (1) index.jsp에서 값 저장
    index.jsp에서는 page, request, session, application 영역에 각각 값을 저장했다.
    저장한 값을 같은 페이지에서 바로 출력하여 각 Scope에 값이 들어갔는지 확인했다.

    (2) Servlet에서 값 확인
    ScopeController에서는 request, session, application 영역의 값을 꺼내 콘솔에 출력했다.
    session은 request.getSession으로 가져오고, application은 getServletContext로 가져왔다.

    (3) res.jsp로 forward
    ScopeController는 request.setAttribute로 reqId 값을 새로 저장한 뒤 res.jsp로 forward했다.
    forward를 사용했기 때문에 res.jsp에서 request 영역의 값을 확인할 수 있었다.

4 EL

1) EL의 개념

    (1) EL
    EL은 Expression Language의 줄임말이다.
    JSP에서 데이터를 쉽게 출력하기 위한 표현식 언어이다.

    (2) 사용하는 이유
    기존 JSP에서는 값을 출력할 때 <%= %> 표현식을 사용했다.
    EL을 사용하면 ${} 문법으로 더 간단하고 읽기 쉽게 값을 출력할 수 있다.

    (3) 기본 형태
    EL은 ${값} 형태로 작성한다.
    숫자, 문자열, 연산 결과, 객체의 필드 값 등을 화면에 출력할 수 있다.

2) EL 기본 연산

    (1) 숫자 출력
    ${1}처럼 작성하면 숫자 1이 화면에 출력된다.
    단순 값 출력에 사용할 수 있다.

    (2) 산술 연산
    ${1+2}처럼 작성하면 계산 결과가 출력된다.
    EL 안에서 간단한 덧셈, 뺄셈, 곱셈, 나눗셈 같은 연산을 할 수 있다.

    (3) 비교 연산
    ${(1==2)?3:4}처럼 조건식을 사용할 수 있다.
    조건 결과에 따라 다른 값을 출력할 수 있다.

5 EL에서 객체 값 출력하기

1) request에 객체 저장

    (1) Score 객체
    Score 클래스는 이름, 국어, 영어, 수학, 총합, 평균 정보를 가지는 클래스이다.
    생성자에서 국어, 영어, 수학 점수를 받아 총합과 평균을 계산한다.

    (2) request.setAttribute
    Controller에서 Score 객체를 생성한 뒤 request.setAttribute("dto", sc)로 저장했다.
    이렇게 저장한 객체는 forward된 JSP에서 EL로 출력할 수 있다.

2) EL 객체 접근

    (1) ${dto.name}
    ${dto.name}은 dto 객체의 name 값을 출력한다.
    실제로는 getName 메소드를 호출해서 값을 가져오는 방식이다.

    (2) ${dto.kor}
    ${dto.kor}는 dto 객체의 국어 점수를 출력한다.
    실제로는 getKor 메소드를 통해 값을 가져온다.

    (3) ${dto.sum}
    ${dto.sum}은 dto 객체의 총합을 출력한다.
    Score 클래스의 getSum 메소드가 호출되어 계산된 총합이 출력된다.

    (4) ${dto.avg}
    ${dto.avg}는 dto 객체의 평균을 출력한다.
    Score 클래스의 getAvg 메소드를 통해 평균값을 가져온다.

3) EL의 Scope 탐색 순서

    (1) 기본 탐색 순서
    EL은 이름만 작성하면 pageScope, requestScope, sessionScope, applicationScope 순서로 값을 찾는다.
    같은 이름의 값이 여러 Scope에 있으면 더 좁은 영역의 값이 먼저 출력된다.

    (2) ${tmp}
    tmp라는 이름의 값이 request와 session에 모두 있다면, 기본적으로 request 영역의 tmp가 먼저 출력된다.
    requestScope가 sessionScope보다 먼저 탐색되기 때문이다.

    (3) ${sessionScope.tmp}
    특정 Scope의 값을 명확히 꺼내고 싶을 때는 sessionScope.tmp처럼 작성한다.
    이렇게 하면 session 영역에 저장된 tmp 값을 직접 가져올 수 있다.

6 JSTL

1) JSTL의 개념

    (1) JSTL
    JSTL은 JSP Standard Tag Library의 줄임말이다.
    JSP에서 자주 사용하는 조건문, 반복문, 출력, 포맷 처리 등을 태그 형태로 사용할 수 있게 해주는 라이브러리이다.

    (2) 사용하는 이유
    JSP 안에서 Java 코드를 많이 작성하면 HTML과 Java 코드가 섞여서 복잡해진다.
    JSTL을 사용하면 Java 코드 대신 HTML과 비슷한 태그로 조건문과 반복문을 작성할 수 있다.

    (3) JSP 코드 가독성
    JSTL은 JSP 화면을 더 깔끔하게 만들기 위해 사용한다.
    View 페이지에서 복잡한 스크립트릿 사용을 줄일 수 있다.

2) taglib 지시자

    (1) core 태그 선언
    core 태그를 사용하려면 taglib 지시자를 작성해야 한다.
    prefix를 c로 설정하면 c:forEach, c:if, c:choose 같은 태그를 사용할 수 있다.

    (2) formatting 태그 선언
    formatting 태그를 사용하려면 prefix를 fmt로 설정한다.
    날짜나 숫자의 형식을 바꿀 때 사용한다.

    (3) prefix의 의미
    prefix는 JSP 안에서 해당 태그 라이브러리를 어떤 이름으로 부를지 정하는 별칭이다.
    core는 보통 c, formatting은 보통 fmt를 사용한다.

7 JSTL core 태그

1) c:forEach

    (1) 반복문
    c:forEach는 JSP에서 반복문을 작성할 때 사용하는 JSTL 태그이다.
    Java의 for문과 비슷한 역할을 한다.

    (2) items
    items에는 반복할 데이터 목록을 작성한다.
    MyServlet에서 request에 저장한 list를 ${list}로 받아 반복할 수 있다.

    (3) var
    var는 반복 중 현재 요소를 저장하는 변수 이름이다.
    c:forEach var="score" items="${list}"라고 작성하면 list 안의 Score 객체를 하나씩 score라는 이름으로 사용할 수 있다.

    (4) begin, end, step
    c:forEach는 begin, end, step을 이용해 숫자 반복도 할 수 있다.
    예를 들어 0부터 10까지 1씩 증가하며 반복할 수 있다.

2) c:if

    (1) 조건문
    c:if는 조건이 true일 때만 내용을 실행하는 태그이다.
    Java의 if문과 비슷한 역할을 한다.

    (2) test
    test 속성에는 조건식을 작성한다.
    예를 들어 score.name이 특정 값과 같을 때만 원하는 내용을 출력할 수 있다.

    (3) 사용 상황
    조건이 하나만 필요할 때 c:if를 사용한다.
    여러 조건 중 하나를 선택해야 한다면 c:choose를 사용하는 것이 더 적합하다.

3) c:choose, c:when, c:otherwise

    (1) c:choose
    c:choose는 여러 조건 중 하나를 선택할 때 사용하는 태그이다.
    Java의 if else 또는 switch문과 비슷한 역할을 한다.

    (2) c:when
    c:when은 각각의 조건을 작성하는 태그이다.
    test 속성에 조건식을 작성하고, 조건이 true이면 해당 내용이 실행된다.

    (3) c:otherwise
    c:otherwise는 앞의 c:when 조건들이 모두 false일 때 실행된다.
    Java의 else와 같은 역할이다.

4) c:out

    (1) 출력 태그
    c:out은 값을 화면에 출력하는 태그이다.
    EL로 가져온 값을 안전하게 출력할 때 사용할 수 있다.

    (2) 사용 이유
    단순히 ${test}로 출력할 수도 있지만, c:out을 사용하면 태그 기반으로 출력 처리를 할 수 있다.
    JSTL을 이용한 화면 출력 방식에 익숙해지기 좋다.

5) c:set

    (1) 변수 선언
    c:set은 JSP에서 변수를 선언하거나 값을 저장할 때 사용하는 태그이다.
    var 속성에 변수 이름을 쓰고 value 속성에 저장할 값을 작성한다.

    (2) scope
    c:set은 scope 속성을 통해 page, request, session, application 중 어느 영역에 저장할지 정할 수 있다.
    scope를 생략하면 기본적으로 page 영역에 저장된다.

8 JSTL formatting 태그

1) fmt:parseDate

    (1) 문자열을 날짜로 변환
    fmt:parseDate는 문자열 형태의 날짜를 Date 타입으로 변환하는 태그이다.
    value에 날짜 문자열을 넣고 pattern에 날짜 형식을 지정한다.

    (2) 사용 예
    value가 2026-06-03이고 pattern이 yyyy-MM-dd이면 해당 문자열을 날짜로 해석한다.
    변환된 값은 var에 지정한 이름으로 저장할 수 있다.

2) fmt:formatDate

    (1) 날짜 형식 변경
    fmt:formatDate는 Date 값을 원하는 형식의 문자열로 출력할 때 사용한다.
    날짜를 사용자에게 보기 좋은 형태로 바꿔 출력할 수 있다.

    (2) 사용 예
    pattern을 MM/dd/yy로 지정하면 월/일/연도 형태로 날짜를 출력할 수 있다.
    날짜 데이터를 화면에 보여줄 때 형식을 통일할 수 있다.

3) formatting 태그를 사용하는 이유

    (1) 화면 출력 형식 조정
    DB나 Java 객체에서 가져온 날짜와 숫자는 그대로 출력하면 보기 불편할 수 있다.
    fmt 태그를 사용하면 사용자가 보기 좋은 형식으로 바꿔 출력할 수 있다.

    (2) View 역할에 적합
    날짜 형식이나 숫자 형식은 화면 표현에 가까운 작업이다.
    따라서 JSP View에서 JSTL formatting 태그를 사용해 처리할 수 있다.

9 오늘 실습의 핵심 정리

1) Scope 이해

    (1) 데이터 공유 범위
    Scope는 데이터를 어디까지 공유할 수 있는지 정하는 개념이다.
    page, request, session, application은 각각 유지 범위가 다르다.

    (2) request와 forward
    request 영역은 forward를 사용할 때 다음 JSP까지 유지된다.
    Controller에서 JSP로 데이터를 넘길 때 중요한 개념이다.

    (3) session과 로그인
    session 영역은 같은 브라우저 안에서 유지된다.
    로그인 정보처럼 여러 페이지에서 계속 필요한 데이터를 저장하는 데 적합하다.

    (4) application과 전체 공유
    application 영역은 웹 애플리케이션 전체에서 공유된다.
    모든 사용자와 페이지에서 공통으로 사용할 값에 적합하다.

2) EL 이해

    (1) 표현식 간단화
    EL은 JSP에서 값을 더 간단하게 출력하기 위한 문법이다.
    기존의 <%= %> 표현식보다 코드가 짧고 읽기 쉽다.

    (2) 객체 접근
    EL은 객체의 getter 메소드를 이용해 필드 값을 가져온다.
    ${dto.name}, ${dto.kor}, ${dto.avg}처럼 객체 값을 간단히 출력할 수 있다.

    (3) Scope 탐색
    EL은 page, request, session, application 순서로 값을 찾는다.
    특정 영역 값을 명확히 가져오고 싶다면 sessionScope.tmp처럼 Scope를 직접 지정할 수 있다.

3) JSTL 이해

    (1) Java 코드 줄이기
    JSTL은 JSP 안에서 Java 스크립트릿 사용을 줄이기 위해 사용한다.
    조건문과 반복문을 태그 형태로 작성할 수 있어 화면 코드가 더 깔끔해진다.

    (2) 반복과 조건 처리
    c:forEach로 리스트를 반복하고, c:if와 c:choose로 조건에 따라 다른 값을 출력했다.
    이를 통해 View 페이지에서 데이터를 화면에 맞게 표현하는 방법을 배웠다.

    (3) 날짜 포맷 처리
    fmt:parseDate와 fmt:formatDate를 사용해 날짜 문자열을 날짜로 변환하고 원하는 형식으로 출력했다.
    화면에 보여줄 데이터 형식을 조정하는 방법을 배웠다.

4) 오늘 배운 전체 흐름

    (1) ScopeController 실습
    index.jsp에서 page, request, session, application 영역에 값을 저장했다.
    Servlet에서 request, session, application 값을 확인하고, forward로 res.jsp에 데이터를 전달했다.

    (2) EL 실습
    Controller에서 Score 객체를 request에 저장하고 JSP에서 EL로 값을 출력했다.
    기존 JSP 표현식보다 간단하게 객체 값을 화면에 보여줄 수 있었다.

    (3) JSTL 실습
    Servlet에서 Score 객체 리스트를 request에 저장하고 jstlpage.jsp로 forward했다.
    JSP에서는 JSTL의 c:forEach, c:if, c:choose, c:out, c:set, fmt 태그를 사용해 데이터를 출력했다.

    (4) 앞으로의 의미
    Scope, EL, JSTL은 JSP View를 더 깔끔하게 작성하기 위한 중요한 개념이다.
    Servlet이 Controller 역할을 하고 JSP가 View 역할을 할 때, JSP 안의 Java 코드를 줄이고 데이터를 보기 좋게 출력하는 데 필요하다.