240117 TIL : DI

2025. 1. 17. 17:20·🏕 멋사 Java 백엔드 13기/TIL

💬 IoC(Inversion of Control, 제어의 역전)

💡 프로그램의 제어 흐름을 개발자가 아닌 프레임워크가 관리하는 디자인 원칙 

 

  • 기존 방식 
    • 객체 생성 → 의존성 객체 생성 → 의존성 객체 메소드 호출
  • 스프링
    • 객체 생성 → 의존성 객체 (스프링이 만들어 놓은 객체) 주입  → 의존성 객체 메소드 호출

❔ IoC의 장점

  • 유연성 증가
    • 클래스 간 결합도 낮아짐 
  • 유지 보수 용이
    • 코드 변경 시 적은 부분만 변경할 수 있음

💬 Bean

💡 Spring IoC 컨테이너가 관리하는 객체. (생성•초기화•보관•제공) 

❔ Bean의 주요 특징 

  • 관리의 자동화 
  • 싱글턴 패턴 
    • 어플리케이션 내에서 해당 Bean에 대한 요청이 있을 때마다 동일한 객체 인스턴스가 반환됨
    • 필요에 따라 프로토타입 등의 다른 스코프 설정 가능
  • 의존성 주입(DI)
    • 의존성을 자동으로 주입받으며, 설정 파일 및 어노테이션 등을 통해 구성이 가능하다.

❔ Bean 정의 방법

  • XML 파일을 통해 등록
  • Java Config 클래스를 이용해 등록 : @Configuration과 @Bean을 사용하여 등록 = 외부 객체
  • 애노테이션을 이용한 Bean 등록 : @Component, @Service, @Controller, @Repository 등을 사용해 Bean을 정의하고, @ComponentScan으로 Bean을 스캔 = 자신이 만든 객체  

 

✅ @SpringBootApplication 사용 시의 스캔

  • @SpringBooTApplication 어노테이션이 붙은 클래스가 자동으로 컴포넌트를 스캔
  • @SpringBootApplication은 기본적으로 현재 클래스가 위치한 패키지•하위 패키지를 스캔 

💬 DI(Dependency Injection, 의존성 주입)

💡  객체가 사용할 의존 객체를 외부에서 만들어 주입받는 방식

❔사용 목적

  • 유연성 및 유지보수성 확보
  • 의존도 감소
  • 테스트 용이성 확보 

❔구현 방식

1️⃣ 생성자 주입(Constructor Injection) : 

// 의존성 클래스
class Service {
    public void serve() {
        System.out.println("Service is serving...");
    }
}

// 클라이언트 클래스
class Client {
    private final Service service;

    // 생성자를 통해 의존성 주입
    public Client(Service service) {
        this.service = service;
    }

    public void execute() {
        service.serve();
    }
}


public class Main {
    public static void main(String[] args) {
        Service service = new Service();
        Client client = new Client(service); // 생성자를 통해 의존성 주입
        client.execute();
    }
}

2️⃣ 세터 주입(Setter Injection)

// 의존성 클래스
class Service {
    public void serve() {
        System.out.println("Service is serving...");
    }
}

// 클라이언트 클래스
class Client {
    private Service service;

    // 세터 메서드를 통해 의존성 주입
    public void setService(Service service) {
        this.service = service;
    }

    public void execute() {
        service.serve();
    }
}

// 메인 클래스
public class Main {
    public static void main(String[] args) {
        Service service = new Service();
        Client client = new Client();
        client.setService(service); // 세터 메서드를 통해 의존성 주입
        client.execute();
    }
}

3️⃣ 필드 주입(Field Injection) : 비추천 

@Service
public class Service {

    @Autowired
    private Serviceone serviceone;

   ....

 

'🏕 멋사 Java 백엔드 13기 > TIL' 카테고리의 다른 글

250205 TIL | 람다식  (1) 2025.02.05
250121 TIL | AOP  (2) 2025.01.21
[멋쟁이사자처럼 부트캠프 TIL 회고] 241231 백엔드 Java 부트캠프 21일차  (2) 2024.12.31
[멋쟁이사자처럼 부트캠프 TIL 회고] 백엔드 Java 부트캠프 12일차 | DB  (2) 2024.12.17
[멋쟁이사자처럼 부트캠프 TIL 회고] 백엔드 Java 부트캠프 11일차 | DB  (1) 2024.12.16
'🏕 멋사 Java 백엔드 13기/TIL' 카테고리의 다른 글
  • 250205 TIL | 람다식
  • 250121 TIL | AOP
  • [멋쟁이사자처럼 부트캠프 TIL 회고] 241231 백엔드 Java 부트캠프 21일차
  • [멋쟁이사자처럼 부트캠프 TIL 회고] 백엔드 Java 부트캠프 12일차 | DB
Cofish
Cofish
  • Cofish
    Codesea
    Cofish
  • 전체
    오늘
    어제
    • 분류 전체보기 (18)
      • 🏕 멋사 Java 백엔드 13기 (17)
        • TIL (15)
        • 자료구조 (2)
      • 네트워크 (1)
        • TCP•IP (1)
      • 🎨 블로그 꾸미기 (0)
      • 💬 일상 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    부트캠프
    db 기초
    java 기초
    멋쟁이사자처럼 #부트캠프
    멋쟁이 사자처럼
    MySQL
    디자인 패턴
    백엔드 java 부트캠프
    #멋쟁이 사자처럼
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
Cofish
240117 TIL : DI
상단으로

티스토리툴바