의존성 주입을 해준다는 문장에 꽂혀서 각각의 종류를 찾아보게 되었다 그런데 생각해보니 의존성 주입에 대한 개념이 부족한것 같아서 두가지 어노테이션을 공부하기전에 의존성 주입 개념을 다시한번 잡았다.
의존성 주입은 두 객체간의 관계를 결정해주는 디자인패턴인데 인터페이스를 사이에 둬서 클래스 레벨에서는 의존관계가 고정되지 않도록 하고 런타임 시에 관계를 동적으로 주입하여 결과적으론 유연성 확보와 결합도를 낮추도록 해준다.
의존성은 한객체가 다른 객체를 사용할 때 의존성이 있다고한다.
예를 들면
public class Subject {
private Math math
}
Subject 클래스에서 Math 클래스를 사용하고 있다 이때 " Subject 객체가 Math객체에 의존성이 있다"고 말할 수 있다.
주입방법은 생성자 주입, 필드 주입, 수정자 주입 등 다양한 방법이 존재한다.
의존성 주입을 사용해야 하는 이유?
public class Subject {
private Math math
public Subject(){
this.math = new Math();
}
}
이렇게 코드를 사용하면 Subject 와 Math 두 클래스가 강하게 결합된다. 즉 객체간의 관계가 아닌 클래스 간의 관계가 맺어진다는 것 이렇게 되면 코드를 작업하는데 문제가 생기는데 예를 들면 Subject 에 English 라는 정보가 추가된다면 Subject 의 생성자도 함께 변경해줘야 하기 때문에 유연하지 못하게 된다. Subject 의 구성 정보를 설계할 때 생성자만 다르고 나머지는 중복되는 Subject 클래스들이 파생되는 것은 좋지 못하다(유지보수의 어려움, 코드 중복, 테스트 복잡도 증가, 퍼포먼스 감소). JAVA가 원하는 올바른 객체지향적 설계 관점으로 보면 클래스 간의 관계가 아닌 객체들간의 관계를 맺는것이 올바르다.이후에는 관심의 분리로 클래스 안의 관련 특정 정보만이 존재하게 하는 것이 좋다.
public class Subject{
private Math math;
public Subject(Math math){
this.math = math;
}
}
Subject에서 Math객체를 주입하기 위해서는 애플리케이션 실행 시점에 필요한 객체(빈)를 생성해야 하며, 의존성이 있는 두 객체를 연결하기 위해 한 객체를 다른 객체로 주입시켜야 한다.
public class BeanFactory {
public void subject() {
//Bean 생성
Math geometry = new geometry(); // 수학안에 기하가 포함되있어 이렇게 설정함
//의존성 주입
Subject subject = new Subject(geometry);
}
}
스프링은 특정 위치부터 클래스를 탐색하고, 객체를 만들며 객체들의 관계까지 설정해준다. 이러한 이유로 스프링은 DI 컨테이너라고도 불린다.(제어의 역전과 같음)
=> 어떠한 객체를 사용할지에 대한 책임은 프레임워크에게 넘어갔고, 자신은 수동적으로 주입받는 객체를 사용하기 때문이다.
공부가 거의 끝날 때 쯤 들었던 생각은 지속적으로 이렇게 의존성을 주입해주는 것도 좋지만 이것들이 자주 호출이 되어버리면 비효율적이지 않을까? 라고 생각을 하고 있었는데 출처의 게시물 마지막줄에 Spring에서는 Bean들을 기본적으로 싱글톤으로 관리한다고 하는 것을 보고 역시 비효율적으로 계속해서 생성하지는 않는구나 라고 생각했다
출처: https://mangkyu.tistory.com/150 [MangKyu's Diary:티스토리]
전부 이글을 보고 생각하며 공부했다 정말 좋은 자료같다..!
'Back-End > Spring' 카테고리의 다른 글
[Spring security] 중복 로그인 방지 기능 만들다가 마주친 Maximum sessions of 1 for this principal exceeded 오류 + 리스너 개념 (0) | 2024.09.11 |
---|---|
[Spring] RestAPI와 @ResponseEntity (0) | 2024.09.10 |
[Spring Security] spring security 에서 CSRF 작동시키는 이유 (2) | 2024.09.09 |
[Spring] @Autowired 와 @RequiredArgsConstructor (1) | 2024.09.06 |