728x90
쿠키로그인사용자가 로그인에 성공하면 응답에 쿠키를 생성하여 리다이렉트 한다.@PostMapping("/login")public String login(@Valid @ModelAttribute LoginForm form, BindingResult bindingResult, HttpServletResponse response) { ... Cookie idCookie = new Cookie("memberId", String.valueOf(loginMember.getId())); response.addCookie(idCookie); return "redirect:/";} 세션 쿠키로 설정하기 위해 쿠키에 시간 정보를 주지 않았다. `영속 쿠키` : 만료 날짜까지 유지`세..
Bean Validation검증 로직을 모든 프로젝트에 적용할 수 있게 공통화하고 표준화한 것이다. 우선 Bean Validation 을 사용하려면 다음 의존관계를 추가해야 한다.build.gradleimplementation 'org.springframework.boot:spring-boot-starter-validation' 해당 라이브러리를 넣으면, 자동으로 Bean Validator 를 인지하고, 스프링에 통합한다.그리고 LocalValidatorFactoryBean 을 자동으로 글로벌 Validator 로 등록한다. `@Valid`, `@Validated` 만 적용하면 되고,검증 오류가 발생하면 FieldError, ObjectError 를 생성하여 BindingReslut 에 담아준다.(이때 ..
검증 직접 처리...Map errors = new HashMap();// 필드 오류if (item.getQuantity() == null || item.getQuantity() >= 10000) { errors.put("quantity", "수량은 최대 9,999 까지 허용합니다.");}// 글로벌 오류if (item.getPrice() != null && item.getQuantity() != null) { int resultPrice = item.getPrice() * item.getQuantity(); if (resultPrice 이렇게 필드 오류와 글로벌 오류가 발생하면 errors 에 담아, errors 에 값이 있으면 다시 입력 폼이 있는 뷰 템플릿으로 보낸다. ...수량 필드 글로벌 ..
메시지 소스스프링은 다양한 메시지를 한 곳에서 관리할 수 있도록 메시지 기능을 제공한다.인터페이스 `MessageSource` 와 구현체 `ResourceBundleMessageSource` 를 스프링 빈으로 등록하면 된다.(스프링 부트를 사용하면 자동으로 등록한다.) 직접 등록@Beanpublic MessageSource messageSource() { ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource(); messageSource.setBasenames("messages", "errors"); messageSource.setDefaultEncoding("utf-8"); return messageSource;}..
타임리프특징- 서버 사이드 HTML 렌더링 (SSR) : 백엔드 서버에서 HTML 을 동적으로 렌더링- 네츄럴 템플릿 : 순수 HTML 파일을 그대로 유지 : 서버를 통해 뷰 탬플릿을 거치면 동적으로 HTML 을 변환- 스프링 통합 지원 사용 선언`` 속성 변경 `attrappend` `attrprepend` `classappend` `checked` - `th:xxx` : 타임리프 뷰 템플릿을 거치게 되면 `th:xxx` 값으로 동적으로 변경된다. : HTML 대부분의 속성을 `th:xxx` 로 변경할 수 있다. : `th:href="@{/css/bootstrap.min.css}"`- `th:attrappend` `th:attrprepend` : 속성 값 뒤/앞 에 값을 추가한다. : `..
요청 매핑`@RestController` : @Controller 는 반환값이 String 이면 뷰 이름으로 인식하여 뷰를 찾고 렌더링 : @RestController 는 반환값으로 뷰를 찾는 것이 아닌, HTTP 메시지를 바디에 바로 입력 : @Controller + @ResponseBody 효과@RestControllerpublic class MappingController { @RequestMapping("/mapping-get-v1") public String mappingGetV1() { return "ok"; }} `@RequestMapping("url")` : URL 호출이 오면 이 메서드가 실행되도록 매핑 : 다중 설정 가능 : 겹치는 URL 부분을 클래스 단위에..
로깅로깅의 장점- 스레드 정보, 클래스 이름 같은 부가 정보를 함께 볼 수 있고, 출력 모양을 조정할 수 있다.- 로그 레벨을 설정하여 상황에 맞게 조절해 사용할 수 있다.- 콘솔에만 출력하는 것이 아닌, 파일/네트워크 등 별도의 위치에 남길 수 있다.(파일에 남기는 경우, 일별 / 특정 용량에 따라 로그를 분할하는 것도 가능)- 성능도 `System.out` 보다 좋다. (내부 버퍼링, 멀티 스레드 등) `SLF4J` : 로그 라이브러리들을 통합한 인터페이스`LogBack` : `SLF4J` 를 구현한 구현체 중 한 로그 라이브러리 로그 선언private Logger log = LoggerFactory.getLogger(getClass());> `@Slf4j` 를 클래스에 추가하면, 로그 선언 없이 바..
SpringMVC 전체 구조DispatcherServlet- SpringMVC 의 프런트 컨트롤러- `HttpServlet` 을 상속받아 사용하고, 서블릿으로 동작- 스프링 부트가 `DispatcherServlet` 을 서블릿으로 자동 등록하며 모든 경로 (`urlParrerns`) 에 대하여 매핑 SpringMVC 구조 핸들러 매핑 ↑ ① 핸들러 조회↑ 핸들러 어댑터 목록 ↗ ② 핸들러 어댑터 조회 ↗ 클라이언트HTTP 요청→ → → →DispatcherServlet ③ handle(handler)→ → → → → → ← ← ← ← ← ← ⑤ModelAndView 반환핸들러 어댑터 ④ 핸들러 호출→ → → →핸들러(컨트롤러) ↓ ⑧ render(model) 호..