"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > 스프링 부트의 의존성 주입: 막 뒤의 마법사

스프링 부트의 의존성 주입: 막 뒤의 마법사

2024-11-09에 게시됨
검색:320

Dependency Injection in Spring Boot: The Wizard Behind the Curtain

스프링 부트의 종속성 주입: 커튼 뒤의 마법사

Spring Boot가 당신에게 필요한 것이 무엇인지 알고 은쟁반에 담아 당신에게 건네주는 마법의 집사라고 생각한 적이 있습니까? 이는 기본적으로 종속성 주입(DI)입니다. 아마도 당신은 궁금해하지 않고 DI를 100번 이상 사용했을 것입니다. Spring은 도대체 무엇을 언제 주입해야 하는지 어떻게 아는 걸까요?

당신도 그렇게 생각하신다면, 참여를 환영합니다! 우리는 Spring Boot의 DI가 Bean, @Autowired 및 Bean 라이프사이클을 관리하는 방법부터 시작하여 생성부터 소멸까지 마법처럼 작동하는 방식에 대한 재미있는 비하인드 스토리를 살펴보겠습니다. 이 블로그가 끝날 무렵에는 새로 발견한 DI 지식을 전문가처럼 활용하게 될 것입니다.


의존성 주입이란 무엇입니까? 그리고 왜 관심을 가져야 합니까?

평신도의 관점에서 의존성 주입은 식료품을 직접 사러 나가는 대신 집까지 배달받는 것과 같습니다. 종속성(빈)을 "주입"하는 책임을 Spring에 위임하여 수동으로 객체를 생성하거나 수명 주기에 대해 걱정할 필요가 없도록 하는 것입니다.

당신이 분주한 주방을 운영하는 셰프라고 상상해 보세요(애플리케이션). 필요할 때마다 달려가 계란, 우유, 설탕을 집어들 시간이 없습니다. 누군가(예를 들어 Spring)가 필요한 모든 것을 필요할 때 정확하게 마법처럼 전달한다면 좋지 않을까요?

이것이 바로 Spring DI가 수행하는 작업입니다. 필요한 모든 재료(빈)를 찾아 손가락 하나 까딱하지 않고도 코드에 주입합니다. 꽤 깔끔하죠?


봄 컨테이너의 마법: 개인 집사

좋아요, 여기서 마법이 일어납니다. SpringApplication.run()을 사용하여 Spring Boot 앱을 실행하면 Spring은 ApplicationContext를 부트스트랩합니다. 이를 집사의 사용 설명서라고 생각하세요. 무엇을 언제 가져올지 정확히 알고 있습니다.

단계별로 분석해 보겠습니다.

  1. 컨테이너 초기화: SpringApplication.run()을 누르면 Spring 컨테이너(일명 ApplicationContext)가 작동합니다. 이는 모든 것이 준비되어 있는 가상 레스토랑의 문을 여는 것과 같습니다.

  2. Bean 생성: 컨테이너는 코드에서 @Component, @Service, @Repository 또는 @Controller와 같은 주석을 검색합니다. 이들 각각은 Spring이 관리하는 객체인 이 됩니다. 밀가루, 설탕, 계란 등 주방의 필수 재료라고 생각하세요.

  3. BeanFactory를 구출하세요: Spring Boot는 BeanFactory를 사용하여 이러한 빈을 생성하고 관리합니다. 이 공장은 빈을 언제 어떻게 생성할지 정확히 알고 있으므로 필요할 때 사용할 수 있도록 보장합니다.

  4. 종속성 주입: 일단 빈이 준비되면 Spring은 @Autowired로 표시한 곳에 빈을 주입합니다. 이는 커피를 만드는 것뿐만 아니라 필요한 곳에 정확한 카운터까지 전달하는 바리스타를 갖는 것과 같습니다. 그것에 대해 생각할 필요조차 없습니다. 모든 것이 표시됩니다.


@Autowired는 어떻게 작동하나요? 콩의 셜록 홈즈

아, 좋은 @Autowired 주석이군요. Spring이 종속성을 주입할 위치를 마술처럼 어떻게 아는지 궁금한 적이 있습니까? 이는 레지스트리에 있는 올바른 빈과 사용자의 요구 사항을 일치시키는 탐정과 같습니다.

작동 방식은 다음과 같습니다.

  • 유형 일치: Spring이 @Autowired를 볼 때 컨테이너에서 동일한 유형의 빈을 찾습니다. 당신이 커피콩(CoffeeService 클래스)을 주문했다고 상상해 보세요. Spring은 자신의 Bean 저장소를 보고 "아, 나 이거 가져왔어!"라고 말합니다. 제가 주사해 드리겠습니다.”

  • 한정자: 하지만 동일한 유형의 빈이 여러 개 있는 경우에는 어떻게 될까요? 이 경우 Spring은 놀라서 "NoUniqueBeanDefinitionException"과 같은 예외를 던질 수 있습니다. 하지만 걱정하지 마세요. @Qualifier를 사용하여 주입할 빈을 지정하면 Spring을 진정시킬 수 있습니다.

@Autowired
@Qualifier("espressoBean")
private CoffeeService coffeeService;
  • 생성자 주입(가장 좋은 방법): 요즘 생성자 주입은 블록에서 가장 멋진 기술입니다. 이는 빈을 불변으로 만들 뿐만 아니라 테스트도 쉽게 만듭니다. 방법은 다음과 같습니다.
public class CoffeeShop {

    private final CoffeeService coffeeService;

    @Autowired
    public CoffeeShop(CoffeeService coffeeService) {
        this.coffeeService = coffeeService;
    }
}

Spring이 자동 조종 장치로 작동하여 생성자에 빈을 주입하면 짜잔—잘 진행됩니다!


Spring Bean의 수명주기: 탄생부터 은퇴 파티까지

Spring Boot의 Bean은 단순한 객체가 아닙니다. 그들은 기원 이야기, 만족스러운 경력, 그리고 궁극적인 은퇴를 갖춘 완전한 삶을 살고 있습니다. Bean의 라이프사이클을 따라가 보겠습니다.

  1. 인스턴스화(생성): 먼저 Spring은 Bean의 인스턴스를 생성합니다. 이는 콩의 탄생과도 같습니다. 봄이 온다. "자, 꼬마야!" 그리고 이를 컨테이너에 전달합니다.

  2. 종속성 주입: 빈을 생성한 후 Spring은 빈을 종속성(케이크 레시피의 재료와 같은)으로 채웁니다. @Autowired가 작동하는 곳입니다. 빈은 제대로 작동하는 데 필요한 모든 것을 갖습니다.

  3. Post-Initialization: @PostConstruct로 주석이 달린 메소드가 있는 경우 Spring은 종속성을 주입한 후 해당 메소드를 호출합니다. 이는 빈이 작동하기 전에 새로운 페인트를 칠하는 것과 같습니다.

  4. 실행 준비: 이제 빈이 살아 있고 작동 중입니다. 세계를 정복할 준비가 되었습니다!

  5. 파괴 전(은퇴): 애플리케이션이 종료되면 Spring은 @PreDestroy 메소드를 호출하여 빈에 우아한 종료를 제공합니다. 이것은 Bean의 자원을 정리하는 Bean의 은퇴 파티입니다.

  6. 빈 파괴: 마지막으로 빈이 파괴됩니다. 편히 쉴 시간입니다.

코드에서 이러한 수명 주기 이벤트를 추적하는 방법은 다음과 같습니다.

@Component
public class CoffeeBean {

    @PostConstruct
    public void onStart() {
        System.out.println("Bean is ready to brew some coffee!");
    }

    @PreDestroy
    public void onEnd() {
        System.out.println("Bean is retiring. Goodbye, world!");
    }
}

빈 스코프: 마법은 얼마나 오래 지속되나요?

모든 콩의 기대 수명이 동일한 것은 아닙니다. Spring Boot를 사용하면 빈에 대해 다양한 범위를 정의할 수 있습니다(기본적으로 빈의 수명). 가장 일반적인 두 가지는 다음과 같습니다.

  • 싱글톤(기본값): 전체 애플리케이션에서 공유되는 빈 인스턴스가 하나만 있습니다. 이는 커피숍 전체에 에스프레소 머신 한 대를 사용하는 것과 같습니다.

  • 프로토타입: 필요할 때마다 빈의 새로운 인스턴스가 생성됩니다. 주문할 때마다 신선한 에스프레소 머신이 있다고 상상해 보세요. 리소스가 많이 소모되지만 때로는 필요할 때도 있습니다.

@Component
@Scope("prototype")
public class LatteMachine {
    // This bean is made fresh for every use
}

SpringApplication.run(): DI의 그랜드마스터

자, SpringApplication.run()을 사용하여 Spring Boot 앱을 실행할 때 무슨 일이 일어나는지 이야기해 보겠습니다. 이 방법은 전체 DI 프로세스를 시작하는 그랜드마스터입니다.

  1. 애플리케이션 컨텍스트 시작: Spring은 모든 Bean이 있는 ApplicationContext를 실행합니다.
  2. 빈 검색: Spring은 코드에서 빈을 검색하고 등록합니다.
  3. 종속성 주입: 일단 빈이 준비되면 Spring은 @Autowired가 사용되는 모든 곳에서 빈을 주입하기 시작합니다.
  4. 애플리케이션 실행: 모든 것이 준비되면 애플리케이션이 활성화됩니다. 마법이 완성되었습니다.

실제 비유: 커피숍의 DI

Spring Boot 애플리케이션을 커피숍으로 생각해보세요. 당신은 주인이고 콩은 당신의 재료입니다: 커피, 우유, 설탕 등. 이러한 재료를 직접 관리하기 위해 이리저리 뛰어다니는 대신 모든 것을 가져와서 정확히 있는 곳에 전달하는 바리스타(스프링 컨테이너)가 있습니다. 필요합니다.

당신이 해야 할 일은 명령을 내리는 것뿐입니다(@Autowired 필드 설정). 바리스타가 나머지를 처리합니다. 즉, 고객을 위해 종속성이 가득한 커피 한 잔을 완벽하게 추출합니다(애플리케이션).


정리: DI는 여러분의 초능력입니다

결국, 종속성 주입이 Spring Boot를 그토록 강력한 프레임워크로 만드는 이유입니다. 이는 삶을 단순화하고, 빈을 관리하며, 코드의 유지 관리 및 확장이 용이하도록 보장합니다.

이제 당신은 커튼 뒤를 엿보았으니 많은 개발자들이 당연하게 여기는 초능력을 갖게 되었습니다. 이제 지금처럼 마법사처럼 DI를 사용해 보세요. 그리고 다음에 @Autowired를 보면 내부에서 무슨 일이 일어나고 있는지 정확히 알게 될 것입니다.


이 블로그를 통해 여러분이 Spring Boot DI에 대해 더 깊이 이해하고 미소를 지으실 수 있기를 바랍니다. 이제 가서 콩을 주입하고 친구들에게 그 방법을 보여주세요!


재미있고, 유익하고, 이해하기 쉬운 블로그는 어떤가요? 더 많은 조정을 원하시면 알려주세요!

릴리스 선언문 이 기사는 https://dev.to/janisyed18/dependent-injection-in-spring-boot-the-wizard-behind-the-curtain-49n8?1에 복제되어 있습니다. 침해 사항이 있는 경우, Study_golang@163으로 문의하시기 바랍니다. .com에서 삭제하세요
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3