우아한테크코스/레벨2

[OOP] POJO (Plain Old Java Objects) 란? (feat. 스프링의 등장 배경)

MINGYUM 2024. 4. 27. 17:46

앞서 포스팅을 작성하면서 DTO를 공부하는 과정에서 POJO라는 단어를 많이 보았다. 

POJO가 어떤 객체를 의미하는 지 정확히 몰랐기 때문에 POJO가 뭔지, 그리고 스프링에서 어떤 의미가 있는지 이번 포스팅에서 공부해보려고 한다.

 

When we talk about a POJO, what we’re describing is a straightforward type with no references to any particular frameworks. 
A POJO has no naming convention for our properties and methods.
- Bealdung

 

POJO는 Plain Old Java Object라는 뜻으로 오래된 방식으로 만들어진 자바의 간단한 객체라는 의미로 직역할 수 있다.

어떠한 인스턴스 변수나 함수에 네이밍 컨벤션도 적용되지 않은 단순한 객체이다. 특정 프레임워크에 종속되어있지 않고 모든 자바 프로그램에 사용 가능하다. 

 

👀 등장 배경

POJO는 마틴 파울러에 의해 EJB에 대응되는 개념으로 등장하였다.

 

Enterprise Java Bean을 뜻하는 EJB는 하나의 클래스에 비즈니스 코드 뿐만 아니라 EJB 기술과 관련된 코드에 종속되어있었다. 그래서 개발 생산성이 매우 떨어지는 단점이 있었고 비즈니스 로직으로부터 기술적인 리소스를 분리할 필요성이 있었다.

public class EmployeePojo {

    public String firstName;
    public String lastName;
    private LocalDate startDate;

    public EmployeePojo(String firstName, String lastName, LocalDate startDate) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.startDate = startDate;
    }

    public String name() {
        return this.firstName + " " + this.lastName;
    }

    public LocalDate getStart() {
        return this.startDate;
    }
}

 

이렇게 POJO는 자바 그 자체만으로 객체지향의 장점을 얻기 위한 시도로 만들어진 개념에 해당된다.

 

🧐 JavaBean과의 비교

JavaBean은 POJO와 다르게 구현하는 방식에 있어서 조금 더 엄격한 규칙을 따른다. 아래 규칙을 모두 지킨다면 POJO가 아닌 JavaBean이라고 부를 수 있다.

  • 필드의 접근 제어자를 private로 유지한다. 
  • 메소드 이름에 대한 컨벤션을 유지한다.
  • 기본생성자를 유지한다. 
  • Serializable 인터페이스를 구현한다.
public class EmployeeBean implements Serializable {

    private static final long serialVersionUID = -3760445487636086034L;
    private String firstName;
    private String lastName;
    private LocalDate startDate;

    public EmployeeBean() {
    }

    public EmployeeBean(String firstName, String lastName, LocalDate startDate) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.startDate = startDate;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    //  additional getters/setters

}

 

이 규칙에 따른 JavaBean의 코드 형태는 다음과 같다.

 

그렇다면 POJO가 스프링에서 가지는 의미는 무엇일까? 왜 스프링에서 POJO라는 개념이 중요하게 쓰일까?

⭐ POJO와 스프링

EJB의 문제점이 대두되고 기술적인 복잡한 코드를 핵심 로직에서 제거하고자 스프링이 탄생하였다. 기술적인 로직을 깔끔하게 비즈니스 로직에서 분리할 수 있었던 것은 객체지향 기술 덕분이다. 스프링의 DI 역시 그 객체지향 기술 중 하나이다. 

스프링의 정수(essence)는 엔터프라이즈 서비스 기능을 POJO에 제공하는 것이다.

 

라는 말이 있다.

EJB에서 문제가 되었던 부분은 기술적인 코드와 애플리케이션 로직이 함께 구현되어야한다는 점이었다. 스프링은 이를 분리하여 POJO 프로그래밍을 통한 애플리케이션 로직만을 작성함으로써 엔터프라이즈 서비스 기술을 구현할 수 있다는 점에서 가치가 있다.

 

아래 사진을 보자. 객체지향을 이용해 코드를 분리하였고, 이 분리한 스프링의 주요 기술이 AOP, PSA, IoC/DI라고 할 수 있다. 이 기술들이 있기 때문에 POJO 프로그래밍으로 서비스를 개발할 수 있다는 의미를 담은 사진이다.

 

 

POJO 프로그래밍을 학습하면서 스프링의 탄생 배경에 대해서 간단하게 알아보았다.

외부로 기술적인 코드를 분리한 객체지향 기술들이 더 궁금해지는데, 다음 포스팅에서 정리해보고 싶다.

 

참고

https://martinfowler.com/bliki/POJO.html

https://www.baeldung.com/java-pojo-class

https://mangkyu.tistory.com/281