안녕하세요. Fulfillment Engineering 팀의 입사한 지 1년이 얼마 지나지 않은 싱싱한(?) 주니어 개발자 백정현입니다. 최근 들어 JAVA를 기반으로 한 Spring boot + JPA 또는 Spring Data JPA를 이용한 프로젝트가 많이 보입니다. JPA는 쿼리를 지원하는 다양한 방법들이 있는데, 그중 QueryDSL에 대해서 살포시 찔러보도록 하겠습니다. QueryDSL은 무엇인가요? QueryDSL은 정적 타입을 이용해서 SQL과 같은 쿼리를 생성할 수 있도록 해 주는 오픈소스 프레임워크입니다. 쿼리를 문자열로 작성하거나 작성하는 것이 아닌, QueryDSL이 제공하는 Fluent API를 이용해 코드 작성의 형식으로 쿼리를 생성할 수 있게 도와줍니다. Gradle 설정 Qu..
안녕하세요 Post-tx & Accounting 팀 권우석입니다. 회사에 처음 입사했을 때 저에게 '객체 지향 프로그래밍'은 인터넷에 검색하면 나오는 몇 가지 특성과 설계 원칙으로 대변되는 단어였습니다. 하지만 당장에 프로젝트를 진행한다고 상상했을 때 "어떤 객체가 필요하지?", "객체는 어떻게 구현해야 하지?"와 같은 질문을 마주할 것 같았고, 질문에 대한 답을 명확히 할 수 없는 느낌에 공부를 했었는데요. 이때 공부했던 내용을 아래의 순서로 간단히 정리해보려 합니다. (1) 객체를 식별하는 방법 (2) 객체를 구현하는 방법 (3) 객체들이 협력할 수 있는 구조 객체 지향은 현실의 모방이다? 위 사진을 보면 "배달원이 고객에게 택배를 전달하는 상황"이라는 사실을 어렵지 않게 파악할 수 있습니다. 아마 ..
오랜만에 Java Generic 포스팅으로 돌아왔습니다. 이번에는 Java Generic에서 주의해야 하는 심화 개념들을 몇 가지 다뤄보겠습니다. 1. Type Erasure Java Generic 을 관통하는 주요 개념 중에 Type Erasure라는 개념이 있습니다. 이론적으로는 Generic 을 운영하기 위해 부가적으로 들어간 소스코드들이 바이트코드 레벨에서는 모두 제거되는 것을 의미하는데요. 개념편에서 다루었던 예제를 기반으로 좀 더 상세히 알아보겠습니다. public class Tv { private String title; public Tv(String title) { this.title = title; } public String getTitle() { return title; } } pub..
안녕하세요. Seller 팀에서 판매자 대상으로 업무를 진행하고 있는 개발자 박명훈입니다. 오늘은 지난 회고록에서 이야기했던 업무에 대해 좀 더 정리해서 이야기해보려고 합니다. 아직까지 부족한 부분이 많지만 나름의 발전 정도라고 생각해주시면 감사하겠습니다. Gmarket과 Auction에서 쓰는 상품 리스트, 상품 상세 페이지에서 사용하는 브랜딩 서비스에 대해 서술합니다. 저는 뒷단의 백엔드 서비스를 담당하여 개발하였습니다. 브랜딩 정책은 비지니스 룰이 많아서 규칙이 까다롭기 때문에 여러 테이블을 조인해서 기준을 판단하며, 요청마다 이러한 테이블을 조인해서 응답을 주게 되면 이는 곧 성능 저하로 연결됩니다. Gmarket과 Auction의 상품에서 브랜드 정보 요청은 모든 사용자들이 사용하므로 많은 요청..
Linger Kafka 에 보면 linger 라는 개념이 나옵니다. 프로듀서가 메세지를 전송할 때, 전송을 위한 통신 오버헤드를 줄이기 위해 메세지를 어느 정도 모아서 보내는 방식입니다. 네트워크 비용은 대체적으로 큰 비용에 속하기 때문에 이를 줄이기 위한 방법입니다. 이 컨셉은 kafka 의 여러 곳에서 등장합니다. 기능만큼이나 성능 측면에서 비용을 낮추기 위해 여러 방안을 사용한 듯 싶습니다. 네트워크 비용만큼이나 비싼 비용은 바로 DB 비용입니다. 특히 RDB 에서는 원하는 목표를 위한 큰 비용을 마주하곤 합니다. 도메인의 특이한 제약은 종종 겪곤 하는데 저도 이번 경우에 몇몇 제약적인 상황 하에 RDB 의 비용을 효율적으로 다뤄보기 위해 linger 전략을 도입한 사례를 소개합니다. Linger ..
실패한 작업 가끔 일련의 작업을 하나의 트랜잭션 마냥 수행해야 하는 경우가 있습니다. 분산처리나 분산 트랜잭션 등의 주제라면 또 다른 얘기가 되지만, 좀 더 단순하게 코드 레벨의 문제들을 마주할 경우가 있죠. 각 작업은 실패할 수 있고 하나라도 실패하는 경우 지금까지 수행한 작업들에 실패 처리를 하는 코드를 어떻게 짜면 좋을까요? 일단 하나의 작업에 대해서 실패를 대비하고 실패 시 처리방안을 마련하는 방법은 바로 try-catch 일 것입니다. 그러면 쉽게 생각해서 일련의 작업을 위한 try-catch 를 여러 번 사용하면 되지 않을까요? 중첩 Try Catch 하나의 작업은 다음과 같이 실패를 다룰 수 있습니다. try { // 실패할 가능성이 있는 작업 } catch (Exception e) { //..
After GC, Post GC Memory는 프로그래밍에 꽤 중요하고 기술적인 부분입니다. 만약 독자께서 malloc, calloc, free 등에 어색함이 없다면 더욱 Memory를 다루는 것에 기술적인 특징들을 공감하실 수도 있겠습니다. 그래서 또 Memory를 다룬다는 점은 꽤 신중하고 기교가 높아야 했으며 문제가 복잡해질수록 이 과정에서의 버그나 Side-effect의 해결이 쉽지 않습니다. 이런 고통(?)에 대한 공감은 어렵지 않은 일이죠. 그래서 등장한 것이 바로 Garbage Collection 입니다. Garbage Collection은 무려 1959년에 John McCarthy에 의해 Lisp에서 등장하는 역사를 가지고 있습니다. 벗어나는 이야기지만 Robert C. Martin은 Th..
변경에 강한 패턴 생뚱맞은 도입이지만 좋은 코드란 무엇일까요? 여러 설명들을 들 수 있지만 그중 꽤 많이 거론되는 덕목은 변경하기 용이한 코드입니다. 코드의 작성 시점에서 변경은 미래에 일어날 일입니다. 지금 그 요구를 다 안다면 기다릴 것 없이 코드에 반영하면 되지만 그렇지 않기 때문에 변경이 용이할 수 있다는 점은 쉽지는 않습니다. 한편으로는 그렇기에 코드를 변경하는 케이스들을 일반화하여 코드를 작성하는 시점에 어떤 변경 패턴을 대비하곤 합니다. 그리고 그런 방법 중에 Middleware 패턴을 코드 수준에서 이용해 보려고 합니다. 코드 흐름과 변경 먼저, 코드를 변경하는 패턴 중에는 코드가 진행하는 흐름에 대한 패턴을 짧게 살펴볼까 합니다. 대표적으로 then 의 의미를 사용하는 방식들을 찾아볼 수..