전체 글
-
OOM: unable to create new native thread 추적하기JVM 2024. 9. 23. 02:51
1) 서론개인적으로 개발하던 애플리케이션에서 OOM이 발생했습니다. 현상과 문제 되는 코드는 명확하게 발견했는데요. 원인을 찾아나가는 과정 중에 배운 것을 공유합니다.2) OutOfMemoryError 발생JVM 기반 애플리케이션에서 발생했고, 더 이상 요청을 받을 수 없는 상태가 되었습니다.Caused by: java.lang.OutOfMemoryError: unable to create new native thread at java.lang.Thread.start0(Native Method) at java.lang.Thread.start(Thread.java:717) 이유는 명확했습니다. 스레드풀 생성에 singleton pattern이 적용되지 않았습니다. 한번만 초기화되고, 이후에는 초기화된 인스..
-
집나간 zip 파일 찾아요Linux 2024. 9. 2. 03:38
1) 서론혹시 겉만 보고 무언가를 선택했다가 실망했던 경험이 있으신가요? 마트에서 종종 과일을 살 때 겉과 속이 다른 것에 실패하는 경험을 했었는데요. 빨갛게 잘 익어 보이는 자두나 사과를 구매했지만 막상 먹어보면 맛이 없는 경우가 있습니다. 오히려 색깔도 연하고 보기에 그저 그런 것이 의외로 맛있을 때도 있는데요. 어릴 때 어머니와 마트를 가면 손바닥으로 수박을 통통 두드려보는 것을 종종 봤습니다. 실제로 잘 익은 수박은 수분이 많기 때문에 맑은 '통통' 소리가 난다는 과학적 근거가 있다고 합니다. 어머니들은 이미 생활 속에서의 경험으로 얻은 지혜를 가지고 계셨을 수도 있습니다. 이처럼 겉으로만 보고 무언가를 판단하게 되면 안됩니다. 정말 그 내부가 어떻게 되어 있는지 알아야 하는데요. 최근 zip 파..
-
인터페이스와 제네릭을 이용한 공통 로직 관리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 등 발생하게 되면..
-
JPA Repository 기본 postfix로 인한 순환참조 해결Spring Framework 2023. 7. 30. 19:40
1) 서론 요즈음 스프링 프레임워크를 사용한다면 Spring Data JPA는 기본적으로 사용하게 되는데요. ORM 프레임워크는 RDB의 테이블을 객체로서 나타내고 맵핑할 수 있게 합니다. 애플리케이션에서 테이블에 질의할 때 쿼리와 데이터 중심이 아닌 객체로서 바라보는 것이 가능해졌습니다. 객체지향적인 설계에 큰 도움을 주게 됩니다. 이외에도 메서드를 활용하여 자동완성 되는 쿼리를 손쉽게 사용할 수 있는데요. 하지만 JDBCTemplate 같은것을 활용하여 쿼리를 날리는 것에 비해 주의해야 할 점이 많이 생겼습니다. 영속성 컨텍스트를 이해하지 못하거나 트랜잭션의 관리가 잘 되지 않는다면 예상치 못한 문제들이 발생할 수도 있는데요. 이번에는 Repository를 정의하고, 이에 대한 순환참조가 발생한것을 ..