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

+ Recent posts