🟧 01. 필터(Filter) 란? 필터(Filter)는 디스패처 서블릿에 요쳥이 전달되기 전/후로 작업을 처리해주는 기능이다. 그림을 보면 알 수 있듯이 스프링 컨테이너가 필터를 관리하지 않고 웹 컨테이너가 관리하고 있다. jakarta.servlet.Filter가 들어있는 것을 확인할 수 있다. 사실 필터를 봤을 때 궁금한 점이 많았다. 🤔 필터는 어디서 어떻게 사용하고 있는걸까 ? 인터셉터와 차이가 무엇이 있을까 ? 이제부터 하나하나 알아가보자. 🟧 02. 필터로 전/후로 작업을 처리하는게 뭐가 있을까 ? 먼저 필터가 연쇄적으로 동작할 수 있게 이루어져 있다는 것을 알고 진행하는 편이 좋을거 같다. 이 개념은 필터 체인(FilterChain)을 통해서 알 수 있고 간단하게 그림만 보고 넘어가자. 필..
안녕하세요 ~ 헤나입니다 ! 😄 🟧 01. id(pk값)을 제외하고 모든 정보를 수정한다고 할 때 PUT 메서드를 사용하는 것은 괜찮을까 ? 상품 정보를 수정하는 컨트롤러를 작성하던 중에 문득 고민된 부분이 있었다. PUT과 PATCH 메서드의 차이 때문이다. 현재 상품 수정 컨트롤러 코드는 아래와 같다. public class ProductApi { @PatchMapping("/{id}") public ResponseEntity updateProduct( @PathVariable(value = "id") long productId, @RequestBody @Valid ProductUpdateRequest request ) { final ProductResponse productResponse = pro..
Http Method에서 PUT과 PATCH의 차이에 대해서 알아보겠습니다. 🟧 01. PUT 메서드와 PATCH 메서드는 무슨 일을 할까 ? Http Method 중에서 PUT과 PATCH는 자원을 수정할 때 사용하는 메서드이다. 그렇다면 왜 수정하는 메서드가 두 가지(PUT, PATCH)가 있을까 ? 🟧 02. PUT 메서드는 자원을 대체한다. PUT 메서드는 자원을 완전히 대체하거나 생성하는 메서드이다. 좀 더 쉽게 말하면 자원을 덮어씌운다. 먼저 PUT 요청과 기존 데이터이 있다고 하자. 이 때 name은 "하이에나" -> "헤나"로 수정되기를 원한다. 실제로 PUT 메서드 요청을 보내면 아래와 같이 된다. PUT 메서드를 요청했을 때 name만 변경될 거 같지만 실제로 같은 값인 userId도 ..
스프링을 사용하면 기본적으로 알아야할 DispatcherServlet에 대해서 알아보겠습니다. 🟧 01. 디스패처 서블릿 (DispatcherServlet)에 대해서 Spring MVC와 같은 많은 웹 프레임워크들은 Front Controller Pattern을 중심으로 설계됐다. DispatcherServlet은 요청 처리에 대한 알고리즘을 제공하고 있다. 즉, Http Protocol로 오는 모든 요청을 적절한 컨트롤러에게 위임해주는 프론트 컨트롤러(Front Controller)가 DispatcherSevlet이다. 🟧 02. 프론트 컨트롤러 (Front Controller)가 뭔데 ? 과거에는 클라이언트가 요청을 보내면 각 요청에 맞는 컨트롤러에서 처리한다. 때문에 공통 로직이 중복되는 단점이 있..
스프링에서 예외 처리하기 위해서 @ExceptionHandler 어노테이션을 자주 사용했습니다. 컨트롤러A에 @ExceptionHandler와 @ControllerAdvice를 이용하면 다른 컨트롤러B, C에서 일어난 예외를 잡을 수 있었습니다. 이뿐만 아니라 @ResponseStatus, TypeMismatchException, 에러 페이지 렌더링, ... 등의 기능이 있었습니다. 이게 과연 어떻게 가능한걸까요 ? 🤔 검색해봤을 때 HandlerExcpetionResovler 인터페이스를 알게 되었습니다. 하나하나 알아볼까요 ? 🟧 01. Resolvers 예외 처리기 등록 Spring configuration에서 예외 처리기인 여러 HandlerExceptionResolver을 빈 체이닝으로 선언한다..
안녕하세요 ~ 헤나입니다 ! 😄 이번에는 "LEVEL2 - 웹 자동차 경주 미션 1단계" 회고를 진행해보려고 합니다 ! 🟧 01. 테스트 검증부 하드코딩 기존에 테스트를 다음과 같이 작성했다. @DisplayName("자동차 경주를 통해 게임 결과를 반환한다.") @Test void race() { // given final String jeomoon = "저문"; final String hyena = "헤나"; final CarGroup carGroup = new CarGroup("저문,헤나"); final int trial = 10; // when final RacingInfoResponse response = service.race(carGroup, trial); final List names = ..
item 23 태그 달린 클래스보다는 클래스 계층구조를 활용하라 01. 태그 달린 클래스 태그 : 클래스가 어떤 타입인지에 대한 정보를 담고있는 멤버 변수 태그 달린 클래스는 두 가지 이상의 의미를 가질 수 있다. 현재 표현하는 의미를 태그 값으로 알려주는 클래스를 태그 달린 클래스라고 한다. 아래 BoardGame 클래스를 보면 세 가지 필드가 존재한다. gameType, cards, board 이때 BoardGame이 어떤 타입인지에 대한 정보를 갖는 "GameType"을 태그라고 한다. public class BoardGame { enum GameType { BLACKJACK, CHESS } // 태그, 사람이 어떤 게임을 갖고 있는지 private GameType gameType; // 블랙잭 게..
ArgumentResolver 🟧 01. ArgumentResolver와 HandlerMethodArgumentResolver ArgumentResolver는 Spring MVC에서 Controller에 들어온 HTTP Request를 가공하여 메서드의 파라미터 타입으로 만드는 역할이다. 이러한 ArgumentResolver는 HandlerMethodArgumentResolver를 줄여서 부른다. 🟧 02. HandlerMethodArgumentResolver 이 뭔데 ? HandlerMethodArgumentResolver는 스프링 프레임워크가 제공하는 인터페이스이다. @RequestParam, @ModelAttribute, @PathVariable, @RequestParam, ...와 같은 어노테이션..
안녕하세요 ~ 헤나입니다 ! 😄 우아한테크코스 레벨1을 끝내기 전에 "레벨 인터뷰"가 있습니다. 이번 글을 레벨 인터뷰 회고에 대한 글입니다 ~ 👍 🟧 레벨 인터뷰 이전에 네오 코치와 함께 진행하는 재밌는 인터뷰(회고) 시간이다. 같은 인터뷰 팀이 된 크루들과 함께 진행했다. 이 시간은 회고가 중심이라고 생각한다. 면접과 비슷한 형식이지만 잘한 점, 보완할 점을 얻어갈 수 있는 의미 있는 시간이지 않을까 싶다. 😄 자신이 있지도 없지도 않았지만 확실히 내가 한거는 얘기하고 싶었다. 그래서 따로 인터뷰 준비를 레벨로그 작성 외로는 하지 않았다. 있는 그대로의 모습을 보여주고 싶었고 사실 시간이 없었기도 하다. 🤔 그리고 느끼고 싶은게 있었는데, 다시 공부하지 않아도 기억하고 있을지, 결정한 기술들에 대해서..
안녕하세요 ~ 헤나입니다 ! 😄 저번 글은 블랙잭 미션 1단계 & 2단계 회고 였습니다. 이번에는 "체스 미션 1단계 & 2단계" 회고를 진행해보려고 합니다. 🟧 메서드 순서 정리 메서드 순서를 정리하자. 💁♂️ 리뷰어 전체적으로 메서드 순서 정리를 해주셨으면 합니다. (다른 클래스도) 아래 글에서 3번 항목을 참고해주셨으면 해요. 🔗 클린코딩/더 나은 코딩을 하는 10가지 방법 기존에 나는 메서드를 정리할 때 다음과 같은 순서로 정리했다. public 메서드를 최상단에 작성한다. private 메서드는 public 상단에서 관련된 순서로 작성한다. equals, hashcode, getter, setter 메서드는 왼쪽 순서대로 최하단에 작성한다. 이전 페어들과 같이 코드를 작성하면서 위와 같은 방식..