Spring Framework (Spring Container/DI)

John Jun·2023년 6월 8일
0

Index


1. Spring Container & Bean

2. Practice


1. Spring Container & Bean

  1. AppConfigurer 클래스 생성및 Bean 등록
@Configuration
public class AppConfigurer {

    @Bean
    public Menu menu() {
        return new Menu(productRepository());
    }

    @Bean
    public ProductRepository productRepository() {
        return new ProductRepository();
    }
  1. 스프링 컨테이너(ApplicationContext 인터페이스)생성
  2. main에서 Bean 조회 및 의존성 주입
// (1) 스프링 컨테이너 생성
	    ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfigurer.class);
			
			// (2) 빈 조회 
	    ProductRepository productRepository = applicationContext.getBean("productRepository", ProductRepository.class);
		  Menu menu = applicationContext.getBean("menu", Menu.class);
	    Cart cart = applicationContext.getBean("cart", Cart.class);
	    Order order = applicationContext.getBean("order", Order.class);

			// (3) 의존성 주입
	    OrderApp orderApp = new OrderApp(
                productRepository,
                menu,
                cart,
                order
			        );
	
			// (4) 프로그램 실행 
      orderApp.start();
  1. 스프링에서 지원하는 컴포넌트 스캔과 의존성 자동 주입
  • @Configuration와 @ComponentScan어노테이션 사용
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration // Configurer클래스에 붙혀서 해당 기능 사용
@ComponentScan // 스캔의 시작지점 따라서 Configurer 클래스를 프로젝트 최상단에 두는것이 일반적 / @ComponentScan(basePackages = “”) ""를 변경해 범위를 따로 지정할 수 있다.
public class TestConfigurer {
}
  • @Component 어노테이션 사용

: 스프링 컨테이너가 해당 클래스의 인스턴스를 생성하여 스프링 빈으로 관리

  • @Autowired 어노테이션을 사용하여 의존성 주입
@Component
public class Order {
    private Cart cart;
    private Discount discount;

	@Autowired
    public Order(Cart cart, Discount discount) {
        this.cart = cart;
        this.discount = discount;
    }

   ...
}

:@Autowired 애너테이션을 통해 스프링이 관리하고 있는 해당 타입의 객체가 자동으로 주입되어 의존 관계가 완성

2. 스프링 컨테이너의 싱글톤 패턴

1.싱글톤 패턴 적용/비적용 차이

  1. singleton 패턴:
public class AppConfigurer {

    private Cart cart = new Cart(productRepository(), menu());

    public Cart cart() {
        return cart;
    }

    --- 생략 ---
}
  • Configurer클래스에서 카트 클래스를 instantiate한 뒤 cart()메서드를 통해 return: 결과적으로 하나의 객체를 모두가 공유하게 됨
  1. Non singleton 패턴:
public class AppConfigurer {
public ProductRepository productRepository() {
        return new ProductRepository();
    }

    public Menu menu() {
        return new Menu(productRepository().getAllProducts());
    }
    ...
    }
    
  • Configurer 클래스를 통해 의존성을 주입받고 해당 객체를 사용할때 마다 새로운 객체를 생성해서 return

    -싱글톤 패턴을 이용하면 객체를 매번 새롭게 생성하지 않고 하나의 객체를 공유하여 메모리 낭비를 줄일 수 있다. 하지만 이러한 장점에도 반드시 필요한 상황에만 사용해야 하는데 이는 객체간의 의존도(결합도)가 높아지기 때문이다.

2. Spring Framework를 이용한 싱글톤 패턴 구현

  • 스프링 프레임워크는 자동으로 DI를 할때 기본적으로 싱글톤 패턴으로 구현된다. 스프링 컨테이너는 내부적으로 객체들을 싱글톤으로 관리하고 싱글톤 레리스트리 기능을 수행한다.(CGLIB 라이브러리 사용)

  • 이를 통해 싱글톤 패턴이 가지는 메모리의 낭비가 적음을 이용하면서 동시에 객체간의 의존도(결합도)를 느슨하게 유지할 수 있다.

  • 스프링의 Bean객체들의 관리 범위는 @Scope(Prototype/Session/ Request) 등의 @Scope 어노테이션을 추가해 변경할 수 있다.

profile
I'm a musician who wants to be a developer.

0개의 댓글