[Spring] 스프링 특징-의존성 주입 (0805)

왕감자·2024년 8월 6일

KB IT's Your Life

목록 보기
115/177

스프링 프레임워크

1) 경량 프레임워크 (light-weight Framework)


2) 스프링 특징

  • POJO(Plain Old Java Object) 기반 구성 : 상속이나 인터페이스 구현 강제화 X
    • Java EE : 상속과 인터페이스 기반 (부모나 인터페이스가 정의한 구조로 구현)
  • 의존성 주입(Dependency Injection) : 필요로하는 의존객체가 있다면 제시만 ➞ 조립은 Spring
  • AOP(Aspect Oriented Programming) 지원
  • 편리한 MVC 구조
  • WAS에 종속적이지 않은 개발 환경


의존성 주입

Spring (x)

public class Chef {
   // Chef 클래스 구현
}

public class Rest {
    private Chef chef;

    // 생성자 주입
    public Rest(Chef chef) {
        this.chef = chef;
    }

    // 접근자 메소드
    public Chef getChef() {
        return chef;
    }
}
public class Main {
    public static void main(String[] args) {
        // Chef 객체 생성
        Chef chef = new Chef();

        // Chef 객체를 사용하여 Rest 객체 생성
        Rest rest = new Rest(chef);

        // Rest 객체에서 Chef 객체를 가져오기
        Chef retrievedChef = rest.getChef();

        // Chef 객체 사용
        System.out.println(retrievedChef);
    }
}

1) @Autowired

  • Spring Annotation
  • Spring 컨테이너가 자동으로 빈을 주입할 수 있게 해줌
  • java의 reflection 기능을 사용함 - private 멤버여도 상관X
  • Spring Context에 등록된 Bean이어야 함
  • final 키워드를 붙이기 힘듦 (final은 초기화 코드가 있어야 하기 때문)
@Component // Bean 객체 등록
public class Chef {
}

@Component
@Data
public class Restaurant {
    @Autowired
    private Chef chef; //멤버 변수에 의존 객체
}

단위테스트 해보기~

@ExtendWith(SpringExtension.class) //Spring Test다
@ContextConfiguration(classes = {RootConfig.class}) //설정파일
@Log4j //로그 출력을 위함, log 멤버 변수 자동 생성
class RestaurantTest {
    @Autowired
    private Restaurant restaurant;

    @Test
    void getChef() {
        assertNotNull(restaurant);
        log.info(restaurant);
        log.info("--------------------");
        log.info(restaurant.getChef()); //Restaurant.java에 @Autowired가 없으면 null
    }
}

2) 생성자 주입을 통한 의존성 주입 (권장)

🔸 생성자 주입

  • 클래스의 생성자를 통해 의존성을 주입
  • Spring : 생성자가 1개 있으면 그 생성자를 통해 의존성을 주입
    @RequiredArgsConstructor 를 사용하면 생성자가 1개 생성되기 때문에 @Autowired X

🔸 @RequiredArgsConstructor

  • 필수 인자 생성자(Constructor)를 자동으로 생성
    • final 필드
    • @NonNull 어노테이션이 붙은 필드
@Component // Bean 객체 등록
public class Chef {
}

@Component
@Data
@RequiredArgsConstructor //필수 argument에 대해 Constructor 만들어 줌 (final)
public class Restaurant {
    final private Chef chef; 
}

@RequiredArgsConstructor가 만들어 주는 것

public Restaurant(Chef chef) {
    this.chef = chef;
}

💡 의존성 주입 정리

  • 의존성 주입을 하기 위한 방법 - 생성자 주입
  • @Autowired
    • Spring에서 의존성을 주입
    • 생성자에 @Autowired를 사용하면 동시에 생성자 주입과 의존성 주입
  • @RequiredArgsConstructor
    • final / @NonNull이 붙은 필드에 대해 자동으로 생성자 생성

0개의 댓글