ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 빈 등록과 주입을 아라보자
    스프링 2024. 5. 15. 23:26

    Spring Bean 등록하기

    1. 컴포넌트 스캔과 자동 의존관계 설정

    스프링 부트에서 사용자 클래스를 스프링으로 등록하는 가장 쉬운 방법은 @Component를 사용하는 것이다.

    @contorller, @service, @reposiotory는 모두 @Component를 포함하고 있다.

    해당 어노테이션으로 등록된 클래스는 스프링 컨테이너에 의해 자동으로 생성되어 스프링 빈으로 등록된다.

    1. 자바 코드로 직접 등록

    수동으로 스프링 빈을 등록하려면 자바 설정 클래스를 만들어 사용해야 한다.

    스프링 부트가 아닌 그냥 스프링을 사용하면 XML파일을 이용하여 빈을 등록해야 한다.

    설정 클래스를 만들고, @Configuration을 클래스 선언부 위에 추가하면 된다.

    이후 특정 타입을 return 하는 메소드를 만든 후, @Bean을 붙이면 자동으로 해당 타이브이 빈 객체가 만들어진다

    의존성 주입하기

    의존성 주입은 필요한 객체를 직접 생성이 아닌, 외부로 부터 객체를 받아서 사용하는 것이다.

    이를 통해 클래스간 결합도를 줄이고 의존성을 줄이며, 재활용성을 높일 수 있다.

    또한 테스트가 용이해진다.

    1. 생성자 주입
    @Controllerpublic class CocoController {  //final을 붙일 수 있음    
    private final CocoService cocoService;  
    
    @Autowired     
    public CocoController(CocoService cocoService) {        
            this.cocoService = cocoService;    
            }
    }

    생성자가 하나이고, 주입받을 객체가 빈으로 등록되어 있다면, 이때는 Autowired 생략이 가능하다.

    스프링 레퍼런서를 찾아보면 생성자 주입을 권장하고 있다.

    먼저 순환 참조를 방지할 수 있기 때문이다.

    A가 B를 참조하고, B가 다시 A를 참조하는 상황을 가정하자.

    필드 주입과 setter주입은 빈 생성 이후에 참조를 하기 때문에 어플리케이션이 오류 없이 구동되기 때문에, 호출되기 전까지 오류를 잡을 수없다.

    그러나 생성자를 통해 주입을 한다면 BeanCurrentlyInCreationException이 발생하다.

    또한 의존관계를 외부로 노출시켜 실행시 오류를 체크할 수 있다.

    또한 불변성의 이점이 있다.

    의존성으로 주입시 final 선언이 가능하여 변경 가능성을 제거한다.

    setter주입과 메소드 주입은 수정의 가능성을 열어두기 때문에 OCP원칙을 위반하게 된다.

    1. 필드주입
    @Controllerpublic class CocoController {        
            @Autowired     
            private CocoService cocoService;
    }

    필드에 @Autowired를 붙여주어, 자동으로 의존성을 주입한다.

    그러나 외부에서의 변경이 힘들고, 프레임워크에 의존적임과 동시에 객체지향 적으로 좋지 않다.

    1. Setter주입
    @Controllerpublic 
    class CocoController { 
           private CocoService cocoService; 
    
           @Autowired  
             public void setCocoService(CocoService cocoService) {        
             this.cocoService = cocoService;    
            }
        }

    Setter 메소드에 @Autowired를 붙인다. 그러나 어디서든 변경이 가능하다는 위험이 있다.

    728x90

    댓글

Designed by Tistory.