인프런 - 스프링 부트와 JPA 활용1 by 김영한 을 기반으로 작성된 글입니다.
실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
@GetMapping("/members")
public String list(Model model){
//모델이라는 객체를 통해 화면에 데이터 전달
List<Member> members = memberService.findMembers();
//모든 회원 조회
model.addAttribute("members",members);
return "members/memberList";
}
해당 members 변수를 변수 인라인화 하여 아래 코드처럼 한줄로 나타낼 수 있다 (리팩토링)
model.addAttribute("members", memberService.findMembers());
리팩토링 (refactoring)
결과의 변경 없이 코드의 구조를 재조정하는 것을 뜻 하며, 가독성과 유지보수성을 높인다
코드는 일부만 나타내도록 하겠다
<!--model 에서 담아 넘긴 멤버 리스트 members-->
<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>
Thymeleaf
타임리프에서 ?
란?
전달 받은 값이 null일 경우 더이상 실행하지 않는다는 뜻
예시) 만약 member.address가 null 이라면 더이상 city 출력을 하지 않아야 한다
<td th:text="${member.address?.city}"></td>
요구사항이 단순할 경우 엔티티를 그대로 사용(등록, 수정)해도 되지만
실무에서는 요구사항이 단순한 경우가 거의 없다
엔티티를 직접 사용하면 화면을 처리하기 위한 기능이 추가되고
결과적으로 엔티티에 화면 종속적 기능이 생긴다
👉 유지보수성 낮음
엔티티를 최대한 유지하고 오직 핵심 비즈니스 로직에만 의존되도록 설계하는 것이 중요하다
👉 유지보수성 높음
화면이나 API에 맞는 폼 객체, DTO(Data Transfer Object) 을 사용하는 것을 권장한다
💡 API를 만들 때는 절대 엔티티를 웹으로 반환하면 안된다 (외부로 노출 X)
그러나 우리가 사용하는 템플릿 엔진(강의) 에서는 선택적으로 사용해도 괜찮다!