본문 바로가기
728x90

백엔드145

스프링 서블릿 오류 페이지 설정 스프링 빈 등록 package hello.exception; import org.springframework.boot.web.server.ConfigurableWebServerFactory; import org.springframework.boot.web.server.ErrorPage; import org.springframework.boot.web.server.WebServerFactoryCustomizer; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Component; @Component public class WebServerCustomizer implements WebServerFactoryCu.. 2021. 10. 2.
스프링 ArgumentResolver 컨트롤러 @Login 어노테이션 등록(사용자가 만들어줘야함) @GetMapping("/") public String homeLoginV3ArgumentResolver(@Login Member loginMember, Model model){ // 세션에 회원 데이터가 없으면 home if (loginMember == null) { return "home"; } // 세션이 유지되면 로그인으로 이동동 model.addAttribute("member", loginMember); return "loginHome"; } @Login package hello.login.web.argumentresolver; import java.lang.annotation.ElementType; import java.lang.an.. 2021. 10. 1.
스프링 인터셉터 - 인증 체크 인터셉터 package hello.login.web.interceptor; import hello.login.web.SessionConst; import lombok.extern.slf4j.Slf4j; import org.springframework.web.servlet.HandlerInterceptor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; @Slf4j public class LoginCheckInterceptor implements HandlerInterceptor { @Override public boo.. 2021. 10. 1.
스프링 인터셉터 - 요청로그 인터셉터 package hello.login.web.interceptor; import lombok.extern.slf4j.Slf4j; import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.UUID; @Slf4j public class LogInterceptor implem.. 2021. 10. 1.
스프링 서블릿 필터 - 로그인 인증 체크 필터 package hello.login; import hello.login.web.filter.LogFilter; import hello.login.web.filter.LoginCheckFilter; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import javax.servlet.Filter; @Configuration public class WebConfig { @Bean public FilterRegistrationBean.. 2021. 9. 30.
스프링 서블릿 필터 - 요청 로그 필터 chain.doFilter 무조건 해줘야한다. 안해주면 웹 동작 안함 package hello.login.web.filter; import lombok.extern.slf4j.Slf4j; import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import java.io.IOException; import java.util.UUID; @Slf4j public class LogFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { log.info("log filter init"); } @Overrid.. 2021. 9. 30.
스프링 로그인(쿠키, 세션) 로그인 컨트롤러 import hello.login.domain.login.LoginService; import hello.login.domain.member.Member; import hello.login.web.SessionConst; import hello.login.web.session.SessionManager; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Controller; import org.springframework.validation.BindingResult; import org.springframework.validation.anno.. 2021. 9. 30.
스프링 Bean Validation 컨트롤러 팁! 수정 form 이랑 생성 form이랑 다르게 Validation 체크를 해야한다! @ModelAttribute에 값 지정하지 않으면 스프링에서 자동으로 이름변경한다음 model에 넣어주므로 체크! package hello.itemservice.web.validation; import hello.itemservice.domain.item.Item; import hello.itemservice.domain.item.ItemRepository; import hello.itemservice.domain.item.SaveCheck; import hello.itemservice.domain.item.UpdateCheck; import hello.itemservice.web.validation.form.. 2021. 9. 29.
스프링 API JSON 검증 컨트롤러 import hello.itemservice.web.validation.form.ItemSaveForm; import lombok.extern.slf4j.Slf4j; import org.springframework.validation.BindingResult; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; impo.. 2021. 9. 29.
스프링 검증 Validation 검증 V1 Controller @PostMapping("/add") public String addItem(@ModelAttribute Item item, RedirectAttributes redirectAttributes, Model model) { //검증 오류 결과를 보관 Map errors = new HashMap(); //검증 로직 if (!StringUtils.hasText(item.getItemName())) { errors.put("itemName", "상품 이름은 필수입니다."); } if (item.getPrice() == null || item.getPrice() 1000000) { errors.put("price", "가격은 1,00.. 2021. 9. 24.
스프링 메시지, 국제화 메시지 하드코딩된 HTML 문자열들을 별도의 파일("messages.properties")에서 변수로 관리하는 방법 국제화 메시지에서 설정한 파일("messages.properties")을 각 나라별로 별도로 관리하면 서비스를 국제화 할 수 있다. "messages_en.properties" 설정 파일 item=Item item_id = Item Name "messages_ko.properties" 설정 파일 item=상품 item_id = 상품 ID 접근 인식 방법은 HTTP "accept-language" 헤더 값을 사용하거나 사용자가 직접 언어를 선택하도록 하고, 쿠키 등을 사용해서 처리하면 된다. 스프링부트인 경우 application.properties에서 설정해 주면된다. message 테스트.. 2021. 9. 23.
타임리프 셀렉트 박스 model에 Array로 넘겨줬다 ${item.deliveryCode}, ${deliveryCodes} 완전히 다른 객체이다. 2021. 9. 15.
타임리프 라디오 버튼 itemType Enum Controller에서 Enum 정보로 라디오 버튼 생성 HTML 체크박스 HTML 이랑 거의 비슷하다 2021. 9. 15.
타임리프 체크박스 단일체크박스 체크박스 속성상 select를 안하면 아예 서버로 전송이 안되므로 null 값을 받게된다(boolean 타입으로 저장해야한다.) 스프링 MVC에서는 _(name이름)을 사용해서 판단한다. 1. name 속성(open)이 오면 그대로 사용 2. name 속성(open)이 오지않으면 _open 값을 확인해서 open 속성에 = false를 넣어준다. 타임리프를 사용하면 체크박스의 히든 필드 관련 부분도 처리해준다. 멀티 체크박스 ${regions} 는 model의 addAttribute 로 추가해준 속성이고 *{regions} 는 form 에 있는 ${item} 내부의 regions 속성이다 ids.prev, ids.next를 사용해 동적으로 생성되는 id 값을 사용할 수 있게 한다. 2021. 9. 15.
타임리프 입력 폼 처리 th:object, th:field 중요!! Controller Model에 Item 객체 추가 @GetMapping("/add") public String addForm(Model model) { model.addAttribute("item", new Item()); return "form/addForm"; } Item 객체 import lombok.Data; @Data public class Item { private Long id; private String itemName; private Integer price; private Integer quantity; public Item() { } public Item(String itemName, Integer price, Integer quantit.. 2021. 9. 14.
템플릿 템플릿 조각 insert, replace 속성으로 불러오기 가능 main.html 부분 포함 부분 포함 insert 부분 포함 replace 부분 포함 단순 표현식 파라미터 사용 footer.html 푸터 자리 입니다. 파라미터 자리 입니다. 템플릿 레이아웃 layoutMain.html 의 head 태그 안의 값을 base.html의 head 태그의 common_header 템플릿 함수를 실행시키고 나온 결과값을 layoutMain.html head 태그로 적용한다. layoutMain.html 메인 컨텐츠 base.html 2021. 9. 13.
타임리프 자바스크립트, JS each 자바스크립트 inline 사용 Controller @GetMapping("/javascript") public String javascript(Model model) { model.addAttribute("user", new User("UserA", 10)); addUsers(model); return "basic/javascript"; } HTML 객체는 JSON으로 넣어준다. 2021. 9. 12.
타임리프 block 렌더링시 block이 들어가 있는 태그는 사라지고 내부 태그만 표시 Controller @GetMapping("/block") public String block(Model model) { addUsers(model); return "basic/block"; } HTML 사용자 이름1 사용자 나이1 요약 2021. 9. 12.
타임리프 주석 Controller @GetMapping("/comments") public String comments(Model model) { model.addAttribute("data", "Spring"); return "basic/comments"; } HTML 예시 html data 1. 표준 HTML 주석 2. 타임리프 파서 주석 여러줄 주석 html data 3. 타임리프 프로토타입 주석 (파일 그자체를 열떄는 안보이지만 타임리프를 이용해 서버사이드에서 렌더링시 표시) 2021. 9. 12.
타임리프 조건식(if, unless, switch) 조건을 충족시키지 않으면 태그자체가 삭제된다. Controller 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); } @GetMapping("/condition") public String condition(Model model) { addUsers(model); return "basic/condition"; } HTML if, unless count username age 1 username 0 switc.. 2021. 9. 12.
타임리프 반복(each) Controller @GetMapping("/each") public String each(Model model) { addUsers(model); return "basic/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); } HTML 기본 테이블 username age username 0 반복 상태 유지 count username age etc username username 0 index .. 2021. 9. 12.
타임리프 속성 값 설정 controller @GetMapping("/attribute") public String attribute(){ return "basic/attribute"; } HTML 속성 설정 속성 추가 - th:attrappend = - th:attrprepend = - th:classappend = checked 처리 - checked o - checked x - checked=false 2021. 9. 12.
타임리프 연산 Controller @GetMapping("/operation") public String operation(Model model) { model.addAttribute("nullData", null); model.addAttribute("data", "Srping!!"); return "basic/operation"; } HTML 산술 연산 10 + 2 = 10 % 2 == 0 = 비교 연산 1 > 10 = 1 gt 10 = 1 >= 10 = 1 ge 10 = 1 == 10 = 1 != 10 = 조건식 (10 % 2 == 0)? '짝수':'홀수' = Elvis 연산자 ${data}?: '데이터가 없습니다.' = ${nullData}?: '데이터가 없습니다.' = No-Operation ${data}?:.. 2021. 9. 12.
타임리프 리터럴 Controller @GetMapping("/literal") public String literal(Model model) { model.addAttribute("data","Spring!"); return "basic/literal"; } HTML 리터럴 'hello' + ' world!' = 'hello world!' = 'hello ' + ${data} = 리터럴 대체 |hello ${data}| = 2021. 9. 12.
타임리프 URL 링크 컨트롤러 @GetMapping("link") public String link(Model model) { model.addAttribute("param1", "data1"); model.addAttribute("param2", "data2"); return "basic/link"; } HTML URL 링크 basic url hello query param path variable path variable + query parameter 2021. 9. 11.
타임리프 유틸리티 객체와 날짜 타임리프 유틸리티 객체들 #message : 메시지, 국제화 처리 #uris : URI 이스케이프 지원 #dates : java.util.Date 서식 지원 #calendars : java.util.Calendar 서식 지원 #temporals : 자바8 날짜 서식 지원 #numbers : 숫자 서식 지원 #strings : 문자 관련 편의 기능 #objects : 객체 관련 기능 제공 #bools : boolean 관련 기능 제공 #arrays : 배열 관련 기능 제공 #lists , #sets , #maps : 컬렉션 관련 기능 제공 #ids : 아이디 처리 관련 기능 제공 컨트롤러 @GetMapping("/date") public String date(Model model) { model.addAt.. 2021. 9. 11.
타임리프 기본객체(session, request, response) 및 스프링 빈 조회 컨트롤러 @Controller @RequestMapping("/basic") public class BasicController { @GetMapping("/basic-objects") public String basicObjects(HttpSession session) { session.setAttribute("sessionData","hello Session"); return "basic/basic-objects"; } @Component("helloBean") static class HelloBean{ public String hello(String data){ return "Hello " + data; } } } HTML 식 기본 객체 (Expression Basic Objects) request.. 2021. 9. 11.
타임리프 SpringEL, 지역변수 컨트롤러 @Controller @RequestMapping("/basic") public class BasicController { @GetMapping("/variable") public String varible(Model model) { User userA = new User("userA", 10); User userB = new User("userB", 10); List list = new ArrayList(); list.add(userA); list.add(userB); Map map = new HashMap(); map.put("userA", userA); map.put("userB", userB); model.addAttribute("user", userA); model.addAttribut.. 2021. 9. 11.
타임리프 text, utext 컨트롤러 데이터 전송 @Controller @RequestMapping("/basic") public class BasicController { @GetMapping("text-unescaped") public String textUnescaped(Model model) { model.addAttribute("data", "Hello Spring!"); return "basic/text-unescaped"; } } HTML text vs utext th:text = th:utext = [[...]] vs [(...)] [[...]] = [[${data}]] [(...)] = [(${data})] 2021. 9. 11.
스프링 리다이렉트 컨트롤러에서 리다이렉트 사용시 참고 // @PostMapping("/add") public String addItemV5(Item item){ itemRepository.save(item); // 이렇게 사용하면 한글같은 경우 인코딩이 되지 않음 return "redirect:/basic/items/"+item.getId(); } @PostMapping("/add") public String addItemV6(Item item , RedirectAttributes redirectAttributes){ Item savedItem = itemRepository.save(item); redirectAttributes.addAttribute("itemId", savedItem.getId()); redirectA.. 2021. 9. 11.
728x90