공부(Study)/스프링(Spring)

스프링 DI, 의존성 주입

Zibu 2022. 10. 13. 15:18
반응형

 

 

코드 내용

깃허브 Repository

 

 

 

 

📢 의존성 주입 의 종류(생성자, setter, 필드), 역할, 좋은점

📢 의존관계 설정하는 방법(컴포넌트 스캔, 수동으로 빈 등록)

📢 어노테이션 모르는 것

 

 

 

✔️의존관계(DI) 란?

A가 B를 의존한다 → 의존 대상 B가 변하면 그것이 A에 영향을 미친다.

 

 

정의

 

의존관계 주입을 스프링 컨테이너에 등록된 빈(Bean)에서 찾아서 설정하는 방법

컨트롤러가 서비스단에 신경을 안써도 되고 코드를 바꾸지 않아도 의존하는 대상에 변화에 영향을 받는다.

 

 

과정

 

  1. 스프링 컨테이너가 @Component 를 찾아서 모두 스프링 빈으로 등록
  2. 의존성이 필요한 부분에서 @Autowired 태그가 있다면 등록된 스프링 빈에서 찾아서 의존관계 주입 설정
//controller
class Controller{
    private Service service;

    public Controller() {//의존성 주입
        service = new Service();        
    }
}

//service
interface Element {

}

class Service implements Element{

}

 

 

 

✔️의존성 주입의 종류

 

 

필드 주입

 

필드(변수)에 Autowired를 붙여서 자동으로 의존성 주입을 해서 코드는 간결하다는 장점이 있지만 객체 생성 후 변경하기 힘들다.

@Controller
public class Controller {
	@Autowired private Service service; //service단
}

 

 

setter 주입

 

setter 메서드가 public 하게 열어둬서 인스턴스 생성 후 언제든지 변경할 가능성이 있다.

@Controller
public class Controller {
	private Service service; //service단

	@Autowired
	public void setController (Service Controller) {
		this.service = service;
	}
	
}

 

 

생성자 주입

 

인스턴스를 생성하면서 바로 주입받는다. 인스턴스 하나당 등록되어있는 빈하나를 주입하기 때문에 불변성을 갖는다.

@Controller
public class Controller {
	private final Service service; //service단

	@Autowired
	public Controller (Service service) {
		this.service = service;
	}
	
}

 

 

 

 

 

✔️의존성 관계(DI) 설정 방법

정형화된 코드를 작성할때는 컴포넌트 스캔방법을 따르고 구현 클래스를 변경해야 되는 경우에는 수동으로 등록해야 됨

 

 

수동으로 빈을 생성해서 주입하는 방법

 

1. Service, Repository 에서 어노테이션을 전부 지우고 SpringConfig 파일에서

빈을 등록한다

2. @Configuration , @Bean을 통해서 빈을 등록한다.

@Configuration
public class SpringConfig {
    @Bean
    public Service servie() {
        return new Service(repository());
    }

    @Bean
    public Repository repository(){
        return new MemoryRepository();
    }
}

 

 

컴포넌트 스캔 방법

 

Controller, Service, Repository 어노테이션을 붙이면 스프링 컨테이너가 빈으로 등록하고 Autowired 를 통해 인스턴스 생성시 바로 주입됨

@Controller //빈생성
public class Controller {
    private  final Service service;

    @Autowired //의존성 주입
    public Controller(Service service) {
        this.service= service;
    }
}

@Service
public class Service{

    private final Repository repository;

    @Autowired
    public Service(Repository ) {
        this.repository= repository;
    }
}

@Repository
public class Repository implements MemoryRepository{

}

 

 

 

 

 

 

 

✔️강의 참고

 

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

 

[무료] 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 - 인프런 | 강의

스프링 입문자가 예제를 만들어가면서 스프링 웹 애플리케이션 개발 전반을 빠르게 학습할 수 있습니다., - 강의 소개 | 인프런...

www.inflearn.com

 

 

 

 

 

 

 

 

 

 

 

반응형