Java & Kotlin

parallelStream 안에서 다른 쓰레드 풀을 사용하는 행위

1. Stream Java8부터 제공하는 스트림(Stream)은 Iterable > Collection 인터페이스에 정의된 메서드입니다. 스트림은 List, Set과 같은 다양한 데이터 소스(List, Set을 구현하는 컬렉션 클래스들)로부터 생성되어 중간 연산을 통해 새로운 스트림을 반환하고, 최종 연산은 스트림 요소들에 대한 최종적인 작업을 수행하여 리턴하는 구조로 많이 사용됩니다. // 스트림 생성, 중간 연산, 최종 연산 Stream stream = numbers.stream(); Stream integerStream = stream.filter(number -> number % 2 == 0); List evenNumbers = integerStream.toList(); // 보통 Method..

2024.04.08 게시됨

Data Engineering

ELK Stack으로 Nginx 로그 수집하기

이번 글에서는 ELK Stack을 활용해서 애플리케이션의 Nginx 로그를 수집해보는 프로젝트를 실습해보려고 합니다. ELK Stack ElasticSearch(es)는 Elastic Stack의 핵심인 분산 검색, 분석 엔진입니다. 고성능에 스키마 없는 JSON 기반 document로 다양한 데이터에 대한 검색과 분석에 용이합니다. Logstash는 데이터를 수집, 집계하고 원하는 곳에 전송할 수 있도록 하는 도구입니다. 특히 es에 데이터를 로드할 때 편리하고 우수한 성능의 인덱싱을 가능하게 하여 es를 사용한다면 Logstash를 동시에 사용하는 것이 보편적입니다. Kibana는 데이터 시각화 및 탐색 도구입니다. 이 역시 es에 저장된 데이터를 시각화할 때 기본적으로 많이 사용되고 있습니다. 결국..

2024.03.15 게시됨

Spring & Springboot

jackson-databind, AUTO_DETECT_IS_GETTERS 옵션(is getter)

0. 문제 아래 예제 코드를 보겠습니다. @Getter @AllArgsConstructor @NoArgsConstructor @Builder @Entity public class Book implements Serializable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column private String title; @Column private int stock; @Column private boolean isSoldOut; // .. 생략 } 간단한 책(Book) Entity 입니다. 설명을 위해 필요한 코드만 작성했습니다. 해당 엔티티에서 주의깊게 볼 부분은 private boolean isSoldOu..

2024.02.14 게시됨

Spring & Springboot

Spring 5.2.X 버전에서 @RequestParam required = true 옵션은 null safety 하지 않다.

2024년 1월 현재 기준으로 개인 프로젝트나 가까운 시일 내에 시작한 프로젝트라면 Springboot 3.X 버전, Spring 6.X 버전을 사용하게 됩니다. 하지만 프로젝트 개발을 한 지 오래된 서비스라면 Spring, Springboot 버전이 꽤 낮을 수 있는데요. 예를 들어, 3년 전인 2021년에 개발을 시작한 프로젝트만 하더라도 당시 Springboot의 최신 버전은 2.3.1.RELEASE 였으며 이 때 호환되는 Spring 버전은 5.2.X 이었습니다. 이번 글에서는 이런 점을 심각하게 고려하지 않고 개발을 하다가 마주친 문제에 대해 정리해보려고 합니다. 바로 예제 코드를 보겠습니다. @GetMapping("/v1/book") public Book getBook(@RequestPara..

2024.01.28 게시됨

Git

Github PR(Pull Request) 생성 전 생각해보면 좋을 것들

이번 글은 PR(Pull Request)을 생성하기 전에 한 번쯤 체크해볼만한 내용을 정리해보고자 작성하게 되었습니다. 먼저 제가 생각하는 PR의 목적은 크게 두 가지입니다. [1] 이슈를 처리하기 위한 해결책을 담았다. [2] 코드 리뷰가 필요하다. 어떻게보면 당연한 이야기겠지만, 이 두 가지 목적을 담은 PR은 결국 PR을 올린 당사자가 이해하기 쉬운 것보다 PR을 봐야하는 팀원들 혹은 제 3자의 이해가 직관적이어야 효율적인 PR이라는 생각입니다. 물론 서비스마다, 팀마다 PR 템플릿도 다르고 브랜치 전략도 다를 수 있기 때문에 제가 생각해 본 체크 리스트가 적용되지 않을 수도 있습니다. 또한 많은 분들은 이미 실천하고 계실 수 있기 때문에 가볍게 봐주시면 좋을 것 같습니다. 1. PR Checkli..

2024.01.14 게시됨

Spring & Springboot

Spring RestTemplate 까보기

RestTemplate은 Spring에서 동기적인 HTTP 요청을 수행하기 위해 정말 많이 사용되고 있는 클래스입니다. Spring 5.0부터 소개된 WebClient는 HTTP 요청에 대한 동기, 비동기적인 처리 방식을 모두 제공하는 조금 더 최신의 클라이언트지만, 과거 버전의 스프링 프로젝트 + 전통적인 MVC 패턴 안에서 개발을 시작한 프로젝트라면 RestTemplate이 당연히 더 익숙할 수밖에 없습니다. 그래서 이번 글에서는 RestTemplate에 대한 공식 문서와 여러 레퍼런스를 참고해서 RestTemplate을 어떻게 이해하고 사용해야 하는지에 대한 나름의 정리를 해보고자 합니다. 1. RestTemplate은 Deprecated 되나? 구글에 RestTemplate에 대해 검색해보면 아래..

2024.01.11 게시됨

Thinking

2023년 회고

겨울이 찾아오면서 올해를 돌아보는 회고 글을 쓰기 시작했다. 조금 모순적인데(?), 미래에 일어날 일에 대한 기대나 계획을 세우는 데는 그렇게 큰 에너지가 필요하지 않지만 이미 지난 시간을 돌아보고 별점을 매기는 건 왜인지 심리적으로 조금 저항이 느껴진다. 아마도 미래에 대해서는 항상 긍정적으로 상상할 수 있지만, 지난 경험들을 돌아보는 것은 그 속에서 있었던 결점들을 찾아내고 다시 마주해야 하는 과정이 있기 때문인 것 같다. 어쨌든, 다시 시간을 거슬러 가본다. 1.올해 동안 팀에서 처리했던 이슈 목록을 확인하니, 내가 참여한 이슈가 약 150개 정도 되었다. 에픽 이슈부터 간단한 버그 수정까지 다양한 이슈들이 포함돼 있어 개수가 많아 보이기는 하지만, 그래도 스스로 한해동안 할 수 있는 최선을 다했다..

2023.12.31 게시됨

Design Pattern

예제 코드로 이해해보는 디자인 패턴 - 커맨드 패턴(Command Pattern)

디자인 패턴에 대한 정리글이 꽤 쌓여가고 있는데요. 글을 쓸 때마다 각 디자인 패턴을 잘 설명할 수 있는 예제 코드를 고민해보긴 합니다. 하지만 디자인 패턴이라는 것 자체가 모든 코드에 100% 적용할 수도 없을 뿐더러, 실제로는 꽤나 디테일하고 복잡한 상황을 대하는 고민의 결과이기에 쉬운 예제로 디자인 패턴이 얼마나 유용한지 전달하기가 쉽지만은 않은 것 같습니다. 이번 글에서 소개할 커맨드 패턴(Command Pattern)도 마찬가지입니다. 실무에서도 커맨드 패턴을 사용하는 코드 예제가 있지만 꽤나 복잡한데요. 다른 레퍼런스와 영상 등을 보면서 제 나름대로 이해한 바를 소개하겠습니다. 1. 커맨드 패턴(Command Pattern)이란? 1-1. 커맨드 패턴 디자인 커맨드 패턴(Command patt..

2023.11.29 게시됨

Data Engineering

Kafka Leader Election에 대한 정리

최근 Confluent에서 업로드한 카프카의 파티션 리더 선출과 관련한 1시간 남짓한 영상을 보게 되었습니다. Using Kafka-Leader-Election to Improve Scalability and Performance 꽤 유익한 내용이었던 것 같아 이번 글에서는 영상의 내용을 요약 정리해보고 다른 레퍼런스를 참고해 공부해 본 내용을 정리해보려고 합니다. (아래에서 설명하는 내용 중 리더 파티션과 브로커를 혼용해서 사용했는데, 리더 브로커가 좀 더 적합한 표현이지만 개별 파티션 관점에서 설명하기 위해 리더 파티션이란 용어를 썼습니다.) 글을 읽기 전에 여기 Stackoverflow 질문을 참고해보면 도움이 될 것 같습니다. 1. Kafka Partition Leader? Partition Le..

2023.11.23 게시됨

Design Pattern

예제 코드로 이해해보는 디자인 패턴 - 팩토리 메서드 패턴(Factory Method Pattern)

이번 글에서는 또 다른 디자인 패턴 중 하나인 팩토리 메서드 패턴(Factory Method Pattern)에 대해 정리해보겠습니다. 먼저, 간단하게 팩토리 메서드 패턴의 정의와 개념에 대해 소개하고 실제 예제 코드를 보면서 디자인 패턴을 구현하는 방법에 대해 이해해보겠습니다. 1. 팩토리 메서드 패턴? 팩토리 메서드 패턴은 구체 클래스의 생성 로직(Constructor, Builder 등)을 통한 객체의 생성 대신, 구체 클래스들의 공통 인터페이스를 바탕으로 객체를 생성하는 방식을 말합니다. 따라서 팩토리 메서드 패턴을 디자인할 때 전제가 되는 점은 각 구체 클래스들이 공통으로 하는 인터페이스가 존재해야 한다는 것인데요. 아래 예제 코드에서도 살펴보겠지만 팩토리 메서드 패턴의 목표는 구체 클래스를 명시..

2023.11.14 게시됨