본문 바로가기
Today I Learned/Spring

[Spring] Spring Framework 특징(POJO, IoC/DI, AOP, PSA)

by 프로그래 밍구 2022. 9. 21.

Spring 삼각형

[그림] Spring 삼각형

 위 그림은 Spring 핵심개념들을 표현하는 Spring 삼각형이다. POJO라는 것을 IoC/DIAOPPSA를 통해서 달성할 수 있다는 것을 의미한다.

POJO (Plain Old Java Object)

 Plain은 플레인 요거트를 떠올리면 이해하기 쉽다. 플레인 요거트는 과일이나 시리얼이 들어가지 않은 순수한 요거트를 의미한다. 즉 POJO란 Java로 생성하는 순수한 객체를 말한다. POJO를 이용해서 프로그래밍 코드를 작성하는 것을 POJO 프로그래밍이라고 하는데 이 POJO 프로그래밍에도 규칙이 있다. Java나 Java의 스펙에 정의된 것 이외에는 다른 기술이나 규약에 얽매이지 않아야 하며 특정 환경에 종속적이지 않아야 한다.

POJO 프로그래밍이 필요한 이유

1. 특정 환경이나 기술에 종속적이지 않으면서 재사용이 가능하다. 확장 가능한 유연한 코드를 작성할 수 있다.

2. 저수준 레벨의 기술과 환경에 종속적인 코드를 애플리케이션 코드에서 제거함으로써 코드가 깔끔해진다.

3. 코드가 깔끔해지기 때문에 상대적으로 디버깅하기 쉽다.

4. 객체지향적인 설계를 제한없이 적용할 수 있다.

 

Spring Framework는 POJO 프로그래밍을 지향하기 위해 IoC/DI, AOP, PSA라는 기술을 제공한다.

IoC (Inversion of Control)

 일반적인 애플리케이션의 흐름은 (주도권을 가진)개발자가 작성한 코드를 순차적으로 실행하는 것이다. IoC란 애플리케이션의 주도권이 개발자에서 프레임워크(Spring)로 넘어간 것을 말한다. 개발자가 아닌 컨테이너가 애플리케이션의 흐름을 제어하는 것이다.

 Java 콘솔 애플리케이션의 경우 main() 메서드가 종료되면 애플리케이션의 실행도 종료된다. 하지만 웹에서 동작하는 애플리케이션의 경우 외부에서 접속해서 사용하는 서비스이기 때문에 main() 메서드가 종료되지 않아야 할 것이다.

 서블릿 기반 웹 애플리케이션을 예시로 들겠다. 서블릿 컨테이너는 클라이언트 요청이 들어올 때마다 서블릿 컨테이너 내부 로직(메서드)이 서블릿을 직접 실행시킨다. 즉 main() 메서드를 필요로 하지 않는다. 애플리케이션의 주도권은 개발자가 아닌 서블릿 컨테이너가 가지고 있으며 이 경우는 IoC의 개념이 적용되어 있는 것이다.

DI (Dependency Injection)

 클래스 내부에서 다른 클래스의 객체를 생성하게 되면 두 클래스 간에 의존 관계가 성립하게 된다. 클래스 내부에서 new를 사용해 참조할 클래스의 객체를 직접 생성하지 않고, 생성자 등을 통해 외부에서 다른 클래스의 객체를 전달 받고 있다면 의존성 주입이 이루어지고 있는 것이다. new 키워드를 사용하여 객체를 생성할 때, 클래스 간에 강하게 결합되어 있다고 한다.

 반면 어떤 클래스가 인터페이스와 같은 일반화된 구성 요소에 의존하고 있을 때는 클래스들 간에 느슨하게 결합되어 있다고 한다. 객체들 간의 느슨한 결합은 요구사항의 변경에 유연하게 대처할 수 있도록 해준다. 의존성 주입(DI)은 클래스들 간의 강한 결합을 느슨한 결합으로 만들어준다. Spring에서는 Spring이 의존성 주입(DI)을 대신 해준다.

AOP (Aspect Oriented Programming)

 AOP를 한글로 번역하면 관심지향프로그래밍 정도이다. 핵심적인 관점과 부가적인 관점으로 나누어서 그 관점을 기준으로 각각 모듈화를 한다는 의미이다. 상세하게는 애플리케이션 전반에 걸쳐서 사용되는 로깅이나 보안, 트랜잭션과 같은 공통 기능들을 비즈니스 로직으로부터 분리하는 것이다. AOP를 애플리케이션에 적용하면 코드의 간결성을 유지할 수 있으며, 객체 지향 설계 원칙에 맞는 코드를 구현할 수 있다. 또한 코드의 재사용도 용이하다.

PSA (Portable Service Abstraction)

 객체지향 프로그래밍 세계에서 어떤 클래스의 본질적인 특성만을 추출해서 일반화하는 것을 추상화(Abstraction)라고 한다. 클라이언트가 추상화 된 상위 클래스를 일관되게 바라보며 하위 클래스의 기능을 사용하는 것이 바로 일관된 서비스 추상화(PSA)의 개념이다. 예시로 잘 만들어진 인터페이스를 생각할 수 있다. 애플리케이션에서 특정 서비스를 이용할 때, 서비스의 기능을 접근하는 방식 자체를 일관되게 유지하면서 기술 자체를 유연하게 사용할 수 있도록 하는 것을 PSA(일관된 서비스 추상화)라고 한다.

 PSA가 필요한 주된 이유는 어떤 서비스를 이용하기 위한 접근 방식을 일관된 방식으로 유지함으로써 애플리케이션에서 사용하는 기술이 변경되더라도 최소한의 변경만으로 변경된 요구 사항을 반영하기 위함이다. 

'Today I Learned > Spring' 카테고리의 다른 글

[Spring] API 문서화  (2) 2022.09.26
[Spring] JPA 엔티티 간 연관 관계 매핑  (0) 2022.09.25
[Spring] DTO(Data Transfer Object)  (0) 2022.09.24
[Spring] Controller  (0) 2022.09.23
[Spring] Spring MVC 아키텍처  (2) 2022.09.22

댓글