분류 전체보기
-
Dependency Injection, 그 참을 수 없는 유연함Java & Kotlin 2023. 1. 3. 03:27
1) 서론 혹시 자신의 친구를 누군가에게 소개해준 경험이 있으신가요? 20대 초반, 내 친구 정도면 아주 훌륭하다고 생각하며 또 다른 친구에게 소개팅을 해준 적이 있는데요. 만약 잘 안되더라도 세 명이서 좋은 친구가 되면 좋을 것 같다는 생각이 들었었습니다. 하지만 인생은 실전입니다. 언제나 최악이 기다리고 있었는데요. 두 친구는 잘 사귀던 중 어떠한 문제로 인해 크게 싸우고 헤어졌습니다. 주선자인 저도 괜히 가운데서 어색해졌는데요. 둘 중 누구를 만나기에도 어색한 상황이 되었었던 기억이 있습니다. 당시에 많이 후회했었습니다. 나와 완전히 연관된 친구가 아닌, 친구의 친구를 소개시켜줬다면 어땠을까라는 생각이 들었습니다. 그러면 지금처럼 가운데에서 난감한 상황이 벌어지지 않았을 수도 있을 것 같습니다. 개..
-
[2022년 회고] 앞만 보고 달렸다. 그런데 주변은?회고 2023. 1. 1. 01:13
1) 앞만 보고 달린 2022년, 그런데 주변은? 2021년 9월 27일 처음으로 개발자가 되었다. 2021년은 개발자로서, 회사원으로서 적응하는데 시간을 보냈었다. 혼자서 개발하는 것에서 벗어나 많은 사람들과 개발하고, 대화를 잘할 수 있는 고민을 했던 것 같다. 2022년은 쏟아지는 수많은 현실 문제를 해결하는데 집중했다. 클라우드가 아닌, IDC 로컬 서버에서 운영 중인 서버는 언제 멈출지 모르는 시한폭탄과 같았다. IDC에 계약된 물리적인 하드웨어 스펙이 너무나도 부족한 상태에서 DB 커넥션은 항상 모자랐다. 이런 심각성을 아는지 모르는지 N+1 쿼리, 끝나지 않는 긴 트랜잭션, 데드락 등 온갖 문제점들이 터져나왔다. 알 수 없는 스케줄링된 배치 코드가 동작을 해서 뜬금없이 새벽에 서버가 죽기도 ..
-
MySQL 트랜잭션 lock 충돌 오류 개선하기Java & Kotlin 2022. 11. 27. 21:12
1) 서론 이번 글에서는 MySQLTransactionRollbackException의 발생 원인을 분석하고 개선 방안을 고민해보는 글입니다. 그리고 JPA를 사용하다 보면 동일한 상황에서 발생하는 PessimisticLockingFailureException도 함께 알아보려고 합니다. 나름대로의 방법을 찾았지만, 더 좋은 아이디어를 댓글로 주신다면 감사히 받겠습니다. 2) MySQLTransactionRollbackException가 발생하는 이유 아래와 같은 상황을 가정합니다. TR은 transaction의 약자로 사용합니다. TR1 test 테이블 데이터 전체 삭제 TR1 lock 획득 후 실행 중 TR2 삭제 요청 이때 TR2는 실행될 수 있을까요? 아래와 같이 코드를 작성합니다. TR1: 테이블..
-
HikariCP, 일단 connection 맺어 본다Database 2022. 11. 16. 23:18
1) 서론 이번 글에서는 HikariCP의 설정에 대해서 공부한 것을 공유드리려고 합니다. 이미 설정을 해보시고 테스트해본 분께는 쉬운 내용이므로 읽지 않으셔도 좋습니다. 2) 아이디어 출발점 중요한 새로운 모바일 애플리케이션 출시를 앞두고 있었습니다. 사용자들은 업데이트 후 재로그인이 필수인 상황 대대적인 공지로 인해 오전 평소보다 많은 요청 발생 예상 매우 제한된 IDC 레거시 인증 담당 서버의 담당자는 하필 주니어인 나... 배포를 앞두고 걱정이 되어 괜히 이래저래 문제가 없을지 고민해봅니다. 이미 계약된 IDC의 물리적인 하드웨어 스펙은 현재 개선할 수 없습니다. 그래서 애플리케이션과 DB의 설정을 확인해보는데요. 혹시 N+1 쿼리가 발생할 수 있는지 확인 DB connection 부족하지 않은지..
-
Redis, Jmeter를 이용하여 동시성 문제 해결하기Redis 2022. 11. 6. 20:41
1) 서론 하나의 일을 할 때에는 침착히 잘 해내는데, 여러 일을 동시에 할 때는 허둥지둥하여 망쳐버린 경험이 있으신가요? 저는 여러 일을 동시에 진행할 때 우선순위를 잘 정하지 못하고, 처리하는데 급급하여 결과의 품질이 떨어지는 경험을 하곤 했습니다. 모든 일을 마치고 보면 항상 아쉬움이 남습니다. 조금 더 신경 썼다면 더 나은 결과물을 냈을 것 같다는 후회도 종종 하는데요. 이러한 경험 때문인지 출근 후 가장 먼저 TO-DO 목록을 작성합니다. 그리고 일의 우선순위를 나름대로 정하여 어떠한 경우가 발생하더라도 그것을 지키려고 합니다. 고객 혹은 업무 연관자들이 대기하는 시간이 길어질 것 같은 것을 먼저 처리하고, 혼자서 하는 개인 업무를 처리하는 방식으로 우선순위를 정하는데요. 일의 우선순위는 사람마..
-
Java Optional과 container objectJava & Kotlin 2022. 9. 10. 21:07
1) 서론 혹시 '열 길 물속은 알아도 한 길 사람 속은 모른다'라는 속담을 들어보신 적 있으신가요? 물은 직접 들어가 보면 알 수 있지만, 사람의 속은 알 수 없다는 의미인데요. 학교, 회사 등에서 사람과의 관계는 언제나 어렵습니다. 실제의 마음을 잘 못 전달해서 오해를 살 수도 있습니다. 때로는 오히려 드러내지 않는 것이 더 좋았을까라는 고민도 하게 됩니다. 최근에 개발을 하다가 내부 구현을 추상화된 표면과 내부 구현의 로직이 다른 것을 만났었는데요. Optional.isEmpty() 사용 중 당황했던 경험 그리고 이를 stackoverflow에 질문을 올리고, 이유와 철학을 알아가는 과정을 공유드리려고 합니다. 2) Optional.isEmpty()의 속은 모르겠다 Java8부터 등장한 Option..
-
스프링에서 재처리를 위한 @Retryable 사용하기Spring Framework 2022. 8. 22. 23:10
1) 서론 혹시 어떠한 일을 할 때 배보다 배꼽이 더 커졌던 경험이 있으신가요? 예전에 문득 해물탕이라는 요리가 너무 먹고 싶었고, 집 근처에서 해물탕 가게를 찾을 수 없었습니다. 그래서 직접 해물탕을 만들겠다는 생각을 했었는데요. 하지만 해물탕 한 그릇을 먹기 위해 비싼 해산물들을 구매해야 했습니다. 그리고 구매한 해산물들을 다듬는 시간은 꽤 오래 걸렸는데요. 혹시 잘 못 해감을 해서 모래가 씹히지 않을까, 이 부분은 먹어도 되는 걸까? 고민을 했었습니다. 어찌어찌 요리 후 맛있게 먹었습니다. 하지만 여전히 남는 아쉬움은 있었습니다. 15분 만에 먹고 끝내는 이 한 그릇을 위해서 이렇게 많은 돈과 정성을 쏟는 것이 정말로 효율적인 건가? 식당을 찾아가서 먹거나, 추가의 배달비를 내고 배달을 시키는 것이..
-
Junit 테스트 병렬 수행으로 빌드 시간 단축하기Spring Framework 2022. 8. 16. 01:14
1) 서론 혹시 무언가를 기다리는 시간이 지루하게 느껴진 경험이 있으신가요? 저는 놀이기구를 타기 위해 기다리는 시간이 참 지루하다고 느껴집니다. 대기열에서 약 1시간씩 기다리다 보면, 자유이용권을 구매했지만 몇 개 못 타는 경험을 하기도 하는데요. 가끔 대기열이 전혀 없고, 실컷 탈 수 있었으면 하는 상상도 해봅니다. 최근 문득 애플리케이션의 build 시간이 지루하고, 아깝다는 생각이 들었는데요. 특히 테스트 코드가 증가하게 되면, 빌드 시간도 계속해서 지연됩니다. Githbub actions를 사용해서 PR 생성 혹은 commit 시 자동으로 build가 동작하거나, 배포를 위해 build 할 때도 마찬가지입니다. 만약 총 10명의 개발자가 하루에 5번 build 하고 1분씩 아낄 수 있다면 총 5..