spring

[spring] DI(의존 관계 주입) (스프링 핵심 원리-기본편 from 김영한 강사님)

Lord DEVader 2023. 8. 23. 11:15
@SpringBootApplication
public class DependancyinjectionsampleApplication {

	public static void main(String[] args) {
		SpringApplication.run(DependancyinjectionsampleApplication.class, args).getBean(DependancyinjectionsampleApplication.class).excute();

	}

	@Autowired
	Greet greet;

	private void excute() {
		greet.greeting();
	}
}​
System.out.println("이 게시물은 김영한님의 스프링 핵심 원리-기본편을 참조하였습니다.");
// https://www.inflearn.com/course/lecture?courseSlug=%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8&unitId=55337&tab=curriculum

 

DI (Dependency Injection)

    : SW 개발 디자인 패턴중 하나. 하나의 객체가 다른 객체의 의존성을 제공하는 테크닉.

      애플리케이션 실행 시점에 외부에서 실제 구현 객체를 생성하고 클라이언트에 전달하므로서, 클라이언트와 서버의 실제 의존 관계가 연결되는것

    - 장점

        - 느슨한 결합도.

        - 테스트 용이성

        - 재사용성

        - 유지보수성

    - 종류

        - 생성자 주입

        - 세터 주입

        - 인터페이스 주입

    - 예시

        "클라이언트가 어떤 서비스를 사용할지 지정 x ==>  클라이언트에게 무슨 서비스를 사용할지 말해줌."

        클라이언트는 실행에만 집중하면 되고, 서비스가 어떻게 구성되는지 몰라도 됨.

출처. 의존성 주입 - 위키백과, 우리 모두의 백과사전 (wikipedia.org)

 

 


의존성 주입 예시

public interface Greet {
    void greeting();
}

@Component
public class MorningGreet implements Greet {
    @Override
    public void greeting() {
        System.out.println("-------------");
        System.out.println("Good morning!");
        System.out.println("-------------");
    }
}

//@Component
public class EveningGreet implements Greet{

    @Override
    public void greeting() {
        System.out.println("-------------");
        System.out.println("Good evening!");
        System.out.println("-------------");
    }
}

결과


 

 

생성자 주입의 예시

public class AppConfig {
    public MemberService memberService() {
        return new MemberServiceImpl(new MemoryMemberRepository()); //생성자 주입
    }

    public OrderService orderService() {
        return new OrderServiceImpl(new MemoryMemberRepository(), new FixDiscountPolicy());
    }
}

 

public class MemberApp {
    public static void main(String[] args) {
        AppConfig appConfig = new AppConfig();
        MemberService memberService = appConfig.memberService(); // 인터페이스에만 의존적이고, 그 대상은 외부(appConfig)에 의존한다.
//        MemberService memberService = new MemberServiceImpl(); // 인터페이스와 구현체 모두에 의존적이다.
        Member member = new Member(1L, "memberA", Grade.VIP);
        memberService.join(member);

        Member findMember = memberService.findMember(1L);
        System.out.println("new member = " + member.getName());
        System.out.println("fineMember = " + findMember.getName());
    }
}

 

구현체는 밖에서(appConfig)에서 만들어 주입한다.

인터페이스는 주입된걸 실행하는것에만 집중한다.