[Java] BiConsumer: 두 개의 매개변수를 처리하는 함수형 인터페이스
·
JAVA
안녕하세요 개발자 stark입니다! 오늘은 BiConsumer에 대해서 소개드리고자 합니다. 어느 날 제 사수님께서 2개의 List를 이중 stream을 돌리며 filter로 특정 조건을 매칭시키면서 값을 세팅하는 방식에서 BiConsumer를 사용하여 값을 세팅하는 방식으로 변경하신 다음 코드의 가독성과 전체적인 성능이 개선된 것을 리뷰해 주셨습니다. 그래서 저도 이 지식을 흡수하고 로직에서 사용해 보고자 BiConsumer에 대한 자료들을 찾아보며 이해하기 위해 많은 노력을 했습니다. 그리고 이제는 어느 정도 이해가 되었다고 느껴져서 조금이지만 정리해 본 것을 공유드리고자 합니다. 항상 새로운 것을 제게 가르쳐주시는 제 사수님께 감사한 마음을 가지며 포스팅을 작성합니다. 시작해 봅시다. Let's g..
Kafka에서 Locale.ROOT 사용의 중요성
·
Apache Kafka
오늘은 Kafka 소스코드를 분석하다 발견한 Locale.ROOT의 사용 사례를 다뤄보려고 합니다. 이 코드는 처음 봤을 때는 뭔가 신기했지만, 실제로 왜 사용되었는지를 깊이 이해한 후에는 그 중요성을 충분히 깨달을 수 있었습니다.제가 글로벌 서비스를 운영할 때 각 지역별로 다른 시간을 보여주기 위해 JavaScript에서 Locale을 다룬 경험은 많았지만, 백엔드 개발을 하며 Java에서 이렇게 명시적으로 Locale을 설정한다는 것은 생각해 본 적이 없었습니다. (UTC와 Zoned는 다뤄봤지만 Locale만을 직접적으로 다뤄본 적은 없습니다.) 그래서 이번 포스팅을 통해 그 내용을 간단히 공유해 보겠습니다.  Kafka의 AcknowledgeType Enum 코드 분석아래 코드는 오픈 소스 Kaf..
[Java] List를 Optional로 처리할 때 고려해야 할 사항
·
JAVA
Optional에 List를 담았을 때 착각할 수 있는 점이 있다.📌 서론개발 작업을 하던 도중 외부 api를 호출하여 받은 응답 객체(DTO) 내부의 List 필드를 가져다 사용하는 경우가 있었다. 이때 NPE가 생기지 않도록 하기 위해 Optional로 List 필드를 한번 감싸게 되는 상황이 있었다. 이게 선호되는 방법은 아니지만 NPE를 방지하고자 로직을 이렇게 작성하게 되었다. 문제는 내가 착각을 해서 Optional로 감싼 리스트가 빈 리스트(Empty List) 일 때도 ifPresentOrElse() 메서드의 else에 잡힌다고 생각했다. 근데 빈 리스트는 null이 아니기 때문에 orElse에 잡히지 않는다. 그래서 로직을 또 바꾸게 되는 일이 생겼다. 바보 같은 실수일 수도 있지만 충..
[Java] 객체지향(OOP)의 특징: 캡슐화
·
JAVA
객체지향(OOP)의 특징 중 캡슐화에 대해 알아보자📌 서론객체지향 언어인 Java를 사용하다 보면 캡슐화에 대해 다양한 생각을 가지게 된다.나는 처음 캡슐화라는 말을 들었을 때 근본적으로 왜 "캡슐"이라고 부르는지는 생각하지 않고 진짜 알약 캡슐만을 생각하면서 개발하다 보니 대체 왜 이게 캡슐화라고 불리는 것인지 잘 이해가 가지 않았다.다만 현업에 들어와 개발을 하며 시간이 흐른 지금은 이전보다는 이해도가 많이 상승하여 조금은 어떤 느낌인지 알게 되었다. 이번 포스트에서 "캡슐화"에 대해서 간단하게 예시를 통해 알아보도록 하자.  1. 캡슐화란?캡슐화란 무엇일까캡슐화는 '캡슐 안에 무언가를 담는 것'을 의미한다. 우리가 아플 때 먹는 약 캡슐을 생각해 보자. 약 성분은 캡슐 안에 안전하게 보호되어 있다..
[Java] HashTable이 뭘까?
·
JAVA
1. Hashtable 클래스를 왜 살펴보는데?우리가 개발을 하다 보면 Map, Set을 자주 사용하게 된다. 근데 생각해 보면 그냥 Map, Set을 쓰기보단 HashMap, HashSet을 주로 사용한다. 그래서 나는 왜 그런지 궁금해서 자세히 알아보려고 java.util 패키지에 들어가 봤는데 내 눈에는 목적과는 다르게 다른 녀석이 눈에 띄었다. 바로 Hashtable이라는 클래스다. 이걸 보자마자 궁금증이 들었다. Hashtable은 대체 뭘 하는 녀석인가? 사실 이 녀석은 "면접 질문"으로 자주 나온다는 것을 들어서 유명하다는 것은 알고 있었지만 솔직히 그래서 이걸로 뭘 하는지를 모르겠고 사용해 본 적도 없었다. 그래서인지 나는 이 클래스를 조금이라도 이해하고 싶어졌다. 그래서 내부가 어떻게 생..
[Java] 동시성 제어가 가능한 CopyOnWriteArrayList와 일반 ArrayList의 차이점
·
JAVA
동시성 제어가 가능한 List인 CopyOnWriteArrayList를 알아보자📌 서론동시성 제어가 가능한 HashMap인 ConcurrentHashMap에 대해 공부하고 사용하다 보니 List에도 동시성 제어가 가능한 클래스가 존재할 것이라는 생각이 들었고 열심히 찾아본 결과 java.util.concurrent 패키지 내부에 CopyOnWriteArrayList라는 동시성 제어가 가능한 List가 존재한다는 것을 알아냈다. 이번 포스트를 위해 우리가 개발할 때 일반적으로 사용하는 ArrayList와 동시성 제어를 해준다는 CopyOnWriteArrayList를 스프링에서 사용해 보면서 동시성 제어가 어떻게 되는 것이고 성능은 어떨지 알아보자. SpringBootTest와 locust를 사용한 동시성..
[Java] ConcurrentHashMap의 동작원리 (CAS 기법)
·
JAVA
Java의 ConcurrentHashMap을 이해해 보자📌 서론Java에서 일반적인 HashMap을 사용하면 동시성 문제가 발생할 수 있다. HashMap은 멀티스레드 환경에서 안전하지 않기 때문에, 여러 스레드가 동시에 HashMap을 수정하려고 하면 데이터 불일치, 무한 루프, 또는 예기치 않은 결과가 발생할 수 있다. 이 문제를 해결하기 위한 방법 중 하나로 ConcurrentHashMap을 사용할 수 있다. ConcurrentHashMap은 멀티스레드 환경에서 안전하게 동작하도록 설계된 클래스다. 내부적으로 분할 잠금 메커니즘(lock stripping)과 CAS(Compare-And-Swap) 같은 비동기적인 동시성 제어 기법을 사용하여 여러 스레드가 동시에 데이터를 읽고 쓰는 상황에서도 안전..
[Spring] 커스텀 어노테이션 적용
·
Spring/Spring 기초 지식
커스텀 어노테이션 적용기 📌 서론 SpringBoot로 개발하다 보면 @Controller, @Service, @Repository, @Transactional, @Component, @Bean 등등 정말 많은 어노테이션을 사용하여 편하게 개발을 한다. 근데 스프링이 제공하는 어노테이션 말고도 개발자가 직접 본인만의 어노테이션을 만들어서 프로젝트에 적용시킬 수 있다는 것을 아는가? 아마 대부분의 개발자들은 알고 있었겠지만 사용해 볼 일은 거의 없었을 것이다. 나는 사용자 커스텀 어노테이션이 어떻게 작성되고 프로젝트에서 사용되는지 내부의 동작원리가 궁금했고 직접 만들어보기로 했다. 지금부터 Spring에 직접 커스텀 어노테이션을 만들어보면서 이게 어떻게 동작하는지 알아보자. 완성된 코드는 아래의 Repo..