분류 전체보기
-
[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에서 생성된..
-
Github Actions을 활용한 CI 안정성 확보하기Contribution 2022. 6. 26. 20:08
1) 서론 혹시 요리를 자주 하시나요? 저는 가끔 이것저것 남은 재료를 가지고 요리를 하곤 하는데요. 하지만 요리 실력은 마음처럼 잘 따라주지 않습니다. 그래서 간혹 참사가 벌어지고는 하는데요. 맛있는 재료들만 넣고 만들었는데 완성하고 보니 맛이 이상한 경우가 많습니다. 분명히 맛있을 수밖에 없는 재료들만 넣고 합쳤는데, 왜 맛이 없을까요? 아마도 각각의 재료들은 아주 뛰어나지만 이것들을 잘 조화롭게 합쳐서 요리하지 못한 게 문제일 것 같습니다. 개발할 때의 CI(Continuous Integration)도 비슷할 것 같습니다. 최근 각각의 PR단위에서는 문제가 없었지만, 배포 시 빌드가 되지 않던 경험이 있었습니다. 이를 사전에 해결하기 위해 도입한 Github Actions 내용을 공유드립니다. 2)..
-
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) 서론 일이 바쁘다는 핑계로 사용한 물건을 집안 곳곳에 아무렇게나 방치한 경험이 있나요? 당시의 나는 일단 물건을 어딘가에 두고, 씻고 잠자는 것이 더 편하고, 우선이라고 생각했을 것 같습니다. 하지만 시간이 흐르고 이러한 것들이 쌓이게 된다면, 물건을 찾기는 더더욱 불편해집니다. 어쩌다 새로운 가구를 구매라도 하게 되면, 어디에 놓아야 할지 엄두가 나지 않습니다. 왜냐하면 정리되지 않은 물건들로 공간은 가득할 테니까요. 이런 순간이 되면 미리미리 치워놓을걸 하는 후회와 함께, 이 짐들을 어디로 옮기고, 새로운 가구는 어떻게 배치할 것인지 고민이 될 것입니다. 아마도 우리가 작성하는 코드도 비슷할 거라고 생각합니다. 처음에는 빠르게 개발하는 것이 중요했을 것이고, 그것이 실제로 중요한 시기였을 것입니..