** 자기 공부용 및 암기용으로 포스팅하는 글 입니다.
** 정확한 정보는 보장 할 수 없으니, 참고용으로만 봐주시면 감사하겠습니다.
** 제 개인적인 생각 및 자기 암시목적으로 작성되기에 이점 양해 부탁드립니다.
들어가기에 앞서..
Spring Framework의 특징인 POJO.
POJO 프로그래밍을 지향하기 위해 Spring Framework는 IoC/DI, AOP, PSA 기술을 제공한다.
우리는 이번 시간을 통해 각 기술들이 어떠한 것인지 알아보는 시간을 가져보자.
★ 알아볼 내용
1. Spring Framework의 특징 - AOP
2. Spring Framework의 특징 - PSA
내용 설명
1. Spring Framework의 특징 - AOP
Aspect Oriented Programming의 약자로 관심 지향 프로그래밍 이라고 해석할 수 있다.
우리는 객체 지향 프로그래밍을 지향하는 방식에서 관심 지향 프로그래밍을 작업을 해야한다는 것인데, 어떻게 적용을 해야할까?
프로그래밍을 진행할 때, 여러 애플리케이션에서 필요한 기능들 중 공통되는 점이 있을 것이다.
우리는 이를 공통된 관심사로 묶어서 "공통 관심 사항"으로 분류 할 수 있다.
또, 비즈니스 로직(애플리케이션의 주목적)을 달성하기 위한 핵심 로직을 우리는 "핵심 관심 사항"으로 분류를 할 수 있다.
AOP를 다루게 될 경우 각 애플리케이션에서 "공통 관심 사항"과 "핵심 관심 사항"을 분류하여 구별 할 줄 알아야 한다는 것이다.
대표적인 예시로 항상 사용해 왔던 커피 주문 애플리케이션을 예시로 들어보자.
커피를 주문하기 위해서는 핵심로직(핵심 관심 사항) 은 아래와 같다.
- 커피 주문 기능
- 커미 메뉴 등록 기능
- 커미 주문 변경 기능
위 3가지 시스템에서 공통으로 들어가는 기능(공통 관심 사항)은 아래와 같다
- 로깅
- 보안
- 트랜잭션
사진으로 정리하면 아래와 같다.
결론적으로 이야기를 하자면,
AOP라는 것은 애플리케이션의 핵심 업무 로직에서 로깅이나 보안, 트랜잭션 같은 공통 기능 로직들을 분리하는 것이라고 해석 할 수 있다.
그렇다면은... AOP가 왜 필요할까
AOP를 사용하게 되면은 3가지의 강점을 가져 갈 수 있다.
- 코드의 간결성 유지
- 객체 지향 설계 원칙에 맞는 코드 구현
- 코드의 재사용
우리가 만약에 "공통 기능 로직"을 분리하지 않고 각 애플리케이션에서 사용하게 되면은 복잡해 지는것은 뻔한 것이고, 이로 인해 가독성 저하, 유지보수의 난이도 증가가 따라오게 될 것이다.
그렇기에 로직 분리를 통해 위 세가지의 장점을 얻게 된다는 것이다.
2. Spring Framework의 특징 - PSA
Portable Service Abstraction의 약자이며 추상화라는 뜻을 가지고 있다.
우선 추상화라는 것은. 해당 클래스의 걷어낼 건 걷어낸 후 본질만 남겨 일반화 시키는 작업이다.
말로 설명하기에는 복잡할 수 있으니 예시로 소스코드를 가져왔다.
우리는 미취학 아동을 관리하는 어플리케이션을 설계하면서 아이클래스를 추상화한다고 가정하자.
아이를 관리하는 관점에서 아이의 일반적인 속성으로는 이름, 키, 혈액형 등이 있다.
그다음 일반적으로 아이가 할 수 있는 동작은 웃다,울다,자다 등이 있다고 하자.
각 아이의 특징을 추상 클래스로 작성하면 아래와 같이 된다.
public abstract class Child {
protected String childType;
protected double height;
protected double weight;
protected String bloodType;
protected int age;
protected abstract void smile();
protected abstract void cry();
protected abstract void sleep();
protected abstract void eat();
}
추상화를 통해 우리는 해당 아이의 나이[시기]에 따라 하는 행동을 Override를 통해 구현할 수 있다.
// NewBornBaby.java(신생아)
public class NewBornBaby extends Child {
@Override
protected void smile() {
System.out.println("신생아는 가끔 웃어요");
}
@Override
protected void cry() {
System.out.println("신생아는 자주 울어요");
}
@Override
protected void sleep() {
System.out.println("신생아는 거의 하루 종일 자요");
}
@Override
protected void eat() {
System.out.println("신생아는 분유만 먹어요");
}
}
// Infant.java(2개월 ~ 1살)
public class Infant extends Child {
@Override
protected void smile() {
System.out.println("영아는 많이 웃어요");
}
@Override
protected void cry() {
System.out.println("영아는 종종 울어요");
}
@Override
protected void sleep() {
System.out.println("영아부터는 밤에 잠을 자기 시작해요");
}
@Override
protected void eat() {
System.out.println("영아부터는 이유식을 시작해요");
}
}
// Toddler.java(1살 ~ 4살)
public class Toddler extends Child {
@Override
protected void smile() {
System.out.println("유아는 웃길 때 웃어요");
}
@Override
protected void cry() {
System.out.println("유아는 화가나면 울어요");
}
@Override
protected void sleep() {
System.out.println("유아는 낮잠을 건너뛰고 밤잠만 자요");
}
@Override
protected void eat() {
System.out.println("유아는 딱딱한 걸 먹기 시작해요");
}
}
우리는 위 구현 방식을 통해 클라이언트는 NewBornBady, Infant, Toddler를 사용할 때 구체화 클래스의 객체를 자신의 타입에 할당하지 않고 Child 클래스 변수에 할당을 해서 접근한다는 것을 알 수 있다.
이렇게 된다면은, 클라이언트 입자엥서는 Child라는 추상 클래스만 일관되게 바라보며 하위 클래스의 기능을 사용하는 것이다. 이것이 일관된 서비스 추상화 PSA의 기본 개념이다.
그렇다면은 PSA는 왜 필요한 것일까?
PSA가 필요한 주된 이유는 어떤 서비스를 이용하기 위한 접근 방식을 일관된 방식으로 유지함으로써
애플리케이션에서 사용하는 기술이 변경되더라도 최소한의 변경만으로 변경된 요구 사항을 반영하기 위함이다.
Spring은 상황에 따라 기술이 바뀌더라도 변경된 기술에 일관된 방식으로 접근할 수 있는 PSA를 적극적으로 지원하고 있습니다.
Spring에서 PSA가 적용된 분야로는 트랜잭션 서비스, 메일 서비스, Spring Data 서비스 등이 있습니다.
이번 시간을 통해 PSA의 기본 개념을 이해함으로써 Spring이 지원하는 기술을 적절하게 사용할 수 있고, 필요하다면 미래에 PSA를 통한 서비스를 직접 개발할 수 있는 원동력이 될 것이다.
'Spring 지식 및 공부' 카테고리의 다른 글
[Spring] 자주 사용하는 어노테이션(Annotation) 정리 (0) | 2024.07.06 |
---|---|
[Spring] 아키텍처 ( Architecture ) (0) | 2024.07.04 |
[Spring] IoC/DI (1) | 2024.06.30 |
[Spring] POJO (Plain Old Java Object) (0) | 2024.06.29 |
[Spring] Lombok 사용 방법 및 적용 방법 (0) | 2024.06.19 |