실무에서는 Setter를 사용하지 않는다!JAVA를 활용하여 Api를 개발하는 것을 경험해본 사람이라면 Setter를 사용하면 안된다는 말을 한 번쯤은 들어봤을 것입니다. 개발 초기에 Setter를 활용하여 값을 바인딩하였지만 이를 해결하기 위해 공부해봤습니다.Setter를 사용하여 개발을 하게되면, 다른 개발자가 어떠한 객체의 필드 값을 수정할 수 있습니다.OCP의 원리를 지킬 수 없습니다.그리하여 Setter를 제거하고 builder 패턴을 적용하기 위해 팀원들에게 builder를 사용하는 이유를 설명하고, setter를 제거하는 과정을 거쳤으며 새로운 오류 또한 만날 수 있게 되었습니다. @setter를 사용하여 객체를 생성하는 것과 @Builder를 사용하여 객체를 생성하는 것은 크게 다르지 않습..
바로 전 글에서 @ExceptionHandler를 사용하여 예외처리를 깔끔하게 처리했다. 하지만 컨트롤러의 정상 처리와 예외 처리 코드가 하나의 컨트롤러에 섞여있다. 이를 @ControllerAdvice를 사용하여 둘을 분리할 수 있다. ExControllerAdviceExControllerAdvice라는 클래스를 하나 만들어보자. 그 후, 기존 ApiExceptionV2Controller에서 예외처리를 하던 코드를 ExControllerAdvice에다가 옮기고 실행했다.@Slf4j@RestControllerAdvicepublic class ExControllerAdvice { @ResponseStatus(HttpStatus.BAD_REQUEST) @ExceptionHandler(Illegal..
HTML vs Api 오류전에 언급한 Spring mvc 패턴과 Restful Api의 차이가 여기서 한 번 더 나온다. 이 둘의 차이가 헷갈리다면 아래 글을 참고하기 바란다.2023.08.16 - [Spring/Spring Exception] - Spring Exception 4. Api 예외 처리 (Spring mvc VS RestfulApi) Spring Exception 4. Api 예외 처리 (Spring mvc VS RestfulApi)Spring mvc 패턴 VS RestfulApi 이전 글에도 언급했지만 mvc 패턴과 Api의 차이를 명확히 알아야 이해할 수 있다. 이 둘의 가장 큰 차이점만 언급하겠다. Spring mvc 패턴 View 지향: Spring MVC 패턴은 주로 웹 애toyc..
기본 제공 ResolverSpring Boot가 기본으로 제공하는 ExceptionResolver는 아래와 같다. 1. ExceptionHandlerExceptionResolver2. ResponseStatusExceptionResolver3. DefaultHandlerExceptionResolver ExceptionHandlerExceptionResolver는 Api 예외처리할 때 @ExceptionHandler로 대부분 처리한다. ResponseStatusExceptionResolver는 HTTP 상태 코드를 지정해 준다. ex) @ResponseStatus(value = Httpstatus.NOT_FOUND)DefaultHandlerExceptionResolver는 스프링 내부 기본 예외를 처리한다..
예전 로직지금까지는 예외가 발생하고 WAS까지 예외가 던져지고, WAS에서 오류페이지를 찾은 후 다시 /error로 호출했다.하지만 이렇게 여러 필터 및 인터셉터를 거치는 과정은 매우 비효율적이고 복잡하다.이때 ExceptionResolver를 활용하면 이러한 과정을 거치지 않고 예외를 깔끔하게 처리할 수 있다. UserException 정의 예외 추가RuntimeException을 상속받는 사용자 정의 예외를 추가했다. public class UserException extends RuntimeException{ public UserException() { super(); } public UserException(String message) { super(message);..
HandlerExceptionResolver만약 클라이언트의 요구사항이 추가되어서 bad라는 uri가 들어올 경우, 클라이언트에게 서버 문제가 아닌, 클라이언트의 문제라는 것을 알려주려면 어떻게 해야 할까? 기존 컨트롤러에 추가해 보자. @Slf4j@RestControllerpublic class ApiExceptionController { @GetMapping("/api/members/{id}") public MemberDto getMember(@PathVariable String id) { if (id.equals("ex")) { throw new RuntimeException("잘못된 사용자"); } if (id.equals("b..
BasicErrorControllerBasicErrorController에는 html view렌더링 이용시 이미 만들어져있듯 Api에 대한 내용 또한 이미 만들어져 있다.html view렌더링에 대한 응답과 json에 대한 응답은 다르지만 유입 경로는 동일하다. @RequestMapping(produces = MediaType.TEXT_HTML_VALUE) public ModelAndView errorHtml(HttpServletRequest request, HttpServletResponse response) {...} @RequestMapping public ResponseEntity> error(HttpServletRequest request) {...} BasicErrorControlle..
Spring mvc 패턴 VS RestfulApi이전 글에도 언급했지만 mvc 패턴과 Api의 차이를 명확히 알아야 이해할 수 있다.이 둘의 가장 큰 차이점만 언급하겠다. Spring mvc 패턴View 지향: Spring MVC 패턴은 주로 웹 애플리케이션의 사용자 인터페이스(UI)를 개발하는 데 사용된다.컨트롤러가 뷰를 반환하고, JSP와 같은 뷰 템플릿 엔진을 통해 HTML을 생성하여 클라이언트에게 제공한다. RestfulApi데이터 지향: API 방식은 주로 데이터를 주고받는 데 사용된다.JSON, XML과 같은 데이터 형식을 사용하여 클라이언트와 서버 간 데이터를 교환한다. 뷰를 생성하는 대신, 데이터만 반환한다. 이 둘의 차이를 꼭 알아야, 이해가 가능하다. Api의 경우 웹 페이지가 아닌 ..
2023.08.12 - [Spring/Spring mvc] - Spring Exception 1. 서블릿1 (Spring에서 예외처리를 어떻게 할까?)2023.08.14 - [Spring/Spring mvc] - Spring Exception 2. 서블릿2 (Filter와 Interceptor를 안 거치려면?)BasicErrorController이전 글들을 보면 WebServerCustomizer를 만들어 오류 종류에 따라 어떠한 페이지로 가는지 경로를 정해줬고, 예외 처리용 컨트롤러를 직접 만들었다. 하지만 SpringBoot는 앞서 배운 내용을 기본으로 제공한다. 이러한 기본적인 내용들은 BasicErrorController에 모두 정의되어 있다. new ErrorPage로 상태코드와 예외를 설정하지..
서블릿 예외 처리 - 필터바로 전 포스트에서 예외 발생 시 오류 페이지 요청 흐름에 대해 알아보았다.2023.08.12 - [Spring/Spring mvc] - Sprinng Exception 1. 서블릿불필요한 호출오류가 발생시에 WAS 내부에서 다시 호출을 진행하는데 불필요하게 인터셉터, 서블릿, 필터가 2번씩 비효율적으로 호출된다. 하지만 로그인 기능 같은 경우, 이미 필터, 인터셉터에서 검증을 했는데, 한번 더 호출되는 것은 비효율적이다. 클라이언트에서 발생한 요청인지, 오류 페이지를 보여주기 위한 요청인지 구분해야 한다.서블릿은 이럴 때 사용하기 위해 DispatcherType이라는 옵션을 제공한다. DispatcherTypeDispatcherType에는 5가지 타입이 존재하는데, 아래 두 가..