Spring 공통 예외 처리(ControllerAdvice, ExceptionHandler) @ControllerAdvice, @ExceptionHandler 는 애플리케이션의 모든 컨트롤러에서 발생할 수 있는 예외를 한 곳에서 관리하기 위해 설계된 기능입니다. 예외 발생 시 ResponseEntity 또는 JSON/XML 형태로 클라이언트에게 에러 정보를 제공할 수 있고, 특정 컨트롤러, 패키지에 대한 예외만 처리할 수도 있습니다. . 아래 코드를 보면 bindingResult 를 검증하는 코드와 try-catch 로 예외를 핸들링하는 것을 볼 수 있습니다. 모든 컨트롤러에 아래와 같은 형태로 구현을 하게 되면 컨트롤러에 코드가 거대해지고 코드를 읽기도 어려워질 것 같죠?! 제가 그랬었답니다..😅 @P..
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)를..
2023년 회고 늦은 회고로.. 글은 올해(2024년도) 기준으로 작성되었다. Intro 2023년에도 잔디를 구멍 없이 심는 목표로 달려왔지만.. 아쉽게도 몇 군데 구멍이 보여서 아쉽다. 그래도 2023년을 열심히 달려온 나를 위해 박수로 시작을..👏🏼 2023년도는 정말 다사다난했다.. 기쁘고 감사한 시간이 많았던 만큼 힘들고 슬픈 시간도 있었지만, 돌아보면 결국 하나님께 감사드릴 일들뿐이다. 크고 작은 사건을 통해 작고 초라했던 나를 더 나은 사람으로 만들어 주시고, 주변에 좋은 사람들을 붙여 주시고, 부족한 것들을 채워주시고.. 돌아보면 모든 것이 감사한 한 해였다. 회사 프로젝트 2023년도에 기억에 남는 큼지막한(?) 프로젝트는 OOAh luxe, AppleCare+ 후 가입 서비스, DB 탈..
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..
Spring MVC Custom Validation 일반적으로, 사용자 입력 검증이 필요할 경우 Spring MVC는 미리 정의된 검증자를 제공한다. 하지만, 좀 더 특정한 유형의 입력을 검증해야 할 경우 사용자 정의 검증 로직을 자체적으로 생성할 수 있다. . Dependency Spring Boot를 사용한다면 spring-boot-starter-web 라이브러리에서 hibernate-validator을 의존하고 있으므로 추가할 필요는 없다. org.hibernate:hibernate-validator . Custom Validation 들어가기 전에 검증 로직 구현을 위해 필요한 ConstraintValidator 인터페이스를 살짝 확인해 보자. 주어진 객체 유형 T에 대하여 주어진 제약 조건 A를..
11ST MSA 11번가 Spring Cloud 기반 MSA로의 전환 - 지난 1년간의 이야기 영상을 정리한 글이다. . 입사 전에 이미 본 영상이긴 하지만(당시에는 이해가 되지 않았던 부분이 많았다는 사실..), 입사 후 1년 반이 지난 지금은 입사 전보다는 이해가 잘 될 것이라는 기대를 안고.. 지금으로부터는 약 5년 전 영상이지만 회사 기술을 다시 한번 복기하고자 새로운 마음으로 정리를 해보려고 한다. 💪🏼 Before MSA 도입 전의 모습. 초대형 거대 Monolithic System 낙후된 S/W stack 거대한 라인의 공통 모듈 . 이로 인해.. 많은 개발팀의 코드를 한 번에 배포 한 명의 실수로 모든 코드를 롤백 다른 팀의 코드에 영향 범위를 알 수 없으므로 버전업의 어려움 거대한 공통 ..
SocketUtils.findAvailableTcpPort() BindException: 주소가 이미 사용 중입니다 Jenkins Build periodically Schedule 기능을 활용하여 스프링 배치를 주기적으로 빌드해 주고 있다. . 그러던 어느 날..🌅 Jenkins 에 새로운 배치 아이템이 추가될수록 아래 에러가 종종 발생하기 시작했다. org.springframework.boot.web.server.WebServerException: Unable to start embedded Tomcat server ... Caused by: java.net.BindException: 주소가 이미 사용 중입니다 . 로그를 보아하니.. 포트는 랜덤으로 할당되고 있는 것 같아서 관련 코드를 확인해 보았다...