POJO 란?
- Plain Old Java Object 의 약자이다.
- 마틴 파울러가 위의 이름을 지었는데, 이유는 단순한 개체에 걸맞는 마땅한 이름이 없기 때문이라고 한다.
- 해석해보면, 오래된 방식의 간단한 자바 오브젝트라는 뜻이다.
- 객체지향적인 원리에 충실하면서 특정 환경과 규약에 종속되지 않아, 필요에 따라 재사용이 될 수 있는 방식으로 설계된 오브젝트를 말한다.
- 쉽게 말하면, 특정 기술과 환경에 종속되어 동작하는 것이 아닌 순수한 자바 객체를 말한다.
- Java EE 등의 중량 프레임워크들을 사용하게 되면서 해당 프레임워크에 종속된 "무거운" 객체를 만들게 된 것에 반발해서 사용되게 된 용어이다.
POJO의 장점
- 특정 기술과 환경에 종속적이지 않은 코드는 깔끔하다.
- 자동화된 테스트에 유리하다.
- 객체지향적인 설계를 자유롭게 적용할 수 있다.
- 자바의 객체지향적인 특정을 살려서 비즈니스 로직에 충실한 개발이 가능하다.
POJO 가 되기 위한 조건
- Can't Extend anything -> 어떤 것도 상속을 받으면 안된다. -> 특정 규약에 종속되지 않아야한다.
- Can't Implement anything -> 어떤 것도 구현하면 안된다. -> 특정 환경에 종속되지 않아야한다.
- No outside annotation -> 외부로 부터 파생된 애노테이션을 사용하면 안된다.
코드 예시
public class Cat{
int age;
String name;
}
위의 코드는 POJO 이다.
어떤것도 상속받고 있지않고, 어떤 것도 구현하고 있지않고, outside 애노테이션 또한 없다. -> 이는 POJO 이다.
아래의 코드는 POJO 일까?
public class Cat extends Animal{
int age;
String name;
}
- 위의 코드는 Animal 을 상속받고 있으므로 POJO가 아니다.
public class Cat implements MakesNoise{
int age;
String name;
}
- 이 또한 인터페이스를 구현하고 있으므로 POJO가 아니다.
@Entity
public class Cat{
int age;
String name;
}
- 위 코드 또한 Hibernate 에 종속적이기 때문에 POJO 가 아니다.
JavaBean vs POJO
- JavaBean 이면 POJO 일까? -> 맞다.
- POJO 이면 java bean 일까? -> 아니다.
- 이렇듯 Beans 는 좀 더 엄격한 규칙을 가지고 있다.
- JavaBean 이기 위한 조건은 아래와 같다.
- No-args constructor
- Properties must be private
- public getters and setters
- Must be serializable
- 위에서 작성했던 Cat 클래스는 POJO 다.
- 하지만 이를 JavaBean 이 되려면 아래와 같이 코드가 바껴야 한다.
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;
}
}
JavaBean vs SpringBean
- 위에서도 정리 했지만 Java Bean 은 특정 형태의 클래스를 가르키는 뜻으로 사용된다.
- 예를들어, DTO, VO 가 Java Bean 이라고 할 수 있다.
- Spring Bean 은 스프링 IoC 컨테이너가 관리하는 Java 객체를 말한다.
- Java 객체와 다른 점은 없다. 단지 개발자가 관리하는 객체가 아닌 스프링에게 제어권을 넘긴 객체를 말한다.
REFERENCES
'객체지향' 카테고리의 다른 글
디자인 패턴에 함수형 프로그래밍 적용하기 (0) | 2022.03.06 |
---|---|
다형성 (0) | 2022.02.28 |
디자인 패턴 (0) | 2022.02.28 |
SOLID (0) | 2022.02.28 |
refactoring (0) | 2022.02.28 |