의존성?
의존성 주입을 이해하기전
의존성(=의존관계,Dependency)란?
A가 B를 의존한다와 같이
의존대상 B가 변하면 그것이 A에 영향을 미치는 관계 , 그런 성질을 의미한다.
즉 하나의 클래스가 바뀔때 다른 클래스가 영향을 받는다는 것을 뜻한다.
DI(Dependency Injection , 의존성 주입, 의존관계 주입)
의존성 중비이란 클래스간 의존성을 클래스 외부에서 주입하는것을 뜻한다.
더 자세하게는
의존성 주입은
클래스에 대한 의존성의 인터페이스화를 통한 코드 유연성 증대 + 클래스의 인스턴스를 외부에서 생성하여 주입하는것
을 뜻한다.
예)
Computer 클래스가 CPUi5 클래스를 의존하고있었고 , 해당 cpui5 클래스 안에 메소드도 이용하고있었다.
하지만 어떠한 이유로 인해
computer 클래스안에 cpu를 바꿔야할 상황이 왔고 cpui9으로 바꾸게 되었다.
그렇게 되면 computer클래스안에서 cpui5의 객체를 생성했던 부분의 코드와 , 해당 객체를 이용하여 cpui5의 메소드를 사용했던 부분 모두를 수정해야하므로 변경될 부분이 많아진다.
cpui5와 cpui9이 같은 동작을 하지만 메소드 이름이 서로 다를 경우 , 객체 생성부분만 수정해야하는것이 아니고 메소드 사용하는 부분도 수정해야해서 수정할 부분이 더 증가하는것이다.
수정할 부분을 객체 이름정도로만 줄이기 위해서는 인터페이스를 이용하여 특정 클래스에 대한 의존성을 해결 할 수 있다.
클래스에 대한 의존성의 인터페이스화를 통한 코드 유연성 증대 가 이부분에서 해결된다.
다음과 같이 구성하면 컴퓨터클래스에서는 cpu를 cpui5로 바꾸거나 cpui9으로 바꾸는 간단한 작업만으로 원하는 cpu객체로 수정가능하고 컴퓨터 클래스 내부의 다른 수정은 필요없게 된다.
인터페이스화를 통해서 특정 클래스 의존성을 해결했는데
의존적인 클래스를 외부에서 생성후 주입해주는 이유가 뭘까?
위에서는 컴퓨터 클래스가 예시가 하나였지만
그 수가많아질수록 , 객체 이름만 바꿔주는일도 상당히 버거운 일이 된다.
하지만 모니터를 32인치로 바꾸려고 하면 컴퓨터1,2,3 클래스의 모니터 객체 생성코드를 각각 바꿔줘야한다.
이를 해결하기 위해 주입을 사용한다.
외부에서 모니터 객체를 만들어서 모니터가 필요한 각각의 컴퓨터 클래스에 주입해준다.
이러한 인스턴스를 저장하는 공간을 container라고 부르며 , 이제 객체에 대한 제어권한이 더이상 컴퓨터에 있는것이 아니라 Container에 있다. 이것을 IOC(inversion of control) 제어의 역전이라고 하며 인스턴스를 저장하는 container를
ioc container라 부른다.
이렇게 구조를 바꾼다면 컴퓨터 클래스는 모니터객체를 외부에서 주입받는것이므로 모니터 객체의 수정을 신경안써도되고 , 여러개의 모니터 객체를 만들지않고 하나의 모니터 객체를 이용하여 주입하므로 메모리 측면에서도 ,관리측면에서도 편하다.
위에서는 그냥 주입이라고 적혀있지만
주입의 방법은 2가지가 있다.
주입의 방법
1. 생성자를 이용한다.
class computer{
private Monitor monitor;
public computer(Monitor monitor) // 모니터 객체를 생성자를 통해 받아오는 방법
{
this.monitor = monitor;
}
}
해당 방법으로 외부에서 모니터 객체를 주입받는다.
2. 메소드를 이용한다 (setter 메소드)
class Computer{
private Monitor monitor;
public void setMonitor(Monitor monitor) // 컴퓨터 클래스안에 setter를 이용하여 모니터 객체를 주입받는다.
{
this.monitor = monitor;
}
}
class main
{
private Computer computer = new Computer();
public void changeMonitor()
{
computer.setMonitor(new Monitor32()); // setter를 이용하여 컴퓨터 객체의 모니터객체를 수정가능
}
}
setter를 이용하여 컴퓨터 클래스 내부의 모니터 객체를 주입받아 수정하는 방식
의존성 주입 (DI)의 장점
클래스간의 결합도가 약해짐 -> 한 클래스가 변경될경우 다른 클래스가 변경될 필요성이 적어진다.
1. 의존성이 줄어든다.
의존대상의 변화가 취약하다는 단점을 해결한다. (주입받는 대상이 변하더라도 수정할 부분이 없거나 줄어듬)
2. 재사용성이 높은 코드가 된다.
원래는 monitor가 특정 컴퓨터 클래스에서만 사용됬는데(인터페이스를 쓰지않아 메소드 이름도 다르고 해서)
외부에서 인터페이스를 이용하여 구분하므로 다른클래스에서 쉽게 재사용이 가능하다.
3. 테스트 하기 좋은 코드가 된다.
컴퓨터클래스와 모니터 클래스의 테스트를 분리하여 진행 할 수 있다.
4. 가독성이 높아진다.
출처
https://tecoble.techcourse.co.kr/post/2021-04-27-dependency-injection/
'Spring > Spring' 카테고리의 다른 글
Spring] 예외처리 (@ExceptionHandler , @ControllerAdvice,@RestControllerAdvice), 에러코드,실제 적용 [미완] (0) | 2023.01.24 |
---|---|
Spring Profile마다 Application.* 다르게 사용하기 [미완] (0) | 2023.01.20 |
스프링환경설정파일(.properties,.yml),노출되면 안되는 정보 파일 관리, 빌드/배포 [미완] (0) | 2023.01.20 |
Spring Boot]로그,로깅,로그를 파일로 저장하기 (LogBack) [미완] (0) | 2023.01.19 |
[swagger] 스웨거 (0) | 2022.10.09 |
댓글