Plain Old Java Object
평범한 오래된 자바 객체
POJO가 가장 헷갈린 이유는 평범한데 오래된 자바 객체..에서 오래된 이란 뜻이 날 어렵게 만들었다.
분명 낡고 오래된것들은 프로그래밍 세계에서 그리 좋은 취급은 받지 못하는 것 같았기에 이 의미가 무엇인지 제대로 파악할 의무가 있었다
POJO는 Martin fowler에서 시작되었다.

배경에 보이는 Agile과 민머리 + 수염이 대단한 포스를 풍긴다.
그는 사람들이 왜 간단한 객체를 사용하길 꺼려하는지 의문을 가져왔는데 그 이유는 바로 그 간단한 객체로 쓰이는 것에 이름이나 유래가 없었기 때문이라고 생각했기 때문이다.
따라서 그는 이렇게 간단하게 쓰이는 객체에 POJO라는 수식어를 붙여주었다.
POJO를 사용하면 좀 있어보이게 말이다...
그렇게 생겨난 POJO는 2000년부터 현재까지 쭉 사용되고 있다.
다른 클래스의 자식 클래스가 되면 안된다.
인터페이스를 구현하면 안된다.
외부의 어노테이션을 사용하면 안된다.
이유는 즉, POJO란 말 그대로 단순한 클래스이기에 추가 항목이 없어야한다.
POJO를 사용하기 위해 외부 라이브러리나 다른 클래스들이 필요하지 않다는 뜻이다.
public class Cat {
int age;
String name;
}
위의 클래스는
1. 클래스를 상속받거나
2. 인터페이스를 구현하지도 않았고
3. 외부의 어노테이션 같은 것들도 쓰지 않았기에
POJO의 정의를 충족한다
public class Cat extends Animal{
int age;
String name;
}
Animal 클래스를 상속받기 시작하면, Cat 클래스를 사용하기 위해 외부 Animal 클래스가 필요하게 된다.
따라서 POJO라고 말할 수 없다.
public class Cat implements Walkable{
int age;
String name;
}
인터페이스를 상속받은것도 옳지 않다.
왜냐하면 이것이 동작하게 하려면 외부에서 상속받은 인터페이스에서 작업이 이루어져야 하고 인터페이스 변경에 따른 영향을 받게 되기 때문이다.
@Entity
public class Cat {
int age;
String name;
}
위의 클래스는 하이버네이트의 @Entity가 붙어있다.
즉 이 클래스를 사용하기 위해서는 하이버네이트가 필요하다는 뜻이고 따라서 더 이상 POJO가 될 수 없게 된다.
Java Bean은 POJO에 더해 몇가지 요구사항을 충족해야 한다.
1. public 기본 생성자가 있어야 합니다.
2. 변수는 모두 private이어야 한다
3. private이기에 필요에 따라 getter 와 setter가 있어야한다
4. 직렬화가 가능해야 한다.
public class Cat{
int age;
String name;
}
위의 Cat 클래스에서는 클래스가 가지고 있는 인스턴스 변수들은 private 하지 않고 이를 접근하기 위해 getter나 setter가 따로 존재하지 않는다. 그리고 직렬화 할 수 없다.
따라서 POJO는 만족하지만 Java Bean은 될 수 없다.
이를 Java Bean으로 만들기 위해서는
public class Cat implements Serializable{
private int age;
private String name;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
와 같이 만들어야 합니다.
What is a POJO in Java에 대한 강의
Java Bean에 왜 기본 생성자가 있어야하는지에 대한 아티클