지금까지 코드에 스크립틀릿을 넣어 .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="제목 변경"> <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="제목 변경">
<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이 자동으로 다음 순서로 찾습니다:
- pageScope.board
- requestScope.board
- sessionScope.board
- applicationScope.board
이 중 어디든 존재하면 자동으로 객체를 찾고 접근합니다.
스크립틀릿처럼 request.getAttribute("board") 해줄 필요가 없다
자동으로 getter까지 호출을 하기 때문이다
ex)
${board.title} → board.getTitle()
${board.writerName} → board.getWriterName()
⭐ 그렇다면 “사라진 것”은 어디로 간 것인가? → 실제로 사라진 게 아니라,
EL이 자동으로 requestScope에서 찾아와주는 기능 때문에 생략된 것입니다.
즉, 우리가 명시적으로 변수 선언을 안 해도
board라는 이름으로 저장된 객체가 이미 requestScope에 있음
↓
EL이 알아서 가져옴
↓
JSP에서 바로 ${board.xxx}로 사용 가능
⭐ 그렇기 때문에 동작이 문제 없이 되는 이유
- **Controller(서블릿)**에서 이미로 request에 세팅 ▶request.setAttribute("board", boardDTO객체);
- JSP에 도착했을 때 EL이 ${board} 를 만나면 requestScope를 검사
- board 객체를 찾고 boardDTO의 getter를 자동 호출
따라서 스크립틀릿 변수 선언이 필요 없어짐.
'JSP' 카테고리의 다른 글
| GET 방식과 POST 방식 (0) | 2025.11.24 |
|---|---|
| 트리나라 페이지 분석하기 (0) | 2025.11.22 |
| 🍍 JSTL | 리스너 | 에러페이지 설정 | 필터 Filter (0) | 2025.11.21 |
| requset | session | application | response (0) | 2025.11.20 |
| setAttribute( )!! request와 같이 사용하기 (0) | 2025.11.20 |