스프링
-
API 예외처리 - HandlerExceptionResolver스프링/스프링 MVC 패턴 2023. 3. 5. 14:30
HTML이 아니라 API에서 예외를 처리해야할 상황이 있다. 그 때는 HTML처럼 뷰 템플릿을 보여주는 것이 아니라 Json 방식으로 사용자에게 전달해야한다. @Slf4j @RestController public class ApiExceptionController { @GetMapping("/api/members/{id}") public MemberDto getMember(@PathVariable("id") String id) { if (id.equals("ex")) { throw new RuntimeException("잘못된 사용자"); } if (id.equals("bad")) { throw new IllegalArgumentException("잘못된 입력 값"); } return new Member..
-
스프링 부트의 오류 페이지스프링/스프링 MVC 패턴 2023. 3. 3. 22:38
스프링 부트에서 오류가 나면 자동으로 페이지를 연결해주는 기능이 있다. 뷰 템플릿은 resource/templates/error/~~~~~.html 이라는 정해진 규칙이 있어서 여기에 html 파일을 넣으면 된다. 404 오류 발생시 @Slf4j @Controller public class ServletExController { @GetMapping("/error-404") public void error404(HttpServletResponse response) throws IOException { response.sendError(404, "404 오류!"); } 404.html 404 오류 화면 스프링 부트 제공 오류 화면 입니다. 400 에러 발생시 @GetMapping("/error-400") ..
-
스프링 인터셉터 (서블릿 필터 상위 기능)스프링/스프링 MVC 패턴 2023. 3. 1. 16:44
스프링 인터셉터는 서블릿 필터와 비슷하지만 서블릿 필터보다 더 많은 기능을 지원하고 정교하게 사용할 수 있다. 스프링 인터셉터 흐름 HTTP 요청 ---> WAS ---> 필터 ---> 서블릿 ---> 스프링 인터셉터 ---> 컨트롤러 스프링 인터셉터 또한 체인 형식이라 인터셉터를 여러개 넣을수도 있다. preHandle : 컨트롤러 요청 전에 호출 - preHandle의 응답값이 true면 다음으로 진행하고 false면 인터셉트, 핸들러 어댑터 전부 호출하지 않는다. postHandle : 컨트롤러 요청 후에 호출 afterCompletion : http 최종 요청 후에 호출 (뷰가 렌더링 된 이후에 호출) 컨트롤러에서 예외가 발생하면 postHandle은 호출되지 않는다. 하지만 afterComple..
-
서블릿 필터스프링/스프링 MVC 패턴 2023. 3. 1. 15:42
로그인이 된 사용자만 상품 관리 페이지에 들어갈 수 있어야 하는데 로그인을 하지 않은 사용자가 URL을 직접 호출하면 상품 관리 화면에 들어가서 기능들을 사용할 수 있다. 웹에 관련된 공통 관심사를 처리할 때에는 서블릿 필터나 스프링 인터셉터를 사용하는 것이 좋다. 이 글에서는 서블릿 필터에 대해 배우도록 하겠다. 필터 흐름 HTTP 요청 ---> WAS ---> 필터 ---> 서블릿 ---> 컨트롤러 필터를 적용하면 피터가 호출된 다음에 서블릿이 호출되며 특정 URL 패턴에 적용할 수 있다. 로그인 한 사용자는 필터, 서블릿을 건너서 컨트롤러까지 호출하는데 로그인을 하지 않은 사용자는 필터에서 요청을 끝내버릴 수 있다. 로그인 여부 등을 체크하기에 좋은 기능이다. 필터는 체인으로 구성되기 때문에 필터를..
-
서블릿 Http 세션스프링/스프링 MVC 패턴 2023. 2. 28. 23:48
쿠키를 이용해서 하는 것은 보안 문제가 있기 때문에 세션을 이용하는 것이 좋다. 세션이라는 것은 임의의 특이한 코드를 사용자에게 무작위로 줘서 고유의 값으로 서버와 연결할 수 있게 해주는 것이다. 서블릿에서 지원하는 세션 기능을 사용해서 구현할 수 있다. @PostMapping("/login") public String loginV3(@Valid @ModelAttribute LoginForm form, BindingResult bindingResult, HttpServletRequest request) { if (bindingResult.hasErrors()) { return "login/loginForm"; } Member loginMember = loginService.login(form.getLog..
-
로그인 페이지 만들기스프링/스프링 MVC 패턴 2023. 2. 28. 15:34
회원 가입 페이지를 만들었으니 이제 로그인을 할 수 있는 페이지를 만들 것이다. 로그인 페이지만 만드는 것이고, 로그인이 성공하면 로그인 성공 페이지로 이동하고 실패하면 에러를 출력하는 페이지이다. 우선 도메인에 LoginService 클래스를 만들었다. @Service @RequiredArgsConstructor public class LoginService { private final MemberRepository memberRepository; /** * @return null이면 로그인 실패 */ public Member login(String loginId, String password) { return memberRepository.findByLoginId(loginId) .filter(m -..
-
상품 등록 전 로그인하기 - 회원가입 페이지 만들기스프링/스프링 MVC 패턴 2023. 2. 28. 14:19
상품을 등록하고 수정하는데 아무나 할 수가 있기 때문에 상품 등록을 하기전에 로그인 페이지를 만들어서 로그인이 된 사람만 상품 등록 및 수정을 할 수 있도록 만들 것이다. java.hello.login.domain.member에 Member 객체 클래스 생성 @Data public class Member { private Long id; @NotEmpty private String loginId; // 로그인 ID @NotEmpty private String name; // 사용자 이름 @NotEmpty private String password; } MemberRepository 클래스 생성 @Slf4j @Repository public class MemberRepository { private sta..
-
등록과 수정의 검증 분리 - V4스프링/스프링 MVC 패턴 2023. 2. 25. 17:37
등록과 수정은 항상 같은 값들이 넘어오는 것이 아니라 부가적인 데이터가 많기 때문에 등록과 수정을 분리해주는 것이 좋다. 등록을 위한 ItemSaveForm package hello.itemservice.web.validation.form; import lombok.Data; import org.hibernate.validator.constraints.Range; import javax.validation.constraints.Max; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; @Data public class ItemSaveForm { @NotBlank private String it..