04.17 학습&숙제

한강섭·2025년 4월 17일
0

학습 & 숙제

목록 보기
67/103
post-thumbnail

💉 DI (Dependency Injection)


🔗 의존성과 DI

전통적으로 의존성을 구매했지만, 최근에는 렌탈 서비스가 급격히 증가 📦

  • 구매 (의존성 생성) vs 렌탈 (의존성 주입)

🫘 빈(Bean) 이란?

스프링 프레임워크에 의해 생성되고 관리되는 자바 객체 🛠️
스프링은 빈의 생성, 의존관계 설정, 객체 관리 등 빈의 라이프사이클을 전반적으로 관리합니다.


🧩 의존 관계란?

어떤 객체가 비즈니스 로직 처리를 위해 다른 객체에 의존하는 관계 → 객체 간 has-a 관계

의존 관계 관리를 위해 DI 개념을 사용하며 이 과정에서 제어의 역전(IoC)이 발생합니다.


❗ DI의 필요성

1단계: 기존 결합도 높은 코드 🔧
2단계: 인터페이스 도입 (하지만 new로 생성하므로 여전히 결합됨) 🧱
3단계: Factory Pattern 도입 (렌탈 업체 등장! 생성은 Factory가, 참조만 인터페이스) 🏭
4단계: 싱글톤 적용 (객체 생성은 딱 한 번!) 🧵

➡️ 최종적으로 Spring Framework의 등장 🎉

Spring은 빈(Bean) 이라는 개념으로 객체를 관리하고, 의존성을 주입(DI) 해줍니다.

👉 개발자가 직접 컨트롤 → 프레임워크가 컨트롤 (제어의 역전!)


🛠️ 멤버 변수를 설정하는 방법 (3가지)

DI 방식


⚙️ Spring의 빈 관리 방법

  1. 개발자는 POJO로 빈 작성 🧑‍💻
  2. 메타 정보(빈 생성 및 의존 설정)를 스프링 컨테이너에 전달 🧾
  3. 런타임 시,
    • 스프링은 메타 정보를 참고하여 싱글톤 객체 생성
    • 설정된 관계에 따라 의존성 주입 처리

✍️ 명시적 DI

빈을 생성하고 의존성을 주입하는 코드를 별도의 설정 파일에 명시하는 방식

  • @Configuration + @Bean 사용

(어노테이션을 확인할 때 중요한 2가지: 타겟과 속성!)

🫢 계속 new 되는 거 아니야?! → @BeforeEach로 한 번만 생성 가능하게 설정 가능


🧪 Test 코드 작성

@BeforeEach를 사용하여 new를 테스트 전에 딱 한 번 실행되도록 함 🔄
@Test를 통해 테스트 실행 ✔️
싱글톤 확인은 Assertions.assertSame() 사용 ✅


🤖 묵시적 DI

명시적 DI처럼 @Configuration, @Bean을 사용하지 않고, 어노테이션을 기반으로 주입

  • @Component : 클래스 위에 붙여 스프링 빈으로 등록 가능

  • 기본 빈 이름은 클래스명을 소문자로 시작한 camelCase

  • @Autowired : 타입 기반의 자동 주입 (생성자, 메서드, 필드에 사용 가능)

  • 생성자가 하나일 경우, @Autowired 생략 가능

@ComponentScan : 어떤 패키지에서 빈을 스캔할지 설정 🔍

⚠️ 주의사항:
1. 어떤 패키지를 스캔할지 명시해야 함
2. 설정 클래스에 @Configuration 있어야 작동

🫢 Watch와 SmartWatch처럼 타입이 같으면 스프링이 헷갈려서 어떤 빈을 줘야 할지 모름

➡️ @Qualifier 사용으로 이름 기반으로 주입할 빈을 한정할 수 있음

  • @Component : 특별한 의미는 없지만, "빈의 대상"임을 나타냄
  • 스테레오타입 어노테이션 → @Repository, @Service, @Controller, @Configuration 등은 내부적으로 @Component 포함

👉 가급적 스테레오 타입 어노테이션 사용하고, 일반적인 경우엔 @Component 사용


🔄 DI 방법의 비교


주입 방식에 따른 비교

✅ 생성자 주입 (가장 권장됨)

  • 모든 의존성이 반드시 필요함을 명확히 보여줌
  • 순환 참조 시 즉시 문제 발견 가능 (빈 생성 시점)
  • 많은 경우 field를 blank final로 선언하고 생성자 주입을 사용하는데 lombok의 @RequiredArgsConstructor 활용

⚠️ Setter 주입

  • 선택적인 의존성에 적합

🚫 Field 주입

  • 테스트 어려움, 유지보수 불리 → 지양

🧠 DI 방법 비교 정리

명시적 DI보다 묵시적 DI가 익혀야 할 어노테이션은 많지만 더 직관적이고 편리합니다.

하지만 외부 라이브러리 코드는 @Component가 없어 자동 등록이 불가능하기 때문에
➡️ 명시적 DI도 보조적으로 반드시 필요합니다.


🌀 빈의 생명 주기

  1. 생성자 호출
  2. Setter 호출
  3. 초기화 메서드 호출
  4. 빈 사용 가능 (ctx.getBean())
  5. 소멸 메서드 실행 🔚

📚 정리

의존성은 무조건 가져야 하는 것 ex) 클래스 안에 있는 객체, has a 관계

객체를 원래 내가 선언하고 활용해야 하는데 그러면 유지보수가 힘듬 그것을 해결해주는게 IOC = 제어의 역전

IOC의 방법이 바로 DI = 의존성 주입!

Spring이 DI를 자동으로 해주기 위해 Bean으로 class들을 관리

명시적과 묵시적 방법으로 주입 가능 (어노테이션 활용)


🎨 정리한 그림

숙제

정처기 실기 모의고사 , 1 알고리즘

profile
기록하고 공유하는 개발자

0개의 댓글