본문 바로가기

전체 글

(71)
타임리프 - 기본 기능 (4) 템플릿 조각 웹 페이지를 개발할 때는 공통 영역이 많이 있다. 예를 들어서 상단 영역이나 하단 영역, 좌측 카테고리 등등 여러 페이지에서 함께 사용하는 영역들이 있다. 이런 부분을 코드를 복사해서 사용한다면 변경시 여러 페이지를 다 수정해야 하므로 상당히 비효율 적이다. 타임리프는 이런 문제를 해결하기 위해 템플릿 조각과 레이아웃 기능을 지원한다. @RequestMapping("/template") public class TemplateController { @GetMapping("/fragment") public String template() { return "template/fragment/fragmentMain"; } } footer.html 푸터 자리 입니다. 파라미터 자리 입니다. templa..
타임리프 - 기본 기능 (4) 주석 @GetMapping("/comments") public String comments(Model model) { model.addAttribute("data", "Spring!"); return "basic/comments"; } 예시 html data 1. 표준 HTML 주석 2. 타임리프 파서 주석 html data 3. 타임리프 프로토타입 주석 1. 표준 HTML 주석 자바스크립트의 표준 HTML 주석은 타임리프가 렌더링 하지 않고, 그대로 남겨둔다. 2. 타임리프 파서 주석 타임리프 파서 주석은 타임리프의 진짜 주석이다. 렌더링에서 주석 부분을 제거한다. 3. 타임리프 프로토타입 주석 타임리프 프로토타입은 약간 특이한데, HTML 주석에 약간의 구문을 더했다. HTML 파일을 웹 브라우저에서..
타임리프 - 기본 기능 (3) 속성 값 설정 타임리프 태그 속성(Attribute) 타임리프는 주로 HTML 태그에 th:* 속성을 지정하는 방식으로 동작한다. th:* 로 속성을 적용하면 기존 속성을 대체한다. 기존 속성이 없으면 새로 만든다. @GetMapping("/attribute") public String attribute() { return "basic/attribute"; } 속성 설정 속성 추가 - th:attrappend = - th:attrprepend = - th:classappend = checked 처리 - checked o - checked x - checked=false 속성 설정 → 타임리프 렌더링 후 속성 추가 th:attrappend : 속성 값의 뒤에 값을 추가한다. th:attrprepend : ..
타임리프 - 기본 기능 (2) 기본 객체들 ${#request} - 스프링 부트 3.0부터 제공하지 않는다. ${#response} - 스프링 부트 3.0부터 제공하지 않는다. ${#session} - 스프링 부트 3.0부터 제공하지 않는다. ${#servletContext} - 스프링 부트 3.0부터 제공하지 않는다. ${#locale} 스프링 부트 3.0 부터는 ${#request} , ${#response} , ${#session} , ${#servletContext} 를 지원하지 않는다. 스프링 부트 3.0이라면 직접 model 에 해당 객체를 추가해서 사용해야 한다. @GetMapping("/basic-objects") public String basicObjects(HttpSession session) { session.s..
타임리프 - 기본 기능 (1) 공식 사이트: https://www.thymeleaf.org/ Thymeleaf Integrations galore Eclipse, IntelliJ IDEA, Spring, Play, even the up-and-coming Model-View-Controller API for Java EE 8. Write Thymeleaf in your favourite tools, using your favourite web-development framework. Check out our Ecosystem to see more integrati www.thymeleaf.org 공식 메뉴얼 - 기본 기능: https://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf.htm..
PRG Post/Redirect/Get 사실 지금까지 진행한 상품 등록 처리 컨트롤러는 심각한 문제가 있다. 상품 등록한 컨트롤러를 보게 되면 @PostMapping("/add") public String addSaveV4(Item item){ itemRepository.save(item); return "basic/item"; } 폼에서 Item 객체타입으로 값들이 전달되서 저장되고 ModelAttribute는 안보이지만 model에 담겨 뷰템플릿으로 가는 코드이다. 단순히 한번의 등록으로 끝난다면 문제는 없지만 등록한 페이지에서 새로고침을 하게 되면 문제가 생긴다. 이유는 저장한 뒤 사이트의 주소를 보게 되면 여전히 add에 머물러있게 되고 새로고침을 하게 되면 등록한 주소와 내용 값들이 다시 호출이 되어 새로고침을 누를 때마다 상품이 등..
간단한 사이트 만들기 프로젝트 생성 Project: Gradle Project Language: Java Spring Boot: 2.4.x Project Metadata Group: hello Artifact: item-service Name: item-service Package name: hello.itemservice Packaging: Jar (주의!) Java: 11 Dependencies: Spring Web, Thymeleaf, Lombok 상품 객체 public class Item { private Long id; private String itemName; private Integer price; private Integer quantity; public Item() { } public Item(String ..
요청 매핑 헨들러 어뎁터 구조 모든 비밀은 애노테이션 기반의 컨트롤러, 그러니까 @RequestMapping 을 처리하는 핸들러 어댑터인 RequestMappingHandlerAdapter (요청 매핑 헨들러 어뎁터)에 있다. ArgumentResolver HttpServletRequest , Model 은 물론이고, @RequestParam , @ModelAttribute 같은 애노테이션 그리고 @RequestBody , HttpEntity 같은 HTTP 메시지를 처리하는 부분까지 매우 큰 유연함을 보여주었다. 이렇게 파라미터를 유연하게 처리할 수 있는 이유가 바로 ArgumentResolver 덕분이다. 애노테이션 기반 컨트롤러를 처리하는 RequestMappingHandlerAdapter 는 바로 이 ArgumentResolve..