[JAVA] POJO(Plain Old Java Object)란?
POJO는 말 그대로 오래된 방식의 간단한 자바 오브젝트라는 말로써 Java EE 등의 중량 프레임워크를 사용하게 되면서 해당 프레임워크에 종속된 "무거운" 객체를 만들게 된 것에 반발해서 사용된 용어이다.
-위키백과-
POJO는 정말 말 그대로 오래된 방식의 간단한 자바 객체를 뜻한다. 쉽게 말해 특정 자바 모델이나 기능, 프레임워크 등을 따르지 않는 순수한 자바 객체 그 자체를 뜻한다.
반면, 특정 기술과 환경에 종속되어 사용되는 기술을 EJB(Enterprise Java Beans)라고 한다. 이 EJB는 자바 개발을 할 때 로우 개발에 신경 쓰지 않고 개발을 쉽게 하도록 도와주지만, 특정 기술에 의존하여 확장서가 떨어지고 객체지향성을 잃어버리게 됐다.
따라서 옛날에 객체지향성이 큰 순수한 방식으로 돌아가자는 의미로 POJO가 탄생하게 되었다.
대표적으로 스프링 프레임워크는 POJO 방식의 프레임워크이다.
POJO라는 용어의 탄생
이 POJO라는 용어가 탄생하게 된 배경이 참 재밌다.
마틴 파울러와, 조지 매켄지, 레베카 파슨스는 2000년 9월 한 회의에서 강연을 준비했다. 해당 강연에서 셋은 비즈니스 로직을 Entity Beans를 사용하는 것보다 일반 Java 객체로 인코딩하는 것의 이점을 설명했다.
그러나 사람들은 자신들의 시스템에 아주 일반적인 Java 객체를 사용하는 것에 매우 반대했다. 세 명은 이러한 원인을 "일반적인 Java 객체"에 화려한 이름이 없기 때문이라고 결론 내렸다.
따라서 세 명은 이러한 "일반적인 Java 객체"에 "Plain Old Java Object"라는 화려하고 그럴듯한 이름을 붙여주었고, 이는 사람들에게 매우 잘 받아들여지게 되었다.
"... 우리는 사람들이 자기네 시스템에 보통의 객체를 사용하는 것을 왜 그렇게 반대하는지 궁금하였는데, 간단한 객체는 폼 나는 명칭이 없기 때문에 그랬던 것이라고 결론지었다. 그래서 적당한 이름을 하나 만들어 붙였더니, 아 글쎄, 다들 좋아하더라고 - 마틴 파울러 "
POJO의 조건
1. 특정 규약에 종속되면 안 된다.
JAVA언어와 꼭 필요한 API 외 다른 것에 종속되면 안 된다.
2. 특정 환경에 종속되면 안 된다.
POJO는 환경에 종속되지 않고 독립적이어야 한다. 예를 들어 웹 기술의 클래스나 인터페이스를 상속받거나 구현하면 해당 객체는 웹 환경에서만 사용가능할 것이다. 이처럼 특정 환경에 종속되어서는 안 된다.
3. 객체 지향적 원리를 지켜야 한다.
POJO는 자바의 기본인 객체지향적 원리를 지켜야 한다. 하나의 클래스는 하나의 책임과 역할을 갖도록 하는 등 객체지향 설계를 적용해야 진정한 POJO라고 볼 수 있다.
참고)
POJO 예시
public class GoodPojo{
private Long id;
private String name;
public Long getId(){
return id;
}
public String getName(){
return name;
}
public void setId(int id){
this.id = id;
}
public void setName(String name){
this.name = name;
}
}
위 클래스는 Getter와 Setter로 구성된 가장 순수한 형태의 POJO이다.
public class NotPojo extends HttpServlet{
@Override
public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{
...
}
}
반면 위와 같이 HttpServlet을 상속받는 클래스는 어떨까? 이러한 방식은 웹 방식에서만 사용가능하기 때문에 엄밀하게 POJO라고 할 수 없다.
하지만, 위에서 스프링 프레임워크는 POJO 방식의 프레임워크라고 했다. 이건 어떻게 된 걸까?
POJO 프레임워크
POJO 프레임워크는 POJO의 장점과 EJB의 장점을 합쳤다고 볼 수 있다. 객체지향성을 살리면서도 EJB의 엔터프라이즈 기술을 그대로 사용할 수 있는 것이다.
예를 들어 스프링 프레임워크는 하이버네이트를 이용해 ORM 기술을 사용하게 만들어준다. 이것은 스프링에서 JPA라는 표준 인터페이스를 정했기 때문에 가능해진다.
여러 ORM 프레임워크들이 JPA라는 표준 인터페이스 아래에서 구현되어 실행되기 때문에, 하나의 프레임워크에 종속되지 않고 여러 환경에서 사용가능해진다. 이는 POJO의 원칙에 해당되는 부분이다.
이러한 방식을 스프링의 PSA(Portable Service Abstraction)이라고 한다.
쉽게 말해 PSA는 환경의 변화와 관계없이 일관된 방식의 기술로의 접근 환경을 제공하는 추상화 구조를 뜻한다.
이는 POJO 원칙을 따르는 스프링의 기능으로 스프링에서 동작가능한 라이브러리들은 POJO 원칙을 지키게끔 추상화되어 있음을 의미한다.
참고
1. https://ko.wikipedia.org/wiki/Plain_Old_Java_Object
2. https://www.martinfowler.com/bliki/POJO.html
3. https://doing7.tistory.com/81
4. https://dev-coco.tistory.com/82