본문 바로가기

백엔드/Spring131

[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.
[Spring] ReactiveMongoTemplate vs ReactiveMongoRepository ReactiveMongoTemplate과 ReactiveMongoRepository는 반응형 MongoDB 작업을 수행하는 두 가지 주요 방식이다. ReactiveMongoRepository를 사용해야 하는 경우ReactiveMongoRepository는 주로 기본적인 CRUD 작업을 간편하게 처리할 때 유용하다.단순한 조회, 저장, 삭제 등의 작업이 자주 필요할 때는 repository가 더 직관적이고, 필요한 메서드들이 미리 정의되어 있어 코드가 간결해진다. 단순한 CRUD 작업: 기본적인 조회(findById, findAll), 저장(save), 삭제(deleteById) 등의 작업메서드 이름을 통한 쿼리 정의: findByName, findByStatus 등 메서드 이름만으로 간단한 조건 기반 조.. 2024. 11. 7.