애플리케이션이 제공하고자 하는 서비스나 도메인을 직접적으로 구현한 부분(유스케이스로 표현)
트랜잭션 스크립트 설계 pattern
하나의 트랜잭션으로 구성된 로직을 단일 스크립트(함수)에서 처리(로직 주도 설계)
행위(script), 속성(data; VO, DTO) 분리
단순하고 간편하지만 비즈니스 로직이 복잡해지면 난해하고 중복된 코드가 우려된다.
도메인 모델 설계 pattern
객체지향 분석·설계에 기반하여 구현하고자 하는 도메인(비즈니스 영역)의 모델 생성
상속 등을 통해서 객체의 기능과 역할 확장·변경
하나의 도메인 모델을 구축하는데 많은 노력 필요
트랜잭션: 업무 처리 단위
ACID: Atomicity(원자성), Consistency(일관성), Isolation(독립성), Durability(영속성)
트랜잭션 시작 begin ~ 커밋 commit/롤백 rollback
트랜잭션 관리(시작, 커밋, 롤백)를 소스 코드로 명시

프레임워크의 정의 파일에 선언하여 트랜잭션 관리

객체를 직접 생성하지 않고, 스프링 컨테이너가 외부에서 가져와 자동으로 연결해 주는 방식
자바는 클래스 간 의존성이 높다. 의존성이 높은 객체를 생성하게 되면 클래스 간의 결합도가 높아지기 때문에 코드의 재활용성이 떨어지고, 클래스가 수정되었을 때 의존되어 있는 클래스들을 수정해야 하는 단점이 생긴다. DI를 사용하면 애플리케이션 안에서 관련 있는 클래스 간 결합도를 낮추고 유지 보수가 쉬워진다.
코드의 재활용성이 높아진다
코드를 단순화한다.
클래스 간 결합도가 낮아져 유연성과 확장성이 높아진다
컨트롤러와 서비스의 의존관계
서비스와 DAO의 의존관계
애너테이션을 이용한 DI : 소규모 프로젝트
Bean 정의 파일을 이용한 DI : 대규모 프로젝트
spring의 핵심 개념 중 하나인 DI가 애플리케이션 모듈들 간의 결합도를 낮춰준다면, AOP는 애플리케이션 전체에 걸쳐 사용되는 기능을 재사용하도록 지원하는 것이다.
애플리케이션 전체에 흩어진 공통 기능이 하나의 장소에서 관리된다는 점
다른 서비스 모듈들이 본인의 목적에만 충실하고 그 외 사항들은 신경 쓰지 않아도 된다는 점
아래 용어들은 Spring에서만 사용되는 용어들이 아닌 AOP 프레임워크 전체에서 사용되는 공용어
Target: 부가기능을 부여할 대상
Aspect: 객체지향 모듈을 오브젝트라 부르는 것과 비슷하게 부가기능 모듈을 Aspect라고 부른다.
Advice: JoinPoint 때 실행되는 코드로 실질적으로 부가기능을 담은 구현체
PointCut: JoinPoint에서 Advice의 호출 여부를 결정하는 조건
JoinPoint: Advice를 실행시킬 수 있는 때
Proxy: Target을 감싸서 Target의 요청을 대신 받아주는 랩핑 오브젝트