[ 면접 질문 - 스프링 3대 핵심 요소에 대해서 ]
1) IoC - 제어의 역전.
클라이언트 구현 객체가 스스로가 조종했던 기존 프로그램의 제어 흐름을 IoC 컨테이너가 주체적으로 관리하는 방식이 됨.
제어의 역전 기능을 이해하면 프레임워크 - 라이브러리의 구분도 가능해진다. 제어의 흐름을 담당하는 것이 프레임워크라면 프레임워크, 내가 작성한 코드라면 라이브러리라고 한다.
2) DI - 의존성 주입.
스프링 로직이 실행될 때 필드나 생성자, 세터 등을 해당하는 구현체를 찾아서 주입하는 것을 말함. 의존성 주입을 통해 인터페이스를 사용하고 구현체에 주입받는 구조가 되면 클래스 간의 의존도가 낮아지고 구현체를 쉽게 교체할 수도 있는 장점이 있음.
-> IoC 컨테이너 또는 DI 컨테이너라는 것은 객체를 생성하고 관리하면서 의존관계를 연결해 주는 것을 말한다. 이로 인해 개발자는 직접적으로 객체 간의 관계나 생성 로직에 대해서 관리할 필요가 없어진다.
3) PSA - 서비스 추상화
스프링은 추상화 계층을 통해 구체적인 기술과 환경에 종속되지 않도록 한다. 즉, 추상화 계층을 사용해 어떤 기술을 내부에 숨기고 개발자에게 편의성을 제공하는 것이다.
대표적인 예로 MVC 계층과 트랜잭션이 있다.
Spring에서는 서블릿 기반의 애플리케이션을 만들고 있음에도 서블렛 코드는 보이지 않는다. 컨트롤러의 @PostMapping, @GetMapping 등이 그 예시다.
트랜잭션도 마찬가지로, 처리 과정의 복잡함을 숨길 수 있도록 @Transactional 에너테이션으로 대신한다.
4) AOP - 관점 지향 프로그래밍
애플리케이션에 공통적으로 나타나는 부가적인 기능들을 독립적으로 모듈화하는 프로그래밍 모델.
기술적인 면이나 요구사항 면에서 복잡도가 올라갔을 때 책임, 관심사 분리가 어려워지기 때문에 스프링에서 지원하는 AOP를 이용하여 깔끔한 코드 유지와 객체지향적인 개발을 가능하게 함.
예를 들어 @Transactional 에너테이션은 AOP에 의해서 실행되는데, 비즈니스 로직과 트랜잭션 로직이 결합됐을 때의 로직 중복과 책임 분리의 어려움이 해결됨.
-> 프록시 객체를 사용해 AOP를 구현함.