전체 글
-
Querydsl cross join 개선 하기Spring Framework 2022. 6. 18. 19:48
1) 서론 회사에서 Spring Data JPA는 서버 개발의 공통 기술 스택입니다. 그리고 당연하게 where 절을 많이 사용하는데요. 이때 만난 문제점을 개선하고 이를 공유하고자 합니다. Querydsl 뿐만 아니라, Spring Data JPA를 사용해보셨다면 이미 알고 계신 내용일 수도 있는데요. 그런 분들은 이번 글은 skip 하셔도 좋을 것 같습니다. 2) Querydsl where절의 문제점 ORM 프레임워크 상 혹은 SQL 쿼리를 직접 사용할 때 where절은 숨 쉬듯 자연스럽게 사용됩니다. 하지만 이러한 where절이 문제점을 일으킬 것이라고는 생각하지 못했었는데요. 어떤 문제가 있을까요? @Table(name = "book", schema = "test") @Entity class B..
-
FK 없는 OneToOne 즉시 로딩 개선하기Spring Framework 2022. 6. 7. 00:08
1) 서론 이번 글에서는 업무 중 발견한 레거시 코드의 문제점을 개선한 것을 공유하고자 합니다. 다양한 로직에서 빈번히 조회되고 있던 엔티티가 있었는데요. 특별히 문제가 발생하지 않았기 때문에 실제로 발생하는 쿼리를 주의 깊게 보지 않았었습니다. 하지만 우연히 지나치게 많은 쿼리가 발생하고 있는 것을 발견했습니다. 최초의 설계 의도는 지연 로딩을 하고자 했던 것 같지만, 실제로는 즉시 로딩이 되고 있었습니다. N+1 문제가 발생하고 있었는데요. 적은 스펙의 IDC 환경에서 돌아가는 애플리케이션을 운영하는 입장에서 불필요한 쿼리 개선 하나하나가 소중한 상황입니다. 이러한 레거시 코드를 개선하고, 변경한 내용을 공유합니다. 2) DB schema 모든 테이블 구조 및 로직은 재현을 위해 임의로 만들었습니다..
-
public, private은 언제 사용해야 할까?Java & Kotlin 2022. 4. 24. 18:19
1) 서론 이번에 작성할 글은 단순히 고민의 흐름을 기록하는 글입니다. 그리고 나름대로 생각을 정리했지만, 결론을 내리지는 않습니다. 오히려 같은 고민을 하는 분들의 댓글을 기다리는 글입니다. 이 글에서 이루어지는 고민은 "public과 priavte은 언제 어떻게 사용해야 할까?"입니다. 특정 기능을 개발하는데, 습관적으로 모든 함수를 private으로 작성하고 있는 제 자신을 발견했습니다. 그러다 보니 모든 기능의 테스트를 할 수 없었는데요. 이러한 방식이"정말로 이게 맞을까?"라는 의문으로 시작된 고민입니다. 2) 기본적인 public, private 개념의 차이 대부분의 언어에서 public, private 개념과 사용법은 비슷할 것입니다. 이 글에서는 Kotlin을 예제로 사용합니다. publi..
-
No Fedex, Yes IndexDatabase 2022. 4. 11. 00:47
1) 서론 인터넷에서 상품을 주문했을 때 예상 배송 기간보다 늦은 경험을 해보셨나요? 저는 스무 살 때 데이트를 해보겠다고, 인생 첫 헤어 왁스를 인터넷에서 주문해본 적이 있는데요. 예상보다 늦은 배송으로 인해 정작 데이트 날은 머리를 꾸미지도 못 하고 나갔던 기억이 있습니다. 이유는 택배사 물량 폭주로 인한 배송 지연이었습니다. 하지만 요즘에는 로켓 배송, 샛별 배송, 새벽 배송 등 쿠팡을 시작으로 아주 빠른 배송이 이루어지고 있는데요. 예전에는 3 ~ 5일이 걸렸지만, 요즘은 하루 혹은 반나절이면 충분한 세상이 됐습니다. 쿠팡은 각 지역마다 거대한 물류센터를 지어서 소비자와 물리적인 거리를 줄이고, 자동화 시스템을 통해 효율적인 배송 준비를 하는데요. 물건을 배송한다는 것은 기존의 업체들과 같지만, ..
-
처음으로 해본 리팩토링 후기Spring Framework 2022. 3. 24. 02:40
1) 서론 일이 바쁘다는 핑계로 사용한 물건을 집안 곳곳에 아무렇게나 방치한 경험이 있나요? 당시의 나는 일단 물건을 어딘가에 두고, 씻고 잠자는 것이 더 편하고, 우선이라고 생각했을 것 같습니다. 하지만 시간이 흐르고 이러한 것들이 쌓이게 된다면, 물건을 찾기는 더더욱 불편해집니다. 어쩌다 새로운 가구를 구매라도 하게 되면, 어디에 놓아야 할지 엄두가 나지 않습니다. 왜냐하면 정리되지 않은 물건들로 공간은 가득할 테니까요. 이런 순간이 되면 미리미리 치워놓을걸 하는 후회와 함께, 이 짐들을 어디로 옮기고, 새로운 가구는 어떻게 배치할 것인지 고민이 될 것입니다. 아마도 우리가 작성하는 코드도 비슷할 거라고 생각합니다. 처음에는 빠르게 개발하는 것이 중요했을 것이고, 그것이 실제로 중요한 시기였을 것입니..
-
Optional 아무렇게나 사용하고, 장애 발생시킨 이야기Java & Kotlin 2022. 3. 15. 01:09
1) 서론 당연한 것이라고 생각하며 한 번도 의심해보지 않은 것이, 사실은 아니었던 경험이 있으신가요? 저는 TV에서 나오는 맞춤법 퀴즈를 볼 때 종종 "이게 정답이라고?" 라는 생각을 하기도 하는데요. 최근 개발을 하던 중 사용한 Java의 Optional이 저에게는 그런 존재입니다. Java8의 시대부터, 아마도 자바 개발자에게 Optional의 사용은 필수가 됐을 것 같습니다. 저는 NPE를 방지하기 위해서, 습관적으로 사용하곤 했었는데요. 이러한 Optional을 무분별하게 사용하다가, 시원하게 장애를 발생시킨 경험입니다. 2) 상황 설명 값을 조회합니다 값이 있다면, Exception 발생합니다. Post 테이블의 title이 'title'인것을 조회합니다. 데이터는 존재하지 않습니다. 앞서 '..
-
짐 덩어리, Git 브랜치 삭제 적용해본 이야기Contribution 2022. 2. 27. 23:57
1) 서론 이 글을 읽는 대부분은 이사를 해본 경험이 있을 것입니다. 그리고 아마도 "왜 이렇게 짐이 많지? 이걸 왜 안 버리고 있었을까?"라는 생각을 한번쯤은 해보셨을 텐데요. 지금은 쓸모없어 보이는, 구석에 어딘가 둔 물건이 과거의 나에게는 소중했었을 것입니다. 혹은 미래에 소중할 것이라고, 당시에 생각했었을 수도 있고요. 하지만 중요한 건 현재의 내가 느끼는 필요성일 텐데요. 모든 기준은 현재의 나 자신입니다. 과거를 후회하는 것도, 미래를 희망하는 것도 현재의 나 자신입니다. GIt도 마찬가지입니다. GIt이라는 VCS로서 역사를 기록하지만, 결국에는 마지막으로 merge 된 최종본이 중요합니다. Git의 역사를 기록하는 방법 중 하나인 branch를 더 깔끔히 유지하는 방법에 대해서 알아봅니다...
-
착한 가로채기, InterruptedExceptionJava & Kotlin 2022. 2. 21. 03:16
1) 서론 JVM은 Java 언어가 어떠한 운영체제와도 동작할 수 있도록 도와주는 가상 머신입니다. 기계어로 바로 변환되는 C언어와 다르게, byte code로 변환 후 필요시 native code로 변환하고 읽는데요. "Write once, Run anywhere"라는 자바 언어를 만들던 당시의 철학을 떠올려보면, 당연한 동작 방식 입니다. JVM은 단순히 코드를 변환해주는 역할만 하지 않습니다. 운영체제 위해서 애플리케이션과 메모리를 관리하는 역할도 하는데요. 특히 프로세스, 스레드 관리를 매우 철저하게 해 줍니다. GC와 같이 사용되지 않지만, 메모리에 올라와있는 코드를 정리해주기도 합니다. 특히 스레드가 deadlock에 빠졌을 때 JVM은 그냥 두고만 보지 않는데요. 이때 발생할 수 있는 Int..