Spring 공통 예외 처리(ControllerAdvice, ExceptionHandler) @ControllerAdvice, @ExceptionHandler 는 애플리케이션의 모든 컨트롤러에서 발생할 수 있는 예외를 한 곳에서 관리하기 위해 설계된 기능입니다. 예외 발생 시 ResponseEntity 또는 JSON/XML 형태로 클라이언트에게 에러 정보를 제공할 수 있고, 특정 컨트롤러, 패키지에 대한 예외만 처리할 수도 있습니다. . 아래 코드를 보면 bindingResult 를 검증하는 코드와 try-catch 로 예외를 핸들링하는 것을 볼 수 있습니다. 모든 컨트롤러에 아래와 같은 형태로 구현을 하게 되면 컨트롤러에 코드가 거대해지고 코드를 읽기도 어려워질 것 같죠?! 제가 그랬었답니다..😅 @P..
대규모 시스템 설계 독서 후 링크드인 시스템 분석 대부분의 서비스 회사에서는 이미 어느 정도의 시스템이 구축되어 있다 보니 시스템 설계에 대한 관심이 크지 않았었는데, 사이드 프로젝트를 진행하며 시스템 설계에 대한 궁금증과 관심이 생기게 되었고 그 시기에 우연히 보게 된 책 제목에 흥미를 가지고 대규모 시스템 설계 기초 책을 읽게 되었습니다. 당시 링크드인을 막 시작할 무렵이다보니 문득 "링크드인 서비스는 대규모 트래픽을 감당하기 위해 시스템이 어떻게 설계되었고, 어떤 기술을 어디에 어떻게 적용하고 있을까?" 라는 궁금증을 가지고 읽게 되었습니다. 책에서는 다양한 시스템 설계 방법에 대하여 소개하고 있는데 링크드인 시스템 분석(사실 분석이라는 말은 거창하지만..)을 위해 적용해 볼 수 있는 몇 가지 주제..
Record record 클래스를 잘 알고 사용하기 위해 java14에 출시한 record 클래스를 알아보려고 합니다. Intro Record 클래스는 데이터를 저장하는 데 사용되는 DTO(Data Transfer Object)나 VO(Value Object) 같은 간단한 데이터를 운반하기 위한 불변 클래스를 정의할 때 간결하고 유용하게 사용할 수 있습니다. record 클래스는 데이터를 저장하는데 사용되는 DTO(Data Transfer Object)라고 불리는 클래스를 API 요청, 쿼리 결과 등의 데이터 이동에 사용하곤 합니다. DTO는 대부분 불변성을 가지고 있는데, 불변 클래스로 만들기 위해 적지 않은 노력이 필요합니다. 각 데이터에 private, final 키워드 선언 각 필드에 대한 get..
AWS EC2 Amazon Linux 2023 SSL 사이드 프로젝트에 SSL 인증서를 적용하게 되었습니다. SSL 인증서 발급을 위해 여러 방법을 적용해 보면서 많이 사용되는 두 가지 방법을 적용하는 과정을 기록해 보려고 합니다. 도메인 도메인 구매, 인증, 네임서버 등록은 간략하게 넘어가도록 하겠습니다. 자세한 내용은 EC2 HTTPS로 연결하기 (1) - 도메인 구매하고 ACM 인증서 발급하기 글을 참고하였습니다. . 도메인 구매 먼저 도메인 구매는 gabia를 이용하였습니다. . 도메인 인증 서버로 AWS EC2를 이용하고 있기 때문에 도메인 인증은 AWS Route 53에서 하게 되었습니다. . 도메인 네임 서버 가비아의 도메인 네임서버가 있지만, AWS Route 53에서 도메인을 인증하였으니..
Content type 'application/octet-stream' not supported for bodyType Intro WebClient를 사용하여 아래와 같은 방식으로 API 통신을 하던 중 마주한 예외를 탐구해 보게 되었습니다. Response response = webClient.mutate() .baseUrl(baseUrl).build() .post().uri(uri) .bodyValue(requestBody) .headers(httpHeaders -> httpHeaders.setAll(headers)) .retrieve() .onStatus(HttpStatus::isError, res -> { return Mono.error(new ResponseStatusException(res.s..
파일 시그니처로 유효성 검사하기 기존 반품 신청 시 이미지만 업로드가 가능했었는데요. 이번에 동영상도 업로드가 가능하도록 기능을 추가하게 되었습니다. 클레임 영역에서 동영상 업로드/재생 로직을 신규로 구현하다 보니 신경 써야 할 요소들이 다소 있었습니다. 그중에서 파일 시그니처로 파일 유효성 검사에 대한 내용을 다뤄보려고 합니다. 어느 날 점심을 먹으러 가는 길에 팀원분과 파일 업로드 관련하여 이야기를 나누던 중 팀원분이 문득 "바이러스 파일을 업로드 가능한 확장자로 변경해서 업로드하게 되면 바이러스도 업로드가 가능하지 않을까?"라는 의문을 공유해 주셨습니다. 당시에는 "설마 클레임 신청 시 바이러스를 업로드하는 사람이 있을까?"라고 단순하게 생각했었지만, 계속 생각하다 보니 충분히 가능성이 있는 사례였..
Redis로 Session 관리하기 사이드 프로젝트에서 JWT를 쿠키에 저장하는 방식으로 인가를 구현하게 되었습니다. 처음에 각각 명확한 장/단점이 존재하는 쿠키 방식과 세션 방식 중 고민을 많이 했었는데, JWT 정보가 클라이언트 측에 저장되다 보니 쿠키에 저장된 JWT 정보만 탈취하면 너무나도 쉽게 계정을 도용해서 접속할 수 있을 것 같다는 생각이 들었습니다. 사용자가 얼마나 될지 모르겠지만, 그래도 사용자에게 로그인에 대한 찝찝함을 제공하지 않으려면 그래도 안전한 세션 방식을 활용하는 것이 좋을 것 같아서 세션 방식으로 다시 적용하게 되었습니다. (찾다 보니 쿠키, 세션의 장점을 모두 활용하는 방식으로 함께 적용한다고도 합니다.) . 세션 저장소는 in-memory data store(redis)를..
Spring WebClient Spring WebClient 먼저 알아보고, WebClient vs. RestTemplate 를 간략하게 비교해 보자. . Spring 5 WebClient Baeldung - Spring 5 WebClient 내용 정리 ✏️ . Web Client: 웹 요청을 수행하기 위한 주요 진입점을 나타내는 인터페이스 Spring Web Reactive 모듈의 일부로 개발되었으며, 기존의 RestTemplate 대체 HTTP/1.1 프로토콜에서 동작하는 반응형 non-blocking solution non-blocking 클라이언트이고 spring-webflux 라이브러리에 속하지만 동기/비동기 작업을 모두 지원 . Dependencies spring-boot-starter-web..