POJO란?

JP·2022년 2월 27일

POJO

Plain Old Java Object

평범한 오래된 자바 객체

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

POJO는 Martin fowler에서 시작되었다.
마틴 파울러
배경에 보이는 Agile과 민머리 + 수염이 대단한 포스를 풍긴다.

그는 사람들이 왜 간단한 객체를 사용하길 꺼려하는지 의문을 가져왔는데 그 이유는 바로 그 간단한 객체로 쓰이는 것에 이름이나 유래가 없었기 때문이라고 생각했기 때문이다.

따라서 그는 이렇게 간단하게 쓰이는 객체에 POJO라는 수식어를 붙여주었다.
POJO를 사용하면 좀 있어보이게 말이다...

그렇게 생겨난 POJO는 2000년부터 현재까지 쭉 사용되고 있다.

POJO가 되기 위해서는?

  1. 다른 클래스의 자식 클래스가 되면 안된다.

  2. 인터페이스를 구현하면 안된다.

  3. 외부의 어노테이션을 사용하면 안된다.

이유는 즉, 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가 될 수 없게 된다.

POJO와 Java Bean

Java BeanPOJO에 더해 몇가지 요구사항을 충족해야 한다.
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에 왜 기본 생성자가 있어야하는지에 대한 아티클

profile
to Infinity and b

0개의 댓글