Spring 훑어보기!

·2024년 10월 21일

업무를 하면서 항상 사용하고 있다.
다시 정리한다는 생각으로 끄적여 보기로한다.

스프링이란?

객체 지향 언어가 가진 강력한 특징을 살려내는 프레임 워크이다.

즉, 핵심은 좋은 객체 지향 애플리케이션을 개발할 수 있게 도와준다.

스프링 핵심 개념 3가지 IOC, DI, AOP

IOC
IoC는 사용할 객체를 직접 생성하지 않고, 객체의 생명주기 관리를 외부(스프링 컨테이너)에 위임하는 것이다.

스프링은 기본적으로 IoC를 이용해서 객체의 생명 주기 관리를 외부에 위임한다.
여기서 외부는 스프링에서 관리하는 Spring Container or IoC Container라고 한다.
이렇게 객체의 관리를 컨테이너에 맡겨 제어권인 넘어간 것을 제어의 역전이라고 부른다.

제어의 역전을 통해 DI, AOP가 가능해진다.
이에 따라 개발자는 객체의 제어권을 컨테이너로 넘기고 객체의 생명 주기 관리 등의 복잡한 요소들을 신경 쓰지 않고, 비즈니스 로직에만 집중할 수 있게 된다.
이제 DI와 AOP를 알아보려한다.

DI

의존성 주입의 줄인말이며, DI를 통해 어플리케이션 모듈간의 결합도를 낮출 수 있도록한다.
의존성 주입 방법에 대해서 알아보자
Setter 주입, 생성자 주입, 필드 주입, 일반 메서드 주입 4가지 방법이 있다.

생성자 주입은 생성 호출시점에 딱 1번 호출되며, 불변, 필수 의존관계를 사용한다.

private final ProductService productService;

public ProductController(ProductService productService) {
    this.productService = productService;
}

Setter 주입은 setter메서드를 통해 주입하는 방식이다.
setter주입을 사용하면 public으로 열어두어야하고 누군가 실수로 변경할수도 있어서 변경하면 안된다.

private ProductService productService;

public void setProductService(ProductService productService) {
    this.productService = productService;
}

필드 주입은 @Autowired 어노테이션을 사용하여 주입해주는 방식이다.
권장하지 않는 방식이다. 안티패턴이라고도 불리고, 외부 변경에 유연하지 않기 때문에 테스트가 어렵다고 한다.

@Autowired
private ProductService productService;

권장하는 방법은 생성자 주입이다!
불변, 대부분 의존 관계 주입은 한번 일어나면 종료시점까지 변경할 일이 없으며, 종료전까지 변하면 안된다.

final 키워드를 사용하면 생성자에서 혹시라도 값이 설정되지 않는 오류를 컴파일 시점에 막아준다.

AOP

AOP(Aspect-Oriented Programming) 이라하며 관점 지향 프로그래밍이다.
보통 핵심기능을 중심으로 두고 구현을 하지만, 관점을 바꿔서 기능에 필요한 부가기능이란 관점으로 보면된다!

부가기능을 분리해서 aspect라는 모듈로 만들고 설계하는 방법이다.

0개의 댓글