Kafka
관련 애플리케이션이나 Elasticsearch
관련 애플리케이션을 작성하려는데 Spring
프레임워크 관련 지식이 부족하여 인프런의 강좌 중 스프링 핵심 원리 - 기본편를 수강하고 몇 가지 기록해두고 싶은 것에 대해 포스팅하려 합니다.
객체지향 개발의 5대 원리 SOLID
이번에 참고했던 스프링 강좌에서는 스프링의 편리함을 보여주기 위해
기능을 확장할 때 클라이언트 코드가 영향을 받게 되는 OCP 위반인 것과
클라이언트 코드가 추상을 의존하여야 하는데 구현 클래스를 의존하는 것 DIP 위반을 해결하는 법을 알려주는 것으로 시작한다.
인터페이스에만 의존하도록 설계하라
역할과 구현을 분리하여 각각의 책임을 확실히 분리한다.
그리고, 역할에 맞는 구현을 넣어주는 설정을 사용한다.
(추후 @Configuration의 기능을 하게 되는 클래스)
ApplicationContext(스프링 컨테이너)를 사용하여
@Configuration의 @Bean이 붙은 메서드를 스프링 컨테이너에 스프링 빈으로 등록한다.
(※ 스프링 빈으로 등록하도록 만드는 다른 어노테이션들도 있지만, 여기서는 @Configuration만 명시하였음.)
이렇게 등록한 빈을 조회하는 방법은 여러가지가 있는데, 그 중 아래의 방법들을 자주 사용함.
getBean(빈 이름, 빈 타입)
: 빈 이름과 타입으로 스프링 빈 조회 (2개 이상이면 오류 발생)
getBean(빈 타입)
: 빈 타입에 해당하는 스프링 빈 조회 (2개 이상이면 오류 발생)
getBeansOfType(빈 타입)
: 빈 타입에 해당하는 모든 빈 조회
아무튼, 스프링 빈을 조회하는 메서드는 여러가지가 있다.
ApplicationContext(스프링 컨테이너)는 파라미터로 전달받은 클래스 (또는 XML)를 사용하여 BeanDefinition
이라는 스프링 빈 설정 메타 정보를 만듬.
(좀 더 정확히 얘기하면 ---BeanDefinitionReader
라는 걸 사용해서 BeanDefinition
을 생성한다고 함.)
BeanDefinition
에는 @Bean
을 통해 만들어진 스프링 빈에 대한 메타 정보를 갖고 있음.
메타 정보 중 기억할만큼 중요한 몇 가지로는 Scope
, InitMethodName
, DestroyMethodName
정도가 있다. (물론 그 밖의 나머지 것들도 중요함.)
자바에서는 객체를 Singleton
으로 생성하기 위해, instance 정적 변수를 사용하고, 생성자를 private으로 처리는 등의 코딩을 해주어야 한다.
하지만 스프링 컨테이너는 스프링 빈을 기본적으로 Singleton
으로 관리한다.
어떻게 Singleton
으로 관리할까?
스프링 컨테이너를 생성하고 설정 정보(CLASS or XML)를 지정했을 때, 이미 스프링 빈을 Singleton
으로 생성한다.
getBean() 메서드를 사용해서 확인해보아도 스프링 빈을 조회할 때 생성되는 것이 아닌 이미 생성된 스프링 빈을 가져옴.
위와 같은 Singleton
을 보장받기 위해서 @Configuration
을 적용하고 @Bean
을 사용하면 바이트코드를 조작할 수 있는 CGLIB 기술이 Singleton
을 보장해준다.
@Autowired
를 사용한 의존성 주입은 4가지 방식이 있음.
※ @Autowired
가 동작하려면 당연히 스프링 컨테이너가 관리하는 스프링 빈이어야 한다.
@Autowired
를 생략해도 자동 주입 됨.강좌에는 포스팅에 적은 것 외에 많은 개념 정의와 예제 코드가 있다.
ex) 스프링 빈의 생명주기, 스코프 등..
본 포스팅은 기억 나는 것들을 의식의 흐름대로 적은 것이니 위 강좌가 비록 유료지만, 들어보는 것을 추천한다.
얕은 스프링 지식을 습득하였으니, 이에 애플리케이션 개발 포스팅을 주력으로 해보도록 해야겠다.