Spring/SpringMVC

임시로 디버깅하는 방법HttpEntity 클래스를 활용하여 body에 어떠한 JSON 값이 들어왔는지 확인한다. //회원가입 @PostMapping("") public void register(//@RequestBody UserRequest userRequest HttpEntity http){ log.info("user : {} ", http.getBody()); // 바디 값 확인 }정확한 request body의 내용이라기보다는 한번 더 캐스팅하여 사용해야하기 때문에 불편함이 있다.클라이언트에게 어떠한 값을 전달했는지 확인하기도 어렵다. 필터 적용하기로그를 찍어볼 수 있는 필터를 생성하여 확인한다...
스프링에서는 어노테이션을 기반으로 ExceptionResolver를 활용하여 API 예외처리를 한다. 스프링 부트가 제공하는 ExceptionResolver는 다음과 같다. ( 위에서부터 우선순위가 높은 ExceptionResolver이다.) ExceptionHandlerExceptionResolver ResponseStatusExceptionResolver DefaultHandlerExceptionResolver ExceptionHandlerExceptionResolver @ExceptionHandler 어노테이션을 찾아 해당 메서드에 작성된 예외 처리를 진행한다. 대부분의 API 예외처리는 이 기능으로 해결한다. @ExceptionHandler 앞서 API예외처리에 있어서 HandlerExceptio..
발생하는 예외에 따라서 400, 404 등 상태코드를 다르게 정의하고 싶을 때는 어떻게 해야할까? ExceptionResolver를 사용하면 된다. ExceptionResolver ExceptionResolver는 말 그대로 컨트롤러(핸들러)에서 발생한 예외를 해결하는 역할을 한다. 앞서 예외를 보면 컨트롤러에서 예외가 발생하면 수 많은 단계를 거쳐 WAS까지 전달되게 되는데, 이 ExceptionResolver를 사용하게 되면 WAS까지 예외가 던져지지 않고 여기서 해결이 가능하다. ExceptionResolver를 사용하지 않으면 예외가 WAS까지 전달되어 WAS에서 서버 내부 오류로 인식해 500 상태코드를 전달하게 된다. 하지만, ExceptionResolver를 적용하면 예외를 Exception..
API 예외처리는 어떻게 해야할까? API는 각 오류 상황에 맞는 오류 응답 스펙을 정하고, JSON으로 데이터를 내려주어야 한다. -> 각 통신마다 쓰는 방식이 다다르기 때문에 이를 공통적으로 약속(오류 응답 스펙)을 하고 사용해야 한다. 서블릿 API 예외처리 기존의 예외처리는 클라이언트가 예외를 발생했을 때 HTML 형태의 뷰템플릿을 반환했었다. 하지만, 클라이언트에서 API로 요청을 보내면 서버에서도 API로 반환해주어야 하는데 별도의 설정 없이 진행하게 되면 서버는 똑같이 뷰템플릿을 반환한다. API 예외처리 컨트롤러 @RestController public class ApiExceptionController { @GetMapping("/api/members/{id}") public Member..
스프링 부트는 앞서 서블릿 오류페이지 처리의 과정들을 기본으로 제공한다. 그로 인해 스프링 부트에서 복잡한 처리를 진행해주어서 개발자는 오류페이지만 등록해주면 된다. 스프링 부트 예외 페이지 처리 ErrorPage를 자동으로 등록한다. => ' /error ' 경로로 기본 오류페이지를 설정한다. new ErrorPage("/error") 서블릿 밖으로 예외가 발생하거나, response.sendError(...) 가 호출되면 모든 오류는 /error 를 호출하게 된다. BasicErrorController를 자동으로 등록 : ErrorPage에서 등록한 /error 를 매핑해서 처리하는 컨트롤러 이러한 처리로 개발자는 오류 페이지 화면만 규칙에 맞게 작성하여 등록하면 된다. BasicErrorContro..
서블릿은 다음 2가지 방식으로 예외를 처리한다. Exception response.sendError Exception (예외) 자바 직접 실행의 경우 자바의 메인 메서드를 직접 실행하는 경우 main이라는 이름의 쓰레드가 실행된다. 실행 도중에 예외를 잡지 못하고 main()을 넘어서 예외가 던져지면 예외 정보를 출력하고 해당 쓰레드는 강제 종료된다. 웹 애플리케이션 웹 애플리케이션은 사용자 요청별로 별도의 쓰레드가 할당되고, 서블릿 컨테이너 안에서 실행된다. 애플리케이션에서 예외가 발생했는데, try-catch문으로 잡지 못하고 서블릿 밖으로까지 예외가 전달되면 WAS까지 이동된다. 이동되는 단계는 다음과 같다. WAS(여기까지 전달된다) 서블릿 -> 필터 -> WAS(sendError 호출 기록 확인..
만약, 웹 브라우저 페이지 중 로그인한 회원만 이용할 수 있는 기능들이 있을때, 어떻게 개발을 해야할까? 아마, 로그인한 회원 정보가 필요한 로직들에 공통적으로 로그인 여부를 확인하는 코드(공통관심사)를 다 작성을 해야할 것이다. 하지만 이는 중복되는 코드도 많고 유지보수적으로 애로사항이 매우 크다. 이렇게 애플리케이션 여러 로직에서 공통으로 관심이 있는 있는 것을 공통 관심사(cross-cutting concern)라고 한다. 이러한 공통 관심사를 해결하는 방법은 다음과 같다. 스프링 AOP 필터, 인터셉터 웹과 관련된 공통 관심사를 처리할 때는 HTTP의 헤더나 URL의 정보들이 필요하기 때문에 필터, 인터셉터를 활용하여 해결하는 것이 좋다. 서블릿 필터나 스프링 인터셉터는 HttpServletReq..
쿠키와 세션은 보통 로그인, 로그아웃을 구현할 때 주로 사용된다. 예를 들어, 사용자가 웹사이트에서 로그인을 할 때 그 로그인한 상태를 유지할 수 있어야 하는데 이를 쿠키와 세션이 그 역할을 한다. 쿠키(Cookie) 클라이언트에 저장되는 키(key)와 값(value)이 들어있는 작은 데이터 파일 브라우저에서 로그인한 사용자 정보를 기억하게 하려면 쿠키에 그 사용자 정보를 저장하면 된다. 사용자가 로그인을 하면, 서버에서 id, password로 사용자를 식별한다. 그 다음, 쿠키를 생성하여 쿠키에 사용자 정보를 담아 클라이언트에 전달한다. (쿠키 저장소에 저장) 이후 브라우저(클라이언트)는 쿠키 저장소에서 해당 사용자 정보를 읽어 사용자 상태를 유지할 수 있다. 영속 쿠키, 세션 쿠키 영속 쿠키 : 쿠..
Bean Validation이란? http://hibernate.org/validator/ The Bean Validation reference implementation. - Hibernate Validator Express validation rules in a standardized way using annotation-based constraints and benefit from transparent integration with a wide variety of frameworks. hibernate.org Bean Validation은 특정한 구현체가 아니라 Bean Validation 2.0(JSR-380)이라는 자바에서 지원하는 기술 표준이다. 쉽게 이야기해서 검증 애노테이션과 여러 인터페이..
오류코드 작성법 errors.properties 파일로 오류코드를 한 곳에 모아 관리하도록 할 때 메시지를 단계별로 나누어 필요에 따라 적절히 활용할 수 있도록 할 수 있다. 메시지를 세분하는 이유? 메시지를 작성할 때 여러 곳에서 사용할 수 있도록 일반적으로 작성하면, 범용성은 좋지만, 자세한 상황을 설명해야 되는 부분에서는 전달이 어려울 수 있다. 또한 자세한 설명을 위해 메시지 자체를 세밀히 작성하면, 여러 곳에서 사용하기에는 적합하지 않다. 따라서, 메시지를 단계별로 나누어 보다 범용성으로 사용하다가, 세밀하게 작성해야 하는 경우 세밀한 내용이 적용되도록 하는 것이다. 메시지를 단계별로 사용할 때, 보다 구체적일수록 우선순위가 높다. ex) required FieldError 메시지 생성 방식 참..
thk_dev
'Spring/SpringMVC' 카테고리의 글 목록