POJO는 자바 및 스프링 공부를 하다보면 많이 볼 수 있는 기본개념이다.
일단, 사전적 정의를 해보자면
오래된 방식의 간단한 자바 오브젝트라는 말로서 Java EE 등의 중량 프레임워크들을 사용하게 되면서 해당 프레임워크에 종속된 "무거운" 객체를 만들게 된 것에 반발해서 사용되게 된 용어
특정 기술과 환경에 종속되어 의존하게 된 자바코드는, 자바가 가진 객체지향의 장점을 잃으며 유지보수가 떨어지고 가독성이 나빠지게 되었다.
아래의 예제코드를 보면 쉽게 이해가 가능할 것 같다.
public class User {
private String name;
private String address;
public String getName() {
return name;
}
public String getAddress() {
return address
}
public void setName(String name) {
this.name = name;
}
public void setAddress(String address) {
this.address = addres;
}
}
이처럼 가장 기본적인 getter, setter 형태를 띄고있는 순수한 클래스를 POJO라 한다.
pojo의 장점과 기존 EJB에서 제공하는 기술을 사용할 수 있도록 도와주는 프레임워크이다.
대표적으로 스프링과 하이버네이트가 있다.
IoC 컨테이너를 제공해서, 인스턴스들의 라이프 사이클을 관리한다.
특정 인터페이스를 구현하거나 상속할 필요가 없고 라이브러리를 지원하기에 용이하다.
객체가 가벼운 것이 특징이며, OOP를 더 OOP답게 쓸 수 있게 해주는 AOP 기술을 적용해서 POJO 개발을 더 쉽게 만들어준다.
Aop는 나중에 한번 더 다룰 예정
Persistence 기술과 오브젝트-관계형 DB 매핑을 순수한 POJO를 이용해 사용할 수 있게 만드는 POJO기반의 퍼시스턴스 프레임워크이다.
하이버네이트가 사용하는 POJO Entity들은 객체지향적인 다양한 설계와 구현이 가능하다는 장점이 있다.
근데 위에서 계속 특정 규역 및 환경에 종속적이면 POJO가 아니라 하였는데, 하이버네이트는 어떻게 사용하는걸까? 🤔
스프링에서 정한 표준 인터페이스인 JPA가 있기 때문이다.
여러 ORM 프레임워크들은 이 JPA라는 표준 인터페이스 아래에서 실행된다.
그리하여 스프링이 새로운 엔터프라이즈 기술을 도입하면서 POJO를 유지할 수 있다.
이러한 방법을 스프링의 PSA라고 한다.
마지막으로.. 유명한 개발 저서인 토비의 스프링에서
그럼 특정 기술 규약과 환경에 종속되지 않으면 모두 POJO라고 말할 수 있는가? 많은 개발자가 크게 오해하는 것이 이거다. 진정한 POJO란 객체지향적인 원리에 충실하면서, 환경과 기술에 종속되지 않고 필요에 따라 재활용될 수 있는 방식으로 설계된 오브젝트를 말한다.
POJO 방식을 활용한 많은 라이브러리도 있지만.. 그 개념을 잊지 않고 의식하며 개발해야되는 것이 개발자의 몫이라 생각된다.