스프링 프레임워크
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 {
}
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 = new Chef();
Rest rest = new Rest(chef);
Chef retrievedChef = rest.getChef();
System.out.println(retrievedChef);
}
}
1) @Autowired
- Spring Annotation
- Spring 컨테이너가 자동으로 빈을 주입할 수 있게 해줌
- java의 reflection 기능을 사용함 - private 멤버여도 상관X
- Spring Context에 등록된 Bean이어야 함
final 키워드를 붙이기 힘듦 (final은 초기화 코드가 있어야 하기 때문)
@Component
public class Chef {
}
@Component
@Data
public class Restaurant {
@Autowired
private Chef chef;
}
단위테스트 해보기~
@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = {RootConfig.class})
@Log4j
class RestaurantTest {
@Autowired
private Restaurant restaurant;
@Test
void getChef() {
assertNotNull(restaurant);
log.info(restaurant);
log.info("--------------------");
log.info(restaurant.getChef());
}
}
2) 생성자 주입을 통한 의존성 주입 (권장)
🔸 생성자 주입
- 클래스의 생성자를 통해 의존성을 주입
- Spring : 생성자가 1개 있으면 그 생성자를 통해 의존성을 주입
⇨ @RequiredArgsConstructor 를 사용하면 생성자가 1개 생성되기 때문에 @Autowired X
🔸 @RequiredArgsConstructor
- 필수 인자 생성자(Constructor)를 자동으로 생성
final 필드
@NonNull 어노테이션이 붙은 필드
@Component
public class Chef {
}
@Component
@Data
@RequiredArgsConstructor
public class Restaurant {
final private Chef chef;
}
@RequiredArgsConstructor가 만들어 주는 것
public Restaurant(Chef chef) {
this.chef = chef;
}
💡 의존성 주입 정리
- 의존성 주입을 하기 위한 방법 - 생성자 주입
- @Autowired
- Spring에서 의존성을 주입
- 생성자에 @Autowired를 사용하면 동시에 생성자 주입과 의존성 주입
- @RequiredArgsConstructor
- final / @NonNull이 붙은 필드에 대해 자동으로 생성자 생성