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
'Spring' 카테고리의 다른 글
[Spring] 컴포넌트 스캔(Component Scan) (3) | 2024.06.08 |
---|---|
[Spring] 스프링 싱글톤 컨테이너(Singleton Container) (0) | 2024.06.06 |
[Spring] 스프링의 삼각형(IoC/DI, AOP, PSA) (0) | 2024.06.05 |
[Spring] 스프링 컨테이너(Spring Container), 스프링 빈(Bean), 빈 설정 방법(XML, Java 기반, Annotation 기반) (0) | 2024.06.04 |
[Spring] IoC(Inversion of Control 제어의 역전), DI(Dependency Injection 의존성 주입), 의존성 주입 3가지 방법 (0) | 2024.06.04 |