본문 바로가기

전체 글621

예상 트래픽 산정하기 (QPS와 RPS) 이 주제로 블로그를 작성한 이유 MongoDB 에서 컬렉션을 생성할 때, 효율적인 데이터 설계와 시스템 안정성 확보하기 위해 예상 트래픽을 산정하는 과정을 거친다.예상 트래픽을 통해 조회, 쓰기 요청의 비율을 파악할 수 있고조회 트래픽이 많다면 적절한 인덱스를 설계해 조회 속도를 최적화할 수 있다. (그렇다고 인덱스를 많이 만들면 쓰기 성능이 저하되므로 트래픽 패턴에 따라 필요한 인덱스만 설정하는게 좋다. ) 트래픽트래픽이란 서버를 통해 최종 사용자에게 전달된 데이터의 양을 말한다. 시스템을 설계할 때 트래픽을 예측하고 이에 적합한 설계를 하는것은 안정성과 성능을 보장하는데 중요하다.  QPS와 RPS 개념RPS 는 QPS 보다 더 상위 개념이다. (RPS  > QPS)QPS(Queries Per Sec.. 2024. 12. 23.
[Spring] Spring MongoTemplate에서 @LastModifiedDate와 Auditing 사용 mongoTemplate.updateFirst()를 사용하는 경우, Spring Data MongoDB의 Auditing 기능 (@LastModifiedDate, @CreatedDate)은 자동으로 적용되지 않는다. 이는 mongoTemplate가 @LastModifiedDate 어노테이션을 처리하는 AuditingEntityListener를 트리거하지 않기 때문이다.두개 동시 사용 관련된 내용  해결 방법mongoTemplate.updateFirst()를 사용할 때도 @LastModifiedDate와 같은 기능을 구현하려면, 업데이트 쿼리에서 명시적으로 lastModifiedDate 필드를 설정해야 합니다.  업데이트 시 직접 필드 추가mongoTemplate.updateFirst()를 사용할 때 현재.. 2024. 12. 2.
[Spring] MongoDB - MongoTemplate 과 Auditing Spring 에서 JPA Auditing 을 사용해 자동으로 값을 넣어주는 기능을 잘 사용하고 있었다.MongoDB 를 사용할 때도 Auditing 기능을 사용하고자 했는데 JPA 기반 Auditing 과 차이가 있었다.  Auditing 기능은 엔티티가 생성되거나 수정될 때 자동으로 특정 필드를 채워주는 기능이다. (createdAt, createdBy) Auditing과 mongoTemplate의 독립성Auditing은 repository 기반 데이터를 조작할 때만 자동으로 동작합니다.하지만 mongoTemplate.updateFirst()는 쿼리 기반으로 작동하므로 @LastModifiedDate를 사용해도 자동으로 업데이트 되지 않는다.Auditing 필드(createdAt, createdBy)가.. 2024. 12. 1.
[Spring] MongoDB 와 Redis 트랜잭션의 한계 와 대안 MongoDB와 Redis는 기본적으로 분산 트랜잭션이나 관계형 데이터베이스에서 사용하는 트랜잭션을 완벽하게 지원하지 않는다.두개를 동시에 사용하면서 데이터 변경 작업을 진행할 때 트랜잭션을 구현하는 것은 어렵다. 하지만 몇 가지 방법으로 트랜잭션과 유사한 일관성을 유지할 수 있다.  MongoDB의 트랜잭션 한계MongoDB는 기본적으로 단일 도큐먼트 수준의 원자성을 보장한다. 즉, 한 도큐먼트 내의 모든 쓰기 연산은 원자적으로 처리된다.MongoDB 4.0부터는 다중 도큐먼트를 대상으로 한 트랜잭션을 지원하지만, 다음과 같은 한계가 있다.Replica Set이나 Sharded Cluster 환경에서만 트랜잭션 사용 가능트랜잭션은 성능 저하를 야기할 수 있음기본적으로 트랜잭션은 60초 안에 완료되어야 .. 2024. 11. 29.
[Spring] Spring Web MVC, WebFlux 의존성 동시 사용 Spring Web MVC 와 WebFlux Reactive 환경에서 두 의존성을 같이 사용하면 문제가 발생한다.   동기/비동기 처리 방식 차이 MVC서블릿 기반 컨테이너 (Tomcat, Jetty 등) 사용 동기적 요청-응답 모델로 요청이 처리될 때까지 쓰레드가 블로킹됨WebFlux비동기 서버 사용 (Netty 등)Reactive Streams 사용요청-응답이 비동기적으로 처리되며 쓰레드 블로킹이 발생하지 않음 Spring Security 모듈 차이 MVC 와 WebFlux는 서로 다른 모듈을 제공한다. 두 모듈이 혼재하면 인증/인가 정보가 제대로 전달되지 않거나 null 로 처리될 가능성이 높다.MVC : spring-boot-starter-securityWebFlux : spring-securit.. 2024. 11. 28.
[Spring] Reactive MongoDB Stream의 Flux, Mono 조회 방법 비교 Reactive MongoDB 를 사용할 때 Flux, Mono 는 데이터를 처리하는 중요한 두가지 방식이다.   buffer 와 next 를 사용한 스트리밍 방식Flux dataStream = mongoTemplate.aggregate(aggregation, "result_data", ResultResponse.class);return dataStream .buffer(pageSize) // 요청한 사이즈만큼 버퍼링 .next() // 첫 번째 페이지만 가져오기 .defaultIfEmpty(Collections.emptyList()) // 데이터가 없을 경우 빈 리스트 반환 .map(res -> { String ne.. 2024. 11. 22.