스프링 컨테이너 생성 → 객체 생성 → 의존 관계 주입 → 초기화 콜백(@Postconstruct) → 사용 → 소멸전 콜백(@PreDestroy) → 소멸 및 스프링 종료
빈 스코프란 컨테이너에서 빈이 존재할 수 있는 범위를 의미한다.
웹 스코프
웹 스코프는 프로토타입 스코프와 마찬가지로, 여러 명의 클라이언트 요청에 대해서 개별적인 빈을 반환하게 된다. 하지만 HTTP 요청이 나갈 때까지 유지되므로, 종료 메서드도 실행된다는 점이 프로토타입 스코프와 다르다.(웹 환경에서만 작동한다.)
스프링 애플리케이션은 POJO를 이용해서 만든 애플리케이션 코드라, POJO가 어떻게 관계를 맺고 동작하는지를 정의해놓은 설계 정보로 구분된다. 스프링의 주요기술인 IoC/DI, AOP, PSA는 애플리케이션을 POJO로 개발할 수 있게 해주는 가능 기술이다. DI는 유연하게 확장가능한 오브젝트를 만들어두고 그 관계는 외부에서 다이내믹하게 설정해준다. 이런 DI의 개념을 스프링은 애플리케이션 전반에 걸쳐 적용한다.
다형성 만으로 OCP, DIP를 지킬 수 없었고 이를 위해 등장한 것이 Spring이다.
MemberService : 클라이언트 코드
MemberRepository m = new MemoryMemberRepository(); // 기존 코드
MemberRepository m = new JdbcMemberRepository(); // 변경 코드
구현객체를 변경하려면 클라이언트 코드를 변경해야 한다.
MemberService : 클라이언트 코드
MemberRepository m = new MemoryMemberRepository(); // MemberService가 구현 클래스를 직접 선택
Spring이 등장하기전 하나의 기능을 구현하기 위해 클래스 간 상속, 인터페이스 구현 등 클래스 간의 의존도가 커지는 상황이 왔고 이를 해결하고자 “간단한 자바 오브젝트로 돌아가자”라는 말을 시작으로 두 가지 오픈소스(J2EE design and development의 예제 코드, 하이버네이트 ORM 프레임워크)가 등장하면서 스프링이 시작되었다.
자바 엔터프라이즈 개발을 위한 오픈소스 어플리케이션 프레임워크
SOLID 원칙의 대부분은 인터페이스 설계와 관련이 되어있다. 의존성을 concrete class(구현 클래스)가 아닌 Interface에 두면, 실제 concrete class의 구현이 변경되어도 이를 사용한 코드는 큰 영향을 받지 않는다. 그렇기 때문에 SOLID원칙(OCP, LSP, ISP, DIP등)을 지키기 위해서는 인터페이스로 설계를 해야한다. 하지만 싱글톤을 이용하는 경우 대부분 인터페이스가 아닌 콘크리트 클래스의 객체를 미리 생성해놓고 정적 메소드를 이용하여 사용하게 된다. 이는 여러 SOLID원칙을 위반할 수 있는 가능성을 열어둠과 동시에, 싱글톤을 사용하는 곳과 싱글톤 클래스 사이에 의존성이 생기게 된다. 클래스 사이에 강한 의존성, 즉 높은 결합이 생기게 되면 수정, 단위테스트의 어려움 등 다양한 문제가 발생한다.
참고
문제 해결
ApplicationContext = IoC Container + Singleton Registry
스프링 컨테이너는 기본적으로 객체 인스턴스를 싱글톤으로 관리하는 싱글톤 컨테이너 역할을 한다.
싱글톤 객체를 생성 및 관리하는 기능을 싱글톤 레지스트리(singleton registry)라고 한다.
스프링은 싱글톤 레지스트리를 이용하여 싱글톤 패턴의 단점을 해결하며 객체를 싱글톤으로 유지할 수 있다.
스프링 레지스트리는 CGLIB(Code Generator Library, 바이트 코드 조작 라이브러리)을 이용하여 싱글톤을 보장한다.
스프링 프레임워크는 @Configuration 어노테이션이 달린 클래스에 속한 @Bean들을 스프링 컨테이너에 등록할 때 해당 클래스의 빈들에게 싱글톤 패턴을 적용하기 위해 임의의 다른 클래스를 만들어서 스프링 빈으로 등록한다.
@Bean이 붙은 메서드마다 이미 스프링 빈이 존재하면 존재하는 빈을 반환하고, 스프링 빈이 없으면 생성해서 스프링 빈으로 등록하고 반환하는 코드가 동적으로 만들어진다.
private, static, DIP 위반, OCP 위반을 일으키는 싱글톤 구현 코드 없이 싱글톤을 사용할 수 있다.
@Configuration을 적용해야만 CGLIB 기술이 적용된다.
Spring
Spring MVC
Spring Boot
Spring MVC와 Spring Boot 차이
구체적인 클래스 타입을 알지 못해도 그 클래스의 메소드나 변수에 접근할 수 있게 하는 자바 API. 작성 시점에는 어떤 클래스를 사용할 지 모르는 상태인데 런타임 시점에 클래스를 가져와 실행해야 할 때 사용된다.