본문 바로가기
백엔드/스프링 프레임워크 단어정리

Spring Framework / @Autowired 어노테이션 / 스프링 컨테이너: ApplicationContext 역할

by maverick11471 2024. 7. 17.

[요약]

@Autowired 어노테이션은 Spring의 ApplicationContext에서 필요한 객체를 찾는 데 사용됩니다.


@Autowired 어노테이션 역할

 스프링 컨테이너에 어노테이션을 통해 빈을 등록하는 방법은 크게 두 가지다.

 

-  @Bean 어노테이션을 통한 빈 등록 (메서드 레벨)

    * 메서드를 통해 반환되는 객체 Bean으로 관리

-  @Component 어노테이션을 통한 빈 등록 (클래스 레벨)

    * 클래스에 붙여 해당 클래스 타입을 기반으로 Bean을 관리

    * @Repository, @Service, @Controller 등의 어노테이션들은 @Component를 이미 포함

    * @Component를 통해 등록된 빈은 다른 곳에서 @Autowired를 사용해 의존성 주입 가

 

이 어노테이션은 Spring 컨테이너가 자동으로 필요한 객체를 찾아 주입해 주는 기능을 제공합니다.

 

@Autowired
public BoardController(ApplicationContext applicationContext) {
    this.applicationContext = applicationContext;
}

 

[로직]

[@Autowired] Spring 컨테이너야. BoardController라는 클래스가 ApplicationContext 라는 애한테 의존하고 있으니 ApplicationContext를 자동으로 주입해. 그럼 BoardController는 ApplicationContext를 몰라도 되잖아.

그렇게 안하면 아래처럼 코드를 작성해야돼. 그럼 너무 복잡하잖아.

public class BoardController {
    private final ApplicationContext applicationContext;

    public BoardController(ApplicationContext applicationContext) {
        this.applicationContext = applicationContext;
    }

    // 컨트롤러 메서드 구현
}

 

 


스프링 컨테이너: ApplicationContext 역할

 

ApplicationContext는 Spring 프레임워크에서 사용되는 핵심 인터페이스 중 하나입니다. 

이 인터페이스는 Spring 애플리케이션의 컨테이너 역할을 하며, 다음과 같은 주요 기능을 제공합니다:

1. Bean 관리: ApplicationContext는 애플리케이션에서 사용되는 모든 Bean(Spring 컴포넌트)을 관리합니다. 이를 통해 Bean의 생성, 의존성 주입, 생명주기 관리 등을 처리할 수 있습니다.
2. 환경 설정 관리: ApplicationContext는 애플리케이션의 환경 설정 정보(properties, XML 파일 등)를 관리합니다. 이를 통해 애플리케이션의 동작 방식을 외부에서 설정할 수 있습니다.
3. 국제화 지원: ApplicationContext는 국제화 기능을 제공하여 다국어 지원이 가능합니다.
4. 이벤트 처리: ApplicationContext는 애플리케이션 내부에서 발생하는 이벤트를 처리할 수 있는 기능을 제공합니다.
5. 리소스 로딩: ApplicationContext는 애플리케이션에서 필요한 리소스(파일, 이미지 등)를 로딩할 수 있습니다.
6. AOP 지원: ApplicationContext는 애플리케이션의 Aspect Oriented Programming (AOP) 기능을 지원합니다.
이와 같은 다양한 기능을 통해 ApplicationContext는 Spring 애플리케이션의 핵심적인 역할을 수행합니다. 개발자는 ApplicationContext를 통해 애플리케이션의 구조와 동작을 효과적으로 관리할 수 있습니다.

 


예시1. Bean 관리 (의존성 주입)

@PostMapping("/post.do")
public String post(BoardDto boardDto) {
    // 게시판 타입에 따른 동적 의존성 주입
    if(boardDto.getType().equals("free")) {
        boardService = applicationContext.getBean("freeBoardServiceImpl", BoardService.class);
    } else {
        boardService = applicationContext.getBean("noticeServiceImpl", BoardService.class);
    }

    boardService.post(boardDto);

    if(boardDto.getType().equals("free")) {
        return "redirect:/board/free-list.do";
    } else {
        return "redirect:/board/notice-list.do";
    }
}

 

해당 코드에서 applicationContext는 다음과 같은 역할을 하고 있습니다:

 

스프링에서 **"동적으로 가져온다"**는 표현은 애플리케이션이 실행 중에 필요한 빈(bean)을 필요할 때마다 생성하거나 가져올 수 있다는 의미입니다. 즉, 빈이 프로그램의 정적 상태가 아니라, 런타임에 상황에 따라 결정된다는 것입니다. 이를 통해 유연한 설계와 효율적인 리소스 관리를 가능하게 합니다.

 


1. 동적 의존성 주입:
  • 게시판 타입에 따라 적절한 BoardService 구현체를 선택하여 주입하고 있습니다.
  •  applicationContext.getBean()을 사용하여 필요한 BoardService 구현체를 동적으로 가져오고 있습니다.
  •  이를 통해 게시판 타입에 따라 다른 서비스 로직을 적용할 수 있습니다.
2. Spring Bean 관리:
  •  applicationContext는 Spring 컨테이너의 역할을 하며, 애플리케이션에서 사용되는 모든 Bean(Spring 컴포넌트)을 관리하고 있습니다.
  •  getBean() 메서드를 사용하여 필요한 Bean을 동적으로 가져올 수 있습니다.
3. 의존성 주입:
  •  BoardController는 ApplicationContext를 생성자 주입(Constructor Injection)을 통해 받고 있습니다.
  •  이를 통해 BoardController가 필요로 하는 BoardService 구현체를 동적으로 주입받을 수 있습니다.
4. 환경 설정 관리:
  •  ApplicationContext는 애플리케이션의 환경 설정 정보(properties, XML 파일 등)를 관리하고 있습니다.
  •  이를 통해 게시판 타입에 따른 서비스 구현체 선택 등의 로직을 외부 설정에 따라 동적으로 변경할 수 있습니다.
종합적으로 이 코드에서 ApplicationContext는 Spring의 핵심 기능인 의존성 주입, Bean 관리, 환경 설정 관리 등을 활용하여 게시판 타입에 따른 동적인 서비스 로직 처리를 가능하게 하고 있습니다. 이를 통해 코드의 유연성과 확장성을 높일 수 있습니다.