Backend
home

Java Spring Boot 개발자가 알아야 할 것들

생성 일시
2025/09/13 12:32
태그
SpringBoot
게시일
2025/09/13
최종 편집 일시
2025/09/13 13:53

목차

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 로그 비활성/활성 전략.