JSP

⭐ EL + JSTL로 변경된 코드 (스크립틀릿 완전 제거 하기!)

보배 진 2025. 11. 21. 14:41

 

 

 

 

지금까지 코드에 스크립틀릿을 넣어 .JSP 파일 안에는 자바 코드와 HTML 코드가 뒤죽박죽이었다

보기에도 안좋고 유지보수나 협업을 할 때 문제가 생긴다고 한다

특히 MVC 구조가 무너진다고 해서 이 부분을 수정하고자 한다

 

 

 

 

기존 코드 중 일부분

<form name="checkForm" action="controller.jsp" method="POST">
    <input type="hidden" name="command" value="UPDATETITLE">
    <input type="hidden" name="bid" value="${board.bid}">
    <!-- <input type="hidden" name="bid" value="<%--<%=board.getBid()%>--%>"> -->
    <table border="1">
        <tr>
            <td>글 번호</td><td>제목</td><td>내용</td><td>작성자</td>
        </tr>
        <tr>
            <td>${board.bid}</td><td><input type="text" name="title" value="${board.title}" required></td>
            <td>${board.content}</td>
            <td>
            <%
            BoardDTO board = (BoardDTO)request.getAttribute("board");
            if(board.getWriterName() == null){
                out.println("탈퇴한 사용자");
            }
            else{
                out.println(board.getWriterName());
            }
            %>
        </td>
        </tr>
        <% if(session.getAttribute("userInfo")!=null && (session.getAttribute("userMrole").equals("ADMIN") || session.getAttribute("userInfo").equals(board.getWriter()))){ %>
        <tr>
            <td colspan="4" align="right"><input type="submit" value="제목 변경">&nbsp;<input type="button" value="글 삭제" onclick="del()"></td>
        </tr>
        <% } %>
    </table>		
</form>

 

<% %>으로 된 부분의 코드를 바꿔야 한다

 

 

🔻

 

 

 

<form name="checkForm" action="controller.jsp" method="POST">
    <input type="hidden" name="command" value="UPDATETITLE">
    <input type="hidden" name="bid" value="${board.bid}">
    <table border="1">
        <tr>
            <td>글 번호</td><td>제목</td><td>내용</td><td>작성자</td>
        </tr>
        <tr>
            <td>${board.bid}</td>
            <!-- 제목 변경 input -->
            <td><input type="text" name="title" value="${board.title}" required></td>
            <td>${board.content}</td> <!-- 내용 -->
            <!-- 작성자 이름 (null이면 탈퇴한 사용자) -->
            <td>
                <c:choose>
                    <c:when test="${empty board.writerName}">
                        탈퇴한 사용자
                    </c:when>
                    <c:otherwise>
                        ${board.writerName}
                    </c:otherwise>
                </c:choose>
            </td>
        </tr>
        <!-- 관리자 OR 본인 글일 때만 버튼 표시 -->
        <c:if test="${not empty userInfo 
                     and (sessionScope.userMrole eq 'ADMIN' 
                         or sessionScope.userInfo eq board.writer)}">
            <tr>
                <td colspan="4" align="right">
                    <input type="submit" value="제목 변경">
                    &nbsp;
                    <input type="button" value="글 삭제" onclick="del()">
                </td>
            </tr>
        </c:if>
    </table>		
</form>

 

 

 

 

 


 

 

 

 

 

 

사진으로 보면 이러하다

 

 

 

BoardDTO board = (BoardDTO)request.getAttribute("board");

이 부분이 사라진 이유가 뭔지 궁금해서 찾아봤다

 

 

 

 

✅ 1. 기존 스크립틀릿에서 이 코드가 존재했던 이유

BoardDTO board = (BoardDTO)request.getAttribute("board");

이 코드가 존재했던 이유는 request 영역에 저장된 객체를 꺼내서

이걸 board라는 자바 변수에 넣기 위해서였다

 

그리고 사용을 할 때는 

board.getWriterName()

board.getBid()

board.getTitle()

이런식으로 request에 있는 값을 직접 꺼내 사용해야 한다

 

 

 

✅ 2. EL에서는 왜 이 코드가 필요 없나?

EL(${ })은 **JSP의 네 가지 기본 scope(page, request, session, application)**를

자동으로 검색해서 이름이 같은 객체를 찾아낸다

 

request.setAttribute("board", boardDTO객체);

이런 코드를 EL로  ${board} 이라고 쓰면

 

 

 

 

 

 

EL이 자동으로 다음 순서로 찾습니다:

  1. pageScope.board
  2. requestScope.board
  3. sessionScope.board
  4. applicationScope.board

이 중 어디든 존재하면 자동으로 객체를 찾고 접근합니다.

 

 

 

스크립틀릿처럼 request.getAttribute("board") 해줄 필요가 없다

자동으로 getter까지 호출을 하기 때문이다

ex)

${board.title}  → board.getTitle()
${board.writerName} → board.getWriterName()

 

 

 

 

 

⭐ 그렇다면 “사라진 것”은 어디로 간 것인가? → 실제로 사라진 게 아니라,

EL이 자동으로 requestScope에서 찾아와주는 기능 때문에 생략된 것입니다.

즉, 우리가 명시적으로 변수 선언을 안 해도

board라는 이름으로 저장된 객체가 이미 requestScope에 있음

EL이 알아서 가져옴

JSP에서 바로 ${board.xxx}로 사용 가능

 

 

 

 

⭐ 그렇기 때문에 동작이 문제 없이 되는 이유

  1. **Controller(서블릿)**에서 이미로 request에 세팅 ▶request.setAttribute("board", boardDTO객체);
  2. JSP에 도착했을 때 EL이 ${board} 를 만나면 requestScope를 검사
  3. board 객체를 찾고 boardDTO의 getter를 자동 호출

따라서 스크립틀릿 변수 선언이 필요 없어짐.