새소식

Spring

[Spring] 의존성주입(DI, Dependency Injection)

  • -

의존성 주입

 

1)    의존성 주입의 개념

 

DI는 객체가 직접 필요로 하는 의존성을 생성자, Setter 메서드, 필드 주입 등의 방법으로 주입받는 것을 의미

 

이를 통해 객체 간의 결합도를 낮추고, 코드의 재사용성과 유지보수성을 향상시킬 수 있습니다.

 

 

2)    의존성 주입의 세가지 방법

 

① 생성자 주입 ( Constructor Injection )

 

생성자를 통해 의존성을 주입하는 방법입니다.
클래스의 생성자를 정의하고, 해당 클래스가 필요로 하는 의존성을 생성자의 매개변수로 선언합니다.

 

<예시>
public class Attack {
    private String name;
// Attack 클래스 선언


    public Attack(String name) {
        this.name = name;
    }

    public void perform() {
        System.out.println(name + " attack performed!");
// Attack 클래스의 perform이라는 메소드 생성
    }
}

public class Pokemon {
    private Attack attack;
// Attack은 클래스이며, Pokemon 클래스 내에 선언된 attack 변수는 Attack 클래스의 객체를 참조함
즉, Pokemon 클래스는 Attack 클래스에 대한 의존성을 가지고 있습니다. 
Pokemon 클래스는 Attack 객체를 필요로 하며, Attack 객체를 통해 실제 공격을 수행합니다.


public Pokemon(Attack attack) {

        this.attack = attack;
    }
// Pokemon 클래스 내에 Attack 객체의 매개변수 attack을 받아 들이고,
이를 인스턴스 변수인 this.attack에 할당합니다.
Attack 객체를 Pokemon 객체에 주입하여 사용할 수 있게 됩니다 생성자 주입


    public void attack() {
        if (attack != null) {
            attack.perform(); // Attack 객체의 perform() 메소드 호출
        } else {
            System.out.println("No attack available!");
        }
    }
}

 

 

 

 

② 세터 주입 ( Setter Injection )

 

Setter 메서드를 통해 의존성을 주입하는 방법입니다.

클래스의 Setter 메서드를 정의하고, 해당 클래스가 필요로 하는 의존성을 Setter 메서드의 매개변수로 선언합니다.

Spring 컨테이너는 Setter 메서드를 호출하여 의존성을 주입합니다.

 

<예시>
public class Attack {
    private String name;

    public Attack(String name) {
        this.name = name;
    }

    public void perform() {
        System.out.println(name + " attack performed!");
// Attack 클래스의 perform이라는 메소드 생성
    }
}

public class Pokemon {
    private Attack attack;

public void setAttack(Attack attack) {
this.attack = attack;
}
// 위 메소드 public void setAttack(Attack attack)은 Attack 클래스의 객체를 참조하는 역할을 함.
Attack 타입의 매개변수 attack을 받아들이고, 이를 Pokemon 클래스의 인스턴스변수 this.attack에 할당
즉, 외부에서 전달된 Attack 객체를 현재 Pokemon 객체의 attack 변수에 저장함.

이렇게 setAttack() 메서드를 통해 외부에서 Attack 객체를 설정할 수 있게 되면, 
Pokemon 객체는 주입된 Attack 객체를 사용하여 attack() 메서드를 호출할 때 
해당 Attack 객체의 perform() 메서드를 실행합니다. 

따라서 setAttack() 메서드는 Attack 클래스의 객체를 참조하여 Pokemon 객체에 주입하고, 
attack() 메서드에서 해당 객체를 사용하는 역할을 합니다.  Setter 주입

    public void attack() {
        if (attack != null) {
            attack.perform(); 
// attack.perform()은 Pokemon 객체에 주입된 Attack 객체의 perform() 메소드를 호출함

        } else {
            System.out.println("No attack available!");
        }
    }
}

 

 

 

 

③ 필드 주입 ( Field Injection )

 

필드에 직접 의존성을 주입하는 방법입니다.
클래스의 필드를 선언하고, 해당 필드에
@Autowired 애노테이션을 사용하여 의존성을 주입합니다.
Spring 컨테이너는 필드 주입을 통해 의존성을 주입합니다.

<예시>
public class Attack {
    private String name;

    public Attack(String name) {
        this.name = name;
    }

    public void perform() {
        System.out.println(name + " attack performed!");
// Attack 클래스의 perform이라는 메소드 생성
    }
}
public class Pokemon {
    @Autowired              Field 주입
    private Attack attack;

    public void attack() {
        if (attack != null) {
            attack.perform(); // Attack 객체의 perform() 메서드 호출
        } else {
            System.out.println("No attack available!");
        }
    }
}

Attack 클래스의 객체를 @Autowired 어노테이션을 사용하여 attack 필드에 주입하고 있습니다. @Autowired 어노테이션은 스프링 프레임워크에서 사용되며,
해당 필드의 타입에 맞는 빈을 자동으로 주입합니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2023.06.27 - [Spring] - Spring의 개념과 기원

 

Spring의 개념과 기원

1) 스프링의 개념 Java 플랫폼에서 웹 애플리케이션 개발을 위한 오픈 소스 프레임워크 2) 스프링의 기원 1』개발자는 누구인가? 호주 시드대학교 출신의 컴퓨터 프로그래머 로데릭 로드 존슨이

devwarriorjungi.tistory.com

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.