: 의존관계주입(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;
|
- @Qualifier (빈 이름으로 주입)
- 주의할 점은 주빙하려는 빈의 앞글자를 소문자로 해야한다.
1
2
|
@Autowired @Qualifier("youBookRepository") // 주입하려는 빈이 YouBookRepository인 경우
BookRepository bookRepository;
Colored by Color Scripter
|
- @SpringBootApplication에 있으며 (springboot) 해당 어노테이션이 붙어있는 클래스의 위치를 기준으로 패키지, 그
이하 패키지에서 Component를 스캔한다.
즉, 동일한 레벨의 패기지라면 컴포넌트 스캔이 이뤄지지 않아 IoC컨테이너에 빈으로 등록되지 않는다.
- 스캔 위치 설정 가능 [ ex. @SpringBootApplication(scanBasePackages = "four") ]
- basePackageClasses : 컴포넌트 스캔을 시작할 위치 설정
- Filter : 어떤 어노테이션을 스캔할지 안 할지
- @Component 종류
- @Repository
- @Service
- @Controller
- @Configuration
: 실행환경에 따라 다르게 빈을 등록시키고 싶을 때 사용한다.
: 표현식 사용 가능. ! (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 / filter / transection 정리하기)
- 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
- 스프링 Bean에만 AOP 적용 가능
- 기존 코드 변경없이 접근 제어 또는 부가 기능 추가
- @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
'Spring' 카테고리의 다른 글
GSON toJson, fromJson에 대한 ...삽질?! (0) | 2020.07.25 |
---|---|
[JPA 공부일지] JPA와 DB설정 동작확인 (0) | 2020.01.27 |
[스프링부트 기초] 스프링부트 활용: 외부설정,프로파일,로깅 (0) | 2019.12.02 |
@Component, @Service, @Repository, @Controller?? (0) | 2019.05.26 |
댓글