public final class AdminPlayerTitleResponse { private AdminPlayerTitleResponse() { } public record Granted( Long playerId, Long titleId, String code, String name, String category, Instant acquiredAt ) { public static Granted of( Long playerId, Long titleId, String cod..
전체 글
@ConditionalOnBean — 스프링 자동 구성에서의 조건부 빈 등록Spring Boot에서는 환경(프로파일, 의존성 유무, 설정 상태)에 따라 특정 빈(bean) 을 자동으로 등록하거나 생략할 수 있습니다.@ConditionalOnBean은 그중에서도 “특정 빈이 이미 존재할 때만” 새로운 빈을 등록하는 조건부 애노테이션입니다.1. 기본 개념@ConditionalOnBean→ 지정한 타입(또는 이름)의 빈이 이미 컨텍스트에 존재할 때만 현재 빈을 등록한다.즉, “A라는 빈이 등록되어 있으면 B도 등록해라”라는 의미입니다.반대로, “A가 없을 때는 등록하지 말라”는 것입니다.2. 예시 코드 @Component@ConditionalOnMissingBean(ChatRealtimeGateway.clas..
카카오 테크 기술 블로그를 읽고 조회까지 트랜잭션이 열리는 이유, SimpleJpaRepository의 기본 정책,제가 구상한 Reader–Writer 분리 전략까지 정리했습니다.1️⃣ SimpleJpaRepository는 어디까지 트랜잭션을 잡는가?Spring Data JPA에서 우리가 사용하는 JpaRepository의 기본 구현체는 SimpleJpaRepository입니다.이 클래스가 바로 트랜잭션의 기본 정책을 정의하고 있습니다. @Transactional(readOnly = true) public class SimpleJpaRepository implements JpaRepository { @Transactional public S save(S entity) { ... } }클래스 레벨에 @T..
문제상황Transaction -> [Service[Writer(합류)]]Mandatory로 인해 Service 트랜잭션에 합류되어 최종 반영은 서비스 이후가 됌즉, ModifiedDate는 트랜잭션이 커밋되는 순간에 반영그렇게 되면 Service에서 Info로 updated_at을 내보낼시 변경시간은 반영이 되지 않는 TOCTOU 문제가 생김GuildService { @Transactional public GuildResult.Info changePolicy(Long playerId, Long id, GuildCommand.ChangePolicy command) { Guild guild = guildReader.getOwned(playerId, id); return G..
브라우저는 모든 페이지에 자동으로 /favicon.ico 를 요청해요.리소스가 없으면 404가 나고, 설정에 따라 NoResourceFoundException 로그가 남습니다.아래 단계만 따라하면 조용하고 깔끔하게 정리됩니다. 1) 증상로그에 이런 메시지가 반복해서 찍힘:org.springframework.web.servlet.resource.NoResourceFoundException: No static resource favicon.ico.혹은 필터/핸들러에서 404(가끔 500처럼 보이는 로그)로 기록됨.2) 원인브라우저가 탭 아이콘을 표시하려고 항상 /favicon.ico 를 요청정적 리소스 폴더에 파일이 없으면 404전역 예외 처리에서 이 404를 잡아 로그를 쌓거나 다른 응답으로 바꿀 수도 있..
1) WebFlux란?정의: Spring의 논블로킹 리액티브 웹 프레임워크. Reactor(Mono/Flux) 기반으로 동작하며 기본 서버로 Reactor Netty를 사용.쓰임새I/O-bound 고동시성: 외부/내부 API, 파일, Redis 등 대기 시간이 긴 I/O를 동시에 많이 처리할 때 효율적스트리밍 응답: SSE/WebSocket/서버-push, 무한 스트림리액티브 스택: R2DBC, Reactive Redis/Kafka 등과 자연스럽게 연동언제 굳이 안 쓰나CPU-bound 위주, JPA(블로킹) 중심 CRUD 위주의 일반 백오피스팀이 리액티브 운영·디버깅 복잡도를 감당할 이유가 없을 때(주의) 리액티브 체인 안에 **블로킹 호출(JPA/외부 SDK)**을 섞으면 이점이 사라짐 → 필요 시 ..