본문 바로가기
반응형

Framework & Library/Spring Boot164

[Spring Boot] : 타임리프 주석 종류 및 사용 방법 타임리프 - 주석 타임리프의 주석 종류에 대해 공부했다. 주석 쓰는 방법이 생각보다 다양했다. HTML 주석이다. 흔히 사용하던 방식이다. html data 타임리프 주석인데 위에는 단일 라인 아래는 여러 라인을 주석처리할 때 사용한다. 특이한 점으로는 아예 렌더링 자체를 하지 않아서 소스보기를 눌러도 표시되지 않는 특성이 있다. 이것도 타임리프 주석인데 프로토타입 주석이라고 불린다. 주석 형태를 보면 양 끝에는 HTML 주석이 들어가있고, 그 앞에 /*/가 있는 형식이다. HTML에서는 주석으로 나타나고 타임리프에서는 실행이 되는 특이한 주석인데 잘 안 쓰인다고 한다. 보통 가운데 있는 주석 사용법을 많이 사용한다고 한다. 스프링 MVC 2편 - 백엔드 웹 개발 활용 기술을 참고하여 공부하였습니다. 2022. 2. 7.
[Spring Boot] : 타임리프 if, unless, switch문 사용 타임리프 - if, unless, switch 조건식과 조건식의 반대인 unless에 대해 공부하고 switch도 같이 알아봤다. 1 username 0 if는 Java에서 많이 사용하던 것과 똑같다. 참일 경우에 True 값을 갖지만 unless는 if문의 반대 개념으로 이해하면 좋다. 거짓일 경우 True 값을 갖게 된다. 하지만 Java와 다른 점도 있다. 타임리프는 해당 조건이 false인 경우엔 태그 자체를 렌더링 하지 않는다. 위에 태그가 거짓일 경우에 태그 자체가 사라지게 된다. 1 username 10살 20살 기타 switch도 Java에서 사용했던 부분과 같다. 마지막에 *값이 들어갔는데 *는 만족하는 조건이 없을 떄 사용하는 디폴트 값이다. 스프링 MVC 2편 - 백엔드 웹 개발 활용.. 2022. 2. 7.
[Spring Boot] : 타임리프 반복문 사용 타임리프 - 반복 반복을 사용하기 위해 each를 사용한다. private void addUsers (Model model) { List list = new ArrayList(); list.add(new User("UserA", 10)); list.add(new User("UserB", 20)); list.add(new User("UserC", 30)); model.addAttribute("users", list); } List에 유저들을 담아두고 html로 넘겨준다. username username 0 th:each 라인을 보면 ${users}의 값을 꺼내어 user 변수에 담아 태그를 반복 실행하게 된다. list 뿐만 아니라 배열이나 Map도 사용이 가능한다. Map은 Map.Entry에 담긴다고 .. 2022. 2. 7.
[Spring Boot] : 타임리프 - 속성 값 설정 타임리프 태그 속성(Attribute) 타임리프는 주로 HTML 태그에 th: 속성을 지정하는 방식으로 동작하며 이 속성이 기존 속성을 대체하고 기존 속성이 없다면 새로 만들게 된다. 위와 같은 속성을 넣어줬다면 타임리프 렌더링 후에는 name이 userA로 바뀌게 된다. - th:attrappend = - th:attrprepend = - th:classappend = 위에서부터 속성 값의 뒤에 값을 추가하고, 앞에 추가하고, class 속성에 자연스럽게 추가한다. 공백이 있으면 같이 추가된다. 예를 들어 첫 라인의 경우 공백이 붙어서 text large 이렇게 된다. - checked o - checked x - checked=false checked 속성에 대해서도 다루었다. HTML에서는 chec.. 2022. 2. 4.
[Spring Boot] : 타임리프 - 연산 타임리프 연산은 자바랑 크게 다르지 않다고 한다. HTML 안에서 사용하기 때문에 HTML 엔티티를 사용하는 부분만 주의해서 사용하면 된다. Elvis 연산자 ${data}?: '데이터가 없습니다.' = ${nullData}?: '데이터가 없습니다.' = No-Operation ${data}?: _ = 데이터가 없습니다. ${nullData}?: _ = 데이터가없습니다. 다른 부분은 자바랑 거의 다른 점이 없고 조금 다른 점이 있는 부분만 가져와 봤다. Elvis 연산자는 조건식 편의 버전으로 보면 된다. ${data}안에 데이터가 없으면 ‘데이터가없습니다.’ 부분을 출력하게 된다. 아래는 데이터가 null 값이니까 데이터가 없습니다가 출력되게 된다. No-Operation은 _ 이렇게 언더바를 말한다... 2022. 2. 4.
[Spring Boot] : 타임리프 - 리터럴, Literals 리터럴은 소스 코드상 고정된 값을 말하는 용어라고 한다. 강의 자료에 따르면 “Hello”는 문자 리터럴, 10, 20 등은 숫자 리터럴이라고 한다. 타임리프에는 문자, 숫자, 불린(true, false), null 리터럴이 있다. 주의해야 하는 점으로는 타임리프에서 리터럴은 ‘ (작은 따옴표)로 감싸주어야 하는데 어느 정도는 지원을 해 준다. A-Z , a-z , 0-9 , [] , . , - , _ 정도는 공백 없이, 중요하다. 공백이 없이 쭉 이어진다면 하나의 의미있는 토큰으로 인지해 작은 따옴표를 생략해서 작성할 수 있다. “hello Spring” 이렇게 작성하면 공백이 존재하므로 2개의 토큰으로 인식한다. “’hello Spring’” 이렇게 작성해야 하나의 토큰으로 인식하게 된다. 'hell.. 2022. 2. 4.
[Spring Boot] : 타임리프 - URL 링크 타임리프에서 URL을 생성할 때 @{...} 문법을 사용한다. basic url hello queryparam path variable path variable + query parameter 위에서 부터 단순한 URL, 쿼리 파라미터, 경로 변수, 경로 변수 + 쿼리 파라미터이다. 아래로 내려 갈 수록 나눠서 하게 되는데 이렇게 되면 링크 부분과 데이터 부분이 나누어져서 나중에 유지 보수하기 수월하다고 한다. 상대경로, 절대경로, 프로토콜 기준을 표한 할 수도 있다고 한다. 📝 ← 참고하자 스프링 MVC 2편 - 백엔드 웹 개발 활용 기술을 참고하여 공부하였습니다. 2022. 2. 4.
[Spring Boot] : 타임리프 - 유틸리티 객체와 Java8 날짜 타임리프는 문자, 숫자, 날짜, URI 등 편리하게 다루는 유틸리티 객체를 제공한다. 강의 자료에 따르면 아래와 같다. #message : 메시지, 국제화 처리 #uris : URI 이스케이프 지원 #dates : java.util.Date 서식 지원 #calendars : java.util.Calendar 서식 지원 #temporals : 자바8 날짜 서식 지원 #numbers : 숫자 서식 지원 #strings : 문자 관련 편의 기능 #objects : 객체 관련 기능 제공 #bools : boolean 관련 기능 제공 #arrays : 배열 관련 기능 제공 #lists , #sets , #maps : 컬렉션 관련 기능 제공 #ids : 아이디 처리 관련 기능 제공, 뒤에서 설명 📝 ←타임리프 유틸.. 2022. 2. 4.
[Spring Boot] : 타임리프가 제공하는 기본객체, 편의객체 ${#request} ${#response} ${#session} ${#servletContext} ${#locale} 타임리프는 위와 같은 기본 객체를 제공하는데 request는 HttpServletRequest 객체가 그대로 제공되어 데이터 조회를 위해서는 request.getParameter(”data”)처럼 접근해야 한다. 이것을 좀 더 편하게 하기 위해 편의 객체도 제공한다고 한다. @GetMapping("/basic-objects") public String basicObjects(HttpSession session) { session.setAttribute("sessionData", "Hello Session"); return "basic/basic-objects"; } @Component(.. 2022. 2. 4.
[Spring Boot] : 변수 - SpringEL 타임리프에서 변수를 사용할 때는 변수 표현식을 사용하는데 이 표현식에는 SpringEL이라는 스프링이 제공하는 표현식을 사용할 수 있다. 변수 표현식은 ${,,,}이런 것을 말 한다. @Data static class User { private String username; public int age; public User(String username, int age) { this.username = username; this.age = age; } } 클래스를 따로 만들어 username, age를 파라미터로 갖는 생성자를 하나 만들어 주고 @Data 어노테이션을 사용해 주었다. User userA = new User("UserA", 10); User userB = new User("UserB", 20.. 2022. 2. 4.
[Spring Boot] : 타임리프 - Escape, Unescape public String textBasic(Model model) { model.addAttribute("data", "Hello Spring !"); return "basic/text-basic"; } 컨트롤러에서 model에 데이터를 담아서 html에서 값을 띄워준다. th:text 사용 컨텐츠 안에서 직접 출력하기 = [[${data}]] 이렇게 두 가지 방법을 통해 데이터를 출력해 줄 수 있다. 두번째 방법을 보면 [[...]] 이런 형식의 문법을 사용했는데 이런 형식의 문법을 Escape(이스케이프)라고 한다. HTML 문서는 와 같은 특수 문자를 기반으로 정의되는데 뷰 템플릿으로 HTML 화면을 생성할 때는 출력하는 데이터에 이런 문자가 있는 것을 주의해야 한다. public String te.. 2022. 2. 4.
[Spring Boot] : 타임리프, 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 타임리프는 메뉴얼이 기본적으로 잘 되어 있으나 순서대로 보기엔 어렵다. 타임리프의 특징 3가지이다. 서버 사이드 HTML 렌더링(SSR) 네츄럴 템플릿 스프링 통합 지원 서버 사이드 렌더링 (SSR) 기술을 하나 쯤은 배워야 하는데 타임리프가 좋다. (JSP도 있다.) 타임리프는 HTML을 최대한 유지한다. 때문에 웹 브라우저에서 파일을 직접 열어도 내용 확.. 2022. 2. 4.
[Spring Boot] : RedirectAttributes 사용하기 리다이렉트를 사용하여 상품이 정상적으로 저장이 되었는지 확인하는 문구가 출력이 되도록 설정할 수도 있다. 내가 팀 프로젝트를 했을 떄에는 이것을 리다이렉트 JSP를 만들어 맵핑 리턴을 JSP로 보내고 JSP에서 JavaScript를 통해 alert를 통해 결과를 안내했는데 이번에는 페이지 자체에 안내가 생기도록 코드를 짜보는 시간을 보냈다. @PostMapping("/add") public String addItemV6(Item item, RedirectAttributes redirectAttributes) { Item savedItem = itemRepository.save(item); redirectAttributes.addAttribute("itemId", savedItem.getId()); red.. 2022. 2. 3.
[Spring Boot] : Post, Redirect, Get 사용하기 지금까지 강의를 따라하면서 만든 상품 등록 처리 컨트롤러에 심각한 문제가 있었다고 한다. 상품 등록을 완료하고 웹 브라우저의 새로고침 버튼을 눌러보면 상품이 중복해서 등록이 된다. 새로고침을 계속 해 보니까 ID 수가 계속 오른다.. 이 문제를 해결하는 강의였다. [출처] : springmvc1 강의자료 218 페이지 이런 문제가 생긴 이유를 그림으로 설명해 주었다. 웹 브라우저에서 새로 고침은 마지막으로 서버에 전송한 데이터를 다시 전송하는데 상품 등록 폼에서 데이터를 입력하고 저장을 선택하면 Post/add+상품 데이터를 서버로 전송하는데 여기서 새로고침을 하면 다시 전송을 하게 되고 그렇게 중복이 계속 되어 데이터가 쌓이게 되는 것이다. [출처] : springmvc1 강의자료 219 페이지 이 문.. 2022. 2. 3.
[Spring Boot] : 상품 수정 구현하기 상품 수정 구현을 해본다. @GetMapping("/{itemId}/edit") public String editForm(@PathVariable Long itemId, Model model) { Item item = itemRepository.findById(itemId); model.addAttribute("item", item); return "basic/editForm"; } 먼저 컨트롤러에 해당 코드를 입력해 준다. 수정에 필요한 정보를 조회하고 수정용 폼 뷰를 호출하게 된다. 상품 ID 앞에서 설정했던 타임리프를 사용하기 위해 선언하는 부분과 CSS를 가져오기 위해 사용한 부분은 적지 않았다. 상품이 수정되고 수정한 내용을 담은 model의 값을 가져올 수 있도록 th:value를 통해 값을 .. 2022. 2. 3.
[Spring Boot] : 상품 등록 처리 @ModelAttribute 사용하기 상품 등록 폼에서 상품을 등록하고 등록한 상품을 목록에서 확인할 수 있게 만들어 보았다. @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); itemRepository.save(item); model.addAttribute("item", item); return "basic/item"; } 기존에는 @RequestP.. 2022. 2. 3.
[Spring Boot] : 상품 상세 페이지 타임리프 적용 및 목록으로 가기 구현 @GetMapping("/{itemId}") public String item(@PathVariable Long itemId, Model model) { Item item = itemRepository.findById(itemId); model.addAttribute("item", item); return "basic/item"; } @pathVariable로 요청 값을 받아서 조회하고 model에 담아두고 뷰 템플릿을 호출해 준다. 타임 리프를 사용하기 위해 html 코드에 위 코드를 추가해 주고 동적 웹 페이지를 위해 th:href 를 사용해서 경로를 잡아준다. 상품 ID 제품을 상세 조회 했을 때 등록한 정보에 맞게 나오게 하기 위해 각 표시 부분에 th:value를 추가해 주준다. 예를 들어 상품.. 2022. 2. 3.
[Spring Boot] : thymelef, 타임리프 간단 사용법 타임리프를 사용하기 위해서는 html 코드에 아래 코드를 적용시켜 줘야 한다. 위 코드를 적용하지 않아도 된다는 말도 있다고 하는데 그냥 적용시켜 사용하는 것을 추천한다고 한다. href="../css/bootstrap.min.css" 이런 html 코드를 타임리프를 통해 아래와 같이 변경해 줄 수 있다. th:href="@{/css/bootstrap.min.css}" 이렇게 되면 페이지에서 소스 보기를 했을 때 ..경로가 없이 동적인 페이지를 완성시켜 나갈 수 있게 된다. 타임리프에서 URL 링크를 사용할 때는 @{..}를 사용한다고 한다. 이 URL 링크 표현식을 사용하면 서블릿 컨텍스트를 자동으로 포함한다. 타임리프의 핵심은 th: 가 붙은 부분은 서버사이드에서 랜더링 되고, 기존 것을 대체한다는 .. 2022. 2. 2.
[Spring Boot] : 요구사항에 맞춰 상품 도메인을 개발하고 테스트 코드를 작성하기 private Long id; private String itemName; private Integer price; private Integer quantity; 저번 강의에서 진행했던 요구사항 분석에 맞춰 상품 도메인을 개발하고 테스트 코드를 작성해 확인하는 코드를 진행한다. 우선 Item 클래스를 만들어 주었다. 여기서 int가 아닌 Integer를 사용한 이유는 null을 사용해야 하는데 int는 null을 허용하지 않아 Integer를 사용했다. 또한, 어노테이션을 @Data로 주로 사용했었는데 이 어노테이션 안에는 다른 기능들이 들어있어서 @Getter, @Setter를 사용하는 것이 좋다고 한다. 또, 여기서 생성자를 따로 만들어 id에 관한 생성자는 포함시키지 않은 생성자도 만들어 줬는데 작.. 2022. 2. 2.
[Spring Boot] : 프로젝트 생성 및 요구사항 분석 https://start.spring.io/ 위 사이트에서 Spring 프로젝트를 생성해 주었다. 이번 강의 섹션에서는 요구사항 분석을 통해 상품을 관리할 수 있는 서비스를 만들어 본다. 상품 도메인 모델은 상품ID, 상품명, 가격, 수량이고 상품 관리 기능은 상품 목록, 상품 상세, 상품 등록, 상품 수정이 있다. 상품 상세는 자세히 볼 수 있는 페이지, 등록은 상품을 등록하고 목록은 등록한 상품들이 보여지는 페이지이다. 강사님이 현업에서 일 하는 방법에 대해 설명해 주셨다. 요구사항이 정리되면 디자이너, 웹 퍼블리셔, 백엔드 개발자가 일은 나눠 진행하고 디자이너가 요구사항에 맞게 디자인하고 웹 퍼블리셔는 HTML, CSS를 만들어 개발자에게 제공한다. 백엔드 개발자는 웹 퍼블리셔를 통해 HTML 화면.. 2022. 2. 1.
[Spring Boot] : 요청 매핑 핸들러 어뎁터 구조 [출처]springmvc1 강의 자료/178페이지 강의에서 제공하는 그림에서 HTTP 메시지 컨버터의 위치가 보이지 않는다. 이 부분에 대해서 진도를 나갔다. 강사님이 모든 비밀은 @RequestMapping을 처리하는 핸들러 어댑터인 RequestMappingHandlerAdapter에 있다고 했다. RequestMappingHandlerAdapter 동작 방식이다. RequestMapping(핸들러 어댑터)가 ArgumentResolver에게 필요한 객체를 가져와 달라고 요청하고 ArgumentResolver는 객체를 가져다 준다. 이렇게 객체를 다 만들고 RequestMapping은 핸들러(컨트롤러)를 호출하게 되고 호출을 하면서 핸들러가 필요로하는 파라미터를 ArgumentResolver가 전달해.. 2022. 1. 28.
반응형