목차
1.
Spring Boot 핵심 아키택처 사고방식
2.
구성/환경: 프로퍼티, 프로파일, 바인딩의 정석
3.
빈/DI/AOP: 생성자 주입, 라이프사이클, 트랜잭션
4.
웹 계층: MVC 내부 동작, 예외 처리, 검증
5.
데이터 계층: JPA 핵심, 트랜잭션, N+1, 성능
6.
캐시/비동기/스케쥴링/리트라이
7.
보안: Spring Security 필터 체인과 JWT
8.
관측성/운영: Actuator, 로그, 메트릭, 트레이싱
9.
실무 노하우 모음(성능/DB/배포/테스트)
1. Spring Boot 핵심 아키텍처 사고방식
•
Auto-Configuration: spring-boot-starter-* 의존성을 기준으로 조건부 설정을 자동 적용. 필요 시 @Configuration + @ConditionalOn* 로 확장/우회.
•
Convention over Configuration + Externalized Configuration
◦
기본값을 사용하되, 런타임에 환경변수/프로퍼티 제어.
•
레이어드 아키텍처 vs 헥사고날(포트/어댑터):
◦
MVC(Service/Repository)에서 출발하고 복잡해지면 도메인 중심 + 포트/어댑터 분리
•
Bean 생명주기: 컨테이너 시작 → 빈 등록/주입 → 초기화 → 소멸.
◦
SmartLifeCycle, @PostConstruct, InitializingBean 등 활용.
원칙: 도메인 규칙은 프레임워크와 느슨하게 결합. 기술 의존은 바깥(어댑터)으로 밀어내고,
핵심 로직은 순수 자바로 유지.
2. 구성/환경: 프로퍼티, 프로파일, 바인딩 정석
•
프로파일:
◦
application.yml, application-dev.yml, application-prod.yml 로 분리.
◦
spring.profiles.active=dev.
•
타입 셰이프 바인딩:
◦
@ConfigurationProperties(prefix="app") 클래스로 묶고, 생성자 바인딩(Spring Boot 3 에서는 기본적으로 생성자 바인딩 권장)으로 불변 객체 구성. @Value는 단일 값/간단한 치환에 한정.
•
우선순위:
◦
명령줄 > 환경변수 > application-* > application > @PropertySource.
•
비밀관리:
◦
환경변수/전용 Valut/KMS/Parameter Store 사용. 코드/리포에 민감정보를 남기지 않기.
3. 빈/DI/AOP/트랜잭션
•
주입: 필드 주입 금지, 생성자 주입 고정. 순환참조 감지 용이.
•
스코프: 기본 singleton. 요청 데이터는 request, 멀티스레드에 올리면 안 됨.
•
AOP: 횡단 관심사(로깅/트랜잭션/리트라이/성능 계측) 분리. 스프링은 주로 프록시 기반.
•
@Transaction 규칙
◦
public 메서드에 적용, self-invocation 미적용
(같은 클래스 내부 호출 시 트랜잭션 안 걸림 → 구조 분리)
◦
읽기 전용 읽기 경로에 readOnly=true 로 힌트 제공(플러시 최적화). 쓰기 경로와 분리.
◦
전파(Propagation): 기본 REQUIRED, 메시징/배치에서 REQUIRES_NEW 등 신중히.
◦
격리수준: DB 기본을 따르되 반복 읽기가 필요할 때만 조정.
4. 웹 계층: MVC 내부 동작, 예외 처리, 검증
•
MVC 파이프라인: DispatcherServlet → HandlerMapping → HandlerAdapter → Controller → ViewResolver.
•
DTO: 엔티티 노출 금지. 요청/응답 DTO 분리, 검증 애노테이션(@NotNull, @Size 등)과 그룹 사용.
•
전역 예외 처리: @ControllerAdvice + @ExceptionHandler 로 표준 오류 응답(예: LT-402 application/problem + json 유사 포맷) 통일.
•
검증: @Validated + 그룹, 바인딩에 실패한 필드/메시지를 일관 포맷으로 리턴.
•
파일 업/다운로드: 스트리밍 처리(InputStreamResource)와 타임아웃/메모리 한계 고려.
5. 데이터 계층: JPA 핵심, 트랜잭션, N+1, 성능
•
영속성 컨텍스트: 1차 캐시/변경감지/지연쓰기. 트랜잭션 경계 내부에서만 엔티티 그래프 탐색.
•
지연 로딩(LAZY) 기본 + N+1 주의: 해결은 fetch join, @EntityGraph, DTO 프로젝션.
•
벌크 연산: JPA 벌크는 컨텍스트를 우회하므로 실행 후 clear 필요.
•
식별자 전략: 대량 삽입 시 IDENTITY 는 배치 비효율. SEQUENCE + allocationSize 조정 or UUID 적용(성능/정렬 고려 시 UUID v7 버전 도입하면 좋음).
•
페이지네이션: 트래픽이 커질수록 키셋 페이지네이션(seek) 고려해야 함. 오프셋은 후반 페이지에서 느려짐.
•
인덱스: 읽기 패턴 기반 다중컬럼 인덱스 확인. 마이그레이션은 Flyway로 이력 관리.
6. 캐시/비동기/스케쥴링/리트라이
•
Spring Cache
◦
@Cacheable (읽기)
◦
@CachePut (쓰기반영)
◦
@CacheEvict (무효화)
◦
키 전략/만료/직렬화 포맷(JSON/SMILE) 명시
•
비동기
◦
@Async + 전용 TaskExecutor (코어/큐/reject 정책). 컨텍스트 전달/트랜잭션 전파 주의.
•
스케쥴링
◦
@Scheduled(cron=. . .) 와 클러스터 환경에서 단일 실행 보장(분산락/리더선출) 필요.
•
Resilience4j
◦
@Retry, @CircuitBreaker, @RateLimiter, @TimeLimiter 로 외부 연동 보호.
7. 보안: Spring Security 필터 체인과 JWT
•
구분: 인증(Authentication) vs 인가(Authroization). 필터 체인에서 JWT 검증 필터는 UsernamePasswordAuthenticationFilter 앞/뒤 적절 위치.
•
OncePerRequestFilter로 토큰 파싱 → Redis/DB 검증 → SecurityContextHolder에 주체 설정.
•
CORS/CSRF: REST API는 CSRF 비활성 + CORS 정밀 허용. HSTS/HTTPS 강제.
•
권한 모델: @PreAuthorize("hasRole('ADMIN')") 등 메서드 보안 활성화.
8. 관측성/운영
•
Actuator: health-check, 쓰레드/히카리/Hikari, 캐시 지표, 환경 노출 범위 최소화.
•
Micrometer + OpenTelemetry: 메트릭/트레이싱 통합. 요청-ID(Log MDC)로 로그-트레이스 연계.
•
구조적 로그: JSON 로그 + 상관관계ID 추적. 샘플링/마스킹.
•
그레이스풀 셧다운: server.shutdown=graceful, 종료 훅에서 작업 마무리.
9. 실무 노하우 모음
•
HTTP 타임아웃
◦
클라이언트/서버 양쪽에 적절한 타임아웃 설정(WebClient/RestClient)
•
연결풀: HikariCP 커넥션 부족 경보/메트릭 모니터링. maxLifetime < DB wait_timeout.
•
API 버저닝/호환: V1→V2 이행 시 contract test 도입.
•
Idempotency: POST 멱등키로 안전하게 재시도할 수 있도록 구성.
•
메시징: 정확히 한 번 처리하는 대신 At-Least-Once + Outbox 패턴 적용.
•
파일/이미지: S3 pre-signed URL, 대용량은 멀티파트 업로드.
•
테스트: Testcontainer로 DB/Kafka 등 유사한 환경을 구축하여 @DataJpaTest, @WebMvcTest 슬라이스.
•
도커 실행옵션: JVM 메모리 제한(-XX:MaxRAMPercentage), GC 로그 비활성/활성 전략.