(Spring) ApplicationContext, AnnotationConfigApplicationContext 란 무엇일까?

Tae Jun Park·2024년 6월 11일

Spring boot (독학)

목록 보기
2/7
post-thumbnail

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

위 사진의 코드와 같이 Application context = new AnnotationConfigApplicationContext(ContextConfiguration.class); 말이다.

이 코드를 보며 몇가지의 의문점이 들었다 (비전공자 입장에서의 의문점)

  • 1. ApplicaitionContext , AnnotationConfigApplicationContext, ContextConfiguration.class 가 어떤 기능을 하는지

    1. 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 가 상속받은 것처럼
두 번째 내가 했던 질문도 같다 결국 구현체만 달라지고 그 안에서 쓰이는 기능을 다르게 해주는 것일 뿐이였다.

어쨌든 이렇게 코드를 구현하면

코드의 유연성 높아지고, 확장성도 더 좋아진다고 한다!

이상 오늘의 궁금증이였다!

profile
나는 박태준

0개의 댓글