본문 바로가기

전체 글139

국제화처리를 위한 messageSource 빈에 대한 이슈 스프링 부트가 아닌 스프링 프로젝트에서는 applicationContext.xml 와 servlet-context.xml 가 따로 있다. applicationContext.xml 에서는 @Service @Repository @Component 빈 등록과 dataSource 관련 빈 등록 등을 작업. servlet-context.xml 에서는 web 과 관련된 설정들 @Controller 빈등록과 mvc 관련 config, 뷰리졸버 관련 빈 등록 등을 작업. 처음엔 messageSource 빈 등록을 servlet-context.xml 에서 했다. 보여지는 메세지만 로케일에 맞게 다국어 처리하는 거니 web 영역이라고 판단했다. 그런데 applicationContext.xml 에 등록된 빈은 servlet.. 2021. 6. 18.
GET / POST 를 목적에 맞춰 사용하지 못한 케이스 1. 메뉴 클릭이고 화면 조회니까 get 이어야 하는데, jquery datatable 을 통해 만들어진, query string 이 너무 많아져서 limit 을 초과하는 에러가 발생했고 부득이 post 로 전송. 2. 앵귤러에서 # 를 스펙에 맞지 않게 사용함. 앵귤러는 url anchor 로써 동작이 아니라 앞부분에 붙여서 의도적으로 뒤에 path를 짜르도록 함. 그래서 url 에서 # 이후를 짤라버려서 request param 정보를 보낼 수 가 없어서 부득이 post 로 전송 (https://codecraft.tv/courses/angular/routing/routing-strategies/#_hashlocationstrategy) 3. 기존 시스템을 재개발하는 상황에서, 하위호환성을 맞춰야 하는.. 2021. 6. 18.
Webclient Timeout 과 connection pool 전략 1) Webclient timeout 아래 코드를 보자. 다양한 timeout 옵션들이 있다. new ReactorClientHttpConnector( reactorResourceFactory, httpClient -> httpClient .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 5000) .doOnConnected(connection -> connection.addHandlerLast(new ReadTimeoutHandler(5) ).addHandlerLast(new WriteTimeoutHandler(5)) ).responseTimeout(Duration.ofSeconds(5)) // 0.9.11 부터 추가 ); ChannelOption.CONNECT_TIME.. 2021. 6. 11.
WebClient 사용할때 주의 (2편) exchangeToMono 를 쓸 때 cf) WebClient 사용할때 주의 (1편) 에서 exchange 를 쓸 때 주의할 점을 하나 소개했는데, 이제 exchange는 deprecated 되었고 대신 exchangeToMono 나 exchangeToFlux 를 써야한다. 1) doOnSuccess 와 onErrorResume .exchangeToMono(clientResponse -> clientResponse.toEntity(String.class)) .doOnSuccess(clientResponse -> { if (clientResponse.getStatusCode() != HttpStatus.OK) { throw new RuntimeException("error"); } } ) .onErrorR.. 2021. 6. 10.
request body 한번만 읽어올수 있는 제약 이전 글에서 Spring Cloud Gateway 에서 request body 정보를 요청당 한번밖에 못읽는다고 설명했는데 꼭 Spring Cloud Gateway 만의 문제는 아니다. 아래와 같이 @RequestBody 애노테이션을 통해 request body 정보를 HelloDto 객체에 맵핑 시켜주게 되면 추가적으로 request.getInputStream 요청을 하게 됐을 때 실패하게 된다. 즉 request body 를 한번밖에 못읽는 제약이 있다. @RequestMapping(value = "/hello") public Mono hello( HttpServletRequest request, @RequestBody HelloDto helloDto) throws Exception { byte[] .. 2021. 6. 9.
Spring Web MVC 구조 논의 1편 Spring Web MVC 를 이용해 개발다보면 대부분 controller - service - dao 구조로 잡혀있다는것을 쉽게 볼 수 있다. controller(web) 는 http 요청을 받아 service 로 전달하고, 또 service 에서 리턴된 결과를 http 응답으로 전달한다. service(domain) 는 비지니스 로직을 수행해 dao 로 전달하고, 또 dao 에서 리턴된 결과를 갖고 비지니스 로직을 수행한다. dao(persistence) 는 service 에서 만들어진 데이터를 db 같은 persistence 영역으로 보내는 역할을 수행한다. 명확하게 딱딱 나눠져 있어 보이지만, 실제 개발하다 보면 그 경계가 모호해질 때도 있고 실수로 다른 계층으로 해야할일을 넘길 수 있다. Get.. 2021. 6. 6.
재귀 호출 최적화(Tail-Call) 일반적인 재귀 호출 방식은 입력 데이터가 매우 많은 경우에 StackOverflowError 가 발생할 위험이 있다. TCO(Tail-Call Optimization) 기술을 사용하면 이 문제를 해결할 수 있다. 먼저 일반적인 재귀를 사용해서 팩토리얼을 계산해보자. public class Factorial { public static void main(String[] args) { System.out.println(factorialRec(5)); // 120 } public static int factorialRec(final int number) { if (number == 1) { return number; } else { return number * factorialRec(number-1); } }.. 2021. 5. 11.
Singleton(면접단골질문) Singleton 은 객체 생성을 제한시키는 목적외에도 지연 초기화(lazy initializaion) 목적도 있다. 기본 코드 public class Singleton { private static Singleton instance; private Singleton() {} public static Singleton getInstance() { if (instance == null) instance = new Singleton(); return instance; } } private 생성자로 외부에서 Singleton 객체를 생성하지 못하게 막고 getInstance 메서드를 통해서만 제공한다. getInstance 에서는 instance 가 null 일때만 생성하도록 해 객체 생성을 제한시킨다. 하지.. 2021. 5. 9.
Optional 형태가 가지는 의미(Monad) Monad 에 대한 정확한 개념을 다루진 않고, 자바 Optional 에서 사용하는 형태를 Monad 응용 관점에서 살펴보려고 한다. Monad 는 다양한 응용이 존재하고 Optional 는 그중 하나다(Optional 을 maybe monad 라고도 한다). Optional 에 대한 용어를 정리하면 아래와 같다. Parameterised type : Optional - T : Type parameter - Optional : Wrapper Type 즉, Optional 는 T type 이 Optional context 에 의해 wrapped 되었다고 말한다. Optional 객체는 of 메서드를 통해서 만들 수 있는데 코드는 아래와 같다. public final class Optional { priva.. 2021. 5. 6.
reflection 사용해서 api 문서화 내가 담당하는 api 서버에서 제공하는 외부/내부 api들을 문서화 하기로 했다. 일반적으로 wiki나 github 등에 문서화를 하면 코드 변경을 계속 반영하기 어려운 문제가 있다. 그걸 해결해주는 대표적인 api 도큐멘트로 swagger 가 있다. swagger 관련 애노테이션을 추가함으로써 쉽게 도큐멘트 페이지를 제공할 수 있다. 하지만 우리팀은 아래 두가지 이유 때문에 직접 구현하기로 결정했다. 1. api 도큐멘트 다국어 국제화 처리 2. 심플하게 꼭 필요한 정보만 제공 하고 애노테이션 하나만 사용 그리고 직접 구현하기 위해서는 자바 리플렉션 기법이 필요했다. 자바 리플렉션 이란 리플렉션은 자바의 클래스, 메서드, 필드 등의 정보를 확인할 수 있는 API 다. Class 객체가 주어지면 그 클래.. 2021. 5. 2.
Cookie SameSite Lax 모드 업데이트 정리 SameSite Lax 는 top-level navigations, 그리고 safe HTTP method 일 경우에만 제한적으로 cross-site 상황에서 쿠키 생성 및 전달을 허용 한다. 혹시 이 얘기가 어렵다면 SameSite 기본편을 보고 오면 좋을거 같다. RFC6265 정책 결정자들은 실제로 브라우저에 SameSite 정책을 적용해보니 Lax 모드를 전체적으로 적용하기 어렵다는것을 깨닫고 기존 Lax 스펙을 일부 수정했다. Lax-Allowing-Unsafe 가 새롭게 생겼는데 HTTP 요청 메서드와 상관없이 top-level request 일때 일때 cross-site 상황에서 쿠키 생성 및 전달이 가능해진다. 예를 들어 로그인 로직 플로우에서 cross-site top-level POST .. 2021. 4. 8.
수학리부트 지인에게 선물 받은 수학리부트 책을 근 두달걸려 처음부터 끝까지 다 풀어봤다. 그리고 오픈소스에 컨트리뷰션 하는 마음으로 총 7개의 오답과, 7개의 오타를 찾아서 제보했다. 정오표 : https://docs.google.com/document/d/1DRMV9_8oDOpAUj0alUviDGCLhFfVr1R-N1RBCHZXV9s/edit 이 책을 보면서 가장 재밌었던 부분은 10.3장 극한에 대한 설명이었다. 보통 무한대를 설명할 때 ‘한없이 커진다 or 작아진다 or 가까워진다’ 는 표현을 많이한다. 그런데 이게 수학적으로 엄밀한 정의가 아니라고 지적하는 부분에서 놀랐다. 여지껏 봤던 수학책에서 다 저렇게 표현 했기에 당연하게 받아들였고, 한번도 엄밀하게 생각해본적이 없었다. 이 책에서 극한을 수학적으로 .. 2021. 4. 8.