웹 애플리케이션을 개발할 때, 서버에서 가져온 데이터를 화면에 표현하는 일은 기본 중의 기본이다. 하지만 단순히 값 하나만 출력하는 게 아니라, 객체 안의 필드, 리스트(List)나 맵(Map) 구조 안의 값까지 꺼내 써야 할 때가 많다.
이럴 때 매번 getUsername(), getAge() 같은 자바 메서드를 직접 호출한다면 코드가 복잡해지고 읽기 어려워진다.
여기서 등장하는 것이 바로 SpringEL(Expression Language, 표현 언어) 이다.
SpringEL을 사용하면 ${user.username}처럼 간단한 문법으로 객체의 속성이나 리스트·맵의 값을 쉽게 꺼낼 수 있다.
이번 글에서는 SpringEL을 사용해 변수를 다루는 방법과, 이를 통해 얻을 수 있는 장점을 정리해본다.
1. 컨트롤러에서 데이터 준비하기
컨트롤러에서는 사용자 객체(User)를 만들고, 리스트와 맵에 담아 모델로 넘긴다.
@Controller
@RequestMapping("/basic")
public class BasicController {
@GetMapping("/variable")
public String variable(Model model) {
User userA = new User("userA", 10);
User userB = new User("userB", 20);
List<User> list = new ArrayList<>();
list.add(userA);
list.add(userB);
Map<String, User> map = new HashMap<>();
map.put("userA", userA);
map.put("userB", userB);
model.addAttribute("user", userA);
model.addAttribute("users", list);
model.addAttribute("userMap", map);
return "basic/variable";
}
@Data
static class User {
private String username;
private int age;
public User(String username, int age) {
this.username = username;
this.age = age;
}
}
}
기서 user, users, userMap이라는 이름으로 모델에 담겨 뷰 템플릿으로 전달된다.
2. 뷰 템플릿에서 SpringEL 사용하기
넘겨받은 데이터를 EL 문법 ${...}으로 꺼내 쓴다.
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>SpringEL 표현식</title>
</head>
<body>
<h1>SpringEL 표현식</h1>
<ul>Object
<li>${user.username} = <span th:text="${user.username}"></span></li>
<li>${user['username']} = <span th:text="${user['username']}"></span></li>
<li>${user.getUsername()} = <span th:text="${user.getUsername()}"></span></li>
</ul>
<ul>List
<li>${users[0].username} = <span th:text="${users[0].username}"></span></li>
<li>${users[0]['username']} = <span th:text="${users[0]['username']}"></span></li>
<li>${users[0].getUsername()} = <span th:text="${users[0].getUsername()}"></span></li>
</ul>
<ul>Map
<li>${userMap['userA'].username} = <span th:text="${userMap['userA'].username}"></span></li>
<li>${userMap['userA']['username']} = <span th:text="${userMap['userA']['username']}"></span></li>
<li>${userMap['userA'].getUsername()} = <span th:text="${userMap['userA'].getUsername()}"></span></li>
</ul>
<h1>지역 변수 - (th:with)</h1>
<div th:with="first=${users[0]}">
<p>처음 사람의 이름은 <span th:text="${first.username}"></span></p>
</div>
</body>
</html>
3. 실행 결과
브라우저로 실행하면 다음과 같이 출력된다.
SpringEL 표현식
Object
${user.username} = userA
${user['username']} = userA
${user.getUsername()} = userA
List
${users[0].username} = userA
${users[0]['username']} = userA
${users[0].getUsername()} = userA
Map
${userMap['userA'].username} = userA
${userMap['userA']['username']} = userA
${userMap['userA'].getUsername()} = userA
지역 변수 - (th:with)
처음 사람의 이름은 userA
4. 무엇이 좋을까?
SpringEL을 사용하면 다음과 같은 장점이 있다.
- 코드가 간단하다
- 원래는 user.getUsername() 같은 메서드를 호출해야 하지만, EL을 쓰면 ${user.username}으로 간단하게 접근할 수 있다.
- 객체, 리스트, 맵 모두 동일한 문법으로 접근 가능
- ${user.username}, ${users[0].username}, ${userMap['userA'].username} 처럼 일관성 있게 표현할 수 있어 직관적이다.
- 템플릿 안에서 가독성이 좋아진다
- HTML에 자바 코드처럼 긴 메서드 호출이 섞이지 않으니, 뷰 코드를 읽고 관리하기 훨씬 쉽다.
- 지역 변수 사용 가능
- th:with를 활용하면 한 번 꺼낸 값을 지역 변수에 담아 재사용할 수 있다. → 반복되는 코드 줄이고 가독성 높임.
마무리하며
오늘은 SpringEL을 사용해 객체, 리스트, 맵의 값을 꺼내는 방법을 살펴보았다.
결국 SpringEL을 쓰면 간단한 문법으로 데이터를 꺼내고, 가독성 있는 템플릿 코드를 작성할 수 있다.
감사합니다.
'타임리프' 카테고리의 다른 글
| [Thymeleaf] 리터럴 (1) | 2025.09.15 |
|---|---|
| [Thymeleaf] URL링크 (0) | 2025.09.15 |
| [Thymeleaf] 유틸리티 객체와 날짜 (0) | 2025.09.15 |
| [Thymeleaf] 텍스트 -text, utext (0) | 2025.09.11 |
| 타임리프(Thymeleaf)에 대하여 (0) | 2025.09.11 |
