Spring

[Spring] POJO(Plain Old Java Object)란?

cloud-grace 2024. 6. 6. 01:03

POJO(Plain Old Java Object)란?

 

이전 포스팅에서 스프링의 삼각형으로 이루어진 스프링의 3대 요소 IoC/DI, AOP, PSA에 대해 알아보았다. 그럼 중앙에 있는 POJO는 무엇일까? 위 그림처럼 POJO는 3대 요소를 통해 POJO를 달성할 수 있다는 의미이다.

 

POJO는 Plain Old Java Object의 약자이며, 말 그대로 오래된 방식의 간단한 자바 객체이다. 즉, 자바로 만드는 순수한 객체를 말한다.

 

중량 프레임워크들을 사용하게 되면서 해당 프레임워크에 종속된 "무거운" 객체를 만들게 된 것에 반발하여 사용되었으며, 2009년 9월, 마틴 파울러 등이 사용하기 시작하였고, 아래와 같이 기원을 밝히고 있다.

 

우리는 사람들이 자기네 시스템에 보통의 객체를 사용하는 것을 왜 그렇게 반대하는지 궁금하였는데,
간단한 객체는 폼 나는 명칭이 없기 때문에 그랬던 것이라고 결론지었다.
그래서 적당한 이름을 하나 만들어 붙였더니, 아 글쎄, 다들 좋아하더라고.

                                                                                                                                      — 마틴 파울러

 

POJO라는 용어는 이후 특정 자바 모델, 기능, 프레임워크 등을 따르지 않은 자바 오브젝트를 지칭하는 말로 쓰이게 되었다. 다시 말해, 특정 기술을 사용하기 위해 특정 프레임워크를 의존하게 되면 그것은 POJO라고 할 수 없다. 특정 기술에 종속되어 있기 때문이다. Spring은 POJO 방식의 프레임워크이다.

 

 

1. POJO 예제 코드

  • 아래 코드는 getter와 setter만 가지고 있는 기본적인 형태의 Java 객체이며, POJO이다.
  • 특정 기술에 종속되어 있지 않은 순수 자바 객체이므로 POJO라고 할 수 있다.
public class User {
    private String name;
    private String id;
    private String password;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getPassword() {
        return password;
    }

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

 

2. POJO가 아닌, 특정 기술에 종속적인 예제 코드

  • 아래 코드는 Java Servlet API를 사용하여 작성된 Servlet 클래스이며, POJO가 아니다.
  • 특정 API에 종속적이고, 특정 규약을 따라야 하며, 특정 라이프사이클 메서드를 구현해야 하기 때문이다.
  • Java Servlet 코드를 작성할 때는 반드시 HttpServlet를 상속받아야 하며, 타 상속이 추가될 수 없어 객체 지향적 설계가 어렵고, HttpServlet의 어떤 기능을 어떻게 재사용할지 판단하기가 어렵다.
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class HelloServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html");
        resp.getWriter().println("<h1>Hello, World!</h1>");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // Post request handling logic
    }
}

 

POJO 프레임워크

POJO 프레임워크는 POJO의 장점과 EJB(Enterprise Java Bean)의 엔터프라이즈 서비스 및 기술을 모두 사용할 수 있다.

EJB(Enterprise Java Bean) : 과거, 엔터프라이즈급 애플리케이션 개발을 단순화하기 위해 사용했던 스펙이다.

 

1. 하이버네이트(Hibernate)

Hibernate는 Java 기반의 ORM(Object-Relational Mapping) 프레임워크로, POJO를 데이터베이스 테이블에 매핑한다. POJO 엔티티들은 SQL 쿼리를 직접 작성할 필요 없이 객체 지향 방식으로 DB 작업을 수행할 수 있다.

 

그러나, 특정 기술에 종속적이면 POJO가 아니다. POJO라고 할 수 있는 이유는 스프링에서 Hibernate를 쓸 때 스프링에서 정한 표준 인터페이스가 있기 때문이다.

 

ORM을 사용하기 위해 JPA라는 표준 인터페이스를 정해두었으며, ORM 프레임워크 중 하나인 Hibernate는 스프링에 기술로 쓰이면서도 POJO를 유지할 수 있다.

 

2. 스프링(Spring)

Spring은 POJO 방식의 프레임워크이다. 다른 환경 및 기술에 종속적이지 않도록 Spring에서는 IoC/DI, AOP, PSA를 지원한다.

 

POJO 프로그래밍 장점

  • 객체 지향적인 설계를 무한하게 적용 가능하다.
  • 저수준 레벨 기술 및 환경에 종속적인 코드를 없애 간결한 코드를 갖고, 디버깅에도 용이해진다.
  • 종속적이지 않으면 재사용성, 확장 가능성, 유연성이 높아지며, 테스트가 단순해진다.

 

POJO의 정의(by 토비의 스프링)

 

그럼 특정 기술규약과 환경에 종속되지 않으면 모두 POJO라고 말할 수 있는가?
많은 개발자가 크게 오해하는 것 중의 하나가 바로 이것이다.

... (중략) ... 

진정한 POJO란 객체지향적인 원리에 충실하면서,
환경과 기술에 종속되지 않고 필요에 따라 재활용될 수 있는 방식으로 설계된 오브젝트를 말한다.

 

 

 

 

참고 자료

https://yoo11052.tistory.com/133

https://dev-coco.tistory.com/82

https://ittrue.tistory.com/211