Spring 들여다보기: IoC, AOP

Spring 들여다보기: IoC, AOP

IoC란

스프링에서 일반적으로 Java 객체를 new로 생성하여 Spring Container에게 관리를 맡긴다.
즉, 개발자에서 프레임워크로 객체 제어의 권한이 넘어 갔으므로 제어의 역전(Inversion of Control)이라고 한다.

스프링이 알아서 객체의 생명주기를 관리한다면 개발자는 어떻게 그 객체를 사용할 수 있을까?
DI를 통해서 사용할 수 있다.




DI(Dependency Injection)

의존성 주입이란 객체를 직접 생성/제어하는 것이 아니라, 제어의 역행을 사용해서 특정 객체를 필요한 객체의 외부에 가져다가 연결하는 것을 뜻한다.
객체가 필요한 어떤 객체를 생성자 혹은 setter를 통해 주입하는 것을 말한다.




빈(Bean)이란?

스프링 컨테이너에서 관리되는 객체들을 모두 빈이라고 한다.




DI된 빈 사용하는 방법

  • @SpringBootApplication: 등록된 빈을 확인할 수 있다.
  • @Component: 해당 어노테이션이 붙은 클래스는 스프링에서 빈으로 생성하여 자동적으로 관리한다.
  • @Qualifier(“빈이름”): @Component가 여러 개가 있는 경우 스프링이 어느 것을 선택해야할 지 헷갈리므로 @Qualifier로 이름을 지정해서 빈을 사용하면 된다.

이렇게 빈으로 등록한 클래스를 어떻게 가져와서 사용할까?
먼저 ApplicationContextAware를 구현한 ApplicationProvider클래스를 생성한 뒤 @Component를 통해서 빈 등록을 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Component
public class ApplicationProvider implements ApplicationContextAware {

private ApplicationContext context;

@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.context = applicationContext;

}

public static ApplicationContext getContext(){
return context;
}
}

new로 생성할 필요없이 @Component로 등록된 빈들은 getBean()메서드를 통해서 접근할 수 있다.

1
2
3
4
5
// 기존 방법: 개발자가 직접 new로 클래스 생성
Example ex1 = new Example(클래스명);

// 스프링에게 loC한 방법
Example ex1 = context.getBean(빈등록한클래스명.class);




한 클래스에서 여러 개 빈 생성하고 싶은 경우

  • @Configuration: 한 클래스에서 여러 개의 빈을 등록하겠다는 의미. @Component와 동일한 동작이지만 여러 개 빈을 한 클래스에 등록할 수 있다.
  • @Bean(“빈이름”): @Configuration를 사용한 클래스 안에서 여러 개의 빈을 @Bean으로 등록할 수 있다. 스프링이 헷갈리지 않도록 각각 빈이름을 붙여줘야한다.

한 클래스에서 여러 개의 빈 생성하는 예시를 보자.
여기서 return에 new로 생성한 것은 예시일뿐 실무에서는 set메서드, 생성자, 변수에 @Autowird, Inject등의 방법을 통해서 객체를 받아온 뒤 진행한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
@Configuration
public class AppConfig{

@Bean("빈이름1")
public Example ex(FirstBaseClass firstBaseClass){
return new Example(firstBaseClass);
}

@Bean("빈이름2")
public Example ex(SecondBaseClass secondBaseClass){
return new Example(secondBaseClass);
}
}

위에서 생성한 빈 중 FirstBaseClass를 사용하는 예시이다

1
Example ex1 = context.getBean("firstBaseClass" , Example.class);




AOP( Aspect Oriented Programming)란

AOP는의 관점 지향 프로그래밍으로 반복되는 코드들을 한 곳으로 모아서 사용할 수 있게하는, 즉 모듈화하겠다는 개념이다.

자주 사용하는 어노테이션은 아래와 같다.

  • @Aspect: AOP를 정의하는 Class에 할당
  • @Pointcut: 기능을 어디에 적용시킬지, 예를 들어 메서드에 적용시킬 지, 어노테이션에 적용시킬지와 같은 AOP를 적용시킬 지점을 설정
  • @Before (이전) : 메서드 실행하기 이전
  • @After (이후) : 메서드의 결과에 관계없이(즉 성공, 예외 관계없이) 메서드가 완료 되면 실행
  • @AfterReturning 메서드호출 성공 실행 시
  • @AfterThrowing (예외 발생 이후) : 메서드호출 실패 예외 발생시
  • @Around (메소드 실행 전후) : Before / After 모두 제어




ObjectMapper

objectMapper 클래스를 통해서 Json node에 접근 할 수 있다.