IoC / DI
의존성의 두가지 종류
집합 관계
- 부분이 전체와 다른 생명 주기를 가질 수 있다.
- 벤다이어그램을 생각해 보면 편할 듯 하다. A와 B라는 집합이 있고, 교집합이 의존성을 이룬다고 생각.
- ex : 집 , 냉장고
구성 관계
- 부분은 전체와 같는 생명 주기를 갖는다.
- 하나의 객체가 사라지면, 해당 객체가 의존하는 다른 객체도 없어진다.
- ex : 사람 , 심장
주입이란?
- 외부에서 내부로 무언가를 하는 행위
- 따라서 의존성 주입이란, 외부에서 의존성을 내부로 장착시키는 것.
💡 의존성 주입을 하는 법 : 클래스 내부에서 의존성을 갖는 다른 객체를 생성하는 것이 아니라, 클래스 외부에서 생성자의 인자 등을 통해 의존성을 생성한다.
DI의 장점
- 의존성이 줄어든다.(의존한다는 것은 의존대상이 변화한다면 그에 맞게 클래스 내부까지 수정해야 한다.)
- 재사용성이 높은 코드가 된다.(생성자 등을 통해 주입한 인터페이스를 다른 클래스에서도 재사용 가능하므로.)
- 테스트하기 좋은 코드가 된다.(클래스 내부에서 의존성을 갖는 것이 아니라 클래스 외부에서 주입받는 것이므로, 따로 테스트가 가능하다.)
- 가독성이 높아진다.
💡 DI는 결국 전략 패턴을 응용한 것!
전략 : 인터페이스를 구현한 구현체.
컨텍스트 : 인터페이스의 공통 메서드.
클라이언트 : 생성자 주입을 호출하는 주체.
스프링을 사용하지 않는 의존성 주입
생성자 주입 vs 속성 주입
생성자 주입
- 생성자에 의존성을 가질 객체를 주입.
- 생성자를 통해 의존성을 주입받으면, 프로그램이 돌아가는 동안 의존 대상을 바꿀 수가 없다.
- 보통 프로그램에서는 한번 주입된 의존성을 계속 사용하는 경우가 일반적이므로, 요즘 더 선호된다.
속성 주입
- setter 메서드를 통해 의존성을 가질 객체를 주입.
- getter / setter 메서드를 통해 구현한다.
스프링을 사용하는 의존성 주입
XML 파일 사용
- 기존의 코드에서 ClassPathXmlApplicationContext에 의존관계를 작성해둔 xml파일을 인자로 넘기면 끝.
- 속성 주입 방식이다. (xml파일을 생성자의 인자로 넘겨주기는 하지만, xml에 작성해둔 내용은 속성 주입이므로.)
- 스프링은 종합 쇼핑몰의 역할.
Autowired 어노테이션을 통한 주입
Resource 어노테이션을 통한 주입
AOP
💡 AOP란? → Aspect Oriented Programming의 줄임말으로써, 관점지향 프로그래밍을 뜻한다.
DI가 의존성 주입이였다면, AOP는 로직 주입!
다수의 모듈에 공통적으로 나타나는 부분을 횡단 관심사라고 한다.
DB에 커넥션을 연결하는 일련의 과정들같이, 공통적으로 나타나는 것들이므로 횡단 관심사이다 !
코드 = 핵심 관심사 + 횡단 관심사
이므로 횡단 관심사를 빼내어 핵심 관심사인 로직에만 집중할 수 있도록 하는것이 AOP
질문 : 메서드에서 코드를 주입할 수 있는 곳
- 메서드에서 코드를 주입할 수 있는 곳 Around :메서드 전 구역(실행 전 후) Before : 메서드 시작 전 After : 메서드 종료 후 After Returning : 메서드 정상 종료 후 After Throwing : 메서드에서 예외가 발생하면서 종료된 후
질문 : AOP를 적용함으로써 얻을 수 있는 SOLID원칙 중 하나와 그 이유?
- AOP를 적용함으로써 얻을 수 있는 SOLID원칙 중 하나와 그 이유? SRP : 코드 = 핵심 관심사 + 횡단 관심사인데, 횡단 관심사를 떼내어 코드는 핵심 관심사에만 신경을 쓰면 되므로, SRP를 지킨다.
질문 : 스프링이 AOP를 만드는(프록시를 구현하는) 2가지 방법
용어 | |
---|
Aspect | Advice들(언제(Before), 무엇을(before())) + Pointcut들(어디에. runSomething()). |
Advisor | 한개의 Advice + Pointcut (deprecated) |
Advice | Pointcut에 적용할 로직(메서드) + 해당 메서드를 언제 적용할 지 정의한 메서드. |
5가지 어노테이션. | |
JoinPoint | Aspect를 적용 가능한 모든 지점 |
스프링 프레임워크가 관리하는 빈의 모든 메서드. | |
Pointcut | JoinPoint의 부분집합. |
Aspect 적용 위치 지정자
횡단 관심사를 적용할 타깃 메서드를 선택한다. |