AOP
Transaction
CGLIB
DispatcherServlet과 MVC 아키텍처
Aspect Oriented Programming
- 독립적인 모듈화가 불가능한 트랜잭션 경계설정과 같은 부가기능을 모듈화하는 작업
- Aspect: 핵심기능에 부가되어 의미를 갖는 특별한 모듈
- AOP는 Aspect를 분리함으로써 핵심기능을 설계하고 구현할 때 객체지향적인 가치를 지킬 수 있도록 도와주는 것(토비의 스프링)
Transaction
더 이상 나눌 수 없는 단위 작업
- SQL을 이용해 다중 로우의 수정이나 삭제를 했을 때, 일부는 되고 나머지는 안되는 경우는 없다.
- DB가 트랜잭션을 보장해 준다고 믿음.
- 여러 SQL이 실행될 때, 어느 한 SQL이 장애가 발생하면 이전에 실행된 SQL 작업은 취소해야 하는데, 이 취소 작업을 "트랜잭션 롤백"
- 여러 SQL이 실행될 때, 모든 SQL이 성공적으로 마무리했다면, DB에 해당 SQL 작업들을 확정해야 하는데, 이 확정 작업을 "트랜잭션 커밋"
- JDBC의 트랜잭션은 default 로 setAutoCommit(true) 이므로, 프로그램적으로 여러개의 SQL에 대하여 트랜잭션 경계설정을 하기 위해서는 autoCommit을 false로 설정해야 한다.
CGLIB
Code Generator Library
- 런타임에 동적으로 클래스의 프록시를 생성함
- JDK Dynamic Proxy 보다 더 빠르다. JDK Dynamic Proxy 의 경우 리플렉션을 이용해 인터페이스의 구현 클래스를 위임하는 프록시 클래스를 이용하며, CGLIB는 클래스 파일을 상속받아서 프록시 클래스를 만들어 낸다. JDK Dynamic Proxy(인터페이스 필요), CGLIB(인터페이스 필요없음)
- AspectJ 는 스프링 컨테이너를 사용하지 않는 경우에도 프록시 클래스 생성을 해주며, 런타임시 바이트코드를 조작하는 방식을 사용한다.
IOC
제어권의 이전을 통한 제어관계 역전
- 오브젝트가 자신이 사용할 오브젝트를 스스로 선택하지 않고 생성하지도 않는다. 모든 제어 권한은 자신이 아닌 다른 대상에게 위임하기 때문, 모든 오브젝트는 위임받은 제어 권한을 갖는 특별한 오브젝트에 의해 결정되고 만들어진다.
- 설계가 깔끔해지고 유연성이 증가하며 확장성이 좋아짐.
DI
런타임 의존관계를 설정
- 클래스 모델이나 코드에는 런타임 시점의 의존관계가 드러나지 않기 위해 인터페이스에만 의존하고 있어야 함.
- 런타임 시점의 의존관계는 컨테이너나 팩토리 같은 제 3의 존재가 결정.
- 의존관계는 사용할 오브젝트에 대한 레퍼런스를 외부에서 제공해줌으로써 만들어 짐.
- 생성자 파라미터를 통한 전달
- 접근자 파라미터를 통한 전달
DispatcherServlet과 MVC 아키텍처
DispatcherServlet은 Spring이 제공하는 프론트 컨트롤러다.
MVC는 프레젠테이션 계층의 구성요소를 정보를 담은 모델(Model), 화면 출력 로직을 담은 뷰(View), 그리고 제어 로직을 담은 컨트롤러(C)로 분리하고 이 세가지 요소가 서로 협력해서 하나의 웹 요청을 처리하고 응답을 만들어내는 구조다.
- MVC 아키텍처는 보통 프론트 컨트롤러(front controller) 패턴과 함께 사용된다.
- 프론트 컨트롤러는 중앙집중형 컨트롤러를 프레젠테이션 계층의 제일 앞에 둬서 서버로 들어오는 모든 요청을 먼저 받아서 처리한다.
- 프론트 컨트롤러는 클라이언트가 보낸 요청을 받아서 공통적인 작업을 먼저 수행한 후에 적절한 세부 컨트롤러로 작업을 위임해주고, 클라이언트에게 보낼 뷰를 선택해서 최종 결과를 생성하는 등의 작업을 수행한다. 예외가 발생했을 때 이를 일관된 방식으로 처리하는 것도 프론트 컨트롤러의 역할이다.
- 스프링이 제공하는 스프링 서블릿/MVC의 핵심은 DispatcherServlet이라는 프론트 컨트롤러다
- 자바 서버의 서블릿 컨테이너는 HTTP 프로토콜을 통해 들어오는 요청이 스프링의 DispatcherServlet에 할당된 것이라면 HTTP 요청정보를 DispatcherServlet에 전달해 준다.(servlet-mapping)
- DispatcherServlet에서 컨트롤러로 HTTP 요청 위임(핸들러 매핑 전략: 어댑터 패턴 - 특정 컨트롤러를 호출해야 할때는 해당 컨트롤러 타입을 지원하는 어댑터를 중간에 껴서 호출함. 이는 DispatcherServlet은 항상 일정한 방식으로 컨트롤러를 호출하고 결과를 받을 수 있다. DefaultAnnotationHandlerMapping, AnnotationMethodHandlerAdapter)
- 컨트롤러의 모델 생성과 정보 등록, 컨트롤러의 결과 리턴: 모델과 뷰(ModelAndView: Model(K,V), ViewName)
- DispatcherServlet의 뷰 호출과 모델 참조(JSP/JSTL 로 HTML 생성 및 동적 변경 model 값 대입)
- HTTP 응답 돌려주기(HttpServletResponse)
출처: 토비의 스프링
댓글
댓글 쓰기