포스트

2021-03-16-TIL

2021-03-16-TIL

Handlebars 템플릿에서 세션 값 쓰기

별다른 설정이 없으면 if 문으로 가져올 때 모델을 가져온다.

handlebars.expose-session-attributes=true 설정을 추가해야한다.

로그인한 사용자에게만 메뉴를 보여 주려고 템플릿에서 {{#if sessionUser}}처럼 세션 값을 확인하는 경우가 많다. 그런데 Handlebars 템플릿이 값을 찾는 곳은 기본적으로 컨트롤러가 넘긴 모델이다. 컨트롤러에서 session.setAttribute("sessionUser", user)로 세션에 넣어 두기만 하면 템플릿에서는 그 값이 보이지 않는다.

1
2
# application.properties
handlebars.expose-session-attributes=true

이 설정이 어디서 오는지 따라가 보면 이해가 쉽다. handlebars-spring-boot-starter의 HandlebarsProperties는 handlebars 접두사를 쓰는 설정 클래스이고, Spring Boot의 AbstractTemplateViewResolverProperties를 상속한다. Spring Boot v2.4.3 소스에서 이 부모 클래스의 exposeSessionAttributes 필드는 다음과 같이 정의되어 있다.

1
2
3
4
5
/**
 * Whether all HttpSession attributes should be added to the model prior to merging
 * with the template.
 */
private boolean exposeSessionAttributes = false;

기본값이 false이고, true로 켜면 템플릿과 합치기 전에 모든 HttpSession 속성을 모델에 추가한다. 그래서 설정 한 줄로 템플릿에서 세션 값을 모델 값처럼 쓸 수 있게 된다. 같은 클래스에는 요청 속성을 모델에 넣는 exposeRequestAttributes도 있다. 이 부모 클래스는 FreeMarker, Mustache 같은 다른 템플릿 엔진 설정도 공유하므로, 접두사만 바꾸면 비슷한 설정을 찾을 수 있다.

세션 속성이 모두 모델에 들어간다는 점은 알아 둘 만하다. 템플릿에서 쓰는 이름이 세션 속성 이름과 겹치면 어느 값이 쓰일지 헷갈릴 수 있으므로, 세션에 넣는 속성 이름을 구분되게 짓는 편이 안전하다.

참고한 자료외부 출처 2

외부 출처

이 글은 저작권자의 CC BY 4.0 라이선스를 따릅니다.

댓글

아직 댓글이 없습니다