221201 POJO 프로그래밍

Jongleee·2022년 12월 1일
0

TIL

목록 보기
118/576

POJO 프로그래밍

스프링 애플리케이션은 POJO를 이용해서 만든 애플리케이션 코드와 POJO가 어떻게 관계를 맺고 동작하는 지를 정의해놓은 설계 정보로 구분된다.
DI의 기본 아이디어는 유연하게 확장 가능한 오브젝트를 만들어두고 그 관계는 외부에서 다이나믹하게 설정해준다는 것이다. 이런 DI 개념을 애플리케이션 전반에 걸쳐 적용하는 것이 스프링의 프로그래밍 모델이다.
기술과 비즈니스 로직을 분리하고 POJO 방식의 어플리케이션 개발을 가능하게 한다는 스프링의 목적을 쉽게 이루기 위해서는 스프링과 같은 POJO 프레임워크가 필요하다.

POJO 프로그래밍을 손쉽게 할 수 있도록 지원하는 세가지 가능기술 (Enable Technology)

  1. IoC(Inversion of Control) / DI(Dependency Injection)

    IoC/DI는 스프링의 가장 기본이 되는 기술이자 스프링의 핵심 개발 원칙이다. 나머지 두가지 기술인 AOP, PSA도 IoC/DI에 바탕을 두고 있다. 두 개의 오브젝트를 분리해서 만들고, 인터페이스를 두고 느슨하게 연결한 뒤 실제 사용할 대상은 DI를 통해 외부에서 지정한다.

    • IoC(Inversion of Control) : 프로그램의 제어권이 애플리케이션에서 외부로 역전된 것

    • DI(Dependency Injection) : 객체 간의 의존관계를 외부에서 주입해주는 것

  2. AOP(Aspect Oriented Programming)
    핵심 관리사를 분리하여 프로그래밍 모듈화를 향상시키는 프로그래밍 스타일로 공통 관심 사항을 구현한 코드를 핵심 로직을 구현한 코드 안에 삽입하는 것이다.

  3. PSA (Portable Service Abstraction)
    인터페이스가 다른 다양한 구현을 같은 방식으로 사용하도록 중간에 인터페이스 어댑터 역할을 해주는 레이어를 하나 추가하는 방법

    Spring에서 동작할 수 있는 라이브러리들은 POJO 원칙을 지키게끔 PSA 형태의 추상화가 되어있으므로 환경과 세부기술의 변화에 관계없이 일관된 방식으로 기술에 접근할 수 있게 해준다.

    따라서 외부 라이브러리들은 Spring에서 내부 구현이 달라지더라도 동일한 인터페이스로 동일한 구동이 가능하게끔 설계되어 있으며 의존성을 고려할 필요가 없다.

    스프링은 특정 기술에 직접적 영향을 받지 않게끔 객체를 POJO 기반으로 한번씩 더 추상화한 Layer를 갖고 있으며 이를 통해 일관성 있는 서비스 추상화를 만들어낸다.

POJO(Plain Old Java Object)

말 그대로 간단한 자바 오브젝트를 사용하는 것을 말한다.

세 가지 조건

  1. 특정규약(Contract)에 종속되지 않는다.
  2. 특정환경에 종속되지 않는다.
  3. 객체 지향 원리에 충실해야 한다.

장점

  1. 깔끔한 코드 & 자동화된 테스트 매우 유리
    -> 조건 1과 조건 2로 인한 장점

    POJO는 자바 언어와 꼭 필요한 API 외에는 종속되지 않아야 한다. 특정 규약을 따라 만들게 하는 경우는 대부분 규약에서 제시하는 특정 클래스를 상속하도록 요구한다. 그럴 경우 자바의 단일 상속 제한 때문에 더 이상 해당 클래스에 객체 지향적인 설계 시법을 적용하기가 어려워지는 문제가 생긴다. 또한 규약이 적용된 환경에 종속적이 되기 때문에 다른 환경으로 이전이 힘들어진다. 특정환경에 종속적이어야만 동작하는 오브젝트는 POJO라고 할 수 없다.

    특정기술과 환경에 종속되지 않을 때 코드가 훨씬 깔끔해진다. 환경의 제약은 코드의 자동화된 테스트를 어렵게 한다. 어떤 환경에도 종속되지 않은 POJO 코드는 매우 유연한 방식으로 원하는 레벨에서 코드를 빠르고 명확하게 테스트가 가능하다.

  1. 객체 지향적 설계 자유롭게 적용 가능
    -> 조건 3으로 인한 장점
    책임과 역할이 각기 다른 코드를 한 클래스에 몰아 넣어 덩치 큰 만능 클래스로 만드는 경우, 재사용이 불가능할 정도로 다른 레이어와 영역의 코드와 강한 결합을 가지고 만들어지는 경우, 상속과 다형성의 적용으로 처리하면 깔끔한 것을 if/swithch 문이 가득찬 길고 긴 메소드로 작성해놓은 경우라면 객체지향적인 자바 오브젝트라고 할 수 없다. 그런식으로 설계되고 개발된 오브젝트라면 단지 특정 기술과 환경에 종속적이지 않다고 해서 POJO라고 불릴 수 없다.
    이를 통해서 객체지향적 설계를 자유롭게 적용 가능하다. 개발자들이 자바와 객체 지향 프로그래밍, 모델링과 설계에 대해 배울 때 그려봤던 도메인 모델과 오랜 경험을 통해 쌓여온 재활용 가능한 설계 모델인 디자인 패턴 등은 POJO가 아니고는 적용하기 힘들다.

진정한 POJO란 객체 지향적인 원리에 충실하면서, 환경과 기술에 종속되지 않고 필요에 따라 재활용될 수 있는 방식으로 설계된 오브젝트를 말한다. 그런 POJO에 애플리케이션의 핵심 로직과 기능을 담아 설계하고 개발하는 방법을 POJO 프로그래밍이라 할 수 있다.

0개의 댓글