-
스프링 퀵 스타트 02Spring&SpringBoot 2025. 9. 17. 17:10
CLASS05. 어노테이션 기반 설정
5.1.3 @Component
<context:component-scan> 설정을 했으면 스프링 설정 파일에 클래스들을 <bean>으로 등록할 필요가 없다
클래스 선언 부분에 @Component 설정해 줌으로써 스프링 컨테이너는 해당 클래스를 bean으로 생성하고 관리한다
5.2.1. 의존성 주입 어노테이션
- @Autowired : 주로 변수 위에 설정하여 해당 타입의 객체를 찾아서 자동으로 할당
- @Qualifier : 특정 객체 이름을 이용해 의존성 주입
- @Resources : @Autowired 같은 기능 제공
- @Inject : @Autowired, @Qualifier 기능을 결합한 어노테이션
5.2.3. @Qualifier
의존성 주입 대상이 되는 Speaker 타입의 객체가 두 개 이상일 때 발생한다
만약 SonySpeaker, AppleSpeaker 객체가 모두 메모리에 생성되어 있는 상황이라면 컨테이너는 어떤 객체를 할당할지 스스로 판단할 수 없어 에러가 발생한다 (NoUniqeBeanDefinitionException)
@Component("apple") public class AppleSpeaker implements Speaker { ... }
@Component("sony") public class SonySpeaker implements Speaker { ... }
@Component("tv") public class LgTV impelements TV { @Autowired @Qualifier("apple") private Speaker speaker; ... }
5.2.4. @Resource
@Autowired는 변수의 타입을 기준으로 객체를 검색해 의존성 주입을 처리하지만, @Resource는 객체의 이름을 이용하여 의존성 주입을 처리한다
@Component("tv") public class LgTV impelements TV { @Resource(name="apple") private Speaker speaker; ... }
- name 속성을 사용할 수 있어 스프링 컨테이너가 해당 이름으로 생성된 객체를 검색하여 의존성 주입 처리
DAY2
CLASS01. 스프링 AOP
비즈니스 컴포넌트 개발에서 가장 중요한 두 가지 원칙
- 낮은 결합도 : 의존성 주입
- 높은 응집도 : AOP
1.1 AOP 이해하기
- 횡단관심 : 메서드마다 공통으로 등장하는 로깅, 예외, 트랜잭션 처리 같은 코드
- 핵심관심 : 사용자의 요청에 따라 실제로 수행되는 핵심 비즈니스 로직
문제 : 기존의 OOP 언어에서는 횡단 관심에 해당하는 공통 코드를 완벽하게 독립적인 모듈로 분리해 내기 어렵다
해결방안 : 스프링 AOP
1.2.2. AOP 라이브러리 추가
# pom.xml <dependency> <groupId>org.aspectJ</groupId> <artifactId>aspectjrt</artifactId> <version>${org.aspectj-version}</version> </dependency> <dependency> <groupId>org.aspectJ</groupId> <artifactId>aspectjweaver</artifactId> <version>1.8.8</version> </dependency>
1.2.3. 네임스페이스 추가 및 AOP 설정
#applicationContext.xml <bean id="log" class="com.springbook.biz.common.LogAdvice"></bean> <aop:config> <aop:pointcut id="allPointcut" expression="execution(* com.springbook.biz..*Impl.*(..))"/> <aop:aspect ref="log"> <aop:before pointcut-ref="allPointcut" method="printLog"/> </aop:aspect> </aop:config>
LogAdvice를 Log4jAdivce로 교체하고 싶다면 applicationContext.xml만 수정하면 된다
스프링 AOP는 클라이언트가 핵심 관심에 해당하는 비즈니스 메서드를 호출할 때 횡단 관심에 해당하는 메서드를 적절하게 실행한다 이때 핵심 관심 메서드와 횡단 관심 메서드 사이에서 소스상의 결합은 발생하지 않으며 이것이 AOP 사용하는 목적이다
CLASS02. AOP 용어 및 기본 설정
2.1.1. 조인포인트
조인포인트는 클라이언트가 호출하는 모든 비즈니스 메서드
조인포인트는 '포인트컷 대상', '포인트컷 후보'라고도 하는데 이는 조인포인트 중에서 포인트컷이 선택되기 때문이다
2.1.2. 포인트컷
포인트컷은 필터링 된 조인포인트를 의미한다
예를 들어 트랜잭션을 처리하는 공통 기능이 있을 때 횡당 관심 기능은 등록/수정/삭제 기능의 비즈니스 메서드는 당연히 동작해야 하지만 검색 기능의 메서드에 대해서는 트랜잭션과 무관하기 때문에 동작할 필요가 없다
이렇게 비즈니스 메서드 중에서 우리가 원하는 특정 메서드에서만 횡단 관심에 해당하는 공통 기능을 수행시키기 위해서 포인트컷이 필요하다
포인트컷을 이용하면 메서드가 포함된 클래스와 패키지는 물론이고 메서드 시그니처까지 정확하게 지정할 수 있다
#applicationContext.xml <aop:config> <aop:pointcut id="allPointcut" expression="execution(* com.springbook.biz..*Impl.*(..))"/> <aop:pointcut id="getPointcut" expression="execution(* com.springbook.biz..*Impl.get*(..))"/> <aop:aspect ref="log"> <aop:before pointcut-ref="getPointcut" method="printLog"/> </aop:aspect> </aop:config>
* | com.springbook.biz.. | *Impl. | get*(..))"
리턴 타입 | 패키지 경로 | 클래스명 | 메서드명 및 매개변수2.1.3. 어드바이스
어드바이스는 횡단 관심에 해당하는 공통 기능의 코드를 의미하며 독립된 클래스의 메서드로 작성된다
또한 어드바이스로 구현된 메서드가 언제 동작할지 스프링 설정 파일을 통해 지정할 수 있다
어드바이스 동작 시점은 before, after, after-returning, after-throwing, around 등 다섯가지로 지정할 수 있다
2.1.4. 위빙(weaving)
위빙은 포인트컷으로 지정한 핵심 관심 메서드가 호출될 때 어드바이스에 해당하는 횡단 관심 메서드가 삽입되는 과정을 의미한다
위빙을 통해서 비즈니스 메서드를 수정하지않고도 횡단관심에 해당하는 기능을 추가하거나 변경할 수 있다
위빙을 처리하는 방식은 크게 컴파일타임 위빙, 로딩타임 위빙, 런타임 위빙이 있지만 스프링에서는 런타임 위빙만 지원한다
2.1.5. Aspect 또는 Advisor
에스팩트는 포인트컷과 어드바이스의 결합으로서, 어떤 포인트컷 메서드에 대해서 어떤 어드바이스 메서드를 실행할지 결정한다
이 에스팩트 설정에 따라 AOP 동작 방식이 결정되므로 AOP 용어 중 가장 중요한 개념이다
2.1.6. AOP 용어 종합
사용자는 시스템을 사용하면서 자연스럽게 비즈니스 컴포넌트의 여러 조인포인트를 호출하게 된다
이때 특정 포인트컷으로 지정한 메서드가 호출되는 순간 어드바이스 객체의 어드바이스 메서드가 실행된다
이 어드바이스 메서드의 동작 시점을 5가지로 지정할 수 있으며 포인트컷으로 지정한 메서드가 호출될 때 어드바이스 메서드를 삽입하도록 하는 설정을 에스팩트라고 한다
이 에스팩트 설정에 따라 위빙이 처리된다
728x90'Spring&SpringBoot' 카테고리의 다른 글
스프링 퀵 스타트 03 (0) 2025.09.18 스프링 퀵 스타트 01 (0) 2025.09.16 [스프링MVC - 2편] 로그인 처리1 - 쿠키, 세션 (0) 2025.03.04 [스프링MVC - 2편] 검증 (4) (0) 2025.03.02 [스프링MVC - 2편] 검증 (3) (1) 2025.03.02