TIL - 20250717

juni·2025년 7월 17일

TIL

목록 보기
67/317

0717 Spring DI 학습 정리

🧱 DI(Dependency Injection) 의존성 주입

  • 의존 객체를 외부에서 주입받아 사용하는 방식으로 객체 간의 결합도를 낮추고 유연한 구조를 설계할 수 있음.

🤝 생성자 주입 방식

  • 객체 생성 시점에 필요한 의존 객체를 생성자 파라미터로 주입받는 방식
  • 테스트, 유지보수에 용이
public class Car {
    private final Engine engine;

    public Car(Engine engine) {
        this.engine = engine;
    }

    public void drive() {
        engine.start();
        System.out.println("자동차가 달립니다.");
    }
}

🏨 chap01 - 레스토랑, 셰프, 코스

구조 설명

  • Restaurant: 레스토랑 인터페이스 (order 메서드)

  • Chef: 셰프 인터페이스 (cook 메서드)

  • Course: 코스 메뉴 인터페이스 (combineMenu 메서드)

  • 구현 클래스:

    • WesternRestaurant, AsianRestaurant
    • JannChef, KimuraChef, StephaneChef
    • FrenchCourse, SushiCourse, ItalianCourse

Hotel 클래스

  • 레스토랑과 셰프를 의존성으로 가짐
  • reserve() 메서드로 예약 동작 구현

HotelManager

  • 직접 의존 객체를 생성하여 주입하는 방식
  • 스프링 없이도 IoC를 흉내냄

🧪 chap02_2 - Spring DI 연습

CarConfig

  • @Configuration@Bean을 사용해 객체 등록
@Configuration
public class CarConfig {
    @Bean
    public Engine engine() {
        return new Engine();
    }

    @Bean
    public Car car() {
        return new Car(engine());
    }
}

LibraryConfig

  • List<Book>Library를 등록하는 예제
@Bean
public List<Book> books() {
    return List.of(
        new Book("캐치캐치 티니핑", "하츄핑"),
        new Book("뽀로로", "삘리리"),
        new Book("반지의 제왕", "링링링")
    );
}

@Bean
public Library library() {
    return new Library(books());
}

MusicConfig

  • Setter를 이용한 의존성 주입
@Bean
public MusicPlayer musicPlayer() {
    MusicPlayer musicPlayer = new MusicPlayer();
    musicPlayer.setSpeaker(speaker());
    return musicPlayer;
}

✍️ 테스트 코드

  • AnnotationConfigApplicationContext로 설정 클래스 등록
  • getBean() 메서드를 통해 빈 객체를 가져와 메서드 실행
ApplicationContext context = new AnnotationConfigApplicationContext(CarConfig.class);
Car car = context.getBean(Car.class);
car.drive();

✅ 요약

  • DI는 객체 간의 강한 결합을 낮춰 유지보수성과 테스트를 높여줌
  • Spring에서는 @Configuration, @Bean을 통해 DI를 구현할 수 있음
  • 생성자 주입 방식이 가장 권장됨 (불변성과 테스트 용이)
  • 다양한 방식(Car, Library, MusicPlayer 등)으로 DI 실습을 통해 개념 이해함

0개의 댓글