스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 - sec07
출처 : 스프링 MVC 1편
요구사항이 정리되고 디자이너, 웹 퍼블리셔, 백엔드 개발자가 업무를 나누어 진행한다.
정적 리소스를 우리는 /resources/static 폴더에 넣어둔다
하지만, 여기에 넣어두면 실제 서비스에서도 HTML이 공개됨 => 서비스를 운영할 때 지금처럼 공개할 필요없는 HTML은 넣어 두는 것을 고려해봐야 함
타임리프는 순수 HTML 파일을 웹 브라우저에서 열어도 내용을 확인할 수 있고, 서버를 통해 뷰 템플릿을 거치면 동적으로 변경된 결과를 확인할 수 있음 ↔️ JSP는 오직 서버를 통해서 열어야 함
우선 하나 알아두고 가기
@RequiredArgsConstructor
final 이 붙은 멤버변수만 사용해서 생성자를 자동으로 만들어줌
public BasicItemController(ItemRepository itemRepository) {
this.itemRepository = itemRepository;
}
@PostConstruct
는 해당 빈의 의존관계가 모두 주입되고 나면 초기화 용도로 호출되는 기능을 가지고 있음 -> 이 친구를 활용하면 됨
뷰 템플릿 영역에 html을 만들고 타임리프화 해줘야 함
<html xmlns:th="http://www.thymeleaf.org">
th:xxx
가 붙은 부분은 서버사이드에서 렌더링 되고, 기존 것을 대체 => 없으면 기존 html의 xxx 속성이 그대로 사용됨th:href="@{/css/bootstrap.min.css}"
@{...} : URL 링크를 사용하는 경우 사용되며 이것을 URL 링크 표현식이라 함
th:href="@{/basic/items/{itemId}(itemId=${item.id})}"
th:href="@{|/basic/items/${item.id}|}"
상품 이름을 선택하는 링크를 확인봐야함
리터럴 대체 문법을 활용해서 간단히 사용 가능
다른 html로 이동
th:onclick="|location.href='@{/basic/items/add}'|"
여기에는 다음에 설명하는 리터럴 대체 문법이 사용됨
th:value="${item.id}"
모델에 있는 item 정보를 획득하고 프로퍼티 접근법으로 출력 ( item.getId() )
value 속성을 th:value 속성으로 변경
|...| : 이렇게 사용한다.
<span th:text="'Welcome to our application, ' + ${user.name} + '!'">
<span th:text="|Welcome to our application, ${user.name}!|">
<tr th:each="item : ${items}">
<td th:text="${item.price}">10000</td>
<td th:text="${item.price}">10000</td>
해당 조건이 참이면 실행
파라미터는 자주 사용해서 타임리프에서 직접 지원함
@ModelAttribute
는 객체를 생성하고, 요청 파라미터의 값을 프로퍼티 접근법(setXxx)으로 입력해줌
모델(Model)에 @ModelAttribute 로 지정한 객체를 자동으로 넣어줌
이름을 생략하면 모델에 저장될 때 클래스명을 사용 => 클래스의 첫글자만 소문자로 변경해서 등록한다.
예) @ModelAttribute 클래스명 모델에 자동 추가되는 이름 Item -> item
@ModelAttribute 자체도 생략 가능 => 대상 객체는 모델에 자동 등록됨
스프링은 redirect:/...
으로 편리하게 리다이렉트를 지원
ex) redirect:/basic/items/{itemId}
코드 addItemV1~V4까지를 보면 웹 브라우저의 새로고침을 계속 할 경우 중복등록되는 것을 확인 할 수 있음
그래서 그 해결방법이 PRG
주의해야할 점
"redirect:/basic/items/" + item.getId() redirect에서 +item.getId() 처럼 URL에 변수를 더해서 사용하는 것은 URL 인코딩이 안되기 때문에 위험 => RedirectAttributes 를 사용해야 함
URL 인코딩도 해주고, pathVarible , 쿼리 파라미터까지 처리해준다.
redirect:/basic/items/{itemId}
pathVariable 바인딩: {itemId}
나머지는 쿼리 파라미터로 처리: ?status=true