💡 Intro

  • POJO에 대해서 ‘그냥 자바 객체요!’라고 말하는 것 이상으로 이해해보자.
  • POJO기반 프레임워크란 무엇인지 이해해보고 스프링에서 POJO는 어떠한 형태를 띄는지 알아보자
  • 스프링이 개발의 복잡도를 낮춰주고 효과적으로 프로그래밍을 할 수 있도록 구체적으로 어떻게 가능하게 하는지 공부해보자.

🌩 POJO 란?

  • 유명한 스프링의 삼각형으로 기본 컨텍스트를 맞추고 설명을 시작해보자.

    • 스프링은 POJO에 주요기술인 IoC/DI, AOP, PSA를 사용한 코드와 POJO가 어떻게 관계를 맺고 동작하는지 정의한 설계정보로 구분된다.

  • 스프링에서 DI는 유연하게 확장 가능한 오브젝트를 만들고, 그 관계를 외부에서 dynamic하게 설정해주는 것이며 스프링에서는 이 아이디어를 전반에 걸쳐서 적용한다.

  • POJO는 EJB처럼 복잡하고 제한이 많은 기술로 엔터프라이즈 애플리케이션의 비지니스 로직을 구현하는 것보다 순수 자바 객체를 사용하여 비지니스 로직을 구현하는 것이 더 좋다고 생각하여 나온 개념이다.

POJO의 조건

  1. 특정 규약에 종속되지 않는다.
    • 자바 언어와 필요 API를 제외하고 다른 것에 종속되지 말아야 한다.
      • 특정 규약에 따른 비지니스 컴포넌트를 만들어야하면 POJO가 아니다.
      • 또한 특정 클래스를 상속해서 만들어야하면 POJO가 아니다 → 단일 상속 제한 때문에 객체지향적인 설계 기법을 적용하기 어렵다.
  2. 특정 환경에 종속되지 않는다.
    • 특정 무언가가 없는 환경에서 그대로 사용하기가 어렵다면 POJO가 아니다.
    • 그렇다면 JPA를 사용하는 Service 클래스는 POJO라고 할 수 있을까? 🤔
      • Service 클래스에서 의존하고 있는 JPA 레파지토리는 구현체인 하이버네이트에 의존하기 보다는 표준 스펙을 정의한 인터페이스이다. 따라서 POJO 프레임워크를 제공하는 것이라고 할 수 있다.
      • 그런 도메인의 인터페이스에 의존하는 서비스는 POJO라고 할 수 있을 것 같다.
      • 개인적인 의견이므로 틀리면 댓글로 얼마든지 알려주세요 🙌
    • 특정 벤더의 서버나 프레임워크 안에서만 동작 가능한 코드는 POJO가 아니다.
    • 웹이라는 환경정보나 웹 기술을 담고 있는 클래스나 인터페이스를 사용하는 것은 POJO가 아니다.
      • 예를 들어 비즈니스 코드에 HttpServletRequest나 HttpSession 등의 API가 등장하거나 클래스에서 그것을 직접 이용한다면 POJO가 아니다.
      • 웹 이외의 클라이언트는 해당 객체를 사용하지 못하며 독립적으로 테스트하기 어려워진다.
    • 어노테이션을 쓰면 POJO가 아니다 라고 말할수는 없다. 해당 어노테이션이 환경에 종속되지 않고 부가적인 정보를 담고 있다면 POJO라고 할 수 있다.
      • 만일 해당 어노테이션이 element에 특정 기술에 환경에 종속적인 정보를 담고 있다면 POJO라고 할 수 없다.
        • 개인적인 의견) 따라서 JPA의 @Entity가 붙은 클래스는 POJO라고 할 수 없을 것 같다. @Id가 반드시 있어야하는 등의 제약사항이 있기 때문이다.
  3. 그렇다고 위 2조건을 만족하는 나머지가 모두 POJO인 것은 아니다!
    • 객체지향적인 자바의 언어를 잘 활용한 것이 POJO이다.
    • 재사용이 가능하고 상속과 다형성을 적용하여 객체지향적으로 설계된 오브젝트를 말한다.

POJO의 장점

  • 기술과 환경에 종속되지 않으면 깔끔한 코드를 짤 수 있으며 순수 비즈니스 로직을 담을 수 있다.
  • 테스트 작성이나 검증이 쉽다.
  • 기술이나 환경의 변화에 취약하지 않다.
  • 재사용이 가능하고, 변경에 자유로우며, 확장이 용이한 객체지향적 설계가 가능하다.

🌩 POJO 프레임워크

  • “스프링의 정수는 엔터프라이즈 서비스 기능을 POJO에 제공하는 것” 이라고 한다.
  • 즉, 트랜잭션과 같이 엔터프라이즈 시스템에서 필요한 기술을 순수 자바 객체에서 가능하게 한다는 것이다.
  • 다시 말하면 엔터프라이즈 서비스 기술과 자바 객체(POJO)를 효과적으로 분리했다는 의미이며 스프링의 가장 큰 장점이다.
  • POJO 프로그래밍이 가능하도록 기술적인 기반을 제공하는 것이 POJO 프레임워크이다. 하이버네이트와 스프링이 대표적인 POJO 프레임워크이다.
  • 스프링은 POJO 기반으로 구현하고 엔터프라이즈 환경의 서비스와 기술을 POJO 방식으로 구현된 코드에 적용할 수 있다.
    • 비즈니스 로직과 엔터프라이즈 기술을 분리하여 구성한다.
    • 스프링은 기술영역에만 관여하고 비즈니스 로직을 다루는 POJO에서 모습을 드러내지 않는다.
    • 데이터 액세스 로직이나 웹 UI 로직에서 최소한의 방법으로 관여한다.

🛋 느낀 점

  • 개발자가 POJO 프레임워크를 사용한다고 해서 자동으로 객체지향적인 코드를 짜는 것은 아니다.
  • 객체지향적 코드가 가능한 기반에서 어떻게 효과적으로 객체지향적 설계를 잘 할지는 개발자의 남은 몫이다.
    • JVM, JDK API, 디자인패턴에 대해서 잘 공부하고 적용할 수 있도록 공부해야겠다.