수업시간에 모르는 것들을 적어놓고 그걸 블로그에서 계속 질문하는 형태로 공부할 예정 (질문살인마)
SPRING은 데이터의 생명주기를 관리해준다
Spring의 IOC컨테이너는 Bean객체의 의존성(dependency)을 관리해준다
IOC컨테이너가 대신 개발자 대신 관리해주기 때문에 개발자는 로직에 집중이 가능하다
Bean이란?
스프링 IoC 컨테이너가 관리하는 객체로
Spring IoC 컨테이너에 의해 인스턴스화, 조립 및 관리되는 객체를 말하고
인스턴스화 된 빈은 @Autowired를 통해 의존성 주입을 받을 수 있다.
빈등록을 한다는건
IOC컨테이너가 의존성주입을 할 수 있게 @어노테이션과 설정파일(xml)을 사용해
객체를 IOC컨테이너 내부에 객체를 등록하는 것을 말한다
# IOC 컨테이너는 뭐지?
IOC 컨테이너의 역할은 크게 3가지가 있음
1. 객체의 생성과 초기화
- 설정파일(XML, config파일)에 정의된 대로 Bean을 생성하고 초기화해줌
2. 의존성 주입
- 특정 객체가 다른 객체를 필요로 할 때 자동으로 주입해줘서 객체간의 결합도를 낮추고 유연성을 높이는 것
Q. 의존성을 주입해준다는게 뭐지
A: 갹체간의 의존 관계를 설정하고 필요한 객체를 자동으로 주입해준다는 뜻
Q. 자동으로 주입해주나 수동으로 하나 뭐가 다르지? 그냥 코드가 짧아지는 거 같은데
A: 자동 의존성 주입이 객체 간의 결합도를 낮추는 이유는 객체가 다른 객체에 대해 직접 알 필요가 없어지기 때문.
코드가 짧아지는 것도 장점이지만 가장 큰 장점은 객체간의 의존성을 느슨하게 만들어서 유지보수성을 높인다는 것
#의존관계란?
int b = 5;
int a = b;
a는 b에 의존하고 있다. 서로 의존관계에 있는 것이고.
> a는 초기화될 때 b의 값이 필요하므로 b에 의존한다
수동주입
public class OrderService {
private ProductService ps;
public OrderService() {
this.ps = new ProductServiceImpl(); //직접 넣어줌
}
}
수동의 경우 OrderService가 ProductService를 직접 생성해서 사용하는데
여기서 문제가 ProductService의 구체적인 생성 방식(기능하는 코드)에 대해서 알고 있어야 한다는 점.
만약 ProductService에 변경이 생기면 OrderService도 바꿔야한다. (연결돼있어서)
이를 강한 결합이라고 함(코드 결합도가 높다)
자동주입
public class OrderService {
private ProductService ps;
public OrderService(ProductService productService) {
this.ps = productService; //자동으로 주입
}
}
그런데 이렇게 자동으로 주입할 경우 ProductService가 어떻게 생기는지 알 필요가 없음
그저 주입되기만 하면 됨. 왜 Why? 컨테이너가 알아서 객체를 생성해서 넣어주기 때문.
이를 느슨한 결합 ( 코드 결합도가 낮다)
이러면 유지보수성이 크게 증가한다
(말이 크게 증가한다지 결합도가 높으면 내가 바꾸는 하나의 코드가 어디까지 연결 돼있는지 생각하기조차 막막해진다)
=> 이런 상황을 [사이드 이펙트] 라고 한다
사이드 이펙트
코드를 수정하거나 실행할 때, 그 코드와 직접적으로 관계가 없는 다른 부분까지 영향을 미치는 현상을 말함
= 결합도가 높다 = 작은 하나의 에러가 프로그램의 많은 부분에 에러를 발생시킬 수 있다
'Spring' 카테고리의 다른 글
@ResponseBody (0) | 2024.10.30 |
---|---|
Spring - Cookie (0) | 2024.10.18 |
Spring 개념정리(DispatcherServlet, 매개변수 바인딩, DB 커넥트풀, 싱글톤 패턴) (0) | 2024.10.18 |
Spring - Filter / Interceptor (0) | 2024.10.18 |
Spring의 요청/응답 처리 방법 (0) | 2024.10.08 |