Spring이나 JAVA를 공부하다 보면 POJO(Plain Old Java Object) 라는 단어를 자주 보게 될텐데 뭔가 대단한 의미가 있어보이는 이 단어는 사실 그렇게 대단한 의미가 있는 단어는 아니다.
POJO는 말 그대로 순수한 자바 오브젝트를 뜻한다.
POJO라는 개념은 예전에 JavaEE등의 중량 프레임워크(특히 EJB) 을 사용하면서 단순한 자바 오브젝트를 사용해서 개발하는 것이 아닌 프레임워크에 종속적인 부분으로 개발을 진행했다.
그로 인하여 모듈의 교체, 시스템 업그레이드 시 종속성으로 인한 불편함이 발생을 했고
해당 프레임워크에 종속된 무거운 객체를 만들게 되는 것에 반발하여
2000년 9월 마틴 파울러, 레베카 파슨, 조쉬 맥킨지 등이 사용하기 시작한 용어이다.
마틴 파울러는 이 용어에 대한 기원을 다음과 같이 밝혔다.
우리는 사람들이 자기네 시스템에 보통의 객체를 사용하는 것을 왜 그렇게 반대하는지 궁금하였는데, 간단한 객체는 폼 나는 명칭이 없기 때문에 그랬던 것이라고 결론지었다. 그래서 적당한 이름을 하나 만들어 붙였더니, 아 글쎄, 다들 좋아하더라고.
뭔가 특별한 의미가 있을줄 알았지만 그런건 없다.
그러면 이제 어떤것이 POJO인지 알아보자.
public class POJOMember {
private String id;
private String password;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
위의 예제처럼 다른 클래스나 인터페이스를 extends 및 implements 받아 메서드를 구현해야 하는 클래스가 아닌, getter/setter 와 같이 기본적인 기능만 가진 자바 객체를 뜻한다.
public class MainKey extends KeyAdapter {
@Override
public void keyTyped(KeyEvent e) {
super.keyTyped(e);
}
@Override
public void keyPressed(KeyEvent e) {
super.keyPressed(e);
}
@Override
public void keyReleased(KeyEvent e) {
super.keyReleased(e);
}
}
Key의 기능을 사용하기 위해 KeyAdapter 클래스를 상속받은 모습이다.
이렇게 사용하면 다른 솔루션을 사용하고자 할 때 많은 양의 코드를 리팩토링하는 문제가 발생한다.
위처럼 특정 기술이나 환경에 종속되어 의존하게 되면, 코드의 가독성 뿐 만이 아니라 유지보수나 확장에도 어려움이 생겨서 POJO라는 개념이 등장 한 것이다.
그리고 토비의 스프링에서는 진정한 POJO를 아래와 같이 정의했다.
그럼 특정 기술규약과 환경에 종속되지 않으면 모두 POJO라고 말할 수 있는가? 많은 개발자가 크게 오해하는 것 중의 하나가 바로 이것이다. ...(중략)...
진정한 POJO란 객체지향적인 원리에 충실하면서, 환경과 기술에 종속되지 않고 필요에 따라 재활용될 수 있는 방식으로 설계된 오브젝트를 말한다.
POJO 프로그래밍이 가능하도록 기술적인 기반을 제공하는 프레임워크는 대표적으로 두가지가 있다