TIL - 20260208

juni·2026년 2월 7일

TIL

목록 보기
262/316

0208 스프링 부트 프로젝트 회고 및 종합 복습


✅ 1. 프로젝트 아키텍처 종합 복습

  • 이번 프로젝트는 현대적인 웹 애플리케이션의 표준적인 아키텍처를 따라, 각 기술 요소가 명확한 책임을 가지고 유기적으로 동작하도록 구축되었습니다.

➕ 전체 흐름

  1. [클라이언트] 사용자가 웹 브라우저에서 https://my-app.com에 접속합니다.
  2. [DNS] DNS 서버가 도메인을 서버의 고정 IP 주소로 변환해줍니다.
  3. [웹 서버: Nginx] 서버의 Nginx가 443 포트(HTTPS)로 요청을 받습니다.
    • SSL/TLS 처리: Let's Encrypt로 발급받은 인증서를 통해 암호화된 통신을 처리합니다.
    • 리버스 프록시: 받은 요청을 내부적으로 localhost:8080에서 실행 중인 Spring Boot 애플리케이션으로 전달합니다.
  4. [애플리케이션 서버: Spring Boot]
    • Spring Security Filter: 요청이 컨트롤러에 도달하기 전에, JwtAuthenticationFilterAuthorization 헤더의 JWT를 검증하여 인증을 처리합니다.
    • Controller: 요청을 받아, @Valid유효성을 검증하고, 비즈니스 로직 처리를 Service에 위임합니다.
    • Service: @Transactional 하에 비즈니스 로직을 수행하고, JPA Repository를 통해 데이터베이스와 상호작용합니다.
    • JPA/Hibernate: 서비스 계층의 요청을 실제 SQL로 변환하여 RDS(MariaDB)에 실행합니다.
  5. [응답] 처리 결과는 역순으로 클라이언트에게 전달되며, @RestControllerAdvice가 중간에 발생하는 예외를 전역적으로 처리하여 일관된 에러 응답을 보냅니다.

✅ 2. 핵심 기술 스택 및 역할 재정리

기술/개념역할왜 사용했는가?
Spring Boot애플리케이션의 핵심 프레임워크자동 구성, 내장 WAS 등으로 Java 웹 개발을 빠르고 간편하게 만들어 줌.
Spring Data JPA데이터 영속성 관리JpaRepository를 통해 반복적인 CRUD 코드를 제거하고, 객체 지향적으로 DB를 다룰 수 있게 함.
Spring Security인증(Authentication) 및 인가(Authorization)필터 기반으로 동작하여, 선언적인 방식으로 애플리케이션의 보안을 강력하게 제어.
JWTStateless 인증 토큰세션 방식의 한계를 극복하고, 서버 확장성 및 MSA 환경에 유리한 인증 방식.
DTO (Data Transfer Object)계층 간 데이터 전달Entity를 보호하고, API 스펙을 안정적으로 유지하며, 무한 루프를 방지.
Nginx리버스 프록시 웹 서버SSL 처리(Offloading), 로드 밸런싱, 무중단 배포의 기반을 마련하여 WAS를 보호하고 성능을 향상.
AWS EC2 / RDS클라우드 인프라애플리케이션 서버(EC2)와 데이터베이스 서버(RDS)를 분리하여, 관리 효율성과 확장성을 높임.
Swagger (OpenAPI)API 문서 자동화코드 기반으로 항상 최신 상태의 API 문서를 유지하여, 협업 효율성을 극대화.
CI/CD (GitHub Actions)빌드/배포 자동화Git 푸시만으로 테스트, 빌드, 배포 전 과정을 자동화하여, 신속하고 안정적인 서비스 제공.

✅ 3. 프로젝트를 통해 배운 것과 아쉬운 점

➕ 배운 점

  • 계층형 아키텍처의 중요성: Controller, Service, Repository의 역할 분리가 왜 필요한지, 그리고 DTO를 통해 계층 간 데이터를 전달하는 것이 얼마나 중요한지 체감했습니다.
  • 선언적 프로그래밍의 힘: Spring의 어노테이션(@Transactional, @Cacheable, @Scheduled)들이 AOP를 통해 어떻게 복잡한 로직을 단순화시키는지 이해했습니다.
  • 인프라와 애플리케이션의 연결: 개발된 코드가 실제 서버(EC2)에 올라가고, 웹 서버(Nginx)와 데이터베이스(RDS)와 연동되며, 도메인(DNS)을 통해 서비스되기까지의 전체적인 흐름을 파악할 수 있었습니다.
  • 자동화의 필요성: CI/CD 파이프라인을 구축함으로써, 반복적이고 실수하기 쉬운 배포 작업을 자동화하는 것이 얼마나 개발 생산성을 높이는지 경험했습니다.

➕ 아쉬운 점 및 향후 개선 방향

  1. 테스트 코드의 부족: 기능 구현에 집중하느라 다양한 시나리오에 대한 단위 테스트 및 통합 테스트를 충분히 작성하지 못했습니다. 특히, Testcontainers를 활용하여 실제와 동일한 환경에서 DB 통합 테스트를 진행해보고 싶습니다.
  2. 성능 모니터링 및 튜닝 부재: nGrinder와 같은 부하 테스트 도구를 사용하여 API의 성능을 측정하고, JVM 튜닝, 커넥션 풀 최적화, 쿼리 튜닝 등을 통해 병목 지점을 개선하는 경험이 필요합니다.
  3. 컨테이너 오케스트레이션의 미적용: 현재는 단일 EC2 인스턴스에 배포하는 방식이지만, 실제 운영 환경을 고려하여 Docker ComposeKubernetes(EKS)를 도입하여 더 높은 가용성과 확장성을 확보하는 아키텍처로 발전시키고 싶습니다.
  4. 고급 기능 추가: 메시지 큐(RabbitMQ, Kafka)를 이용한 비동기 처리, 분산 캐시(Redis)를 통한 성능 향상 등 더 고도화된 기술을 적용하여 시스템을 개선해보고 싶습니다.

📌 최종 요약

이번 프로젝트를 통해, 단순히 Java와 Spring 문법을 아는 것을 넘어, 하나의 웹 서비스가 탄생하고 운영되기까지 필요한 Full-Stack 기술 요소들을 종합적으로 경험할 수 있었습니다. 특히, 애플리케이션 코드뿐만 아니라 이를 둘러싼 인프라, 배포, 보안, 모니터링의 중요성을 깨닫는 계기가 되었습니다. 앞으로는 부족했던 테스트와 성능 최적화 부분을 보강하고, 컨테이너 오케스트레이션과 같은 클라우드 네이티브 기술을 더 깊이 학습하여, 더 안정적이고 확장성 있는 시스템을 설계하고 구축하는 역량을 키워나가야겠습니다.

0개의 댓글