[Thread] 4. Kotlin의 코루틴(Coroutine)이란?
·
개발지식/스레드(Thread)
이번 편에서는 코루틴이 무엇인지 알아보자.📌 서론이전 스레드 시리즈에서는 '일반 스레드와 스레드풀'을 사용하여 성능 비교를 했었다.두가지 테스트만으로도 충분히 흥미로운 결과를 얻을 수 있었으며 내가 지금까지 개발하면서 생각하지 못했던 스레드를 활용한 성능 개선 방법에 대해 배울 수 있었다. 사실 내가 처음 이 시리즈를 작성하게 된 이유는 단순히 스레드의 성능이 궁금해서가 아니다. 동시성에 대한 테스트를 하다보니 스레드에 대해서 알아야겠다는 생각이 들었고 공부하다보니 공부할 것이 정말 많아서 정리를 해야겠다고 생각했기 때문이다. 그래서 열심히 세미나도 찾아보고 각종 문서, 블로그도 살펴봤다. 그랬더니 요즘은 '경량 스레드'를 사용하여 동시성을 제어하는 경우가 있다는 것도 알게 되었다. 그래서 이것에 대해..
[Thread] 3. 일반 스레드 vs 스레드풀 (I/O, CPU 성능 비교)
·
개발지식/스레드(Thread)
스레드 vs 스레드풀 (성능 비교)📌 서론이전 1,2탄 포스팅에서 '일반 스레드'와 '스레드풀'을 사용했을 때 I/O, CPU 작업을 진행하면 어떤 성능을 보여줄지 테스트를 진행했다. 테스트를 통해 I/O 작업이 조금 더 스레드풀 설정에 민감하게(성능향상폭) 반응한다는 것을 알게 되었고 CPU작업은 스레드풀 설정에는 민감하지 않지만 제대로 설정하지 않으면 낭비되는 스레드가 많을 것이라는 생각을 하게 되었다.그래서 이번에는 조금 더 상세하게 각 스레드별로 테스트를 진행하고 분석을 해봤다. 이번 내용을 통해 우리가 일반적으로 사용하는 스레드의 성능과 최적화는 어떻게 하는게 좋을지 알아보자.테스트에 사용되는 코드는 하단의 1,2편에 모두 작성되어 있습니다. (전체 소스코드 깃허브도 이전 포스팅에 포함) [T..
[Thread] 2. 스레드풀의 I/O, CPU 성능 비교
·
개발지식/스레드(Thread)
Kotlin(Java)을 사용하여 스레드풀의 성능을 비교해 보자📌 서론지난 포스트에서는 일반적인 스레드 환경의 I/O, CPU 스레드 성능을 비교해 봤다.이번 포스트는 Thread 시리즈의 2번째 포스트로서 만약 스레드풀을 사용한다면 어떤 성능을 보여줄지 테스트해 보고 이전 결과와 비교해 볼 예정이다.이 글을 확실하게 이해하기 위해 이전 포스트를 확인하는 것을 추천한다. 왜냐하면 이전 포스트에서 얻은 결과를 통해 이번 포스트에서 비교하기 때문이다.이전 포스트 (일반 스레드 성능 비교) [Thread] 1. 일반 스레드의 I/O, CPU 성능 비교Kotlin(Java)을 사용하여 일반 스레드의 성능을 비교해 보자📌 서론최근 나는 동시성 제어에 관심이 생겨 관련된 개념을 많이 찾아보고 생각하고 있다. 그..
[Thread] 1. 일반 스레드의 I/O, CPU 성능 비교
·
개발지식/스레드(Thread)
Kotlin(Java)을 사용하여 일반 스레드의 성능을 비교해 보자📌 서론최근 나는 동시성 제어에 관심이 생겨 관련된 개념을 많이 찾아보고 생각하고 있다. 그래서 java의 동시성 제어 List, Map 등을 내부 구현까지 뜯어서 확인해보기도 하고 성능 테스트도 진행했다.이렇게 열심히 테스트를 하다 보면 동시성 제어가 이런 것이구나! 깨달음을 얻게 된다. 근데 나는 궁금한 게 많은 개발자다 보니 테스트를 하며 새로운 것들에 눈을 뜨게 되었다. 특히 locust결과를 보면 알 수 있는 RPS(Requests Per Second)에 대해서 많이 궁금한 점이 생겼다. RPS는 동시성 제어(synchronized, concurrentHashMap)에 따라 lock이 걸리며 결과가 다르게 나타나기도 하지만 스레..
[Java] HashTable이 뭘까?
·
JAVA
1. Hashtable 클래스를 왜 살펴보는데?우리가 개발을 하다 보면 Map, Set을 자주 사용하게 된다. 근데 생각해 보면 그냥 Map, Set을 쓰기보단 HashMap, HashSet을 주로 사용한다. 그래서 나는 왜 그런지 궁금해서 자세히 알아보려고 java.util 패키지에 들어가 봤는데 내 눈에는 목적과는 다르게 다른 녀석이 눈에 띄었다. 바로 Hashtable이라는 클래스다. 이걸 보자마자 궁금증이 들었다. Hashtable은 대체 뭘 하는 녀석인가? 사실 이 녀석은 "면접 질문"으로 자주 나온다는 것을 들어서 유명하다는 것은 알고 있었지만 솔직히 그래서 이걸로 뭘 하는지를 모르겠고 사용해 본 적도 없었다. 그래서인지 나는 이 클래스를 조금이라도 이해하고 싶어졌다. 그래서 내부가 어떻게 생..
스프링에서 도메인 객체를 사용하는 건에 대해
·
DDD
스프링에서 도메인 객체를 사용하는 이유가 무엇일까?📌 서론이번 포스팅의 내용은 제가 "전통적인 3계층 아키텍처" 방식과 "DDD를 적용시킨 헥사고날 아키텍처"를 사용해서 개발해 보면서 느낀 점을 정리해 봤습니다. (특히 도메인 객체를 사용하는 이유와 객체 지향적인 개발에 중점을 두었습니다.) 제가 개발해 보며 느낀 점을 정리해 둔 것이기 때문에 잘못된 내용이나 잘 모르지만 아는 것처럼 적어둔 부분도 분명히 존재할 것이라고 생각합니다. 그러니 "단순한 개발 회고록" 정도로만 생각하고 재미있게 봐주시면 좋겠습니다 :) 1. 전통적인 3계층 아키텍처 방식의 개발 (도메인 객체가 없음)일반적으로 3계층 아키텍처에서는 도메인 객체를 사용하지 않는다.3계층 아키텍처에서는 대부분 Entity, Dto를 사용하는 방..
[Java] Stream의 mutable, immutable 리스트 변환 (toList)
·
JAVA
자바 Stream을 사용할 때 toList를 잘 사용해야 한다. (불변, 가변 리스트 반환 때문)📌 서론Java 16 이후로 스트림 API에는 새로운 메서드인 Stream.toList()가 추가되었다. 이 메서드는 단순히 보면 Stream.collect(Collectors.toList())와 비슷해 보이지만, 중요한 차이점이 있다. 바로 Stream.toList() 불변 리스트를 반환하고 Stream.collect(Collectors.toList())는 가변 리스트를 반환한다는 것이다.  (이 차이점 때문에 개발 중이던 비즈니스 로직에서 문제가 발생하기도 했다.) 이 글에서는 두 메서드의 차이점을 이해하고, 각각의 설계 의도를 살펴보자. 1. Stream.toList() 메서드의 내부 구현 이해하기:..
[Java] 동시성 제어가 가능한 CopyOnWriteArrayList와 일반 ArrayList의 차이점
·
JAVA
동시성 제어가 가능한 List인 CopyOnWriteArrayList를 알아보자📌 서론동시성 제어가 가능한 HashMap인 ConcurrentHashMap에 대해 공부하고 사용하다 보니 List에도 동시성 제어가 가능한 클래스가 존재할 것이라는 생각이 들었고 열심히 찾아본 결과 java.util.concurrent 패키지 내부에 CopyOnWriteArrayList라는 동시성 제어가 가능한 List가 존재한다는 것을 알아냈다. 이번 포스트를 위해 우리가 개발할 때 일반적으로 사용하는 ArrayList와 동시성 제어를 해준다는 CopyOnWriteArrayList를 스프링에서 사용해 보면서 동시성 제어가 어떻게 되는 것이고 성능은 어떨지 알아보자. SpringBootTest와 locust를 사용한 동시성..
[kafka] Docker로 카프카 실행하기 (KRaft 모드)
·
Apache Kafka
Docker를 통해 Kafka를 실행해 보자📌 서론이전에도 kafka 세팅에 대해 포스팅을 한 적이 있지만 가장 최근에 새롭게 세팅을 하면서 알게 된 점들을 정리해 봤다.특히 port를 설정할 때 내부, 외부로 구성하는 점이 굉장히 중요했다. 이 부분은 실수로 잘못 설정하면 외부에서는 아예 접근조차 불가능했다.세팅은 loacl에서 진행했으며 docker-compose를 사용해서 m2 max 맥북에서 실행했다.만약 SpringBoot에 연결하는 방법이 궁금하다면 이 글을 확인하자 (SpringBoot3.x.x) [Kafka] SpringBoot3.x.x에서 Kafka 연동하기스프링 부트 3.1.2에 Kafka를 세팅해 보자📌 서론이전 포스트를 통해 docker-compose로 Kafka를 띄웠다.이번..