본문 바로가기

Java22

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.
오버로딩vs오버라이딩(면접단골질문) 뻔한 질문이지만 한걸음 더 들어가서 보면 배열과 제네릭까지 묶어서 같이 이야기를 풀어나갈 수 있다. 예제 코드 및 설명은 이펙티브 자바를 많이 참고했다. 먼저 아래의 코드를 살펴보자. 이 코드의 목적은 컬렉션을 종류별로(집합이냐, 리스트냐, 아니면 다른 종류의 컬렉션이냐) 분류하는 것이다. // 의도한 결과를 내지 않는 분류기 public class CollectionClassifier { public static String classify(Set s) { return "Set"; } public static String classify(List lst) { return "List"; } public static String classify(Collection lst) { return "Unknown .. 2021. 1. 22.
Finalizer attack 이펙티브자바 item8 "finalizer 와 cleaner 사용을 피하라" 를 보면 finalizer 를 쓰지 말라고 한다. cf) 자바9부터는 finalizer 대신 cleaner로 대체됐지만 이것도 사용하지 말라고 함 다양한 이유로 finalizer 를 사용하지 말라고 하는데, 그중 fanalizer 공격이 가능해 보안 문제를 일으킬 수 있다고 하는 부분에서 자세한 설명이 없어서 이해가 잘 안됐다. 과연 finalizer 로 어떻게 공격이 가능한걸까? finalizer 는 객체 생성할 때 취약점이 존재한다. finalizer 는 java 메서드가 os로 반납해야되는 리소스를 해제 할 수있게 한다. 그런데 finalizer 메서드 에서 자바 코드가 실행될 수 있으므로 아래와 같은 코드도 허용된다. p.. 2021. 1. 17.