Spring 42

[Spring] AOP의 Weaving 방식

Advice를 Weaving 하는 방식 컴파일 시에 Weaving 클래스 로딩 시에 Weaving 런타임 시에 Weaving 컴파일 시에 Weaving 컴파일 시에 코드를 삽입하는 방법은 AspectJ에서 사용하는 방식이다. 핵심 로직을 구현한 코드를 컴파일할 때, 알맞은 위치에 공통 코드를 삽입하면, 컴파일 결과 AOP가 적용된 클래스 파일이 생성된다. 이 방식에서는 AOP를 도와주는 컴파일러나 IDE를 함께 제공한다. 클래스 로딩 시에 Weaving AOP 라이브러리는 JVM이 클래스를 로딩할 때 클래스 정보를 변경할 수 있는 에이전트를 제공한다. 이 에이전트는 로딩한 클래스의 바이너리 정보를 변경하여 알맞은 위치에 공통 코드를 삽입한 새로운 클래스 바이너리 코드를 사용하도록 한다. 즉 원본 클래스 ..

Spring 2022.02.16

[Spring] AOP의 개념

AOP란? Aspect Oriented Programming(관점 지향 프로그래밍)의 줄임말로서, AOP는 문제를 바라보는 관점을 기준으로 프로그래밍하는 기법을 말한다. AOP는 문제를 해결하기 위한 핵심 관심 사항과 전체에 적용되는 공통 관심 사항을 기준으로 프로그래밍 함으로써 공통 모듈을 여러 코드에 쉽게 적용할 수 있도록 도와준다. 기본적인 개념은 공통 관심 사항을 구현한 코드를 핵심 로직을 구현한 코드 안에 삽입하는 것이다. 그런데 공통 기능을 직접적으로 호출하는 것이 아니라, 핵심 로직을 구현한 코드를 컴파일하거나 컴파일된 클래스를 로딩하거나 로딩한 클래스의 객체를 생성할 때 AOP가 적용되어 핵심 로직 구현 코드 안에 공통 기능이 삽입된다. AOP 라이브러리가 알맞게 삽입해주기 때문에 트랜잭션..

Spring 2022.02.16

[Spring] ApplicationContextAware, BeanNameAware 인터페이스

빈으로 사용될 객체에서 스프링 컨테이너에 접근해야 한다거나, 빈 객체에서 로그를 기록할 때 빈의 이름을 남기고 싶다면 다음의 두 인터페이스를 구현하면 된다. ApplicationContextAware : 초기화 과정에서 컨테이너(ApplicationContext)를 전달받는다. BeanNameAware : 초기화 과정에서 빈 이름을 전달받는다. ApplicationContextAware 인터페이스를 구현한 클래스는 setApplicationContext() 메서드를 통해서 컨테이너 객체를 전달받는다. 전달받은 컨테이너를 필드에 보관 후, 이를 이용해서 다른 빈 객체를 구하거나 컨테이너가 제공하는 기능(이벤트 발생, 메시지 구하기)을 사용할 수 있다. public class WorkScheduler imp..

Spring 2022.02.14

[Spring] 빈 라이프사이클

빈 객체의 라이프사이클 스프링 컨테이너는 다음의 두 가지 방식을 이용해서 빈의 라이프사이클을 관리할 수 있다. 스프링이 제공하는 특정 인터페이스를 상속받아 구현 스프링 설정에서 특정 메서드를 호출하라고 지정 스프링 컨테이너는 빈 객체를 생성하고 초기화하고 소멸할 때 다음과 같은 순서대로 빈 객체의 메서드를 실행한다. 위의 그림을 보면 전체 흐름은 객체 [생성/프로퍼티 설정 -> 초기화 -> 사용 -> 소멸]의 네 단계를 거치는 것을 알 수 있다. 컨테이너는 빈 객체를 생성하고 프로퍼티를 설정한 뒤에 빈의 초기화를 진행하며, 컨테이너를 종료(close())하는 과정에서 생성한 빈 객체의 소멸 과정을 진행한다. @PostConstruct, @PreDestroy 어노테이션 각각 초기화를 실행하는 메서드와 소멸..

Spring 2022.02.13

[Spring] 스프링 컨테이너의 생성과 종료

스프링 컨테이너는 크게 다음의 주기를 갖는다. 컨테이너 생성 빈 메타 정보(XML이나 자바 설정)를 이용해서 빈 객체 생성 컨테이너 사용 컨테이너 종료(빈 객체 제거) 1번과 2번 과정은 컨테이너를 생성할 때 함께 진행된다. // 빈 메타 정보를 컨테이너 생성 시점에 제공해서 빈 객체 생성 GenericXmlApplicationContext ctx = new GenericXmlApplicationContext("classpath:config.xml"); 또는 다음과 같이 컨테이너를 먼저 생성하고 메타 정보를 컨테이너에 제공할 수도 있다. // 컨테이너 생성 GenericXmlApplicationContext ctx = new GenericXmlApplicationContext(); // 메타 정보 제공 ..

Spring 2022.02.13

[Spring] @Component, @ComponentScan 어노테이션

컴포넌트 스캔을 이용한 빈 자동 등록 스프링은 특정 패키지 또는 그 하위 패키지에서 클래스를 찾아 스프링 빈으로 등록해주는 기능을 제공하고 있다. 이때 검색 대상은 @Component 어노테이션이 붙은 클래스이다. 다음 코드를 보자. package com.mypackage; @Component() public class OrderService { // 이하 생략 ... } @Component public class ProductService { // 이하 생략 ... } com.mypackage 패키지에 속한 두 클래스에 @Compnent 어노테이션을 적용하였다. @Component 어노테이션을 적용했다면, 태그를 이용해서 스프링이 클래스를 검색할 패키지를 지정하면 된다. ... 태그는 base-pack..

Spring 2022.02.13

[Spring] @Qualifier 어노테이션

@Qualifier 어노테이션을 이용한 자동 설정 제한 동일한 타입의 빈 객체를 두 개 이상 정의한 뒤 @Autowired 어노테이션을 적용할 경우 NoUniqueBeanDefinitionException을 발생시킨다. 이럴 때는 한정자(qualifier)를 지정해서 빈 객체의 범위를 좁혀야 한다. XML 설정에서는 태그를 이용해서 한정자를 지정하며, 자바 설정에서는 @Qualifier 어노테이션을 이용해서 한정자를 지정한다. ... @Configuration public class ConfigShop { @Bean @Qualifier("order") public SearchClientFactoryBean orderSearchClientFactory() { SearchClientFactoryBean se..

Spring 2022.02.11

[Spring] @Autowired 어노테이션

객체 간 의존 자동 연결 스프링은 개발자가 일일이 의존 정보를 설정하지 않아도 자동으로 스프링 빈 객체 간의 의존을 설정해주는 기능 제공하고 있는데, 이 기능을 사용하면 스프링 코드 설정을 짧게 유지할 수 있게 된다. 이 방법 중에서 @Autowired에 대해서 알아보자. @Autowired 어노테이션을 사용하려면 XML 설정에 다음과 같은 코드를 추가해주어야 한다. // 이하 생략 ... 태그는 다수의 스프링 전처리기 빈을 등록해주는데, 이 중 의존 자동 연결과 관련된 스프링 빈은 다음과 같다. AutowiredAnnotationBeanPostProcessor : @Autowired, JSR-330에 정의된 @Inject 어노테이션 처리 CommonAnnotationBeanPostProcessor : ..

Spring 2022.02.11

[Spring] 스프링 DI를 이용한 객체 생성(3)

이전 글 : https://jaedam.tistory.com/7 [Spring] 스프링 DI를 이용한 객체 생성(2) 이전 글 : https://jaedam.tistory.com/5 [Spring] 스프링 DI를 이용한 객체 생성(1) DI란? DI는 Dependency Injection의 줄임말로서 의존성 주입이라고도 부른다. 스프링은 기본적으로 DI를 기반으로 동작하기 때.. jaedam.tistory.com 앞서 스프링 컨테이너의 종류와 XML 파일의 각 태그를 간략하게 살펴보았다. 이번 글에서는 자바 코드를 이용한 DI 설정에 대해서 살펴보자. @Configuration과 @Bean을 이용한 빈 객체 설정 스프링은 @Configuration 어노테이션이 붙은 클래스를 설정 정보로 사용한다. 그리고..

Spring 2022.02.10