Plain Old Java Object의 약자.
Java EE 등의 중량 프레임워크들을 사용하면서 해당 프레임워크에 종속된 “무거운 객체”를 만드는 거에 반대인 순수한 자바 객체를 말한다.
→ 무거운 객체 : 특정 기술에 종속되어 동작하는 객체.(각종 기술 여러개 들어간 것)
POJO 예제 코드
public class Person {
private String name;
private int age;
public Person() {
}
public Person(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;
}
}
POJO는 개인 정보를 private 필드로 캡슐화하고, 해당 데이터에 접근하고 수정할 수 있는 getter 및 setter메소드를 제공하는 간단한 자바 클래스다.
POJO 아닌 코드
import org.springframework.beans.factory.annotation.Autowired;
public class OrderService {
@Autowired
private OrderRepository orderRepository;
public void createOrder(String item) {
Order order = new Order(item);
orderRepository.save(order);
}
}
이 코드는 특정 프레임워크나 라이브러리에 종속된 추가적인 의존성과 동작을 가지고 있다.
→ OrderService 클래스는 @Autowired
의존성 주입 어노테이션을 가지고 있으며, 이는 Spring 프레임워크에 종속되어 있다.
이렇게 되면 실제 POJO와 비교하여 다른 컨텍스트에서 재사용하기가 어려울수 있다.
POJO스러운 코드로 수정하면
public class OrderService {
private OrderRepository orderRepository;
public OrderService(OrderRepository orderRepository) {
this.orderRepository = orderRepository;
}
public void createOrder(String item) {
Order order = new Order(item);
orderRepository.save(order);
}
}
이렇게 되는데
차이점은
OrderService 클래스는 Spring 어노테이션과 프레임워크에 종속되어 있지 않다. 대신에 생성자로 OrderRepository 인스턴스를 전달 받도록 변경했다.
이 접근 방식으로 테스트 하기에 좋아지고, 테스트 중에 OrderRepository의 모의 구현을 제공하기가 쉬워진다.
정리하면 POJO의 정의적 특성은 간결함과 특정 프레임워크가 라이브러리에 종속되지 않는 것이다.
POJO는 외부 기술과 강하게 결합되지 않고, 쉽게 이해고 테스트하며 여러 응용 프로그램에서 재사용될 수 있는 자체 포함 형 자바 클래스 여야 한다.
Spring 프레임워크는 객체 지향적인 개발을 지향하고, POJO를 중심으로 애플리케이션을 구성하는 것에 장려한다.
Spring은 POJO를 활용해 애플리케이션의 핵심 비즈니스 로직을 담은 클래스를 작성하고, 이 클래스들을 서로 연결하고 구성하면서 애플리케이션의 구조를 유연하고 모듈화된 형태로 구성할 수 있게 도와준다.
Spring은 엔터프라이즈 서비스들을 POJO 기반으로 만든 비즈니스 오브젝트에서 사용할 수 있게 해준다.
IoC 컨테이너를 제공해서, 인스턴스들의 사이클을 관리하고, 특정 인터페이스를 구현하거나 상속할 필요 없고 라이브러리를 지원하기에 용이하며, 객체또한 가볍다.
OOP를 더 OOP답게 쓸 수 있게 해주는 AOP 기술을 적용해 POJO 개발을 더 쉽게 해준다.
https://ko.wikipedia.org/wiki/Plain_Old_Java_Object