코드스테이츠 수강 9주차 3일차에는 빈, 스프링 컨테이너, 싱글톤에 대해 배웟다.
1. 스프링 컨테이너
스프링 컨테이너는 내부에 존재하는애플리케이션 빈의 생명주기를 관리한다.
빈은 뒤에서 설명할텐데, 대략 "인스턴스화된 객체"라고 보면된다. 그래도 안와닿으면 애플리케이션이 작동할때 생성되거나 사용되는 변수 등의 객체들이라고 생각하자.
생명주기를 관리한다는 말이 생소할 수 있는데, 그냥 빈(Bean)의 생성, 관리, 제거를 할 수 있다 이말이다.
스프링 컨테이너의 대표적인 특징이 있다.
- 스프링 컨테이너는 XML, 애너테이션(기계를 위해 주석 달아주는거) 기반의 자바 설정 클래스로 만들 수있다.
- 빈의 인스턴스화, 구성, 전체 생명주기 및 제거 처리
(개발자가 정의한 Bean을 객체로 만들어 관리하고, 개발자가 필요할때 제공) - 스프링 컨테이너를 통해 원하는대로 객체 생성 가능
- 의존성 주입을 통해 해플리케이션의 컴포넌트 관리
->서로다른 빈을 연결해 애플리케이션의 빈을 연결
->메서드가 언제, 어디서 호출되어야 하는지, 호출되기 위한 매개변수 등을 전달하지 않음
왜 스프링 컨테이너를 사용하느냐?
일단, 우리가 객체를 사용할 때 new키워드 + 생성자로 객체를 생성했다.
그런데, 애플리케이션에서 동작할때 사용되는 객체는 한두개가 아니다.
일일히 new생성자로 객체를 생성하게 되면, new키워드가 작동 될 따마다 표적으로하는(의존하는) 클래스의 객체만 사용 가능한데, 이렇게되면 사용되는 클래스에 일일히 의존하는 형태가 된다 -> 느슨한 결합이 아니다!
느슨한 결합이 아니면, 뭐 조금만 수정해도 개판나고, 유지보수가 힘들게 된다!
스프링 컨테이너를 사용하면, 구현 클래스에 있는 의존은 제거하고, 인터페이스에만 의존하도록 설계 가능하다!
결론 : 스프링 컨테이너를 사용함으로써 느슨한 결합의 프로그래밍이 가능하다!
스프링 컨테이너의 생성과정은?
- 스프링 컨테이너는 Configuration Metadata를 사용함
- 스프링 컨테이너는 파라미터로 넘어온 설정 클래스 정보를 사용해서 "스프링 빈" 을 등록한다.
- new AnnotationConfigApplicationContext (에너테이션, 기계한테 말해주는 주석)로 스프링에 있는 @Bean의 메서드를 등록한다.
- 에너테이션 기반으로 컨테이너가 구성됨
이렇게 말하니 잘 모르겠다... 대략적으로 생각하면,스프링 컨테이너는 스프링 내에서 준비되어있는 요소(Configuration Metadata)를 사용해서, 우리가 짠 코드를 빈(Bean, 객체)로 만들어 등록해둔다.그리고, 에너테이션으로 명령어를 이캐캐 써서 특정 메소드에 따라 그에 맞는 스프링 컨테이너가 생성된다. 라는 것으로 생각하자.
스프링 컨테이너의 종류
BeanFactory
- 스프링 컨테이너의 최상위 인터페이스
- 빈을 등록, 생성, 조회, 반환하는 역할 수행
- getBean()메소드를 통해 빈을 인스턴스화 가능
- @Bean(에너테이션)이 붙은 메서드의 명을 스프링 빈의 이름으로 사용해 "빈 등록"
ApplicationContext
- BeanFactory의 기능을 상속받아 제공
- 빈을 관리, 검색하는 기능을 BeanFactory가 제공하고, 이외의 부가기능을 제공함
-부가기능-
- MessageSource: 메세지 다국화를 위한 인터페이스
- EnvironmentCapable: 개발, 운영 등 환경변수 등으로 나눠 처리하고, 애플리케이션 구동 시 필요한 정보들을 관리하기 위한 인터페이스
- ApplicationEventPublisher: 이벤트 관련 기능을 제공하는 인터페이스
- ResourceLoader: 파일, 클래스 패스, 외부 등 리소스를 편리하게 조회
2. 빈(Bean)
빈은 스프링 컨테이너에 의해 관리되는 재사용 소프트웨어 컴포넌트이다.
(쉽게 말하면, 프로그램 돌때 사용되는 쪼가리들인데, 스프링 컨테이너가 관리하는 대상임)
- 빈(Bean)은인스턴스화된 객체를 의미(생성자 등으로 생성된 객체)
- 스프링 컨테이너에 등록된 객체를 스프링 빈이라고 한다.
- @Bean (에너테이션)이적힌 메서드를 모두 호출해서 반환된 객체를 스프링 컨테이너에 등록함
- 빈은 클래스의 등록정보, 게터/세터 메서드를 포함
- 빈은 컨테이너에 사용되는 설정 메타데이터(스프링 안에 준비 되어있는 애)로 생성됨
- 설정 메타데이터는 XML, 자바에너테이션, 자바 코드로 표현하먀, 컨에티너의 명령과 인스턴스화, 설정, 조립할 객체를 정의함
Bean 접근방법
ApplicationContext 사용하여 Bean정의를 읽고, 엑세스 가능
코드 예시
// create and configure beans
ApplicationContext context = new ClassPathXmlApplicationContext("services.xml", "daos.xml");
// retrieve configured instance
PetStoreService service = context.getBean("memberRepository", memberRepository.class);
// use configured instance
List<String> userList = service.getUsernameList();
getBean을 사용하여 Bean의 인스턴스를 가져올 수 있다.
ApplicationContext 인터페이스에는 Bean을 가져오는 여러 방법들이 있으니, 참고
실제 응용프로그램 코드에서는 getBean()메서드를 사용하면 안된다고 하는데.... 찾아보니 같은 타입이 여러개 있으면 충돌이 난다 등의 이유가 있다.... 흠... 더 있을것 같은데 만약 찾게되면 추가적으로 수정하겠다.
BeanDefinition
BeanDefinition는 빈을 정의할때 속성을 지정하는 것이다.
이 속성에 따라 컨테이너가 Bean을 어떻게 생성하고 관리할지 결정한다.
@Bean / <bean> 당 각 1개씩 메타 정보가 생성된다.
Spring이 설정 메타정보를 BeanDefinition 인터페이스를 통해 관리하기 때문에 컨테이너 설정을 XML, Java로 할 수 있는 것이다.
(스프링 컨테이너는 설정 형식이 XML인지 Java 코드인지 알필요 없고, BeanDefinition만 알면 된다.)
3. 빈 스코프(Bean Scope)
BeanDefinition은 빈을 만드는 레시피라고 보면된다.
이 레시피는 빈이 존재할 수 있는 범위를 조절하는 것이다.
코드스테이츠 강의자료가 생각보다 죠큼...이해하기 힘든 부분이 많아 우리 킹영한 선생님 강의를 들을 예정이다.
나머지 부분은 내가 이해를 한 상태에서 작성하는것이 맞을 것 같다...
이번주말~다음주 수요일 까지 최대한 진도를 따라잡고 다시 포스팅 예정
'백엔드 > 코드스테이츠 수강' 카테고리의 다른 글
코드스테이츠 수강_10주차_4일차_Spring MVC, Controller (API계층) (0) | 2022.10.20 |
---|---|
[회고]코드스테이츠 수강_10주차_3일차 부스트캠프 2달 경과 (2) | 2022.10.19 |
코드스테이츠 수강_9주차_1~2일차_Spring FrameWork 기본 (0) | 2022.10.11 |
코드스테이츠 수강_8주차_3~4일차_관계형 데이터베이스(데이터베이스 설계) (1) | 2022.10.06 |
코드스테이츠 수강_8주차_2일차_관계형 데이터베이스 (SQL) (1) | 2022.10.05 |