본문 바로가기
스프링 & Jpa/스프링 핵심원리 강좌📌김영한

Spring 핵심원리 강좌 정리

by IMSfromSeoul 2021. 11. 25.

📌 AppConfig

  • 상품 주문을 하는 OrderService와 해당 회원, 할인 class 등이 있을 때, OrderService 안에서 회원과 할인정책은 interface의 형태로 존재한다고 해보자.
  • OrderService안에서 해당 인터페이스에 대한 구현체로 어떤 클래스를 선택할 지에 대한 결정은 외부 클래스인 AppConfig에 의해서 시행될 수 있다. 

🔥 DI

  • 스프링에서는 스프링 컨테이너를 사용하면 AppConfig를 관리를 해준다. 이 개념을 DI 라고 한다.

🔥 싱글톤 - CGLIB

  • 스프링은 싱글톤으로 돌아간다. 만약 스프링 컨테이너로 관리되는 AppConfig 안에서 memberService를 새로 생성해서 ( new ) return 하는 메서드를 여러 메서드에서 사용한다고 해보자. 그렇다면 여러 객체가 생성될 것 같지만, 찍어보면 하나의 객체만 생성된다. 그 이유는 스프링 컨테이너에서는 AppConfig를 관리하는 것이 아니라, CGLIB 이라는 바이트코드 조작 라이브러를 사용해서  AppConfig를 상속받은 다른 클래스를 만들고, 해당 클래스를 스프링 빈으로 등록하기 때문이다.

📌 BeanFactory - ApplicationContext

  • 스프링 Bean은 BeanFactory를 상속받은 ApplicationContext가 관리한다.

📌 @ComponentScan

  • 현재 폴더를 포함한 하위 폴더의 @Component들을 싹 다 찾아서 Spring Bean에 등록해준다.
  • Spring Boot의 시작점인 @SpringBoolApplication안에도 @ComponentScan이 존재한다.
  • @Service, @Repository, @Controller 등에는 모두 @Component Scan이 붙어있다.

📌 @Component VS @Bean

@Component are used to auto-detect and auto-configure beans using classpath scanning. 
  • @Component는 auto-detect, auto-configure, auto-wiring 등을 하기 때문에 동적 상황에서는 사용될 수 없다.

  • @Component는 사용자가 직접 개발한 클래스를 Bean으로 등록하려고 하는 경우 사용한다.
  • @Bean은 사용자가 직접 제어가 불가능한 라이브러리를 사용할때 , 초기 설정을 하기 위해 사용할 때 사용한다.
  • @Bean을 제공하는 클래스의 경우 반드시 @Configuration을 명시해주어야 한다.
주 참조
https://stackoverflow.com/questions/10604298/spring-component-versus-bean
보조 참조
https://mangkyu.tistory.com/75
참조
https://galid1.tistory.com/494

📌 @Autowired

  • 자동으로 Bean 등록을 해주나, DI 컨테이너에 의존적이게 되기 때문에 지양해야 된다. ( 순수한 Java 코드로는 실행조차 못한다 )
  • @Autowired를 쓰지 말고, 생성자 주입을 통해 Bean을 주입하는게 권장된다.
  • 생성자 주입의 장점은, 컴파일 타임에 오류를 잡아낸 다는 것과 , final로 선언되기 때문에 변경이 불가능하다는 것이 있다.
  • @Autowired의 경우, 같은 이름의 Bean이 2개 이상인 경우, 해당 구현체의 클래스 위에 @Qualifier("이름")을 통해 Bean을 지정할 수 있다.

댓글