POJO(Plain Old Java Object)란?
Plain Old Java Object, 간단히 POJO는 말 그대로 해석을 하면 오래된 방식의 간단한 자바 오브젝트라는 말로써 Java EE 등의 중량 프레임워크들을 사용하게 되면서 해당 프레임워크에 종속된 "무거운" 객체를 만들게 된 것에 반발해서 사용하게 된 용어이다. 2000년 9월에 마틴 파울러, 레베카 파슨, 조쉬 맥킨지 등이 사용하기 시작한 용어로써 마틴 파울러는 다음과 같이 그 기원을 밝히고 있다.
특정 '기술'과 환경에 종속되어 의존하게 된 자바 코드는 가독성이 떨어져 유지보수가 어렵고 확장성이 매우 떨어지는 단점이 있었습니다. 이는 객체지향 언어인 자바가 객체지향의 장점들을 잃어버리게 되는 것입니다.
그래서 POJO라는 개념이 등장했습니다.
ublic class Person {
private String name;
private int age;
public String getName() {
return name;
}
public String getAge() {
return age;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
}
다음과 같이 가장 기본적인 형태의 Java 객체를 POJO라 한다.
좀 더 자세히 설명하자면,
EJB(Enterprise JavaBeans)은 자바 개발에 있어 로우 개발에 신경을 안 쓰고 애플리케이션을 쉽게 만들어준 기술이지만, EJB에서 사용되는 Java Bean은 객체지향성을 감소시키는 단점이 있었다.
EJB의 사용과 프로그램의 규모 증가로 특정 기술과 환경에 종속되어 의존하게 된 자바 코드는 가독성이 떨어져 유지보수에 어려움이 생기게 되고 또한, 특정 기술의 클래스를 상속받거나, 직접 의존하게 되어 확장성이 매우 떨어지며 점점 객체지향성을 잃어갔다.
그래서 개발자는 옛날 순수한 객체지향성이 컸던 시절로 돌아가자는 취지로 POJO를 개발하게 되었다.
POJO는 Java Bean이 아닌 Getter와 Setter로 구성된 가장 순수한 형태의 기본 클래스를 말한다.
POJO class의 특징
- POJO class 는 공개되어야 한다.
- default 생성자를 가지고 있어야 한다.
- 인수 생성자를 가지고 있을 수 있다.
- Getter와 Setter를 가지고 있어서 다른 Java Program들이 class의 값들에 접근할 수 있다.
- private, public, protected와 같은 modifier를 가질 수 있지만, 프로젝트의 보안 향상을 위해 모든 변수는 private이어야 한다.
- 미리 정의된 class를 extends 하면 안 된다.
- 미리 정의된 interface를 implements 하면 안 된다.
- 미리 정의된 annotation을 가지고 있으면 안 된다.
POJO 프레임워크
POJO 프레임워크는 POJO를 사용하는 장점과 EJB에서 제공하는 엔터프라이즈 서비스와 기술을 그대로 사용할 수 있도록 도와주는 프레임워크이다.
많은 POJO 프레임워크가 있지만 대표적으로 하이버네이트와 스프링이 있다.
하이버네이트
하이버네이트는 Persistence 기술과 오브젝트-관계형 DB 매핑을 순수한 POJO를 이용해 사용할 수 있게 만드는 POJO기반의 퍼시스턴스 프레임워크이다.
하이버네이트는 JDBC API를 직접 사용해 개발하는 것 못지않은 성능과 복잡한 퍼시스턴스 로직을 개발 가능하게 해 주었고 하이버네이트가 사용하는 POJO 엔티티들은 객체지향적인 다양한 설계와 구현이 가능하다.
특정 기술에 종속적이면 POJO가 아니라면서 스프링에서 하이버네이트 사용은 어떻게 가능할까?
바로 스프링에서 정한 표준 인터페이스가 있기 때문이다.
스프링 개발자들은 ORM이라는 기술을 사용하기 위해 JPA라는 표준 인터페이스를 정해두었고, 여러 ORM 프레임워크들은 이 JPA라는 표준 인터페이스 아래에서 구현되어 실행된다.
이것이 스프링이 새로운 엔터프라이즈 기술을 도입하면서 POJO를 유지하는 방법이다.
이런 방법을 스프링의 PSA(Portable Service Abstraction)라고 이야기한다.
스프링
엔터프라이즈 서비스들을 POJO 기반으로 만든 비즈니스 오브젝트에서 사용할 수 있게 해 준다.
IoC 컨테이너를 제공해서, 인스턴스들의 라이프 사이클을 관리하고, 특정 인터페이스를 구현하거나 상속할 필요가 없고 라이브러리를 지원하기에 용이하며 객체 또한 가벼운 것이 특징이며, OOP를 더 OOP 답게 쓸 수 있는 AOP 기술을 적용해서 POJO 개발을 더 쉽게 만들어준다.
POJO 프로그래밍의 가치
단순히 POJO 프레임워크를 사용한다고, POJO 개발을 자연스럽게 하는 것은 아니다.
POJO 기반의 코드인지 확인하는 기준
- 객체지향적으로 설계되었는가?
- 반복적인 템플릿 코드와 테스트하기 힘든 구조, 확장 및 재활용의 어려움이 남아있다면 EJB의 문제점을 여전히 안고 있는 것이다.
- 테스트가 용이한가?
- 잘 만들어진 POJO 애플리케이션은 자동화된 테스트 코드 작성이 편리하다.
- 코드 작성이 편리하면 좀 더 꼼꼼하게 만들게 되고, 코드 검증과 품질 향상에 유리해진다.
- 잘 만들어진 테스트 코드베이스가 있다면 리팩토링 할 여유가 생겨 POJO 코드를 좀 더 나은 설계구조로 변경할 수 있다.
진정한 POJO란
그럼 특정 기술규약과 환경에 종속되지 않으면 모두 POJO라고 말할 수 있는가?
많은 개발자가 크게 오해하는 것 중에 하나가 바로 이것이다...(중략)..
진정한 POJO란 객체지향적인 원리에 충실하면서, 환경과 기술에 종속되지 않고 필요에 따라 재활용될 수 있는 방식으로 설계된 오브젝트를 말한다.
참고 자료
https://dev-coco.tistory.com/82
https://ko.wikipedia.org/wiki/Plain_Old_Java_Object
https://www.javatpoint.com/pojo-in-java
'백엔드 > Spring' 카테고리의 다른 글
레이어간 의존 관계 문제 (0) | 2024.07.29 |
---|---|
[Spring] 동적 프록시(Dynamic Proxy) (1) | 2023.05.26 |
[Spring Cloud] Spring Cloud OpenFeign (0) | 2023.05.22 |
[Spring] Spring Boot Actuator (0) | 2023.05.18 |
[Spring] 스프링(Spring) (0) | 2023.04.28 |