본문 바로가기

Java14

Spring Cloud Gateway 인코딩 이슈 http://ybs.com/filtering?sort[]=id,desc&keyword=%EC%96%91%EB%B4%89%EC%88%98 위와 같은 URL 로 요청이 왔을 때, Spring Cloud Gateway 에서 뒷단 서버로 보내기 전 인코딩 여부 검사를 한다. 그런데 '[' 문자가 Invalid character 로 exception 이 발생하면서 인코딩이 안됐다고 판단해서, 재인코딩을 하게 되고 최종적으로는 keyword 값이 두번 인코딩한 결과가 나온다(정작 중요한 '[', ']' 문자는 인코딩안되고 이미 된것만 또 인코딩한 꼴). '[' 문자가 왜 Invalid character 로 exception 이 발생했나를 알아보자. Spring Cloud Gateway 는 허용하는 QUERY_PAR.. 2021. 6. 18.
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.
method return에 대한 고민 method 를 만들 때 정상적인 flow 가 아닌 상황을 고려하다보면 null, Optional, exception 3가지를 활용하게 된다. rsa 키를 달라는 요청을 받을 때, 미리 만들어둔 키를 캐시에서 가져오고 캐시에 없으면 새롭게 만드는 로직을 예제로 살펴보자. public RsaKeyData getRsaKeyData() { RsaKeyData rsaKeyData = getCacheData(); if (rsaKeyData == null) { return generateRsaKeyData(); } return rsaKeyData; } 위 코드에서 이 메서드가 null 을 리턴하면 새롭게 rsa 키를 만들도록 되어있다. 그런데 getCacheData 메서드 결과가 null 이라는건 무슨뜻일까? 1... 2021. 2. 7.
개발 이슈 모음 1. Spring Security X-Frame-Options 이슈 Default Security Headers Cache-Control: no-cache, no-store, max-age=0, must-revalidate Pragma: no-cache Expires: 0 X-Content-Type-Options: nosniff Strict-Transport-Security: max-age=31536000 ; includeSubDomains X-Frame-Options: DENY X-XSS-Protection: 1; mode=block cf) Strict-Transport-Security는 HTTPS 요청일때만 추가된다. X-Frame-Options: DENY response header에 X-Frame.. 2021. 1. 19.