본문 바로가기
IT 이야기/Java

POJO Class

by Dblog 2021. 6. 28.
728x90

POJO Class란.?

https://ko.wikipedia.org/wiki/Plain_Old_Java_Object

 

Plain Old Java Object - 위키백과, 우리 모두의 백과사전

Plain Old Java Object, 간단히 POJO는 말 그대로 해석을 하면 오래된 방식의 간단한 자바 오브젝트라는 말로서 Java EE 등의 중량 프레임워크들을 사용하게 되면서 해당 프레임워크에 종속된 "무거운" 객

ko.wikipedia.org

 

POJO(Plain Old Java Object) 뜻 그대로 해석하면 평범한 오래된 java object입니다.

제게는 그동안 java가 추구해 왔던 객체지향 프로그래밍에서 점점 멀어지고 있던 저를 다시 생각하게 하는 내용이였습니다.

POJO의 어원에 관련해서 마크 파울러가 이런 말을 했다고 전해지고 있습니다.

"We wondered why people were so against using regular objects in their systems and concluded that it was because simple objects lacked a fancy name. So we gave them one, and it's caught on very nicely."

 

POJO Class가 따르지 않아도 되는 제한 조건이 몇 가지가 있는데 Java의 경우는 3가지로 분류됩니다.

  1. 미리 정의된 클래스 extend 
  2. 미리 정의된 인터페이스 implements
  3. 미리 정의된  Annotation을 포함

 

이렇게 글로 정의해놓으면 이해하기 어렵습니다. 그래서 Java의 경우를 예시로 들면 POJO는

( https://ko.wikipedia.org/wiki/Plain_Old_Java_Object )

위 3가지를 따르지 않아도 됩니다.

 

사실 이 부분부터는 굉장히 헷갈렸습니다. POJO의 대표적인 예시가 Spring framework인데 다들 알다시피 Spring Framework는 Annotation과 extends, implements가 굉장히 많이 사용되고 있습니다.

Pojo예제를 검색하면 흔하게 나오는 getter/setter method가 포함된 entity class만 하더라도 벌써 class 상단에 @Entity가 자리 잡고 있습니다. 또 JPA와 같은 라이브러리를 쓰게 되면 Repository interface를 implements 하게 됩니다. 

@Entity
public class UserEntity {

	private String 	username;	
	private String 	password;

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}
}

 

그래서 열심히 POJO가 정확히 뭔지, POJO의 반대라고 하는 EJB도 찾아보고 같이 나오길래 JavaBean도 읽고 해 보면서 POJO에 대해 이해가 되었습니다.

POJO는 단순하게 해당 class에서는 아무 의미도 없는 단지 Framework를 위해서 구현해야 하는 메소드를 구현하는 게 싫어서 나타난 개념인 것 같습니다.

 

EJB예제 중 가장 유명한 Hello 예제를 구글에서 긁어왔습니다. 예제에서 보면 SessionBean을 상속받으면서 ejbActivate(), ejbPassivate().. 이런 method를 필수로 구현해야 합니다.

package com.imissyoubrad.ejb.session;

import javax.ejb.SessionBean;
import javax.ejb.SessionContext;

public class HelloWorldBean implements SessionBean {
	public void ejbActivate() {}
	public void ejbPassivate() {}
	public void ejbRemove() {}
	public void setSessionContext(SessionContext ctx) {}
	
	public String sayHello() {
		return "Hello World";
	}
	
	public void ejbCreate() {}
}

 

그런데 ejbActivate(), ejbPassivate().. 이런 method들은 framework를 위해서 구현하는 것이지 Hello Class를 위한 method들이 아닙니다. 

이런 방식으로 개발을 하다 보니, 어..? 이게 맞나.. 싶은 생각이 들었던 것 같습니다.

그리고 제 가장 큰 의문이었던 Annotation 부분은 SpringBean은 특수 POJO로 일반적인 POJO보다 조금 유연하게 적용되고 있었습니다.

 

(https://www.geeksforgeeks.org/pojo-vs-java-beans/)

POJOJava Bean

POJO Java Bean
It doesn’t have special restrictions other than those forced by Java language. It is a special POJO which have some restrictions.
It doesn’t provide much control on members. It provides complete control on members.
It can implement Serializable interface. It should implement serializable interface.
Fields can be accessed by their names. Fields are accessed only by getters and setters.
Fields can have any visiblity. Fields have only private visiblity.
There may/may-not be a no-arg constructor. It must have a no-arg constructor.
It is used when you don’t want to give restriction on your members and give user complete access of your entity It is used when you want to provide user your entity but only some part of your entity.

 

특수하게 예외를 가지는 Java Bean의 POJO 정책 때문에 헷갈렸던 것 같습니다.

완벽하게 이해하고 있지는 않지만 그래도 이전보다는 조금 나은 것 같습니다. 큰 틀로는 POJO는 결국 의존이 없는 클래스,라고 볼 수 있을 것 같습니다.

728x90

'IT 이야기 > Java' 카테고리의 다른 글

[Bean] JAVA vs Spring  (0) 2021.07.27
JPA Default value 적용 - @DynamicInsert  (0) 2021.07.20
[Java Study] 14일차 제네릭(generic)  (0) 2021.02.22
[Java Study] 13일차 I/O [input/output]  (0) 2021.02.13
[Java Study] 12일차 Annotation  (0) 2021.02.04

댓글