특정 기술에 종속되지 않은 순수한 자바 객체. 직역하면 “오래된 방식의 간단한 자바 객체”인데 이름이 냉소적인 데는 이유가 있다. 특정 프레임워크를 상속받고 그 규약을 따라야만 동작하던 시절에 대한 반발로 나온 말이다.

지켜서 얻는 것

지키면 얻는 것이 셋이다. 프레임워크를 띄우지 않고 new로 만들어 검증할 수 있고, 아래 기술을 갈아타도 도메인 객체는 그대로 남으며, 비즈니스 규칙이 프레임워크 규약에 섞이지 않는다.

기술 종속과 객체지향 원리

이름만 보면 프레임워크를 안 쓰면 POJO인 것 같지만 조건이 둘이다. 하나는 환경과 기술에 종속되지 않는 것으로, 특정 프레임워크를 상속하거나 그 애노테이션 없이는 못 도는 객체가 아니어야 한다. 다른 하나는 객체지향 원리에 충실한 것이고, 그래야 필요할 때 재사용할 수 있다.

두 번째가 빠지면 POJO가 아니다. 아무 기술에도 묶이지 않았지만 좋은 객체가 아닌 객체는 그냥 자바 클래스일 뿐 재사용할 수 없다.

표준 인터페이스라는 해법

여기서 모순이 생긴다. ORM을 쓰려면 Hibernate가 필요한데, 객체가 Hibernate를 직접 의존하는 순간 POJO가 아니다. 해법이 표준 인터페이스다. JPA라는 표준을 정의하고 Hibernate 같은 프레임워크가 그 구현체가 되게 하면 객체는 JPA만 보면 된다. 이 방식이 PSA다.

상속 자리를 차지하는 규약

문제가 되는 것은 상속 자체가 아니라 프레임워크가 특정 클래스 상속을 강제하는 것이다. 자바는 다중 상속이 안 되므로, 규약이 상속 자리를 하나 차지해 버리면 설계에서 쓸 수 있는 카드가 사라진다. EJB가 그랬다. 클래스를 상속하거나 인터페이스를 구현한다고 해서 POJO가 아닌 것은 아니다.

관련

출처