날아라쩡글이의 블로그입니다.

의존성 주입 (DI) 자동 주입 본문

중앙 HTA (2106기) story/spring java framwork story

의존성 주입 (DI) 자동 주입

날아라쩡글이 2021. 12. 27. 10:16
728x90
반응형

UserController, UserServiceImpl는 기대하는 객체이다. 
context-2.xml에는 namespace라는 추가적인 파일을 사용할 예정이다. 
context를 체크하고, 

<context:annotation-config></context:annotation-config>
<context:compnent-scan />
<context:component-scan base-package="com.sample"></context:component-scan>
</beans>

으로 작성하는 방법이다. base-package는 사용할 파일이 있는 경로를 입력한다. com.sample이라고 작성하면 *라는 의미로 전체의 파일을 사용할 수 있다. 

  • 여러가지 class로 종류가 많다. spring Container도 많다. 클래스에 따라서 계층에 맞게 사용되도록한다.
  • @Controller
    • 컨트롤러를 표현한다.
  • @Repository
    • 데이터베이스를 영속화 한다. 
  • @Service
    • 업무로직
  • 프론트컨트롤러가 전달, 허용하는 곳에 전달해서 관리한다. 

Activates various annotations to be detected in bean classes

  • 다양한 어노테이션을 감지하고, 해당하는 객체들이 스프링의 bean으로 등록하게 하고, 적절한 작업을 수행하게 한다. 

<context:annotation-config />

  • 클래스안에 포함된 다양한 어노테이션을 감지하고, 그 어노테이션을 분석하고, 적절한 처리를 수행하는 다양한 AnnonationProcessor 객체가  스프링 컨테이너에 등록된다.
  • AnnonationProcessor객체는 스프링 컨테이너가 스프링 빈 설정파일을 읽어서 객체가 생성하면, 생성된 객체에 포함된 어노테이션을 분석해서 의존성주입(객체조립), 객체에 대한 전처리/후처리, 트랜젝션처리 등 다양한 작업을 수행한다. 
    의존성도 주입하고, 스캔한 어노테이션끼리 조립도 함
  • @Required, @Autowired, @PostConstruct, @PreDestroy, @Resource, @Transactional 등의 어노테이션이 처리대상 어노테이션이다
  •  @Required, @Autowired,@Resource 의존성주입에 대해서 담당하는 곳
  •  @PostConstruct, @PreDestroy 객체에 대한 전처리/후처리
  •  @Transactional 트랜잭션처리 객체 생성 후 전처리, 후처리, 조립등을 담당한다.

<context:compnent-scan />

  •  지정된 패키지 및 그 하위 패키지에서 클래스를 스캔해서 자동으로 컨테이너의 객체로 등록(생성)/조립/보관하게 한다.
  •  @Component, @Repository, @Service, @Controller, @RestController, @ControllerAdvice, @Configuration 등의 
     어노테이션이 부착된 클래스만 스캔한다. 그 외의 것은 스캔하지 않는다. 
  • @Component 어노테이션을 상속받아서 사용자 정의 어노테이션을 정의하면 사용자 정의 어노테이션이 부착된 클래스도 스캔대상이 된다.
  • @Repository, @Service, @Controller, @RestController, @ControllerAdvice, @Configuration 모두 @Component의 자손이다. 
  •  다양한 어노테이션이 존재하는 이유는 특정 역할의 수행하는 클래스마다 각각 다른 어노테이션을 부착하고, 해당 어노테이션이 부착된 클래스만을 대상으로 더 다양한 서비스를 제공하기 위해서다.
  • @Repository =DB Access , @Service 업무로직 @Controller MVC에서 컨트롤러에 위임@RestController=restApplication 
    @ControllerAdvice 컨트롤러 공통설정 @Configuration 자바클래스가 스프링의 환경설정파일에 붙인다. 
    용도에 맞게 어노테이션을 정의한다. 순수하게 객체 생성만 담당한다.

productController 

  • product vo객체를 만들고 productServiceImpl도 만들었다. 
    자동식의 경우 @AutoWired라는 어노테이션을 이용해서 연결한다. 
  • @Autowired
    private ProductService productService;
    //controller에 productService위에 autowired를 붙인다.
    //internalAutowiredAnnotationProcessor

    public String execute(int productNo) {
    Product product = productService.getProductByNo(productNo);
    System.out.println("상품 번호 :" + product.getNo());
    System.out.println("상품 이름 :" + product.getName());
    System.out.println("제조 회사 :" + product.getMaker());
    System.out.println("상품 가격 :" + product.getPrice());
    System.out.println("할인 가격 :" + product.getDiscountPrice());

    return "product.jsp";
    }
  • @Autowired
    • 자동으로 객체조립(의존성 주입:Dependency Injection)을 수행하게 한다.
    • 객체조립 절차
      • 1. 스프링 컨테이너가 빈 설정 정보를 이용해서 해당 객체를 모두 생성하고, 스프링 컨테이너에 보관한다.
      •  2. AnnotaionProcessor가 스프링 컨테이너에 등록된 모든 객체의 어노테이션 정보를 분석한다.
      •  3. @Autowired 어노테이션을 감지하면 해당 어노테이션이 부착된 멤버변수의 타입을 알아낸다.
      •  4. 스프링 컨테이너에 보관된 객체들 중에서 해당 타입의 객체가 있는지 확인한다.
      •  5. 해당 타입의 객체가 발견되면 그 객체의 참조값을 멤버변수에 대입해서 객체가 조립되게 한다.
         *  단, 해당타입의 객체가 존재하지 않거나, 해당 타입의 객체가 2개 이상 발견되는 경우 예외가 발생한다. 
         *  객체가 2개이상 존재하는 경우에는 특별한 경우이다. 2개이상 존재할 수는 있다.
    • 동일한 타입의 객체가 2개이상 존재하는 경우, 특정 객체 하나만 조립되게 하기 
      •  @Primary 어노테이션을 2개 중에 한 클래스에 부착한다.
  • 연결될 productServiceImpl에는 
  • @Component
    @Primary
    public class ProductServiceImpl implements ProductService{

    @Override
    public Product getProductByNo(int no) {
    return new Product(100, "애플워치", "애플", 650000, 610000);
    }
    }

vo, DAO, DTO에는 붙이지 않는다. 항상 새롭게 만들어야한다.
service, Controller처럼 1개만 만들고 계속 사용해야하는 경우에만 사용한다.
이제는 base-packag로 경로만 작성할 예정이다. 
자동은 어노테이션이 없으면 호출되지 않는다. 
1개이상 존재하지 않으면 No such BeanDefinition으로 에러가 나온다. 

반응형
Comments