핵심 로직 변경에 따른 문제 발생과 해결 문제 - 가독성 저하 현재 사내에서 운영하는 서비스에는 사용자의 요청을 받으면 엔티티를 생성해 저장하고 메시지 큐에 발행한다라는 핵심 로직이 존재한다. 이 코드는 처음에는 아주 짧았고, 가독성도 나쁘지 않았다. 그러나 기획이 추가됨에 따라 해당 코드에는 여러 부가 로직들이 추가되었다. 엔티티의 생성 후 또다른 엔티티를 생성해야 하기도 하고, 메시지 큐에 발행하기 전 엔티티에 특정 변환 작업이 추가되기도 했다. 기획이 변경됨에 따라 이러한 변경 사항은 추가되기도, 다시 제거되기도 하며 핵심 로직을 포함한 클래스에 다양한 변경을 일으켰다. 그러다보니 코드는 점점 길어지고 가독성도 나빠졌다. 수정이 잦으니 여러 사람의 작업에 의해 conflict가 발생할 때도 많아졌고..
외부 API 호출이 포함된 비즈니스 로직의 테스트 테스트를 작성하는 과정에서, 우리는 항상 특정 의존 모듈에 대하여 2가지 중 하나를 선택해야 합니다. 실제 모듈을 주입받아 사용 해당 모듈의 모의 객체(Mock)를 생성하여 사용 내부 모듈로부터 수행되는 비즈니스 로직인 경우 둘 중 어느 쪽을 택하든 테스트를 구성하는 데에 문제는 없습니다. 하지만 외부에서 구동되는 서버의 API를 호출하는 경우에는 이야기가 다릅니다. 1번 방법(실제 모듈 사용)을 택해 실제 API 호출이 이루어지는 방향으로 테스트 코드를 작성하게 되면 아래와 같은 문제가 발생할 수 있습니다. 외부 API 서버의 상태에 의존 - 외부 API의 이용 가능 여부에 따라 테스트의 성패가 결정된다. 에러 상황을 테스트하기 어려움 - 외부 API가..
이펙티브 자바란? 자바 개발자의 필독서라고 불리는 책. 자바의 기본 문법에 대해 다루기보다는 어떤 상황에서 어떤 방법으로 문제를 해결해나가면 좋을지에 대한 가이드를 해 주는 책이다. 그렇기 때문에 언어의 문법에 대해 다루는 책보다는 난이도가 있는 편으로, 나 역시 첫 번째 시도 때에는 초반부를 읽다가 어려워서 책을 덮고 현업에서 일한지 만 1년이 다 되어가는 이 시점에서야 1회독을 한 책이다. 또한, 책 구성도 그러하고 저자 역시 권장하듯 순서대로 읽지 않고 원하는 아이템을 먼저 읽어도 되며, 다회독을 하는 것도 좋아 보인다. 나 역시 1회독에는 순서대로 읽으며 카테고리별 팁을 얻는 데에 집중했고, 2회독부터는 미리 정리해둔 요약집을 기반으로 그때그때 필요한/흥미가 가는 내용들을 골라 읽을 예정이다. 이..
드디어 가상 스레드가 도입된 Java의 새 LTS 버전이 출시되었다. 이번 포스팅에서는 이 Java 21의 주요 변경점들을 정리해보았다. Java 21? 2021년 출시된 Java 17 이후 2년만에 출시된 Java의 4번째 LTS(Long Term Support) 버전 주요 변화는 다음과 같다. Sequenced Collections Virtual Thread Record, Switch 개선 1. Sequenced Collections 기존 컬렉션은 순서를 다루기 불편함 기존 컬렉션 프레임워크는 컬렉션 내 원소들에 순서가 존재할 때 사용되는 문법이 제각각이고, 일부는 가독성도 좋지 않았다. 예를 들어, List 인터페이스의 첫 번째와 마지막 원소 접근 코드는 아래와 같다. List wordList = ..
Introduction 저는 현재 주문제작 케이크 업체 탐색 서비스 “당도”의 백엔드 개발을 담당하고 있습니다. 당도에서는 사용자들이 원하는 업체를 빠르고 효율적으로 찾아낼 수 있도록 업체 검색 시 다양한 필터를 제공하고 있는데요. 제공되는 필터의 종류는 다음과 같습니다. 업체가 만드는 케이크의 카테고리 (꽃, 캐릭터, 레터링 등) 업체가 판매하는 메뉴의 최소/최대가 업체가 제공하는 외부 서비스 링크의 종류 (카카오톡 채널, 인스타그램 등) 케이크 수령 방식 (배송, 픽업) 업체 검색 API는 이러한 조건들을 모두 고려하여 제공할 데이터를 구성하게 되는데요. 이러한 조건을 적용한 쿼리는 Spring Data JPA의 Query Method 방식으로 생성하기에는 너무 많은 조건을 가지고 있었습니다. 그렇다..
Introduction 나는 2021년 12월 무렵부터 TIL(Today I Learned) 이라는 Github Repository를 관리하고 있다. 기술 블로그를 따로 운영함에도, 학습 내용을 TIL에 정리하게 된 이유는 다음과 같다. 블로그에는 잘 정리된 포스팅 형태로 글을 게시하고 싶었기 때문에, 정말 날 것 그대로의 학습 내용을 저장할 장소가 필요했다. 마크다운 문서를 예쁘게 보여줬으면 좋겠으므로, 먼저 Notion을 이용해 학습 정리를 하게 되었다. 그러나 Notion은 학습 내용을 여러 사람에게 공유하기 어려워(단순히 문서를 Public으로 설정하는 것은 접근성이 떨어질 것 같아) Github Public Repository를 별도로 운영하게 되었다. Problem 그러나 개인적으로 생각하는 ..
필요한 HTTP Header 브라우저 캐싱을 도입하기 위해서는 아래의 헤더들이 설정되어야 한다. Cache-Control 브라우저의 캐싱 방법을 정하기 위해 서버/클라이언트가 사용하는 HTTP Header 캐시의 저장 여부, 유효 시간 등을 지정할 수 있음 자주 사용하는 디렉티브(directive) 목록 public/private: public은 이 리소스를 받는 모든 주체가 캐싱을 하도록 하고, private는 오직 end-user(마지막 수신자)만이 캐싱을 하도록 함 must-revalidate: 반드시 재검증을 거쳐 캐시된 리소스를 사용하도록 함 max-age=: 캐시가 유효하다고(최신 상태라고) 판단할 최대 시간 E-Tag 리소스를 식별하는 식별자 역할을 하는 HTTP Header response..