
오늘 수업을 들으며 이런 코드를 보며 이게 의미하는 것이 무엇일까 하고 생각했다.

위 사진의 코드와 같이 Application context = new AnnotationConfigApplicationContext(ContextConfiguration.class); 말이다.
이 코드를 보며 몇가지의 의문점이 들었다 (비전공자 입장에서의 의문점)
1. ApplicaitionContext , AnnotationConfigApplicationContext, ContextConfiguration.class 가 어떤 기능을 하는지
A a = new A() 와 같은 형태가 아니라 A a = new B()의 형태인 것인지 그것이 너무 궁금하였다. 따라서 무슨 역할을 하는지 또 왜 A a = new B() 형태인 것인지 공부해봤다 너무 궁금하기도 하고, 이해하고 싶었기 때문이다.
먼저 첫 번째에 대해서 공부한 내용을 정리해 보겠다!
- ApplicationContext
-> App 에서 코드를 구현시켜줄 때 main 메서드 안에서 ApplicationContext 인터페이스에 대한 객체를 생성해주는데,
여기서 ApplicationContext는 Spring의 App을 구성해주고, 빈을 생성 , 설정 관리해 주는 역할을 한다고 한다. (Spring Container와 같은 역할)
- AnnotationConfigApplicationContext
-> 자바 기반의 어플리케이션 Context를 제공하여 어노테이션 기반으로 구성된빈설정 정보를 읽여 들여 Spring Application을 초기화 한다고 한다.
여기서 말하는 것이 처음에 프로젝트를 생성할때
@Configuration
@ComponentScan("com.sh.spring")
public class ContextConfiguration {
}
위와 같은 클래스를 생성해 주었는데 ComponentScan 을 통해 명시적으로 설정해준 com.sh.spring이라는 패키지 하위에 있는 모든 Annotation이 붙어 있는 클래스를 관리해주는 역할로 이해 했다. 제 이해가 틀렸다면 코멘트 부탁드리겠습니다!
- ContextConfiguration
-> Spring Application의설정 정보를 포함하는 자바클래스라고 한다.
위 사진을 보면 알 수 있듯이 @Configuration이라는 어노테이션이 붙어 있는데 이 클래스가 Spring 설정 클래스라는 것을 명시적으로 알려주기 위함이라고 한다.
두 번째 의문에 대한 답이다
Spring에서 핵심 기능은 의존성 주입 (Dependency Injection) , 의존성을 관리하고 주입해주는 제어의 역전 (Inversion of Control)-> 컨테이너 제공 이다.
아까 말했던 메인 메서드에서 생성해주는
ApplicationContext context = new AnnotationConfigApplicationContext(ContextConfiguration.class);
에서 ApplicationContext는 이러한 Container의 동작을 정의하는 인터페이스다
이 Spring Container에서 다양한 구현체가 있는데 그 중 하나가
AnnotationConfigApplicationContext 인 것이다.
Java에서 배웠던 다형성과 같은 역할을 하고 있는 것이다.
코드로 예시를 간단하게 들어보겠다.
//예를 들어 Vehicle이라는 Interface Class 가 존재한다고 가정하겠다.
Public Interface Vehicle(){
void drive();
}
// drive라는 메서드만 정의해주고
public class Car Implements Vehicle(){
@Override
public void drive(){
sout ( Car is drive!)
}
public class Bike Implements Vehicle(){
@Override
public void drive(){
sout ( Bike is drive!)
}
Vehicle vehicle = new Car();
vehicle.drive(); // car is drvie !
Vehicle vehicle = new Bike();
vehicle.drive(); // Bike is drvie !
위 코드처럼 Vehicle 이라는 인터페이스를 Car, Bike 가 상속받은 것처럼
두 번째 내가 했던 질문도 같다 결국 구현체만 달라지고 그 안에서 쓰이는 기능을 다르게 해주는 것일 뿐이였다.
어쨌든 이렇게 코드를 구현하면
코드의 유연성 높아지고, 확장성도 더 좋아진다고 한다!
이상 오늘의 궁금증이였다!