'Development/Diary' 카테고리의 글 목록
본문 바로가기

Development/Diary

(32)
[Diary] 신입 개발자의 오픈소스 컨트리뷰트 해보기 - Spring Data JPA 이번 글에서는 제가 Spring Data JPA에 기여하기 위해 겪은 과정을 소개합니다.Issue 찾기어느 오픈 소스던, Issue는 있기 마련입니다. 완벽한 소프트웨어는 없으니까요!우선 기여할 오픈 소스 레포지토리를 찾아봅시다.어떤 오픈 소스에 Issue를 선정할 것 인지는 우선 본인이 자주 쓰는 오픈 소스이며, 익숙한 프로그래밍 언어를 사용할수록 이슈를 해결하기 좋을 것입니다. 저는 Spring Data JPA에서 찾아보았습니다.Spring Data JPA는 Spring 프레임워크에서 JPA(Java Persistence API) 기반의 데이터 접근을 더 간단하고 효율적으로 구현하기 위한 라이브러리입니다. ORM(Object Relational Mapping)을 지원하며, 데이터베이스와의 상호작용을 ..
[Diary] Elastic Search로 100만 데이터 검색 속도 향상시키기 이 글에서는 상품 서비스에 CQRS 패턴을 적용하고, Query를 위해 Elasticsearch를 적용한 것을 다룹니다.문제 상황: RDBMS의 Full Scan 동작으로 인한 상품 검색 성능 저하기존의 상품 검색의 구현은 위와 같이 QueryDSL로 쿼리가 작성되어 있었습니다.주목해야 하는 코드는 containsIgnoreCase입니다. containsIgnoreCase 조건은 productName 필드 내에서 키워드를 위치와 상관없이 검색하므로 RDBMS에서는 일반적으로 앞에 와일드카드가 포함된 (% keyword%) 검색을 수행하게 됩니다. 이러한 검색은 인덱스를 사용할 수 없게 만들어, RDBMS가 테이블의 모든 productName을 평가해야 하기 때문에 전체 테이블 스캔을 하게 됩니다.실행 계..
[Diary] INSERT 동작에 동시성 문제 해결 일대기 이 글에서는 설문조사 웹 서비스 백엔드를 개발하면서 해결했던 INSERT 동작에 동시성 문제를 해결하는 과정을 소개합니다.문제 파악: 의도치 않은 동일 설문조사 생성 방지설문조사 생성 시 포인트가 필요하기 때문에 불필요한 중복 생성은 사용자 경험에 악영향을 미칠 수 있습니다.예를 들어, 동일 사용자가 동일한 설문조사 요청을 여러 개 보낼 경우를 생각해 보면 사용자가 설문조사를 생성하는 버튼을 여러 번 클릭할 수 있고, 이는 네트워크 지연으로 인해 응답이 늦어질 때 더 흔하게 발생할 수 있습니다.따라서 중복 생성이 발생하지 않도록 효과적인 동시성 제어가 필요했습니다. 이를 해결하지 않으면 사용자에게 의도치 않은 포인트 소모 및 중복 데이터 생성 문제가 발생할 위험이 있었습니다.대안 1: 비관적 락을 사용해..
[Diary] 300만 데이터 전체 조회 성능 개선기 (projection, 테이블 최적화) 이 글에서는 프로젝트를 진행하면서 간단한 방법으로 성능 개선을 수행했던 방법들을 소개하고자 합니다. 테스트 데이터는 300만개 입니다.소프트 삭제 정책에 따른 삭제 테이블 분리하기소프트 삭제(Soft Delete)란 데이터베이스에서 실제로 데이터를 삭제하지 않고, 대신 해당 데이터가 삭제된 것처럼 처리하는 방식입니다. 이를 위해 보통 데이터 테이블에 is_deleted와 같은 플래그(삭제 여부를 나타내는 필드)를 추가하고, 해당 값이 true로 설정된 경우에는 해당 데이터를 "삭제된" 것으로 간주합니다. 따라서 매 조회 쿼리 마다 is_deleted = false라는 조건을 추가해야 하는데, 조건을 추가한다는건 결국엔 DBMS가 추가적으로 작업을 시키게 됩니다. 모든 조회 쿼리에 이 조건을 추가하는 것은..
[Diary][Spring]GitHub Actions로 단위 테스트 환경 구성하기 (Github Service Container) MSA 프로젝트에서 테스트는 특히 외부 의존성을 많이 사용하게 될 경우 복잡해집니다. Redis, DB, Kafka 등 외부 리소스가 있다면, Mocking이나 다수의 서버 및 컨테이너 구동이 필수적이라, 테스트를 생략하고 PR을 진행하는 경우도 빈번하게 발생합니다. 이 글에서는 GitHub Actions를 통해 실제 개발 환경을 자동으로 구성하여 테스트를 자동화하는 방법을 소개합니다.문제 상황: gradle build -x test초기 CI 구성 시에는 gradle build -x test 명령어로 테스트를 건너뛰었다. 외부 Redis, DB, Kafka 등의 의존성이 테스트 중 연결되어야 하는데, 이로 인해 테스트 시 에러가 발생하기 때문이다. 그러나 이렇게 테스트를 생략하면, 서버 실행 후 발생할 ..
[Diary] Apache Cassandra에서 MongoDB 전환기 저는 이커머스 개발 프로젝트에서 배송 도메인의 대한 데이터베이스로 Apache Cassandra를 처음에 선택했는데요, 얼마 지나지 않아 MongoDB로의 마이그레이션을 결정했습니다.이 글에서는 데이터베이스를 선택하면서 했던 고민들을 작성합니다.일단, 왜 NoSQL?쓰기 성능 최적화NoSQL은 설계상 많은 양의 쓰기 작업에 대해 높은 성능을 발휘하도록 최적화되어 있다. NoSQL의 쓰기 성능이 RDBMS보다 빠른 이유는 데이터 일관성 요구 사항을 완화하고, 복잡한 스키마 및 트랜잭션 처리를 배제한 설계 덕분에 쓰기 시 오버헤드가 적기 때문이다.유연한 스키마와 데이터 모델링배송 경로가 자주 추가, 업데이트된다면 NoSQL의 유연한 스키마가 적합하다. NoSQL에서는 구조가 고정되지 않아 데이터를 효율적으로..
[Diary] Domain Driven Design에서 Spring Data Repository 의존성 역전하기 개발을 진행하면서 Repository는 데이터베이스와의 연동을 담당하는 핵심 구성 요소로 사용됩니다.일반적으로 Spring Data JPA를 사용하여 JpaRepository가 있죠. 이를 상속받아 필요한 DB CRUD 기능을 구현하게 됩니다.그렇다면 Domain Driven Design(DDD)에서는 이러한 Repository 클래스들이 어느 계층에 위치해야 할까요? 그리고 어떤 구조로 구현하는 것이 이상적일까요?이 글에서는 Repository에 대한 의존성 역전(DIP)을 구현하는 방법과 그 이유에 대해 자세히 다루고자 합니다.RepositoryRepository는 애플리케이션에서 데이터 접근 계층을 담당하는 핵심 구성 요소이다.데이터베이스와의 상호 작용을 추상화하여 비즈니스 로직이 데이터 저장소의 ..
[Diary][Spring] Spring Data Cassandra에서 @CreatedDate가 안 되는 문제 해결 (Spring Data는 이 데이터가 새 데이터인지 모른다.) Spring Data Cassandra을 사용하면서, @EnableCassandraAuditing를 적용해도 @CreatedDate 필드에 값이 들어가지 않고 null이 저장되는 문제가 발생했습니다. 이 글에서는 문제 상황 및 원인을 분석하고 해결합니다.문제 상황: @EnableCassandraAuditing를 적용해도 null이 들어간다.감사 레코드를 삽입하기 위해 다음과 같이 BaseEntity를 구현했다.이를 Cassandra DB 테이블에 매핑할 클래스에 상속받았다.이후 Auditing을 활성화하기 위해 @EnableCassandraAuditing을 적용했다.또한 @CreatedBy, @LastModifiedBy를 사용하기 위해 getCurrentAuditor를 임시로 구현했다.테스트를 위해 @I..