기술적 질문2 - DI, Filter/Interceptor/AOP

Quann·2023년 3월 28일
2

질문: DI에 대해서 설명해주세요

01. 스프링에서 DI를 구현하는 방식을 예시 코드와 함께 설명해보자

  1. 생성자 주입 (Constructor-based Injection)
public class TempService {
    private final TempRepository tempRepository;
    
    public TempService(TempRepository tempRepository) {
        this.tempRepository = tempRepository;
    }
    
    // ...
}
  • 생성자를 기반으로 의존성을 주입하는 방식
  • 객체 생성 시점에서 모든 의존성이 주입되는 형식이기 때문에, 의존하는 객체가 변화하지 않고 일관성이 보장됨 (추후 변경될 여지가 없다.)
  • Lombok을 통해 아래와 같이 간단하게 작성 가능
@RequiredArgsConstructor
public class TempService {
    private final TempRepository tempRepository;    
    // ...
}
  • 대신, 생성자가 하나일 경우에만 자동으로 생성자 주입이 되는 방식이기 때문에, 두 개 이상의 생성자가 존재할 경우 DI를 위한 생성자에 @Autowired 애노테이션을 붙여주어야 한다.
  1. Setter 주입 (Setter-based Injection)
public class TempService {
	private TempRepository tempRepository;
    
    public void setTempRepository(TempRepository tempRepository) {
        this.tempRepository = tempRepository;
    }    
}
  • Setter 메서드를 기반으로 의존성을 주입하는 방식
  • 객체 생성 후에 필요한 의존성을 주입할 수 있어 유연성이 높지만, 의존하는 객체의 일관성이 보장되지 않음 (추후 의존성이 변경될 여지가 존재한다.
  • 따라서, 변경 가능한 선택적 의존성이 많은 객체에서 적합
  1. 필드 주입
public class TempService {
	// ...
    @Autowired
    private TempRepository tempRepository;
    // ...
}
  • 필드에 직접 의존성을 주입하는 방식
  • 따라서, 작성이 간단하고 코드의 가독성이 높아짐
  • 외부에서 수정 불가능하며, 테스트 코드 작성시 객체 수정이 불가능해짐

전반적으로, 생성자 주입이 권장되며, 이유는 다음과 같다.
1. 필드 주입의 단점
2. 수정자 주입의 단점
3. 객체의 불변성 확보
4. 테스트 코드 작성의 편리함
5. 순환 참조 방지
6. 개발자의 의존성 주입 실수 방지 (final 키워드)


질문: Filter, Interceptor, AOP의 특징과 차이점을 설명해주세요

  • Filter, Interceptor, AOP는 요청 처리 과정에서 특정 로직을 수행하는데 사용되는 기술

Filter

  • Servlet 컨테이너 수준에서 동작, 스프링 컨텍스트 외부에서 동작
  • 인코딩, 보안, CORS 관련 처리 등과 같은 요청과 응답에 대한 전처리 및 후처리 작업에 사용
  • Filter는 스프링의 DispatcherServlet이 실행되기 전에 요청과 응답을 가로챔 => 스프링의 컨텍스트를 직접 사용할 수 없음

Interceptor

  • 스프링의 MVC 패턴에서 동작, 스프링 컨텍스트 내부에서 동작
  • 컨트롤러가 실행되기 전과 후에 특정 로직을 수행하는데 사용되며, 주로 인증, 권한 검사, 로깅 등의 처리를 수행
  • Interceptor는 스프링 컨텍스트 내에서 동작 => 스프링 빈을 주입받아 사용할 수 있습니다.

AOP

  • 관점 지향 프로그래밍 - 관심사의 분리를 통해 코드의 모듈화
  • 특정 로직을 캡슐화한 Aspect를 정의하고, 어느 시점(Pointcut)에서 실행될지 설정하여, 원하는 위치에 적용(Weaving)
  • 로깅, 트랜잭션 관리, 보안, 캐싱 등의 공통 관심사를 처리할 때 사용
  • AOP는 스프링 컨텍스트 내에서 동작하므로 => 스프링 빈을 주입받아 사용

! 스프링 시큐리티에서 사용했던 CustomFilter는 스프링 영역에서 동작하지 않음에도 어떻게 SpringContextHolder를 사용할 수 있을까?

A.

  • 스프링 시큐리티의 CustomFilter는 스프링의 DispatcherServlet 앞에 위치해 보안 관련 로직 처리
  • 스프링 시큐리티를 사용하면, 컨텍스트 내의 스프링 빈을 주입받아 사용할 수 있습니다.
  • 스프링 시큐리티에서 사용하는 CustomFilter는 기본적으로는 Servlet 컨테이너 수준에서 동작
  • 스프링 컨텍스트와 밀접하게 연동되어 동작 => 스프링 컨텍스트 내에서 동작하는 것처럼 사용 가능
profile
코드 중심보다는 느낀점과 생각, 흐름, 가치관을 중심으로 업로드합니다!

0개의 댓글