core tag에서 if, when choose, forEach
는 종종 사용했지만 set, out, url은 잘 사용하지 않아서 정리합니다.
검색해보면 보다 선언적으로 만들기 위해서 사용한다고 하는데 각각의 예를 더 알아보겠습니다.
<c:set var="username" value="John" />
변수에 값을 할당하거나 객체의 속성 값을 설정할 때 사용합니다.
코드의 가독성을 향상시키고 재사용성 및 유지보수를 향상시키기 위해 사용합니다.
또한 값의 가공이 필요하거나 특정 범위 내에서 변수를 사용할 수 있습니다.
<c:set var="uppercaseDetail" value="${fn:toUpperCase(auth.authDetail)}" />
<c:set var="username" value="John Doe" scope="session" />
<c:out value="${user.comment}" />
주요 장점은 자동으로 HTML 특수 문자를 이스케이프하여 XSS(Cross-Site Scripting) 공격을 방지할 수 있습니다.
<c:out>
의 결과는 문자열이 되므로 object를 기대하는 value
값에서는 .
으로 내부 필드에 접근할 수 없습니다.
이스케이프 예시
<
는<
로 변환됩니다.
>
는>
로 변환됩니다.
"
는"
로 변환됩니다.
'
는'
또는'
로 변환됩니다.
&
는&
로 변환됩니다.
이스케이프되므로 악성 스크립트가 DB에 INSERT되지 않고 실행되지 않습니다.
자동으로 url에 CONTEXT PATH를 붙여줍니다.
따라서 CONTEXT PATH변경에 신경쓰지 않아도 됩니다.
그리고 URL객체를 이용해서 파라미터를 쉽게 추가할 수 있습니다.
let url = new URL(location.href);
url.pathname = "<c:url value='/board'/>";
url.searchParams.set('page', pageData.page);
url.searchParams.set('size', pageData.size);
<c:url>
은 자동으로 JSESSIONID를 url에 붙여줍니다.
또한 생성된 URL을 자동으로 인코딩하여 특수 문자나 공백 등이 올바르게 처리됩니다.
not empty
를 이용해서 3항 연산을 만듭니다.
${not empty boardType.tsiCom ? boardType.tsiCom : boardContent.tsiCom}"