스파르타 기술면접
DI 방식, FIlter / Interceptor / AOP
wkdwldP
2023. 3. 30. 15:51
>>DI의 방식 중 필드 vs 생성자 주입 방식
💡 DI는 객체간의 결합도를 줄여 의존관계를 느슨하게! →유연한 대처가 가능
DI의 방식
필드 주입
의존성을 나타내는 필드에 @Autowired어노테이션을 사용해서 주입
- 코드 작성이 간결
- 오류를 찾기 어렵고 의존성 주입의 순서를 보장하기 어려움
생성자 주입
의존성을 주입하는 생성자를 정의하고, @Autowired 어노테이션을 사용하여 의존성을 주입
- 오류를 찾을 수 있고, 의존성 주입의 순서를 보장
- 생성자를 통한 필수 의존성을 전달하므로, 의존성 누락에 대한 예방 가능
- 권장되는 방법(불변성 확보, 테코 작성, final 키워드 작성 및 lombok과 결합, 순환참조 에러 발생 방지(스프링 2.6미만))
예시
필드 주입 & 생성자 주입
//필드 주입
public class PostService {
@Autowired
private PostRepository postRepository;
}
//생성자 주입
public class PostService {
private final PostRepository postRepository;
@Autowired
public PostService (PostRepository postRepository) {
this.postRepository = postRepository;
}
}
프로퍼티를 통한 의존성 주입
- applicationContext.xml에 <property> 태그를 사용하여 의존성을 주입 →객체 생성 시 주입된 객체도 함께 생성됨
인터페이스를 통한 의존성 주입
- 추상화 개념을 이용한 의존성 주입 방식
- 의존성을 주입하는 대상 클래스가 인터페이스를 구현하고 있어야 함. 이 때, 구현체 클래스를 직접 주입하는 대신, 해당 인터페이스를 주입함으로써 유연성과 확장성을 높일 수 있다.
- **ex>**서비스 클래스가 데이터베이스와 의존성을 가지고 있다고 가정. 서비스 클래스는 데이터베이스와 직접적으로 의존하므로 인터페이스를 이용한 의존성 주입 방식을 적용하면, 서비스 클래스는 인터페이스를 의존하도록 변경할 수 있다. 이렇게 하면, 추후에 데이터베이스를 변경하더라도 서비스 클래스의 코드를 수정하지 않아도 됨. →최종 프로젝트에 적용했던 방식…
의존성 주입 순서의 중요성...
- Null 포인터 예외 방지: 의존성이 있는 객체를 생성하기 전에 의존성이 있는 객체를 먼저 생성하면 Null 포인터 예외를 방지할 수 있습니다. 의존성이 있는 객체를 먼저 생성하지 않으면 Null 값을 가진 상태에서 의존성이 있는 객체를 생성하려 할 때 Null 포인터 예외가 발생할 수 있습니다.
- 객체의 무결성 보장: 의존성이 있는 객체를 먼저 생성하고 주입하는 것은 객체의 무결성을 보장하는 데 도움이 됩니다. 의존성이 있는 객체를 생성하고 주입하기 전에 의존성이 있는 객체의 상태가 올바른지 확인하고, 이후에 의존성이 있는 객체를 생성하고 주입하면 객체의 무결성을 보장할 수 있습니다.
- 모듈화된 코드 작성: 의존성 주입 순서를 정해놓으면 코드를 모듈화할 수 있습니다. 의존성이 있는 객체를 먼저 생성하고 주입하는 코드는 의존성이 있는 객체와 의존성이 있는 객체를 사용하는 객체를 분리할 수 있습니다. 이는 코드를 더욱 간결하고 유지보수하기 쉽게 만들어줍니다.
>>Filter / Interceptor / AOP 이 3가지의 정의와 차이점
웹개발을 하다보면 공통적으로 처리해야 할 것들이 생김 (ex. 로그인처리, 권한체크 등…) →공통업무에 관련된 코드를 페이지별로 작성한다면 중복코드 발생 , 서버 부하 , 유지 보수 어려움 등의 문제가 발생한다.
즉, 공통된 업무는 따로 빼서 관리를 하는게 적합!
Spring 에서는 이럴 때 3가지 방법이 존재한다. → Filter / Interceptor / AOP
흐름
- Filer, Interceptor, AOP는 각각의 역할을 수행하며 특정 상황에서 필요에 따라 조합해서 사용.
- 요청 → request > filter > Servlet > Interceptor > AOP > Controller 순서로 실행.
- Interceptor, AOP, Controller : Spring Context Filter : Web Context
공통점
▪ 애플리케이션에서 요청 처리를 조작하고, 제어할 수 있는 기능을 제공한다. ▪ 애플리케이션의 로직을 제어하고, 코드의 중복을 제거하고, 코드의 유지보수성을 높이는 데에 기여할 수 있는 공통적인 목표를 가지고 있다.
Filter
💡 Filter는 서블릿 컨테이너에서 제공하는 기능(스프링 독자적 기능 X)으로, HTTP 요청을 가로채서 요청과 응답에 대한 정보를 조작하거나, 필터링하여 요청을 처리하는 기능을 수행합니다.
- 스프링 컨텍스트가 아니라 웹 컨텍스트에 속하며, 스프링 컨테이너가 아니라 웹컨테이너(톰캣) 에 의해 관리
- 웹 어플리케이션에서 클라이언트의 요청을 처리하기 전후로 요청과 응답을 변경하거나 처리하는 역할
- 모든 서블릿에 대해 적용이 되므로 로그인 여부, 인코딩 처리, 파일 업로드 등의 공통 로직을 처리할 때 주로 사용.
- FilterChain을 통해 여러 필터를 연쇄적으로 동작하게 할 수 있다.
Interceptor
💡 인터셉터(Interceptor)는 스프링에서 AOP(Aspect-Oriented Programming)을 구현하기 위한 기술 중 하나로, 컨트롤러(Controller)에 들어오는 요청(Request)과 컨트롤러가 반환하는 응답(Response)을 가로채서 필요한 처리를 할 수 있도록 하는 인터페이스입니다.
- 컨트롤러 실행 전후의 요청과 응답을 가로채서 처리
- 핸들러 실행 전/후에만 적용이 되므로 컨트롤러에서만 처리하도록 구현된 로직이나 권한체크와 같은 비즈니스 로직을 처리할 때 사용
AOP
💡 AOP는 Aspect Oriented Programming의 약어로, 관점 지향 프로그래밍이라고 번역됩니다. AOP는 OOP(Object Oriented Programming)의 한계를 극복하고, 객체지향 개발을 보완하는 프로그래밍 패러다임입니다.
- 애플리케이션 전체에서 적용되는 공통 로직을 분리 → 개발을 용이하게 하는 기술
- 로깅, 보안, 트랜잭션 초리 등에 사용
- 프록시를 이용하여 타깃객체의 메소드 호출을 가로챔 → Filter나 Interceptor와는 다른 방식으로 동작한다.
https://www.notion.so/836f45337cdd4eebb5e544133e94ab17
...예시 작성해야 함.....
(추가공부…)Dispatcher Servlet / sevlet / requestParam / Tomcat, Thymeleaf