Java & Kotlin
-
공통 기능은 도메인을 몰랐으면 좋겠다Java & Kotlin 2023. 5. 26. 15:30
1) 서론 아마도 모든 애플리케이션에는 common, core 등으로 불리는 공통 기능들이 있을 것 같은데요. 이번에는 이러한 공통 기능을 제공하며, 여러 도메인 사용자의 요청이 섞이면서 어려움을 겪었던 것을 공유드립니다. 2) 공통 기능을 제공해봐요 (모든 내용은 임의로 만든 것입니다) 모놀리식 A, B 도메인 서버 --> User 도메인 서버 요청 User 서버 요청하는 Feign client User 서버를 요청하는 Feign 클라이언트를 제공하게 되었는데요. 아무런 도메인이나 비즈니스 로직이 포함되어 있지 않습니다. 즉 어떠한 도메인에서 유저 정보가 필요하면 사용하고, 각 도메인에 맞게 유연하게 다룰 수 있습니다. 하지만 아래와 같이 수정 요청을 받습니다. A, B 도메인 공통으로 사용하기를 원함..
-
Setter, 맥락 이해가 되지 않아요!Java & Kotlin 2023. 4. 3. 01:34
1) 서론혹시 새로운 업무를 맡았을 때 이전의 업무 맥락을 파악하기 어려웠던 적이 있으신가요? 아마도 이유는 다양할 것 같습니다. 새로 맡은 업무가 너무 생소할 수도 있고요. 혹은 너무 많은 업무들이 한 번에 들이닥쳐서 무언가 정리할 시간이 없었을 수도 있습니다. 하지만 제가 경험했을 때 가장 힘들었던것은 어떤 문제 해결에 있어서 과정없이, 결론만 남아있을 때인데요. 예를 들어 A라는 문제가 발생한 슬랙 스레드가 존재하고, 댓글에는 단순히 "해결됐습니다~" 라는 것만 존재할 때 가장 당황스럽습니다. 무엇을, 어떻게, 왜 해결했는지에 대한 과정 없이 그저 한 문장으로 모든 것을 생략했기 때문입니다. "정말로 해결한것은 맞을까", "도대체 뭘 어떻게 해결했다는 것인가", "같은 문제가 발생했을 때 어떻게 할..
-
모든 햄버거는 다르다, Strategy PatternJava & Kotlin 2023. 3. 29. 14:15
1) 서론혹시 무언가를 얻기 위해 협상을 했던 적이 있나요? 어릴 적 어린이날 선물을 받고 싶어 부모님께 청소를 열심히 하겠다고 했던 적이 있는데요. 당시 부모님께서 자신이 먹은 그릇을 치우고, 어지럽힌 것을 치우는 것은 당연하다고 말씀하셨던 게 기억이 납니다. 청소라는 전략을 사용해서는 어린이날 선물을 받을 수 없다는 것을 깨닫고, 어린이날까지 높임말을 잘 쓰겠다는 전략으로 변경했고 부모님께서는 흔쾌히 승낙했습니다. 아마도 예의를 중요시 여기는 아버지께서는 내심 그러한 것을 바라셨는지도 모르겠습니다. 이렇듯 현실에서 당연히 될것이라고 선택했던 전략이 통하지 않을 때가 많습니다. 왜냐하면 인생은 실전이고, 한 치 앞도 알 수 없습니다. 이럴 때 중요한 것은 기존 전략에 대한 고집을 버리고, 빠르게 다른 ..
-
Dependency Injection, 그 참을 수 없는 유연함Java & Kotlin 2023. 1. 3. 03:27
1) 서론 혹시 자신의 친구를 누군가에게 소개해준 경험이 있으신가요? 20대 초반, 내 친구 정도면 아주 훌륭하다고 생각하며 또 다른 친구에게 소개팅을 해준 적이 있는데요. 만약 잘 안되더라도 세 명이서 좋은 친구가 되면 좋을 것 같다는 생각이 들었었습니다. 하지만 인생은 실전입니다. 언제나 최악이 기다리고 있었는데요. 두 친구는 잘 사귀던 중 어떠한 문제로 인해 크게 싸우고 헤어졌습니다. 주선자인 저도 괜히 가운데서 어색해졌는데요. 둘 중 누구를 만나기에도 어색한 상황이 되었었던 기억이 있습니다. 당시에 많이 후회했었습니다. 나와 완전히 연관된 친구가 아닌, 친구의 친구를 소개시켜줬다면 어땠을까라는 생각이 들었습니다. 그러면 지금처럼 가운데에서 난감한 상황이 벌어지지 않았을 수도 있을 것 같습니다. 개..
-
MySQL 트랜잭션 lock 충돌 오류 개선하기Java & Kotlin 2022. 11. 27. 21:12
1) 서론 이번 글에서는 MySQLTransactionRollbackException의 발생 원인을 분석하고 개선 방안을 고민해보는 글입니다. 그리고 JPA를 사용하다 보면 동일한 상황에서 발생하는 PessimisticLockingFailureException도 함께 알아보려고 합니다. 나름대로의 방법을 찾았지만, 더 좋은 아이디어를 댓글로 주신다면 감사히 받겠습니다. 2) MySQLTransactionRollbackException가 발생하는 이유 아래와 같은 상황을 가정합니다. TR은 transaction의 약자로 사용합니다. TR1 test 테이블 데이터 전체 삭제 TR1 lock 획득 후 실행 중 TR2 삭제 요청 이때 TR2는 실행될 수 있을까요? 아래와 같이 코드를 작성합니다. TR1: 테이블..
-
Java Optional과 container objectJava & Kotlin 2022. 9. 10. 21:07
1) 서론 혹시 '열 길 물속은 알아도 한 길 사람 속은 모른다'라는 속담을 들어보신 적 있으신가요? 물은 직접 들어가 보면 알 수 있지만, 사람의 속은 알 수 없다는 의미인데요. 학교, 회사 등에서 사람과의 관계는 언제나 어렵습니다. 실제의 마음을 잘 못 전달해서 오해를 살 수도 있습니다. 때로는 오히려 드러내지 않는 것이 더 좋았을까라는 고민도 하게 됩니다. 최근에 개발을 하다가 내부 구현을 추상화된 표면과 내부 구현의 로직이 다른 것을 만났었는데요. Optional.isEmpty() 사용 중 당황했던 경험 그리고 이를 stackoverflow에 질문을 올리고, 이유와 철학을 알아가는 과정을 공유드리려고 합니다. 2) Optional.isEmpty()의 속은 모르겠다 Java8부터 등장한 Option..
-
[Java] lambda captureJava & Kotlin 2022. 7. 23. 21:22
1) 서론 자바 개발자라면 '람다 표현식' 이라고 불리는 익명 함수를 자주 사용할 것 같습니다. 꼭 자바 개발자가 아니더라도 '람다 대수'라는것을 배웠다면, 이는 컴퓨터 공학 어디에서든 사용되는 것을 알 수 있는데요. 기본적으로 람다 대수는 함수의 이름을 익명으로 하고, 추상화된 방식으로 계산을 하는데요. f(x)=x+1을 λx.x+1로 표현할 수 있습니다. 중요한것은 함수에 X를 받아, X+1 연산을 한다는 것입니다. 즉 함수의 이름은 익명화 시키고, x가 오면 x+1을 계산합니다. 이러한 람다 표현식이라고 불리는 익명 함수가 자바에도 있는데요. 이때 지역변수로 선언된 값을 람다 표현식에서 사용하다가 어려움을 만났던 점을 기록합니다. 2) 람다 표현식으로 지역변수 사용하기 지역변수를 Supplier 함..
-
객체지향적 리팩토링 맛보기Java & Kotlin 2022. 7. 3. 01:40
1) 서론 개발자에게 리팩토링은 피할 수 없는 순간일 것 같습니다. 개인적으로는 리팩토링은 숨 쉬듯이, 업무와 무관하게 이루어져야 하는 것 같기도 한다는 생각이 들기도 하는데요. 당시에는 빠르게 개발하는 것이 목적이었기 때문에 코드에 신경을 쓰지 못할 수도 있습니다. 혹은 기능 추가가 계속해서 이루어지면서, 어쩔 수 없이 정리가 필요한 순간이 올 수도 있을 것 같습니다. 이번 글에서는 임시적으로 추가한 기능이 어느 순간 중요한 기능이 되고, 지속적으로 로직 추가가 발생했던 기능을 리팩토링 한 경험을 공유드립니다. 2) 어떤 내용을 리팩토링 하나요? (모든 내용은 블로그를 위해 가정한 것들입니다. 회사와 무관합니다) 아래의 상황이라고 가정합니다. A, B 애플리케이션이 각각 다른 서버에 존재 A에서 생성된..