🍀
스프링, POJO 프레임워크가 무슨 뜻일까
November 15, 2021
💡 Intro
- POJO에 대해서 ‘그냥 자바 객체요!’라고 말하는 것 이상으로 이해해보자.
- POJO기반 프레임워크란 무엇인지 이해해보고 스프링에서 POJO는 어떠한 형태를 띄는지 알아보자
- 스프링이 개발의 복잡도를 낮춰주고 효과적으로 프로그래밍을 할 수 있도록 구체적으로 어떻게 가능하게 하는지 공부해보자.
🌩 POJO 란?
-
유명한 스프링의 삼각형으로 기본 컨텍스트를 맞추고 설명을 시작해보자.
- 스프링은 POJO에 주요기술인 IoC/DI, AOP, PSA를 사용한 코드와 POJO가 어떻게 관계를 맺고 동작하는지 정의한 설계정보로 구분된다.
-
스프링에서 DI는 유연하게 확장 가능한 오브젝트를 만들고, 그 관계를 외부에서 dynamic하게 설정해주는 것이며 스프링에서는 이 아이디어를 전반에 걸쳐서 적용한다.
-
POJO는 EJB처럼 복잡하고 제한이 많은 기술로 엔터프라이즈 애플리케이션의 비지니스 로직을 구현하는 것보다 순수 자바 객체를 사용하여 비지니스 로직을 구현하는 것이 더 좋다고 생각하여 나온 개념이다.
POJO의 조건
- 특정 규약에 종속되지 않는다.
- 자바 언어와 필요 API를 제외하고 다른 것에 종속되지 말아야 한다.
- 특정 규약에 따른 비지니스 컴포넌트를 만들어야하면 POJO가 아니다.
- 또한 특정 클래스를 상속해서 만들어야하면 POJO가 아니다 → 단일 상속 제한 때문에 객체지향적인 설계 기법을 적용하기 어렵다.
- 자바 언어와 필요 API를 제외하고 다른 것에 종속되지 말아야 한다.
- 특정 환경에 종속되지 않는다.
- 특정 무언가가 없는 환경에서 그대로 사용하기가 어렵다면 POJO가 아니다.
- 그렇다면 JPA를 사용하는 Service 클래스는 POJO라고 할 수 있을까? 🤔
- Service 클래스에서 의존하고 있는 JPA 레파지토리는 구현체인 하이버네이트에 의존하기 보다는 표준 스펙을 정의한 인터페이스이다. 따라서 POJO 프레임워크를 제공하는 것이라고 할 수 있다.
- 그런 도메인의 인터페이스에 의존하는 서비스는 POJO라고 할 수 있을 것 같다.
- 개인적인 의견이므로 틀리면 댓글로 얼마든지 알려주세요 🙌
- 특정 벤더의 서버나 프레임워크 안에서만 동작 가능한 코드는 POJO가 아니다.
- 웹이라는 환경정보나 웹 기술을 담고 있는 클래스나 인터페이스를 사용하는 것은 POJO가 아니다.
- 예를 들어 비즈니스 코드에 HttpServletRequest나 HttpSession 등의 API가 등장하거나 클래스에서 그것을 직접 이용한다면 POJO가 아니다.
- 웹 이외의 클라이언트는 해당 객체를 사용하지 못하며 독립적으로 테스트하기 어려워진다.
- 어노테이션을 쓰면 POJO가 아니다 라고 말할수는 없다. 해당 어노테이션이 환경에 종속되지 않고 부가적인 정보를 담고 있다면 POJO라고 할 수 있다.
- 만일 해당 어노테이션이 element에 특정 기술에 환경에 종속적인 정보를 담고 있다면 POJO라고 할 수 없다.
- 개인적인 의견) 따라서 JPA의
@Entity
가 붙은 클래스는 POJO라고 할 수 없을 것 같다. @Id가 반드시 있어야하는 등의 제약사항이 있기 때문이다.
- 개인적인 의견) 따라서 JPA의
- 만일 해당 어노테이션이 element에 특정 기술에 환경에 종속적인 정보를 담고 있다면 POJO라고 할 수 없다.
- 그렇다고 위 2조건을 만족하는 나머지가 모두 POJO인 것은 아니다!
- 객체지향적인 자바의 언어를 잘 활용한 것이 POJO이다.
- 재사용이 가능하고 상속과 다형성을 적용하여 객체지향적으로 설계된 오브젝트를 말한다.
POJO의 장점
- 기술과 환경에 종속되지 않으면 깔끔한 코드를 짤 수 있으며 순수 비즈니스 로직을 담을 수 있다.
- 테스트 작성이나 검증이 쉽다.
- 기술이나 환경의 변화에 취약하지 않다.
- 재사용이 가능하고, 변경에 자유로우며, 확장이 용이한 객체지향적 설계가 가능하다.
🌩 POJO 프레임워크
- “스프링의 정수는 엔터프라이즈 서비스 기능을 POJO에 제공하는 것” 이라고 한다.
- 즉, 트랜잭션과 같이 엔터프라이즈 시스템에서 필요한 기술을 순수 자바 객체에서 가능하게 한다는 것이다.
- 다시 말하면 엔터프라이즈 서비스 기술과 자바 객체(POJO)를 효과적으로 분리했다는 의미이며 스프링의 가장 큰 장점이다.
- POJO 프로그래밍이 가능하도록 기술적인 기반을 제공하는 것이 POJO 프레임워크이다. 하이버네이트와 스프링이 대표적인 POJO 프레임워크이다.
- 스프링은 POJO 기반으로 구현하고 엔터프라이즈 환경의 서비스와 기술을 POJO 방식으로 구현된 코드에 적용할 수 있다.
- 비즈니스 로직과 엔터프라이즈 기술을 분리하여 구성한다.
- 스프링은 기술영역에만 관여하고 비즈니스 로직을 다루는 POJO에서 모습을 드러내지 않는다.
- 데이터 액세스 로직이나 웹 UI 로직에서 최소한의 방법으로 관여한다.
🛋 느낀 점
- 개발자가 POJO 프레임워크를 사용한다고 해서 자동으로 객체지향적인 코드를 짜는 것은 아니다.
- 객체지향적 코드가 가능한 기반에서 어떻게 효과적으로 객체지향적 설계를 잘 할지는 개발자의 남은 몫이다.
- JVM, JDK API, 디자인패턴에 대해서 잘 공부하고 적용할 수 있도록 공부해야겠다.