📅 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):
- PID 확인: netstat -ano | findstr :8080
- 프로세스 강제 종료: taskkill /f /pid [확인된 PID]
- 검증: 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 로직 중 하나라도 실패하면 즉각 예외를 발생시키고 전체 작업 롤백 처리
'⏳ Time Log > 1. One Day (Daily · TIL)' 카테고리의 다른 글
| Day 54 (1/5) - [AWS & Git] 리눅스 vi 에디터 및 권한 관리 핵심 명령어 (0) | 2026.02.23 |
|---|---|
| Day 52 (12/31) - [AWS 기초] 우분투(Ubuntu) EC2 인스턴스 가이드 (0) | 2026.02.23 |
| Day 48 (12/24) - 개발 일지: 보안 고도화 및 가상화 환경 구축 (0) | 2026.02.23 |
| Day 47 (12/23) - 개발 일지: Spring Security 보안 설정 및 SQL 심화 (0) | 2026.02.23 |
| Day 46 (12/22) - 개발 일지 및 학습 기록 (0) | 2026.02.23 |