SEB_BE 37일차 - DI 2

subimm_·2022년 10월 17일
0

코드스테이츠

목록 보기
37/83

Daily coding

//제곱근 구하기
 final int PRECISION = 20;

    // 어떤 양수가 와도 무방
    double x = PRECISION;

    // 원하는 정밀도 만큼 반복
    for (int i = 0; i < PRECISION; i++)
        x = 0.5 * (num / x + x);
	//소숫점 두자리 까지 리턴
    return String.format("%.2f", x);
	} 

📔 Component Scan

  • 스프링은 설정 정보 없이 자동으로 스프링 빈을 등록하는 컴포넌트 스캔 기능 제공
  • @Component가 붙은 모든 클래스를 스프링 빈으로 등록
  • 기존과는 다르게 @Bean으로 등록한 클래스를 볼 수 없다.
    • DependencyConfig 등 @Configuration 설정이 된 파일이 있을 시 아래 코드 추가
      @ComponentScan(excludeFilters = @Filter(type = FilterType.ANNOTATION, classes = Configuration.class))

외부 라이브러리 사용 : Bean
내부 : Component6

📖 basePackages

  • 탐색할 패키지의 시작 위치를 지정, 해당 패키지부터 하위 패키지 모두 탐색
  • @ComponentScan()의 매개변수로 basepackages =""를 줄 수 있다.
  • 스프링 부트를 사용하면 @SpringBootApplication 을 프로젝트 시작 루트 위치에 두는 것을 추천 (@ComponentScan이 들어있다.)

📖 컴포넌트 스캔 기본 대상

  • @Component : 컴포넌트 스캔에서 사용
  • @Controller & RestController : 스프링 MVC 및 REST 전용 컨트롤러에서 사용
  • @Service : 스프링 비즈니스 로직에서 사용
  • @Repository : 스프링 데이터 접근 계층에서 사용 (스프링 데이터 접근 계층으로 인식, 데이터 계층의 예외를 스프링 예외로 변환해준다.)
  • @Configuration : 스프링 설정 정보에서 사용 ( 스프링 설정 정보로 인식하고, 스프링 빈이 싱글톤을 유지하도록 추가 처리)

📔 의존관계 주입 방법

📖 생성자 주입

  • 생성자에 @Autowired를 하면 스프링 컨테이너에 @Component로 등록된 빈에서 생성자에 필요한 빈들을 주입
    • 생성자 호출 시점에 딱 1번만 호출되는 것이 보장
    • 불변과 필수 의존관계에 사용
    • 생성자가 1개만 존재하는 경우엔 생략 가능
    • NullPointerException 방지
    • 주입받을 필드를 final로 선언 가능

📖 수정자 주입 (setter 주입)

  • setter라는 필드의 값을 변경하는 수정자 메서드를 통한 방법
    • 선택과 변경 가능성이 있는 의존관계에 사용
    • 자바빈 프로퍼티 규약의 수정자 메서드 방식을 사용
    • 수정자의 경우 @Autowired를 꼭 입력해야 실행

📖 필드 주입

  • 필드에 @Autowired 붙여서 바로 주입
    • 외부에서 변경 불가로 테스트하기 힘들다.
    • 실제 코드와 상관없는 특정 테스트를 하고 싶을 때 사용

📖 일반 메서드 주입

  • 한번에 여러 필드를 주입 / 일반적으로 사용 x

📙 옵션 처리

  • 주입할 스프링 빈이 없을 때 동작해야하는 경우

    • 자동 주입 대상 옵션 처리 방법
      • @Autowired(required=false) : 자동 주입할 대상이 없으면 수정자 메서드 자체가 호출x
      • org.springframework.lang.@Nullable : 자동 주입할 대상이 없으면 null이 입력됨.
      • Optional<>: 자동 주입할 대산이 없으면 Optional.empty가 입력됨.
  • 오류
    AutowiredTest를 실행시키는데 javax.annotation.meta.When not found 오류 발생

    • 해결
      gradle 파일에 아래 코드 추가
    dependencies {
        ...
         // https://mvnrepository.com/artifact/com.google.code.findbugs/jsr305
        implementation 'com.google.code.findbugs:jsr305:3.0.2'
        ...
    }

📖 생성자 주입 방식 사용 이유

  • 불변 : 의존관계 주입은 변경되면 안되기 때문
  • 누락 : 생성자 주입을 사용하면 주입 데이터 누락 시 컴파일 오류가 발생해서 알게됨.
  • final 키워드 사용 가능
  • 순환 참조를 방지 가능

실습 https://github.com/subimm/Spring-DI-.git

profile
코린이의 공부 일지

0개의 댓글