Spring Triangle 핵심 3대요소

Untitled·2024년 1월 9일

Spring

목록 보기
2/12
post-thumbnail

IoC(Inversion of Control) 제어의 역전

IoC 컨테이너가 객체의 생성, 관리, 생명주기를 담당하여 객체의 제어권을 프레임워크로 넘겨 유연하고 확장 가능한 애플리케이션을 개발할 수 있다. 즉 결합도가 낮아지고 유연성을 높일 수 있다.

  • 유지보수성
    객체 간의 의존성 감소 및 느슨하게 결합되어 서로 다른 클래스간의 영향도가 줄어들어 유지보수가 용이해짐
  • 테스트 용이
    테스트에서 Mock객체 주입 가능하여 Unit Test가 용이해진다. DI를 통해 생성되는 의존 객체들은 직접 생성하지 않고 인터페이스에 의존하기에 테스트가 편해진다.
  • 확장성
    새로운 기능이나 모듈 추가 시 기존 코드를 수정하지 않고 확장 가능하다.
  • 코드 가독성이나 재사용성
    IoC 컨테이너가 객체 라이프사이클 관리하여 소멸 관리 안해도된다.

DI (Dependency Injection) 의존성 주입

객체간의 의존 관계를 코드 내에서 설정하는 것이 아닌 외부에서 주입하여 객체 간의 결합도를 낮추는 디자인 패턴

의존성 주입 방법

  • 생성자 이용
  • Setter 이용
  • interface 이용

@Autuwired 를 이용한 주입 방법

  • Constructor Injection (생성자 주입)
    불변성을 유지하면서 객체 초기화 가능 의존성이 필수적인 경우에 사용한다.

    @Service
    public class MyService {
        private final MyRepository myRepository;
    	
        @Autowired
        //Spring 4.3 이후부터 생성자가 한 개만 있다면 해당 생성자에 Spring이 자동으로 @Autowired 어노테이션을 붙여줌
        public MyService(MyRepository myRepository) {
            this.myRepository = myRepository;
        }
    }
    
    
    //@RequiredArgsConstructor 이용방법
     
    @Service
    @RequiredArgsConstructor
    public class MyService {
        private final MyRepository myRepository;
    }
     
  • Setter Injection (세터 주입)
    선택적인 의존성 변경 가능한 의존성 주입이 가능하다. 생성자보다 유연하지만 불변성을 유지하기 쉽지 않을 수 있다.

    @Service
    public class MyService {
        private MyRepository myRepository;
    
        @Autowired
        public void setMyRepository(MyRepository myRepository) {
            this.myRepository = myRepository;
        }
    }
  • Field Injection (필드 주입)
    간결하게 표현가능하나 불변성이나 테스트가 어려울 수 있고 의존성이 숨겨져 있어 코드를 읽기 어려울 수 있다.

    @Service
    public class MyService {
        @Autowired
        private MyRepository myRepository;
    }

AOP(Aspect Oriented Programming)

위키백과에 나와있는 AOP 정의이다.

횡단 관심사(cross-cutting concern)의 분리를 허용함으로써 모듈성을 증가시키는 것이 목적인 프로그래밍 패러다임이다.

즉 프로그램 여러 부분에서 공통적으로 수행되는 작업을 모듈화 및 핵심 비지니스 로직을 분리해서 코드 중복을 줄이고 유지보수를 쉽게 가능하게 만드는 프로그램 패러다임이다.

Aspect(관점)
횡단 관심사를(=공통 기능, 부가 기능) 정의한 모듈로 로깅, 트랜잭션, 보안과 같은 횡단 관심사를 Aspect로 정의하고 캡슐화한다.
Advice와 PointCut을 통틀어 Aspect라고 하기도 한다.
Advice(조언)
Aspect에서 실제로 수행되는 코드 블록을 의미한다. 예를 들어, 특정 메서드 호출 전/후에 실행되는 코드 블록이 Advice에 해당합니다.
Join Point(결합점)
Advice를 적용할 수 있는 지점 또는 위치 메서드 호출, 필드 값 변경 등이 Join Point에 해당합니다.
Pointcut(포인트컷)
어떤 Join Point에 어떤 Advice를 적용할지를 결정 포인트컷은 결합점의 선택 기준을 정의한다.
Weaving(위빙)
Aspect를 핵심 로직에 적용하여 하나의 완전한 프로그램으로 만드는 과정으로 컴파일 타임, 로드 타임, 런타임 중 언제든지 이루어질 수 있다.

AOP를 구현하는 방법

  • 컴파일 시점 (Compile-Time)
    AspectJ 필요하다. 성능은 우수하지만 더 많은 코드가 필요
  • 클래스 로딩 시점 (Load-Time)
    AspectJ 라이브러리 클래스 로더 조작기가 필요하다. 컴파일 시점보다 유연성은 높지만 성능에 오버헤드 발생 가능
  • 런타임 시점 (Runtime)
    런타임 시점에 원본 객체를 감싸는 프록시 객체를 동적으로 생성하여 공통 기능을 삽입한다. 유연성은 뛰어나지만 성능에 손실이 있을 수 있음

Spring AOP 프록시는 대상 객체의 인터페이스를 구현하거나 대상 객체를 상속받아 오버라이딩해 부가 기능을 삽입해 메소드가 실행되는 시점에만 삽입할 수 있고 AOP로 사용하기 위해서는 무조건 Spring Bean으로 등록되어야 한다.

Spring AOP 동작 방식

  1. Spring Bean 대상 객체 생성 : Bean 대상이 되는 객체를 생성한다.
  2. BeanPostProcessor 빈 후처리기에 전달
    • 빈후처리기 (BeanPostProcessor) : 스프링 컨테이너가 Bean을 생성하고 초기화할 때 추가적인 작업을 수행하기 위한 인터페이스
  3. Advisor 조회 : Advice와 Pointcut 결합한 것으로 모든 Advisor 빈을 조회
  4. Proxy 생성 : Advisor에 등록된 Pointcut을 통해 메서드 매칭하여 성공 시 프록시를 생성하여 빈 저장소에 등록한다.
  5. 빈 저장소 등록

PSA(Portable Service Abstraction

기술에 대해 공통으로 사용할 수 있게 추상화된 레이어를 제공하여 이식성을 강화해준다.

Spring Transaction

PlatformTransactionManager 인터페이스를 두고 추상화해두어 구현체를 바꿀 수 있다.

출처
https://velog.io/@langoustine/Spring-02
https://www.inflearn.com/course/스프링-핵심-원리-고급편#
https://www.codestates.com/blog/content/스프링-스프링부트

profile
그저 그런 꾸준히 하고만 싶은 개발자 이야기

0개의 댓글