Query :
데이터베이스에게 특정한 데이터를 보여달라는 클라이언트(사용자)의 요청을 말한다.
쿼리문을 작성한다 > 데이터베이스에서 원하는 정보를 가져오는 코드를 작성한다.
IoC(Inversion of Control) : 제어권의 역전
쉽게 말해 객체를 개발자 본인이 제어하는 것이 아닌 스프링 컨테이너에게 제어권이 넘어가는 것을 뜻한다.
DL(Dependency Lookup) : 의존성 검색
- 컨테이너에게 제공하는 API를 이용해 사용하고 하는 Bean을 저장소에 Lookup 하는 것을 말한다. (사용 시 Container 종속성이 증가한다.)
DI(Dependency Injection) : 의존성 주입
- 각 클래스 간의 의존성을 자신이 아닌 외부(컨테이너)에서 주입하는 것이다. (필드, 생성자, 메소드로 세가지)
- Container는 Bean하고 의존관계가 되어선 안된다. Bean은 독립적으로 존재해야 하며, Container는 단순하게 Bean을 담는 통이고 Bean은 독립적으로 인스턴스를 만들 수 있어야 한다.
AOP(Aspect Oriented Programming) : 관점 지향 프로그래밍
- 여러 개의 핵심 비즈니스 로직 외에 공통으로 처리되어야 하는 로그 출력, 보안처리, 예외 처리와 같은 코드를 모아서 처리를 편리하게 해준다. 대표적으로 @Transactional로 트랜잭션 처리를 공통으로 넣어줄 수 있다.
AOP 구현 방법 : 컴파일 이용방법, 바이트 코드 조작, 프록시 패턴
스프링은 프록시 패턴을 기반으로하여 AOP를 지원하고 있다.
프록시를 통해 핵심 로직을 구현한 객체에 접근하게 되면
핵심 로직을 실행하기 전,후에 공통된 기능을 적용하는 방식으로 AOP를 구현한다.
모든 요청(request)는 서블릿(Servlet)에 도달하기 전에 필터(Filter)가 먼저 해당 요청을 가로채 필터링하고 필터링된 출력값이 서블릿으로 간다. 그리고 서블릿을 거쳐 내부 로직을 처리하는 중에 입/출력단에서 다시 한번 인터셉터(Interceptor)가 동작하는데, 이 필터와 인터셉터 계층에게 공통기능을 맡김으로서 개발자가 원하는 특정 로직에 공통 기능을 적용할 수 있다.
PSA(Portable Service Abstraction) : 추상화 서비스
- 외부 라이브러리들을 POJO로 사용할 수 있도록 일종의 껍데기를 씌워 추상화한 것이다. Spring에서 추상화 된 서비스들을 자바 언어로 자유롭게 사용할 수 있게 된다. 편의성을 제공해주고 완전히 다른 기술 스택으로도 애플리케이션이 작동할 수 있도록 해주어서 코드를 바꿀 일이 줄어든다.