⏳ Time Log/1. One Day (Daily · TIL)

Day 50 (12/29) - 개발 일지: Spring AOP 심화 및 부트 환경 구축

this.Serena 2026. 2. 23. 02:48

📅 2025-12-29 개발 일지: Spring AOP 심화 및 부트 환경 구축

핵심 요약: 스프링 AOP와 트랜잭션의 구조적 이해를 바탕으로 Spring Boot 쇼핑몰 프로젝트 착수 및 효율적인 개발 환경 설정

 


1. Spring 6 Legacy: AOP 및 트랜잭션 복습

  • AOP (Aspect Oriented Programming): 관점 지향 프로그래밍을 통한 핵심 로직과 부가 기능(로깅, 보안 등)의 분리
  • 주요 설정 및 어드바이스(Advice):
    • @Before: 타겟 메서드 실행 전 공통 로직 수행 (JoinPoint 파라미터 활용)
    • @Around: 메서드 실행 전후를 모두 제어하는 가장 강력한 어드바이스
  • 트랜잭션(Transaction) 관리:
    • spring-tx 라이브러리를 통한 선언적 트랜잭션 설정
    • 데이터 무결성 보장을 위한 비즈니스 로직 단위의 트랜잭션 적용

2. Spring Boot & JPA 프로젝트 착수

  • Spring Initializr 활용: start.spring.io를 통한 신속한 부트 프로젝트 뼈대 생성
  • 신규 프로젝트: 스프링 부트 쇼핑몰 프로젝트 (with JPA) 학습 시작
  • IDE 환경 구축: IntelliJ 초기 설정 및 JPA 연동을 위한 프로젝트 생성 완료

3. Windows 시스템 관리: 8080 포트 강제 종료

  • 상황: 포트 충돌로 인한 서버 실행 불가 시 PID 확인 및 프로세스 종료
  • 실행 명령어 (관리자 권한 CMD):
    1. PID 확인: netstat -ano | findstr :8080
    2. 프로세스 강제 종료: taskkill /f /pid [확인된 PID]
    3. 검증: tasklist /svc /FI "PID eq [PID]" (프로세스 명칭 최종 확인)

☕ Java 문법 최적화: 람다와 메서드 참조

1. 람다식 (Lambda Expression)

  • 형태: list.forEach(m -> log.info(m))
  • 특징: 데이터를 어떻게 처리할지 로직을 직접 명시하는 유연한 방식

2. 메서드 참조 (Method Reference)

  • 형태: list.forEach(log::info)
  • 특징: 기존에 정의된 메서드를 그대로 사용할 때 코드를 극도로 간결하게 줄여주는 방식

🗂️ 핵심 개발 메모

  • 학습 흐름: 레거시 AOP 개념 정립 후 최신 스프링 부트 및 JPA 환경으로의 기술 전환 진행
  • 환경 설정: 인텔리제이 숙련도 향상 및 포트 충돌 등 개발 중 발생하는 시스템 이슈 대응력 강화
  • 코드 스타일: 람다식과 메서드 참조의 차이를 이해하고 가독성 높은 코드 작성 지향

 

🚀 Spring AOP 및 트랜잭션(Transaction) 핵심 개념 정리

1. Spring AOP (관점 지향 프로그래밍) 개념 및 구조

  • 도입 목적: 애플리케이션 전반에 걸쳐 반복되는 횡단 관심사(로깅, 트랜잭션 처리 등)를 메인 비즈니스 로직에서 분리하여 모듈화
  • 주요 AOP 용어 정리
용어 (Term) 상세 설명
Aspect 횡단 관심사를 하나로 묶어 담은 모듈 (@Aspect 클래스)
Advice 부가 기능 코드가 언제 실행될지 결정하는 실제 로직 (@Before, @Around 등)
Join Point AOP 로직이 적용될 수 있는 모든 메서드 실행 후보 지점
Pointcut 수많은 Join Point 중 실제 Advice를 적용할 지점을 선택하는 필터링 표현식
Weaving Aspect 코드를 대상 타겟 객체에 성공적으로 삽입하고 결합하는 과정
  • Weaving(위빙) 적용 시점:
    • 컴파일 타임: AspectJ 컴파일러를 통한 정적 결합
    • 로드 타임: JVM 클래스 로딩 시점 결합
    • 런타임: Spring의 동적 프록시(Dynamic Proxy) 방식을 활용한 결합 (가장 대중적이고 일반적인 방식)

 

2. AOP Advice 종류 및 실행 시점

  • Pointcut 표현식: execution(), within(), args() 등을 조합하여 타겟 메서드 정밀 지정
어노테이션 로직 실행 시점
@Before 타겟 메서드 본격 실행 직전
@After 타겟 메서드 종료 후 (성공/예외 발생 여부 무관)
@AfterReturning 예외 없이 정상적으로 메서드 종료 후
@AfterThrowing 런타임 예외(Exception) 발생 직후
@Around 메서드 실행 전후를 모두 감싸서 완벽히 제어 (가장 강력하고 권장되는 방식)

 

3. @Around 메서드 설계 시 핵심 주의사항

  • 전체 흐름을 가로채는 강력한 기능인 만큼 세밀한 예외 및 흐름 제어 필수
주의 항목 상세 내용
proceed() 호출 pjp.proceed() 미호출 시 원본 타겟 메서드가 아예 실행되지 않음
반환 타입 유지 원본 메서드의 실행 결과를 반드시 Object 타입으로 반환 필요
예외(Throwable) 처리 proceed() 실행 과정에서 발생 가능한 모든 예외 상황 핸들링
성능 저하 방지 타겟 메서드를 전면 래핑하므로 과도하게 무거운 로직 삽입 지양
재귀 호출 금지 proceed()를 중복 호출할 경우 무한 루프에 빠질 위험 존재

 


4. Spring 트랜잭션 (Transaction) 관리

  • 개념: 여러 개의 데이터베이스 변경 작업(INSERT, UPDATE 등)을 쪼갤 수 없는 하나의 논리적 단위로 묶어 처리하는 기술
  • 트랜잭션 ACID 4대 원칙
원칙 의미 상세 설명
Atomicity 원자성 모든 작업이 완벽히 성공하거나, 에러 시 전체 롤백 (All or Nothing)
Consistency 일관성 트랜잭션 전후의 데이터베이스 상태와 규칙이 항상 모순 없이 일관됨
Isolation 고립성 다수의 트랜잭션 동시 실행 시 서로의 연산에 간섭 불가
Durability 지속성 성공적으로 완료된 트랜잭션 결과는 시스템 장애 시에도 영구 보존

 

5. 트랜잭션 및 AOP 환경 설정 (XML & Annotation)

  • XML 설정 요소:
    • <aop:aspectj-autoproxy />: 어노테이션 기반 AOP 동작 활성화
    • <tx:annotation-driven />: @Transactional 어노테이션 기반 트랜잭션 관리 활성화
  • 속성 최적화: proxy-target-class="true" 적용 시 인터페이스가 없는 클래스도 CGLIB 프록시를 통해 AOP 및 트랜잭션 적용 가능
  • 코드 적용 예시: 서비스(Service) 계층 클래스나 메서드 상단에 @Transactional 선언 시, 내부 Mapper 로직 중 하나라도 실패하면 즉각 예외를 발생시키고 전체 작업 롤백 처리