(21.09.13)

dongeranguk·2021년 11월 25일
0

✨xml을 이용한 DI 설정

✨싱글톤 패턴의 객체를 생성하기 위한 빈 팩토리

✨@Resource

빈 객체의 생명주기

스프링 컨테이너는 다음의 두 가지 방식을 이용해서 빈의 생명 주기를 관리할 수 있다.

  • 스프링이 제공하는 특정 인터페이스를 상속받아 빈을 구현한다.
  • 스프링 설정에서 특정 메서드를 호출하라고 지정한다.

초기화 3가지 방법 존재.

@PostConstruct 메서드는 빈 객체를 사용하기 전에 초기화 하는 메서드

@PreDestroy 메서드는 빈 객체를 사용하고 나서 빈 객체를 소멸시키는 메서드

전체적인 흐름
객체 생성/프로퍼티 설정 -> 초기화 -> 사용 -> 소멸

스프링은 객체의 초기화 및 소멸 과정을 위해 다음 두 인터페이스를 제공한다.

  • InitializingBean
  • DisposableBean

인터페이스는 한 개 이상의 인터페이스를 구현할 수 있으므로 위의 두가지 인터페이스를 구현하여 사용한다.

위의 과정은 인터페이스를 구현해야 하기 때문에, 귀찮아진다.
따라서, Annotation을 사용하면 간단해진다.
어노테이션이 적용된
마지막 방법으로는, xml 파일에 bean 객체를 생성할 때, init-method, destory-method 를 사용하면 깔끔하고 간단하다.

초기화는 순서대로, 소멸은 반대로.
1-2-3 / 3-2-1

ApplicationContextAware 인터페이스

빈 객체 범위

  • 싱글톤 범위
  • 프로토타입 범위

싱글톤 범위는 빈 객체를 두 개 이상의 클래스에서 사용할 때 동일한 빈 객체를 사용한다면 싱글톤,
프로토타입 범위는 동일하지 않은 빈 객체를 사용

별도 설정을 하지 않을 경우 싱글톤 범위를 사용한다.(scope="singleton") 기본값.

Enviroment

개발을 진행하다 보면, 개발 환경, DB 연결, 디렉터리 구조등이 바뀔 수 있다. 스프링은 환경에 따라 다른 값을 사용할 수 있는 방법을 제공한다.
따라서, 코드를 변경하기보다는 별도 파일을 이용해서 설정 정보를 변경하도록 만든다.

스프링의 Enviroment는 다음의 두 가지 기능을 제공한다.

  • 프로퍼티 통합 관리
  • 프로필을 이용해서 선택적으로 설정 정보를 사용할 수 있는 방법 제공

Enviroment 구하기
ConfigurableApplicationContext에 정의된 getEnviroment() 메서드를 이용해서 Enviroment를 구할 수 있다.

프로퍼티를 읽어오는 과정
1.프로퍼티 값 요청 -> 2.프로퍼티 값 요청 -> 3.정해진 순서대로 프로퍼티 값 요청

XML에서의 프로퍼티 설정 : < context:property-placeholder>

xml 설정을 이용하면, 간단하게 프로퍼티 파일을 이용할 수 있다.
< context:property-placeholder> 태그를 사용할 때 주의할 점은 전체 설정에서 이 태그를 두번 사용할 경우, 첫 번째 사용한 태그의 값이 우선 순위를 갖기 때문에, 우선 순위가 낮은 프로퍼티는 읽어올 수 없다.

따라서, 다수의 xml파일에서 사용되는 프로퍼티 파일이 두 개 이상이라면, 별도의 xml 파일에서 < context:property-placeholder>태그를 설정하고, 다른 xml파일에서 플레이스 홀더를 사용하도록 구성하는 것이 좋다.

//프로퍼티 전용 XML
<beans>
	<context:property-placeholder
    	location="classpath:/db.properties, classpath:/app.properties" />
</bean>

스프링의 프로필은 환경에 따라 알맞은 설정 정보를 사용하기 위해서 사용한다.

프로퍼티 파일을 사용하면 환경에 따라 설정 정보를 바꾸어 주어야 하지만,

프로필은 환경에 맞는 beans태그에 지정한 프로필 이름으로 읽어와서 설정하기만 하면 된다.

beans 태그 안에 중첩하여 beans 태그를 설정할 수 있다.

id에는 반드시 "messageSource" 로 지정

MessageSource 인터페이스의 주로 사용하는 메서드는 다음과 같다.

  • String getMessage(String code, Object[] args, String defaultMessage, Locale locale)
  • String getMessage(String code, Object[] args, Locale locale)

한 개 이상의 프로퍼티 파일로부터 메시지를 로딩하고 싶다면, basenames프로퍼티에 list태그를 이용하여 베이스 이름 목록을 전달하면 된다.

메시지 파일이 UTF-8로 작성되었을 경우, defaultEncoding 프로퍼티의 값을 UTF-8로 지정해주면 올바르게 읽어온다.

ReloadableResourceBundleMessageSource

  • 클래스패스뿐만 아니라, 특정 디렉터리에 위치한 메시지 파일을 사용할 수 있다.
  • 클래스패스를 사용하지 않을 경우, 파일 내용이 변경되었을 때, 변경된 내용이 반영된다.

빈 객체에서 메시지 이용하기

  • ApplicationContextAware 인터페이스를 구현한 뒤,

5장 X

AOP

0개의 댓글