본문 바로가기
Spring

[스프링 프레임워크 핵심 기술] IoC 컨테이너

by 작심평생 2019. 12. 2.
Inversion Of Control

: 의존관계주입(Dependency Injection), 의존 객체를 직접 만들어 사용하는게 아닌, 주입받아 사용하는 방법
: 핵심적인 인터페이스는 BeanFactory 

ApplicationContext
: 실직적으로 사용하는 beanfactory로 beanfactory를 상속받았으며, MessageSource, ResourceLoader 등 
 다양한 기능을 가지고 있는 인터페이스

 


 

의존성 주입
    1. 생성자
    2. 세터
    3. 필드

대표적인 어노테이션은 @Autowired
: 필요한 의존 객체의 타입에 해당하는 빈을 찾아 주입한다. 정확히는 타입을 보고 이름도 확인한다.
   - required : 기본값은 true로 Ioc 컨테이너에 해당하는 빈이 없으면 애플리케이션 구동에 실패한다.

만약 같은 타입의 빈이 여러개인 경우
    1. @Primary
          - 해당 어노테이션을 붙이면 Autowired 시 Primary 가 붙은 Repository가 연결된다.

1
2
3
@Repository @Primary
public class MybookRepository  implements BookRepository{
}
Colored by Color Scripter

    2. 해당 타입의 빈 모두 주입 받기

1
2
@Autowired
List<BookRepository> bookRepository;


  1. @Qualifier (빈 이름으로 주입)
    - 주의할 점은 주빙하려는 빈의 앞글자를 소문자로 해야한다.
1
2
@Autowired @Qualifier("youBookRepository"// 주입하려는 빈이 YouBookRepository인 경우
BookRepository bookRepository;
Colored by Color Scripter
 
 

 
@ComponentScan
   - @SpringBootApplication에 있으며 (springboot) 해당 어노테이션이 붙어있는 클래스의 위치를 기준으로 패키지, 그
       이하 패키지에서 Component를 스캔한다.

  즉, 동일한 레벨의 패기지라면 컴포넌트 스캔이 이뤄지지 않아 IoC컨테이너에 빈으로 등록되지 않는다.

   - 스캔 위치 설정 가능 [ ex. @SpringBootApplication(scanBasePackages = "four") ]
       - basePackageClasses : 컴포넌트 스캔을 시작할 위치 설정
       - Filter : 어떤 어노테이션을 스캔할지 안 할지

  • @Component 종류
    • @Repository
    • @Service
    • @Controller
    • @Configuration
 

 
@Profile
: 실행환경에 따라 다르게 빈을 등록시키고 싶을 때 사용한다.
: 표현식 사용 가능. ! (not), & (and), | (or)

- 클래스에 정의
1
2
3
4
@Configuration
@Profile("test"// 실행환경이 test인 경우에만 빈으로 등록하게 된다
public class applicationConfig {
}
Colored by Color Scripter


- 메소드에 정의

1
2
3
4
5
6
7
8
9
@Configuration
public class applicationConfig {
 
    @Bean
    @Profile("!test"// 실행환경이 test가 아닌 경우에만 빈으로 등록하게 된다
        public String temp() {
            return "hi";
        }
}
Colored by Color Scripter
 

프로파일 설정하는 법

- 인텔리제이 얼티메이트 기준,
  우측 상단 체크박스 -> Edit Configuation -> Active profiles에 @Profile에 작성한 값 작성.

- VM options -> -Dspring.profiles.active = "~~"

 


 

AOP
(AOP / filter / transection 정리하기)
: OOP를 보완하는 수단으로 흩어진 Aspect를 모듈화 할 수 있는 프로그래밍 기법
 
AOP 주요개념

- Aspect : 하나의 모듈
- Advice : 해야할 일들
- PointCut : JoinPoint의 구체적인 시점 (ex. A 생성자 호출직전, B클래스의 C메소드를 호출할 때 등)
- JoinPoint : 어디에 적용해야할지 (ex. 생성자 호출직전, 필드 값을 가져갈 때 등)
- Target : 적용이 되는 대상
 
적용방법

    - 컴파일 타임
       - java파일을 class파일로 만들때 조작된 bytecode를 만들어내는 것
       - class파일에 적용하려는 Aspect가 있어야 한다
       - 성능상 부하가 없지만 별도의 컴파일 과정이 필요

    - 로드타임
       - 순수하게 컴파일되고 해당 class파일을 로딩하는 시점에 정보를 변경(로드타임 위빙)
          -> 로딩 시 적용하려는 Aspect가 적용되어서 실행이 되는 것

       - 로딩 시 약간의 부하가 생기고 로드타임에 대한 설정 필요, 하지만 AspectJ 이용가능(다양한 문법 사용 가능)

    - 런타임
       - Bean을 만들 때, 프록시빈을 만들어서 해당 bean호출 할 때 aspect 적용 (= 프록시기반 AOP)
       - Bean 최초 생성 시 초기비용 증가, 하지만 아무런 설정할 필요 없으며 문법이 쉽다. 


정리하자면

컴파일타임, 로드타임 : AspectJ
런타임 : 스프링 AOP
 
스프링 AOP : 프록시(Proxy) 기반 AOP
  - 스프링 Bean에만 AOP 적용 가능
  - 기존 코드 변경없이 접근 제어 또는 부가 기능 추가
 
Aspect 정의
  - @Aspect
  - 빈으로 등록

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@Component
@Aspect
public class LogAspect {
 
 
    Logger logger = LoggerFactory.getLogger(LogAspect.class);
 
 
    @Around("@annotation(LogExcutionTime)"// LogExcutionTime 어노테이션에 적용(따로 annotation만들어야함 아래 코드참고)
    public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable { 
        StopWatch stopWatch = new StopWatch();
        stopWatch.start();
 
 
        Object proceed = joinPoint.proceed(); // 메서드 실행이라 생각하자
 
 
        stopWatch.stop();
        logger.info(stopWatch.prettyPrint());
 
 
        return proceed;
    }
}
Colored by Color Scripter


포인트컷 정의
  - @PointCut(표현식)

  • 표현식
    • execution
    • @annotation (아래 코드참고)
    • bean
1
2
3
4
5
6
7
// 해당 annotion을 어디에서 사용할 것인지 (=> method에서 쓸거다)
@Target(ElementType.METHOD)
 
// annotion 정보를 언제까지 유지할 것인가(디폴트는 class 웬만하면 그냥 써도 상관없다. 의미는 class파일까지 어노테이션 정보가 남아있게 되는 것)
@Retention(RetentionPolicy.RUNTIME)
public @interface LogExcutionTime {
}
Colored by Color Scripter


  • 어드바이스 정의
    •  @Before
    •  @AfterReturning
    •  @AfterThrowing
    •  @Around

출처 : 인프런 - 백기선 스프링 프레임워크 핵심 기술

 

댓글