Spring 기초 - Bean의 생명주기, Properties(key=value, @Value)

Hailey·2025년 3월 4일

SPRING

목록 보기
5/15
post-thumbnail

initMethod, destroyMethod

스프링 빈은 초기화(init)와 소멸화(destroy)의 라이프 사이클을 가지고 있다. 이 라이프 사이클을 이해하면 빈 객체가 생성되고 소멸될 때 추가적인 작업을 수행할 수 있다

init-method 속성을 사용하면 스프링이 빈 객체를 생성한 다음 초기화 작업을 수행할 메소드를 지정할 수 있다. 이 메소드는 빈 객체 생성자가 완료된 이후에 호출된다. init-method 속성으로 지정된 메소드는 일반적으로 빈의 초기화를 위해 사용된다.

@Bean(initMethod = "openShop", destroyMethod = "closeShop")
    public Owner owner(){
        return new Owner();
    }

또한 실제로 실행파일에서 owner를 불러와서 써야 실행되는 듯하다..


public class Owner {
    public void openShop(){
        System.out.println("openShop");
    }

    public void closeShop(){
        System.out.println("closeShop");
    }
}

owner() 빈은 initMethod가 설정되어 있어, 추가적인 초기화 작업이 필요하므로 우선적으로 생성될 가능성이 높습니다.

destroy-method 속성을 사용하면 빈 객체가 소멸될 때 호출할 메소드를 지정할 수 있다. 이 메소드는 ApplicationContextclose() 메소드가 호출되기 전에 빈 객체가 소멸될 때 호출된다. destroy-method 속성으로 지정 된 메소드는 일반적으로 사용하던 리소스를 반환하기 위해 사용된다.

destroyMethod는 다음과 같이 container를 제거하여 bean을 제거해야 실행된다.

//설명. main 메소드 종료 전에 Container를 제거(bean 제거 강제화)
((AnnotationConfigApplicationContext)context).close();

Properties

Properties 는 키/값 쌍의 파일.
: 빈의 속성 값을 저장하고 읽어올 수 있다.

이건 절대 DI가 아님!! DI이려면 Bean이어야지.

key = value 형식으로 저장됨.

product-info.properties 라는 이름의 파일을 생성하고 Product 타입의 값이 될 value를 적절한 key를 설정하여 정의한다.

bread.carpbread.name=붕어빵
bread.carpbread.price=1000
beverage.milk.name=딸기우유
beverage.milk.price=1500
beverage.milk.capacity=500
beverage.water.name=지리산암반수
beverage.water.price=3000
beverage.water.capacity=500

product-info.properties 파일에 기재한 값으로 상품들의 값을 초기화 하려고 한다.

properties 파일을 읽어올 때 @PropertySource 어노테이션에 경로를 기재하여 읽어올 수 있으므로 읽어올 properties 파일의 경로를 작성한다.

빈 설정 파일 내부에 @Value 어노테이션을 사용하여 properties의 값을 읽어온다. @Value 어노테이션은 빈의 속성 값을 자동으로 주입받을 수 있는 어노테이션이다.

@Configuration
/* resources 폴더 하위 경로를 기술한다. 폴더의 구분은 슬러쉬(/) 혹은 역슬러쉬(\\)로 한다. */
@PropertySource("section03/properties/subsection01/properties/product-info.properties")
public class ContextConfiguration {

	/* 치환자(placeholder) 문법을 이용하여 properties에 저장된 key를 입력하면 value에 해당하는 값을 꺼내온다.
   * 공백을 사용하면 값을 읽어오지 못하니 주의한다.
   * : 을 사용하면 값을 읽어오지 못하는 경우 사용할 대체 값을 작성할 수 있다.
   **/
	@Value("${bread.carpbread.name:팥붕어빵}")
	private String carpBreadName;

	/* 값은 여러 번 불러올 수 있다. */
//	@Value("${bread.carpbread.name:슈크림붕어빵}")
//	private String carpBreadName2;

  @Value("${bread.carpbread.price:0}")
  private int carpBreadPrice;

  @Value("${beverage.milk.name:}")
  private String milkName;

  @Value("${beverage.milk.price:0}")
  private int milkPrice;

  @Value("${beverage.milk.capacity:0}")
  private int milkCapacity;

  @Bean
  public Product carpBread() {

      return new Bread(carpBreadName, carpBreadPrice, new java.util.Date());
  }

  @Bean
  public Product milk() {

      return new Beverage(milkName, milkPrice, milkCapacity);
  }

  @Bean
  public Product water(@Value("${beverage.water.name:}") String waterName,
                       @Value("${beverage.water.price:0}") int waterPrice,
                       @Value("${beverage.water.capacity:0}") int waterCapacity) {

      return new Beverage(waterName, waterPrice, waterCapacity);
  }

  @Bean
  @Scope("prototype")
  public ShoppingCart cart() {

      return new ShoppingCart();
  }
}

필드 또는 파라미터에 @Value 어노테이션을 사용할 수 있으며 해당 어노테이션에 ${key} 와 같이 치환자(placeholder) 문법을 이용하여 properties에 저장된 key를 입력하면 value에 해당하는 값을 꺼내와 필드 또는 파라미터에 주입한다.

key 뒤에 : 을 이용하여 해당 key 값이 없을 경우에는 주입할 기본 값을 입력할 수 있다.

profile
럭키헤일리

0개의 댓글