TIL

184일차(모험 93일차) - 정리 + BeanFactory와 ApplicationContext

haedal-uni 2022. 3. 17. 20:20
728x90

Test 코드 정리

스프링 컨테이너 생성

AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(TestConfig.class);

 

정리를 하다보니 이 전에는 아래와 같이 작성하셨는데

ApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);

 

이후에는 아래와 같이 작성을 하셨다.

AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);

 

 

이유가 궁금해서 검색을 해보니 아래와 같은 이유로 사용을 하셨다.

 

 

ApplicationContext는 AnnotationConfigApplicationContext의 상위 인터페이스 이다.

그래서 ApplicationContext는 기능이 적고,

AnnotationConfigApplicationContext는 너무 많은 기능을 제공한다.

 

우리가 개발을 할 때는 가급적 기능을 적게 제공하는 상위 인터페이스를 사용해야,

향후 구현 클래스가 변경되어도 클라이언트 코드를 변경하지 않아도 된다.

그래서 실제 스프링 애플리케이션을 개발할 때는 ApplicationContext를 사용한다.

그런데 스프링 코어를 설명하다보니 AnnotationConfigApplicationContext를 통해서

제공되는 기능들도 필요해서 이렇게 중간에 변경하게 되었다.

 

출처) https://www.inflearn.com/questions/117634

참고로 볼 만한 글 >> https://www.inflearn.com/questions/47449

 


assertThrows : 예외 테스트

예외가 터져야 test가 성공

* 타입으로 조회시 같은 타입의 스프링 빈이 둘 이상이면 오류가 발생한다.

https://lu-delight.tistory.com/368https://lu-delight.tistory.com/471

 

 

assertThat : 두 값을 비교

https://lu-delight.tistory.com/365

 

 

ac.getBeanDefinitionNames() : 스프링에 등록된 모든 빈 이름을 조회한다.

 

ac.getBean() : 빈 이름으로 빈 객체(인스턴스)를 조회한다.

 

ac.getBeansOfType() : 해당 타입의 모든 빈을 조회할 수 있다

 


내가 가장 헷갈렸던 부분

assertThat(memberService).isInstanceOf(MemberServiceImpl.class);

 

isInstanceOf는 뭔가?

 

instanceof는 객체 타입을 확인하는 연산자이다.

형변환 가능여부를 확인하며 true / false 로 결과를 반환한다.

주로 상속 관계에서 부모객체인지 자식객체인지 확인하는데 사용된다.

출처 : [ - 객체타입 확인 instanceof - ]

 


앞에가 부모가 오고 뒤에가 자식이 오면 false가 된다는데 

memberService를 사용한게 MemberServiceImpl이므로 뒤에가 자식일텐데 왜 되는거지? 싶었다.

 

 

아래 링크를 보면 저 위의 코드가 이해가 된다. 블로그는 잘 모르겠다.

https://www.javatpoint.com/downcasting-with-instanceof-operator

 

 

memberService가 MemberServiceImpl 타입으로 받을 수 있는가? true

AppConfig에서 MemberServiceImpl()을 호출하면 MemberService 타입으로

MemberServiceImpl 객체가 반환된다.

MemberService 타입으로 반환되니 isInstanceOf(MemberServiceImpl.class)를 통과한다.

 

 

... 맞게 이해했나?

 

출처 : https://www.inflearn.com/questions/321131

 


BeanFactory와 ApplicationContext

* 자세한 내용은 pdf 참고하기!

 

 

최상위 BeanFactory 인터페이스

BeanFactory를 상속받은 ApplicationContext 인터페이스 (BeanFactory + 부가기능)

그 밑에 AnnotationConfigApplicationContext 구현 객체(구현 클래스)

 


 

ApplicatonContext가 제공하는 부가기능

 

ApplicationContext가 인터페이스 분리 원칙에 의해 굉장히 많은 인터페이스가 분리되어있다.

 

ApplicationContext가 BeanFactory도 받고있는데 

MessageSource, EnvironmentCapable, ApplicationEventPublisher, ResourceLoader

라는 여러가지 인터페이스도 받고있다.

 


 

정리

 

ApplicationContext는 BeanFactory의 기능을 상속받는다.

ApplicationContext는 빈 관리기능 + 편리한 부가 기능을 제공한다.

BeanFactory를 직접 사용할 일은 거의 없다. 부가기능이 포함된 ApplicationContext를 사용한다.

BeanFactory나 ApplicationContext를 스프링 컨테이너라 한다.

 

 

728x90