
타임리프에서 변수를 사용할 때는 변수 표현식을 사용한다. 변수 표현식 : ${...} 이 변수 표현식에는 스프링 EL이라는 스프링이 제공하는 표현식을 사용할 수 있다. /resources/templates/basic/variable.html SpringEL 표현식 Object ${user.username} = ${user['username']} = ${user.getUsername()} = List ${users[0].username} = ${users[0]['username']} = ${users[0].getUsername()} = Map ${userMap['userA'].username} = ${userMap['userA']['username']} = ${userMap['userA'].getUsern..

텍스트 - text, utext 실행 http://localhost:8080/basic/text-basic Escape HTML 문서는 같은 특수 문자를 기반으로 정의된다. 따라서 뷰 템플릿으로 HTML 화면을 생성할 때는 출력하는 데이터에 이러한 특수 문자가 있는 것을 주의해서 사용해야 한다. 변경 전 "Hello Spring!" 변경 후 "Hello Spring!" 테그를 사용해서 Spring!이라는 단어가 진하게 나오도록 해보자. 웹 브라우저에서 실행결과를 보면 개발자가 의도한 것은 가 있으면 해당 부분을 강조하는 것이 목적이었다. 그런데 태그가 그대로나온다. 소스보기를 하면
Thymeleaf 공식 사이트: https://www.thymeleaf.org/ 공식 메뉴얼 - 기본 기능: https://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf.html 공식 메뉴얼 - 스프링 통합: https://www.thymeleaf.org/doc/tutorials/3.0/thymeleafspring.html 타임리프 특징 서버 사이드 HTML 렌더링 (SSR) 네츄럴 템플릿 스프링 통합 지원 서버 사이드 HTML 렌더링 (SSR) 타임리프는 백엔드 서버에서 HTML을 동적으로 렌더링 하는 용도로 사용된다. 네츄럴 템플릿 타임리프는 순수 HTML을 최대한 유지하는 특징이 있다. 타임리프로 작성한 파일은 HTML을 유지하기 때문에 웹 브라우저에서 ..

build.gradle plugins { id 'java' id 'org.springframework.boot' version '2.7.16' id 'io.spring.dependency-management' version '1.0.15.RELEASE' } group = 'inflearn' version = '0.0.1-SNAPSHOT' java { sourceCompatibility = '11' } configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-start..

상황 설정 상품을 저장하고 상품 상세 화면으로 리다이렉트 한 것 까지는 좋았다. 그런데 고객 입장에서 저장이 잘 된 것인지 안 된 것인지 확신이 들지 않는다. 그래서 저장이 잘 되었으면 상품 상세 화면에 "저장되었습니다"라는 메시지를 보여달라는 요구사항이 추가되었다면, 이를 해결해본다. BasicItemController에 추가 /** * 상품을 추가하는 메서드. * * @param item 추가할 상품 정보를 나타내는 객체 * @param redirectAttributes Spring MVC 리다이렉트 시 데이터를 전달하기 위한 객체 * @return 상품 추가 후 해당 상품 상세 정보 페이지로 리다이렉트 */ @PostMapping("/add") public String addItemV6(Item i..

PRG 사실 지금까지 진행한 상품 등록 처리 컨트롤러는 심각한 문제가 있다. (addItemV1 ~ addItemV4) 상품 등록을 완료하고 웹 브라우저의 새로고침 버튼을 클릭해보면 상품이 계속해서 중복 등록되는 것을 확인할 수 있다. 전체 흐름 다음 그림을 통해서 그 이유 확인 가능하다. POST 등록 후 새로 고침 웹 브라우저의 새로 고침은 마지막에 서버에 전송한 데이터를 다시 전송한다. 상품 등록 폼에서 데이터를 입력하고 저장을 선택하면 POST /add + 상품 데이터를 서버로 전송한다. 이 상태에서 새로 고침을 또 선택하면 마지막에 전송한 POST /add + 상품 데이터를 서버로 다시 전송하게 된다. => 그래서 내용은 같고, ID만 다른 상품 데이터가 계속 쌓이게 된다. 이 문제의 해결법은 ..

상품 수정 상품 수정 폼 컨트롤러 BasicController 에 추가 /** * 상품 수정 폼을 불러오는 메서드. * * @param itemId 수정할 상품의 ID * @param model Spring MVC 모델 객체. 뷰로 데이터를 전달하기 위해 사용됨. * @return 상품 수정 폼 템플릿 이름 */ @GetMapping("/{itemId}/edit") public String editForm(@PathVariable Long itemId, Model model) { // 상품 ID를 사용하여 데이터베이스에서 해당 상품 정보를 조회. Item item = itemRepository.findById(itemId); // 조회한 상품 정보를 모델에 추가하여 뷰로 전달. model.addAttri..

상품 등록 처리 - @ModelAttribute 상품 등록 폼에서 전달된 데이터로 실제 상품을 등록 처리하기 - 상품 등록 폼은 다음 방식으로 서버에 데이터를 전달한다. POST - HTML Form addItemV1 - BasicItemController에 추가 @PostMapping("/add") public String addItemV1(@RequestParam String itemName, @RequestParam int price, @RequestParam Integer quantity, Model model) { Item item = new Item(); item.setItemName(itemName); item.setPrice(price); item.setQuantity(quantity); ..