POJO
POJO는 Plain Old Java Object의 약자로 평범하고 오래된 자바 객체라는 뜻이다.
또는 특정 기술에 종속되지 않는 순수한 자바 객체를 말한다.
POJO가 왜 중요할까?
POJO는 어떤 특정 기술에 종속되어 있는 상태로 개발하지 않는 개념을 위해 등장한 언어인데, 종속성으로 인해 시스템 업그레이드, 모듈 교체와 같은 상황에서 객체지향적인 설계가 힘들거나 불가능한 경우가 많다. 이렇게 되면 코드의 유지보수와 재사용이 매우 불편해지는 단점이 있다. 이를 보완하기 위해 프로그래머가 자유롭고 단순하게 객체를 만들 수 있도록 하기 위해 POJO라는 개념이 만들어졌다.
지난 글에서 스프링 프레임워크에 대해 작성했었는데 거기서도 POJO에 대해서 잠깐 나왔었다.
Spring의 특징으로 POJO기반으로 되어있어서 일반 자바 객체만으로도 동작 가능하다고 설명했었는데
POJO기반의 장점으로 간단하면서 테스트와 유지보수가 좋다는 장점들이 있다.
장점 | 설명 |
간단함 | 자바 문법만으로 작성 가능. 진입 장벽 낮음 |
테스트 쉬움 | 스프링 없이도 JUnit 등으로 쉽게 테스트 가능 |
유지보수 좋음 | 특정 프레임워크에 종속되지 않음 |
재사용성 높음 | 다른 프로젝트나 환경에서도 그대로 사용 가능 |
유연함 | 점진적으로 프레임워크에 통합 가능 (필요할 때만 설정) |
• POJO는 어떤 특정 프레임워크나 라이브러리에 의존하지 않는다.
(Spring, Hibernate 등)
• 상속하거나 구현해야 할 인터페이스가 없다.
• private 필드 + getter/setter + 기본 생성자 정도만 있는 아주 단순한 구조
• 비즈니스 로직이 없는 데이터 구조 위주의 클래스
POJO의 예시
public class Member {
private String name;
private int age;
public Member() {
}
public Member(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
이 코드는 Getter, Setter로 이루어져 있는 POJO의 개념을 지킨 코드다.
@Stateless
public class MemberBean implements MemberService {
public String getName() {
return "EJB Member";
}
}
이 코드는 EJB기반의 예시로 @Stateless 어노테이션을 사용한 Stateless Session Bean을 정의하고, MemberService 인터페이스를 구현한 MemberBean 클래스다.
이 코드는 프레임워크 의존성이 있으며 객체를 관리하는 것은 컨테이너가 관리하고, 테스트는 컨테이너가 필요하여 용이성이 낮으며 설정할 것이 많다.
그래서 많은 프레임워크는 POJO 스타일을 선호하게 되었고, EJB의 복잡성을 피하면서도 DI, 트랜잭션 같은 기능을 지원하려고 했다.