Java & Kotlin
-
인터페이스와 제네릭을 이용한 공통 로직 관리Java & Kotlin 2024. 1. 1. 23:08
1) 서론 하나의 저울로 모든 종류의 물질들을 측정할 수 있을까요? 요리를 할 때 그램 단위의 정밀한 측정이 필요할 때는 미세한 측정이 가능한 요리용 저울이 필요할 것입니다. 하지만 사람의 몸무게를 측정할 때는 당연히 큰 저울이 필요합니다. 미세한 그램 단위까지 알 필요도 없는데요. 만약 건축 자재와 같이 큰 것들은 더더욱 다른 저울로 측정되어야 할 것입니다. 하지만 만약에 요리할 때 사용하면서, 내 몸무게와 코끼리의 몸무게도 재려고 한다면 세 개의 저울이 필요할 것입니다. 저울 한 개가 모든 용도에 맞게 사용되면 아주 간편할 것 같은데요. 결국 '무게 측정 행위'는 동일한 것 같습니다. 개발에서도 마찬가지입니다. 여러 도메인 혹은 비즈니스 로직에서 동일한 로직을 사용한다면, 공통화하고 싶은 욕구가 생깁..
-
ExecutorService 그리고 maxThreadPoolJava & Kotlin 2023. 11. 15. 03:24
1) 서론 이번글에서는 병렬처리 및 별도의 쓰레드풀에서 관리하기 위해서 ExecutorService 사용 중 만난 문제에 대해서 정리하려고 합니다. 2) ExeucutorService가 뭔가요? 자바의 ExecutorServcie 인터페이스는 비동기 작업을 위해서 Future를 생성하고 다룰 수 있게 해줍니다. Future 객체의 특징은 연산에 대한 결과를 blocking 되어 기다리지 않습니다. 요청 후 응답이 왔는지 확인했을 때 결과를 응답하는데요. 이러한 과정이 비동기적으로 일어납니다. 하지만 비동기 요청을 위해서는 기존에 수행되던 쓰레드가 아닌, 별도의 쓰레드에서 수행되어야 합니다. 어떻게 별도의 쓰레드를 비동기 작업을 위해 할당할 수 있을까요? 간편하게는 new Thread()를 이용해서, 직접..
-
JVM OOM 발생 및 원인 분석하기Java & Kotlin 2023. 9. 22. 08:00
1) 서론 평소 요리를 할 때 양 조절을 잘하시는 편인가요? 저는 평소 미역국을 할 때면 항상 양 조절이 어렵습니다. 아주 소량의 미역이라고 생각하며 한 주먹 넣고는 하는데요. 약 5분 뒤 이렇게 많은 미역은 도대체 어디서 나온 건지 의문이 들 정도로 불어나곤 합니다. 의문을 가지고 미역 봉지를 자세히 보게 되면 20인분이라고 적힌 글자를 볼 수 있습니다. 작은 봉지에 든 작은 미역들을 우습게 보고 넣게 되면 예상치 못하게 불어나곤 합니다. 미리 미역 양, 냄비의 크기를 확인하여 넣었어야 합니다. 개발을 할 때도 마찬가지인데요. 적재된 데이터의 양, 단순 코드 실수 등으로 인해 OOM이 발생하고는 합니다. 이번 글에서는 업무 중 발생한 OOM 발생 원인 분석글을 공유드리겠습니다. 2) OOM 발생 (모든..
-
UTF-8, EUC-KR 인코딩 파일 읽어들이기Java & Kotlin 2023. 9. 3. 23:45
1) 서론 파일을 읽고, 쓰는 레거시 로직이 있었습니다. 파일을 읽는 데에는 아무런 문제가 없었으나 정작 나가는 패킷에서는 알 수 없는 문자가 추가되어 나갔습니다. 파일을 받는 쪽에서도 대부분의 문자는 정상이었지만, 중간중간 깨지는 문자들이 존재했습니다. 이러한 문제를 해결하며 확인한 것을 기록하니다. 2) UTF-8 인코딩 파일 읽어들이기 // 생성된 파일 읽기 $ cat test-encoding-utf8.txt 안녕하세요. 저는 현재 테스트 중 입니다. // 파일 인코딩 확인 $file -I test-encoding-utf8.txt test-encoding-utf8.txt: text/plain; charset=utf-8 UTF-8 인코딩 된 텍스트 파일이 존재합니다 FileReader 사용하여 UTF..
-
심심해서 살펴본 Querydsl fetchOne() 구현Java & Kotlin 2023. 8. 27. 17:19
(이번 글은 깊은 내용이 없으므로 가볍게 읽어주세요) 1) Querydsl이란? Querydsl은 JPA의 아쉬운 점을 보조하기 위해서 나왔습니다. JPA 명세를 구현한 ORM 프레임워크는 관계형 데이터베이스의 테이블 설계와 애플리케이션에서의 객체지향적인 설계가 맞지 않는 것을 해결하기 위해서 탄생되었는데요. 자바 코드를 활용하여 객체를 설계하고 테이블의 연관관계를 나타낼 수 있다는 것이 큰 장점입니다. 즉 테이블도 객체로서 바라보며 쿼리를 사용하고 조작할 수 있게 되었습니다. 주로 사용되는 구현체인 Hibernate는 기본적으로 String 기반의 메서드명을 활용하여 쿼리(HQL)를 사용하는데요. 단순 조회, 저장 등은 여전히 간결하고 쉽습니다. 하지만 여러개의 where절, join 등 발생하게 되면..
-
Kotlin Coroutine과 CompletableFutureJava & Kotlin 2023. 7. 27. 02:42
1) 서론 혹시 비슷한 일들을 두고 다른 점을 찾기 어려웠던 경험이 있으신가요? 무언가 다르다고 주장하며 존재하지만 자신이 볼 때는 똑같다고 생각이 들 수도 있는데요. 저는 유독 안심, 등심 돈가스의 차이점에 대해서 공감하지 못했습니다. 안심 돈까스는 지방이 포함되어 부드럽고, 등심 돈가스는 좀 더 쫄깃한 식감을 느낄 수 있다고 하는데요. 실제로 매장에서도 다르게 판매하고 있지만 개인적으로는 똑같이 돼지고기를 튀긴 돈가스라고 생각했습니다. 우연히 모 돈까스 가게를 방문하고 등심+안심이 함께 나오는 세트를 주문했는데요. 평소의 궁금증을 해소하고자 실험정신을 발휘하여 번갈아가며 먹어봤습니다. 막상 진지하게 번갈아먹어 보니 확실히 안심이 더 부드러웠는데요. 이처럼 겉모습만 보거나, 깊게 알지 못하는 비슷한 일..
-
Kotlin coroutine dispatcher란?Java & Kotlin 2023. 6. 26. 00:28
1) 코루틴과 쓰레드는 달라요 코루틴(CoRoutine)과 쓰레드(Thread)는 매우 비슷해 보이는데요. 코틀린 프로그래밍을 하면서 무언가 동시적인(concurrency) 작업을 처리하기 위해서 자주 사용되기 때문일 것 같습니다. 쓰레드는 프로세스를 이루는 가장 작은 단위의 흐름입니다. 예를 들어 일정 간격으로 자동 저장되는 메모장 프로세스가 실행된다고 가정합니다. 타이핑을 치면서 I/O를 담당하고, 일정 간격을 확인하며 저장하는 쓰레드는 다를 것입니다. 즉 하나의 프로세스에 여러 개의 쓰레드가 동작하고 있다고 생각할 수 있습니다. 코루틴은 일시 정지, 재개할 수 있는 함수입니다. 즉 쓰레드처럼 프로세스를 구성하는 일꾼이 아닌, 하나의 함수일 뿐입니다. 그리고 코루틴은 단순히 하나의 쓰레드에서만 이루어..
-
코틀린 setter, 어디까지 써봤니?Java & Kotlin 2023. 5. 30. 01:46
1) 서론 혹시 이도저도 못 하는 경험을 해보신 적 있으신가요? 저는 식당에서 메뉴를 고르는 것을 어려워하는데요. 특히 중국집에서 절정에 다다릅니다. 짜장면을 시키면, 매콤한 짬뽕국물이 먹고 싶어 집니다. 하지만 짬뽕을 시켰을 때 너무 매우면 어쩌지 하며, 짜장면이 먹고 싶기도 합니다. 그러면서 볶음밥을 먹는 게 더 좋지 않을까 고민합니다. 중요한 것은 무엇을 먹든 trade-off가 존재합니다. 짜장면을 먹으면 매운 것을 피할 수 있지만 국물을 포기해야 합니다. 개발에서도 마찬가지인데요. 이번에 코틀린으로 개발하며 entity를 만드는데 고민이 들었습니다. 자바에서 lombok @getter + priavte 필드로 생성하던 것을 코틀린에서는 어떤 방식이 좋을지 고민됐습니다. 이번 글에서는 위의 문제에..