해당 포스트는 스프링 핵심 원리 - 기본편 강의 내용을 참고하였습니다.
1. 역할과 구현을 명확하게 분리
2. 역할이 잘 보이게 수정
// 역할이 잘 안보임
public MemberService memberService() {
return new MemberServiceImpl(return new MemoryMemberRepository());
}
// 역할을 잘 보이기 위해 메소드로 추출
public MemberService memberService() {
return new MemberServiceImpl(memberRepository());
}
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
이해를 위해서 단계 별로 나눴지만 2단계와 3단계는 한 번에 처리된다.
BeanFactory를 직접 사용할 일은 거의 없기 때문에 BeanFactory와 ApplicationContext를 모두 스프링 컨테이너라고 칭한다.
이때까지는 AppConfig.class로 가져왔는데 이렇게 말고 xml이나 다른 파일로 변경하는 것도 아주 간단하다.
구현 클래스는 다르지만 ApplicationContext를 상속하는 다른 구현 클래스에서 각각 AppConfig.class나 appConfig.xml에서 구성 정보를 읽고 그 클래스에 전달해줄 때는 BeanDefinition이라는 빈 메타정보를 생성해서 전달해주기 때문이다.
여기까지도 역할과 구현의 분리가 잘 되어있다!
// 요청을 받을 때 마다 새로운 객체를 만드는 것은 매우 비효율적
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
싱글톤 패턴은 자원을 공유한다는 큰 장점을 갖고 있다.
그럼에도 불구하고 다양한 문제점 때문에 안티패턴이라고도 불린다.
1. 의존관계상 클라이언트가 구체 클래스에 의존한다. ➡ DIP 위반 (~Impl.getInstance() 이런식이 되기 때문에)
2. DIP를 위반하기 때문에 OCP를 위반할 가능성이 높다.
3. 유연성이 떨어진다.
But! 이 단점들을 스프링은 모두 보완해서 관리해준다!
또한 싱글톤 패턴을 우리가 직접 작성할 필요 없이 스프링 컨테이너에서 싱글톤으로 관리해준다!
스프링 컨테이너에서 빈을 등록할 때 키와 값 쌍으로 관리를 한다. 그리고 그 관리를 싱글톤으로 한다.
이렇게 싱글톤 객체를 생성하고 관리하는 기능을 싱글톤 레지스트리라고 한다.
스프링 컨테이너에서 싱글톤이 디폴트이고 대부분 쓰이지만, 싱글톤이 아니고 요청할때마다 새로운 객체를 생성해서 주는 기능도 제공한다.
// stateful하게 코드를 작성하면 price를 다른 사용자와 공유하는 대참사가 발생한다.
private int price; // 상태를 유지하는 필드
public void order(String name, int price) {
this.price = price;
}
// stateless
public int order(String name, int price) {
return price;
}
스프링 컨테이너를 구성할 때, AppConfig.class를 전달하지만 그것 그대로 스프링 컨테이너가 쓰는게 아니다.
AppConfig@CGLIB라는 코드로 조작된 인스턴스가 스프링 컨테이너에 등록되고 사용된다.
이렇게 싱글톤이 유지될 수 있다.
AppConfig에 @Configuration을 안쓰고 구성하면, AppConfig@CGLIB가 아니라 hello.core.AppConfig라는 순수한 클래스를 사용하게 된다. 스프링 Bean은 등록되어 있지만 싱글톤을 유지할 수는 없게된다.
Spring 1
EDITOR: OJO
[스프링 1] 3장.스프링 DI (0) | 2022.10.27 |
---|---|
[스프링 1] 2장.스프링 시작하기 (0) | 2022.10.27 |
[스프링1] 빈 생명주기 콜백, 빈 스코프 (0) | 2022.10.21 |
[스프링1] 컴포넌트 스캔, 의존관계 자동 주입 (0) | 2022.10.13 |
[스프링1] 객체 지향 설계와 스프링, DI (1) | 2022.09.29 |