1. Spring Core
→ 스프링 프레임워크의 기본적인 기능 담당
→ IoC 컨테이너와 DI 컨테이너를 제공하여 객체지향적인 설계를 촉진하고, 애플리케이션의 유연성과 확장성을 향상시킴
위 그림과 같이 애너테이션을 붙이는 방법만으로 객체 A에서 필요한 객체를 직접 생성하는 방식이 아닌 스프링 컨테이너에서 받아오는 방식으로 코드를 작성할 수 있게 된다.
1) IoC (Inversion of Control) 컨테이너
- 객체 생성과 관리 담당
- 빈(Bean) 객체 생성, 의존성 주입(DI) 수행
- 빈의 생명주기 관리
- XML, 애너테이션, 자바 설정파일을 사용하여 빈의 구성 정의
2) DI (Dependency Injection) 컨테이너
- 빈 객체간의 의존성 관리
- 런타임 시 빈들의 의존성 주입
- 인터페이스와 구현체 간의 느슨한 결합 가능하게 함
- 생성자 주입, Setter 주입 등 다양한 방법 제공
3) AOP (Aspect Oriented Programming)
- Aspect Oriented Programming을 지원
- 메서드 호출 전/후 등 특정 시점에서 공통적인 로직을 수행할 수 있도록 함
- 애너테이션을 활용하여 간편하게 할 수 있음
4) 유틸리티 클래스 및 기능
- 스프링 프레임워크에서 자주 사용되는 유틸리티 클래스 제공
- 프로퍼티 파일을 읽어들이는 등의 기능 지원
2. 의존성 주입 (Dependency Injection)
1) 필드 주입 (Field Injection)
→ 의존성 주입을 받을 객체의 필드에 @Autowired 어노테이션을 붙여 의존성 주입을 받는 방법
public class UserServiceImpl implements UserService {
@Autowired
private UserRepository userRepository;
// ...
}
코드 길이가 짧아 간편하지만, 테스트 코드 작성이 어렵고 DI 컨테이너에서 빈을 교체할 수 없어 유연성이 떨어짐
2) 수정자 주입 (Setter Injection)
→ 의존성 주입을 받을 객체의 Setter 메서드에 @Autowired 어노테이션을 붙여 의존성 주입을 받는 방법
public class UserServiceImpl implements UserService {
private UserRepository userRepository;
@Autowired
public void setUserRepository(UserRepository userRepository) {
this.userRepository = userRepository;
}
// ...
}
선택적인 의존성 주입이 가능하여 유연하게 사용할 수 있지만, Setter 메서드를 public으로 열어두어야 하고, 객체 생성 후 의존성 주입이 완료되어야 하므로 일부 속성이 null일 수 있음
3) 생성자 주입 (Constructor Injection)
→ 의존성 주입을 받을 객체의 생성자 파라미터에 @Autowired 어노테이션을 붙여 의존성 주입을 받는 방법
public class UserServiceImpl implements UserService {
private final UserRepository userRepository;
@Autowired
public UserServiceImpl(UserRepository userRepository) {
this.userRepository = userRepository;
}
// ...
}
불변성을 보장하고, 생성자를 통해 필수적인 의존성을 주입받기 때문에 객체 생성 시점에 의존성 주입이 완료되어 NullPoiinterException 등의 문제가 발생할 가능성이 적음
∴ 생성자 주입을 사용하자!
→ 객체 생성 시점에 필요한 의존성을 완전히 제공하고, 불변성을 유지하는 클래스를 구현할 수 있으며 의존성이 변경되는 경우에도 유연하게 대처할 수 있기 때문에 생성자 주입을 사용하는 것이 안전하다.
3. Spring Core 모듈 주요 애너테이션
@Component | 스프링의 컴포넌트 스캔 기능을 사용하여 빈으로 등록하고자 하는 클래스에 사용 |
@Autowired | 자동 주입을 위한 애너테이션으로 스프링 컨테이너가 해당 타입에 맞는 빈을 자동으로 주입 |
@Qualifier | 여러 개의 빈이 등록되어 있을 때 어떤 빈을 주입할지 선택 |
@Controller | 스프링 MVC에서 컨트롤러 역할을 하는 클래스에 사용 |
@Service | 비즈니스 로직을 처리하는 서비스 클래스에 사용 |
@Repository | 데이터베이스와 관련된 작업을 처리하는 DAO 클래스에 사용 |
@Configuration | 자바 기반의 스프링 설정 클래스에 사용 |
@Bean | @Configuration 클래스에서 스프링 빈을 직접 등록하기 위한 애너테이션 |
@Scope | 빈의 범위를 지정하기 위한 애너테이션 singleton, prototype, request, session, global session 등이 있음 |
@Value | 프로퍼티 값을 주입하기 위한 애너테이션 스프링의 PropertyPlaceholderConfigurer를 통해 값을 가져올 수 있음 |
'네트워크캠퍼스 > SPRING' 카테고리의 다른 글
Request Handling (0) | 2024.02.05 |
---|---|
REST API (0) | 2024.02.01 |
Spring MVC 모듈 (0) | 2024.02.01 |
SOLID 원칙 (0) | 2024.01.31 |
스프링 프레임워크 (0) | 2024.01.31 |