참고 : 인프런 [ 실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발 - 김영한 ]
@GetMapping("/members")
public String list(Model model){
List<Member> members = memberService.findMembers();
model.addAttribute("members", members);
return "members/memberList";
}
...
<div>
<table class="table table-striped">
<thead>
<tr>
<th>#</th>
<th>이름</th> <th>도시</th> <th>주소</th>
<th>우편번호</th> </tr>
</thead>
<tbody>
<tr th:each="member : ${members}">
<td th:text="${member.id}"></td>
<td th:text="${member.name}"></td>
<td th:text="${member.address?.city}"></td>
<td th:text="${member.address?.street}"></td>
<td th:text="${member.address?.zipcode}"></td>
</tr>
</tbody>
</table>
</div>
...
th:each="member : ${members}" ${members}는 members라는 List<Member>을 반복하면서 각 항목을 member 변수에 바인딩
members 컬렉션의 각 요소마다 태그를 생성
💡 엔티티 직접 사용하기 vs 폼 객체 생성하여 사용하기
요구사항이 단순할 때는 엔티티를 그대로 사용해도 된다.
실무에서는 폼과 엔티티가 1:1로 매칭되는 경우가 거의 없음.
엔티티를 직접 사용하게 되면 화면 기능 때문에 엔티티가 지저분해짐. : 유지 보수 어려움
화면에 맞는 폼 객체나 DTO 를 사용하는 것을 권장
API를 만들 때는 절대 엔티티를 사용해서는 안됨!
회원 목록 조회 기능의 경우 엔티티를 수정하지 않고 심플하게 화면에 출력할 수 있는 상황이기 때문에 엔티티를 직접 사용하였다.
=> 멤버 DTO나 화면에 맞는 transfer object로 변환하여 반환 하는 것이 가장 깔끔.

회원 목록도 정상적으로 출력되는 것을 확인했다.