본문 바로가기
프로그래밍/JAVA

[SpringBoot]스프링부트에서의 의존성 주입 (DI) 💡🛠️

by 다다면체 2024. 12. 19.
728x90
반응형
반응형

의존성 주입 이해하기 🛠️

스프링부트에서 **의존성 주입(Dependency Injection, DI)**은 핵심 기능 중 하나로, 애플리케이션의 구조를 더 유연하고 확장 가능하게 만들어줍니다! 🤩 이 글에서는 DI의 원리, 활용법, 그리고 프로파일링으로 환경별 설정을 분리하는 방법까지, 실무에 바로 적용할 수 있는 팁들을 소개합니다. 🚀


1. DI의 원리 🔄

의존성 주입이란 객체 간의 결합도를 낮추고, 필요할 때 외부에서 객체를 주입받아 사용하는 설계를 의미합니다. 이렇게 하면 테스트와 유지보수가 훨씬 쉬워지죠! 💪

DI의 동작 방식

  • 의존성 선언: 필요한 의존성을 선언하면, 스프링 컨테이너가 해당 객체를 관리하고 주입해줍니다.
  • @Service public class MyService { private final MyRepository myRepository; public MyService(MyRepository myRepository) { this.myRepository = myRepository; } public void doSomething() { myRepository.save(new Data()); } }
  • 컨테이너 관리: 스프링이 @Component, @Service, @Repository, @Controller 애노테이션으로 등록된 빈(Bean)을 자동으로 생성하고 관리합니다.

DI의 장점

  1. 결합도 감소: 객체 간의 의존성을 인터페이스로 추상화하여 유연성 증가.
  2. 테스트 용이성: Mock 객체를 활용한 단위 테스트 가능.
  3. 코드 재사용성 향상: 의존성 교체가 쉬워 다양한 환경에 적응 가능.

2. 스프링의 DI 컨테이너 🏗️

스프링은 IoC(Inversion of Control) 컨테이너를 통해 객체의 생명주기를 관리합니다. 간단히 말해, 애플리케이션 실행 시 필요한 객체를 생성하고, 필요할 때마다 제공합니다! 🙌

빈 등록하기

  1. 애노테이션 기반 빈 등록
    • @Component를 사용하면 자동으로 빈이 등록됩니다.
    @Component
    public class MyComponent {
        public void execute() {
            System.out.println("Executing...");
        }
    }
  2. Configuration 클래스를 통한 빈 등록
    • Java Config를 사용해 명시적으로 빈을 등록할 수도 있습니다.
    @Configuration
    public class AppConfig {
        @Bean
        public MyService myService() {
            return new MyService(myRepository());
        }
    
        @Bean
        public MyRepository myRepository() {
            return new MyRepository();
        }
    }
  3. @Autowired로 의존성 주입
    • 필드, 생성자, 또는 메서드에 직접 주입할 수 있습니다.
    @Service
    public class MyService {
        @Autowired
        private MyRepository myRepository;
    
        public void process() {
            myRepository.save(new Data());
        }
    }

실무 팁

  • 생성자 주입 권장: 필드 주입보다 생성자 주입을 사용하면 불변성(Immutability)을 유지할 수 있습니다.
  • 필수 의존성 명시: 생성자 주입은 모든 필수 의존성을 강제할 수 있어 더 안전합니다.

3. 프로파일링으로 환경 분리 🌍

스프링부트에서는 @Profile 애노테이션을 사용해 환경별로 서로 다른 의존성을 주입할 수 있습니다. 예를 들어, 개발 환경에서는 Mock 객체를, 프로덕션 환경에서는 실제 객체를 주입할 수 있죠! 🛠️

@Profile 사용법

  1. 환경별 Bean 정의
  2. @Configuration public class AppConfig { @Bean @Profile("dev") public DataSource devDataSource() { return new H2DataSource(); } @Bean @Profile("prod") public DataSource prodDataSource() { return new MySQLDataSource(); } }
  3. 환경 활성화
    • application.properties에서 활성화할 프로파일을 지정하세요:
    • spring.profiles.active=dev
    • 이렇게 하면 개발 환경에서만 H2DataSource가 활성화됩니다! 🤩

실무 팁

  • 다중 프로파일: spring.profiles.active=dev,qa처럼 여러 프로파일을 동시에 활성화할 수도 있습니다.
  • 프로파일 지정 테스트: @ActiveProfiles("dev")를 테스트 클래스에 추가해 특정 환경에서의 동작을 검증하세요.

마무리 🎉

스프링부트의 의존성 주입은 코드의 유연성과 유지보수를 크게 향상시켜주는 강력한 도구입니다. 💪 다양한 환경에 맞는 빈을 설정하고, IoC 컨테이너의 도움을 받아 애플리케이션을 더 깔끔하고 효율적으로 개발해 보세요! 🛠️ 프로파일링까지 활용한다면, 환경별 설정도 문제없답니다! 🚀

728x90
반응형