728x90

Backend/Java 9

flatMap

java8 이후 stream 을 많이 사용해왔지만 그동안 flatMap 은 사용해본 적이 없다. 설명을 봐도 잘 모르겠고 딱히 필요성을 느끼지 못했다. 현재 내게 필요한 건 flatMap 어떻게 사용하나? 가 아니라 flatMap 이 왜 필요한가? 이다. 그런데 오픈소스들을 보면 flatMap를 사용한 예제가 꽤 되어서 flatMap 에 대해 다시 알아봤다. 서칭해보니 map 과 비교하는 글들이 많은데 용어만 비슷할 뿐 역할이 완전히 다른데 왜 비교하는지 모르겠다.. 일단 flatMap 의 역할은 스트림 평탄화 라고 한다. flatMap 은 스트림을 리턴해야 하고 그렇게 리턴된 스트림은 1차원 평탄화 된다. 즉, 다차원 배열 또는 다차원 리스트? 를 단일배열 또는 단일 리스트로 변환해야 할 때 필요하다...

Backend/Java 2022.09.07

JVM 실행 옵션 정리

레거시 코드를 분석하다보니 SpringBoot 로 구성된 자바 서버 구동시 몇가지 JVM 옵션을 지정하고 있어서 확인해봤다. 뭐든 확실하지 않은 건 안 쓰느니만 못하니까. 참고로 Tomcat 에서는 JVM 옵션을 JAVA_OPTS와 GC_OPTS 라는 환경변수 값으로 나눠서 지정하기 때문에 그 기준으로 작성하였다. 추가로 확인된 사항은 수시로 업데이트 할 예정. JAVA_OPTS: -server Server HotSpot JVM을 사용하는 옵션이다. Server HotSpot JVM은 Desktop용 Appkication을 구동하는데 유리하고, 최적화(Optimization)에 필요한 모든 과정을 최대한으로 수행한다. Application의 시작시간은 느리지만, 일정 시간이 흐르면 Client HotSp..

Backend/Java 2022.01.10

@JsonCreator

Spring 에서 직렬화/역직렬화 시 기본적으로 사용되는 ObjectMapper 에서는 역직렬화시 Getter 가 필요하고 직렬화시 기본생성자가 필요하다. 그런데 직렬화시 기본생성자 외에 인자가 있는 생성자나 팩토리 메소드를 활용할 수도 있다. @JsonCreator 어노테이션의 mode 속성은 한 개의 파라미터냐(DELEGATING), 여러 개의 파라미터냐(PROPERTIES)에 따라 선택하거나 자동으로 설정되도록 기본값(DEFAULT)으로 둘 수 있다. 일반적으로 기본값으로 두고 사용해도 무리는 없다. 인자가 있는 생성자를 활용하는 방법 주의할 점은 파라미터에 @JsonProperty 를 반드시 지정해야 한다. class Test { private String a; private String b; p..

Backend/Java 2021.11.19

AutoBoxing과 AutoUnBoxing

Java 1.5가 널리 쓰이던 시절 Java 개발자 면접에 유행처럼 쓰이던 질문이 오토박싱과 오토언박싱 이다. 지금은 너무도 당연해서 이 용어조차 모르고 지내고 있는데 갑자기 생각하려니 기억이 안나 미리 정리해 놓는다. Java에서는 기본타입에 매칭되는 Wrapper 클래스들이 존재한다. int는 Integer, boolean은 Boolean 같은 것들이다. 기본타입의 데이터를 Wrapper 에 넣는 것을 박싱 이라고 하고 반대를 언박싱이라고 한다. Java 1.5 이전에는 이러한 작업시 아래와 같이 명시적으로 변환을 해줘야 했다. Integer intWrapper = new Integer(1); int intValue = 1; int i = (int)intWrapper; Integer j = new I..

Backend/Java 2021.08.25

@Async, CompletableFuture, parallelStream

논블로킹, 비동기, 병렬 과 관련되어 있을 때 자주 거론되는 것들이다. 비슷한거 같으면서도 다른 이 세가지 개념에 대해 정리한다. 우선 논블로킹, 비동기 은 병렬처리를 위한 과정이라고 생각하면 된다. 병렬은 동시에 여러가지 작업이 수행되는 것이고 이를 위해 어플리케이션 입장에서는 일을 시키는 과정이 논블로킹으로 진행되어야 한다. 또한 논블로킹으로 수행된 작업의 결과는 비동기적으로 받을 수 밖에 없다. @Async 를 통해 논블로킹/비동기 작업을 수행할 수 있는데 이 자체 목적으로 활용되기도 하고 CompletableFuture 와 조합해서 병렬처리에 활용하기도 한다. 엄밀히 따지면 @Async 역시 별도 스레드를 통해 작업을 수행하는 것이기 때문에 병렬처리라고 볼 수도 있겠지만 여기에서 말하는 병렬처리는..

Backend/Java 2021.07.14

Collections.EMPTY_LIST, Collections.EMPTY_MAP

apache commons-collections 패키지에 보면 Collections.EMPTY_LIST, Collections.EMPTY_MAP 라는 상수가 존재한다. 여기에서는 이걸 왜 사용하는지 정리해본다. 개발을 하다보면 의도적으로 빈객체를 만들어야 하는 상황이 있다. 예를 들어 CircuitBreaker의 fallback 메소드가 그렇다. 정상적인 데이터를 받지 못했지만 임시로 처리하기 위해 기본적인 객체 구조는 갖추되 정말 아무런 값이 필요없는 필드는 빈 객체로 할당해야 한다. 빈 객체를 할당해야 하는 필드가 List 타입이라고 한다면 new ArrayList() 로 할당해도 되겠지만 되도록 Collections.EMPTY_LIST 를 사용하는 편이 좋다. 이유는 아무런 데이터가 없는 빈 객체 ..

Backend/Java 2021.07.12

jackson 역직렬화 시 주의할 점

자바 진영에서는 json 직렬화/역직렬화시 거의 대부분 jackson 라이브러리를 사용한다. jackson은 json을 역직렬화시 생성자를 활용하고 모든 인자를 받는 생성자에 @ConstructorProperties 어노테이션이 달려있으면 해당 생성자를 역직렬화에 사용하지만 없을 경우 기본 생성자를 사용하게 된다. @ConstructorProperties 는 lombok을 이용해서 모든 인자를 받는 생성자를 생성하면 컴파일시 자동으로 붙여주던 것인데 @AllArgsConstructor, @Builder 를 사용하는 경우를 예로 들 수 있다. 그런데 lombok 1.16.20 이상부터는 이게 자동으로 붙지 않기 때문에 명시적으로 기본생성자를 생성해줘야 한다. 물론 기존처럼 자동으로 @ConstructorP..

Backend/Java 2021.04.14

ThreadLocal

Java에서 Thread의 로컬 컨텍스트 변수로 Thread 가 존재하는 한 계속해서 남아 있는 변수이다. ThreadPool 에서 Thread를 관리하며 request당 하나의 Thread 를 사용하는 웹서버 특성상 하나의 request에서 공유되는 변수라고 생각하면 된다. 이걸 어디에 활용할 수 있나? 예를 들어 클래스끼리 전역으로 참조하고 싶은 데이터가 있다고 생각해보자. java에서 가장 먼저 떠오르는 것은 static 변수이다. 하지만 static 변수는 모든 Thread 에서 공유되고 웹서버는 기본적으로 Multi Thread 방식이기 때문에 Thread Safe 하지 않다. 이때 Thread Local 을 사용할 경우 클래스끼리 전역적으로 참조할 수 있지만 다른 Thread에서는 참조할 수 ..

Backend/Java 2021.03.16
728x90