스프링에는 핵심적인 요소 3가지가 있다.
그전에 POJO란 무엇일까?
POJO는 Plain Old Java Object 라는 단어의 첫글자를 따서 만든 약자dlek.
POJO가 평범한 Java 객체를 의미하는게 맞지만 프로그래밍 관점에서 조금 더 깊은 의미가 있다.
POJO 프로그래밍이란?
POJO 프로그래밍이란 POJO를 이용해서 프로그래밍 코드를 작성하는 것을 의미합니다. 그런데 단순히 순수 자바 객체만을 사용해서 프로그래밍 코드를 작성한다라고 해서 POJO 프로그래밍이라고 볼 수는 없습니다.
POJO 프로그래밍으로 작성한 코드라고 불리우기 위해서는 크게 두 가지 정도의 기본적인 규칙은 지켜주어야 합니다.
- Java나 Java의 스펙(사양)에 정의된 것 이외에는 다른 기술이나 규약에 얽매이지 않아야 한다.
- 특정 환경에 종속적이지 않아야 한다.
서블릿(Servlet) 기반의 웹 애플리케이션을 실행 시키는 서블릿 컨테이너(Servlet Container)인 아파치 톰캣(Apache Tomcat)을 예로 들어보겠습니다.
POJO 프로그래밍이 필요한 이유
POJO 프로그래밍이 필요한 이유는 앞에서 설명한 예시에 잘 나와 있습니다.
- 특정 환경이나 기술에 종속적이지 않으면 재사용 가능하고, 확장 가능한 유연한 코드를 작성할 수 있다.
- 저수준 레벨의 기술과 환경에 종속적인 코드를 애플리케이션 코드에서 제거 함으로써 코드가 깔끔해진다.
- 코드가 깔끔해지기 때문에 디버깅하기도 상대적으로 쉽다.
- 특정 기술이나 환경에 종속적이지 않기 때문에 테스트 역시 단순해진다.
- 객체지향적인 설계를 제한없이 적용할 수 있다.(가장 중요한 이유)
Spring은 POJO 프로그래밍을 지향하는 Framework입니다.
그리고 최대한 다른 환경이나 기술에 종속적이지 않도록 하기 위한 POJO 프로그래밍 코드를 작성하기 위해서 Spring에서는 세가지 기술을 지원하고 있습니다.
IoC(Inversion of Control)
Library는 애플리케이션 흐름의 주도권이 개발자에게 있고, Framework은 애플리케이션 흐름의 주도권이 Framework에 있다고 했습니다.
여기서 말하는 애플리케이션 흐름의 주도권이 뒤바뀐 것을 바로 **IoC(Inversion of Control)**라고 합니다.
AOP(Aspect Oriented Programming)란?
AOP란 무엇일까요? AOP를 한글로 번역하면 관심 지향 프로그래밍 정도로 해석할 수 있습니다.
AOP에서의 Aspect는 부모들이 가지고 있는 아기의 건강 같은 공통 관심사와 마찬가지로 애플리케이션에 필요한 기능 중에서 공통적으로 적용되는 공통 기능에 대한 관심과 관련이 있습니다.
공통 관심 사항과 핵심 관심 사항
애플리케이션을 개발하다보면 애플리케이션 전반에 걸쳐 공통적으로 사용되는 기능들이 있기 마련인데, 이러한 공통 기능들에 대한 관심사를 바로 **공통 관심 사항(Cross-cutting concern)**이라고 합니다.
그리고 우리가 흔히들 말하는 비즈니스 로직 즉, 애플리케이션의 주목적을 달성하기 위한 핵심 로직에 대한 관심사를 **핵심 관심 사항(Core concern)**이라고 합니다.
핵심 관심 사항에 반대되는 개념으로 공통 관심 사항을 부가적인 관심 사항이라고 표현하기도 합니다.
결국 AOP라는 것은 애플리케이션의 핵심 업무 로직에서 로깅이나 보안, 트랜잭션 같은 공통 기능 로직들을 분리하는 것 이라고 생각하면 이해가 빠를것 같습니다.
PSA(Portable Service Abstraction)란?
객체지향 프로그래밍 세계에서는 어떤 클래스의 본질적인 특성만을 추출해서 일반화 하는것을 바로 **추상화(Abstraction)**라고 합니다.
어떤 용어든 간에 추상화의 의미를 이해하는데 더 적합한 언어를 사용하면 되겠지만 추상화보다는 일반화라는 표현이 설계 관점에서 더 적절한 표현인 것 같습니다.
추상화의 예
예를 들어, 미취학 아동을 관리하는 애플리케이션을 설계하면서 아이 클래스를 일반화(추상화) 한다라고 가정해봅시다.
먼저 미취학 아동을 관리하기 위해 필요한 아이의 일반적인 특징에는 뭐가 있는지 한번 살펴보겠습니다.
Java의 클래스는 속성을 나타내는 멤버 변수와 동작을 나타내는 메서드로 구성되므로, 아기의 속성과 동작을 일반화해서 멤버 변수와 메서드로 표현해 보도록 하겠습니다.
먼저 아이를 관리하는 관점에서 아이의 일반적인 속성으로는 이름, 키, 몸무게, 혈액형, 나이 등이 있을 것 같습니다.
그리고 일반적으로 아이가 할 수 있는 동작으로는 웃다, 울다, 자다, 먹다 등이 있을테구요.
추상화를 하는 이유
추상 클래스만 일관되게 바라보며 하위 클래스의 기능을 사용할 수 있습니다.
이처럼 클라이언트가 추상화 된 상위 클래스를 일관되게 바라보며 하위 클래스의 기능을 사용하는 것이 바로 일관된 서비스 추상화(PSA)의 기본 개념입니다.
즉, 일관된 방식으로 해당 서비스의 기능을 사용할 수 있다 는 의미입니다.
이처럼 애플리케이션에서 특정 서비스를 이용할 때, 서비스의 기능을 접근하는 방식 자체를 일관되게 유지하면서 기술 자체를 유연하게 사용할 수 있도록 하는 것을 PSA(일관된 서비스 추상화) 라고 합니다.
PSA가 필요한 주된 이유는 어떤 서비스를 이용하기 위한 접근 방식을 일관된 방식으로 유지함으로써 애플리케이션에서 사용하는 기술이 변경되더라도 최소한의 변경만으로 변경된 요구 사항을 반영하기 위함입니다.
즉, PSA를 통해서 애플리케이션의 요구 사항 변경에 유연하게 대처할 수 있습니다.
Spring은 상황에 따라 기술이 바뀌더라도 변경된 기술에 일관된 방식으로 접근할 수 있는 PSA를 적극적으로 지원하고 있습니다.
Spring에서 PSA가 적용된 분야로는 트랜잭션 서비스, 메일 서비스, Spring Data 서비스 등이 있습니다.
여러분들이 당장에 직접적으로 PSA를 이용해 어떤 서비스를 구현할일은 없을거라 생각합니다. 하지만 PSA의 기본 개념을 이해함으로써 Spring이 지원하는 기술을 적절하게 사용할 수 있고, 필요하다면 미래에 PSA를 통한 서비스를 직접 개발할 수 있는 원동력이 될 것이라고 생각합니다.
'Programming' 카테고리의 다른 글
| [Spring] 스프링이란? (0) | 2023.02.15 |
|---|