POJO란?
순수한 자바 오브젝트를 말한다. 즉, 외부의 종속성이 없는 단순한 자바 객체를 말한다.
디자인패턴에 지대한 영향을 준 마틴 파울러는 단순 자바 객체를 쓰라는 말이 폼나지 않는 다는 반응을 들었다.
적당히 'POJO'라 명명하고 POJO를 사용하라 했더니 반응이 좋아서 해당 개념이 굳혀지게 되었다.
예를들어 아래와 같이 Getter, Setter로 구성된 가장 순수한 형태의 기본 클래스를 POJO라고 할 수 있다.
public class Book {
private String title;
private String author;
public Book() {}
public Book(String title, String author) {
this.title = title;
this.author = author;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public void showInfo() {
System.out.println(title + ", " + author);
}
}
POJO의 탄생 배경
POJO의 탄생 배경을 이해하기 위해 조금더 과거로 돌아가보자.
개발자가 비즈니스 로직 외의 로우레벨(Transaction, Multi Thread 등)까지 직접 jdk로 구현하기는 쉽지 않다.
가능하다 하더라도 확장 가능한, 재사용 가능한 코드를 짜기는 불가능에 가깝다.
이러한 것을 보안하기 위해 EJB(엔터프라이즈 자바 빈즈)가 만들어졌다.
하지만 EJB에도 문제점이 있었다. 개발자가 단순 자바 오브젝트를 사용해서 개발하는 것이 아닌 EJB에 종속되어 개발을 진행했기 때문에, Module의 교체나 시스템 업그레이드시 종속성으로 인하여 불편함이 발생했다.
만약 외부의 종속성이 높은 코드가 있을 경우,
이 코드는 외부 코드가 변경되면 자신에게도 영향이 끼칠 수 있다.
이는 유지보수가 힘들어진다는 단점을 이끌 수 있다.
EJB는 컨테이너 밖에서는 정상으로 작동하지 않거나, 낮은 생상성과 느린 성능으로 인해 저평가를 받게됐다.
이러한 단점을 극복하고자 POJO라는 개념이 등장하게 되었다.
POJO의 특징
1. 특정 규약에 종속되지 않는다.
POJO는 Java언어 규약에 의해 강제된 것 이외의 제한에 구속되지 않은 Java 오브젝트다.
즉, 특정 Library, Module에서 정의된 클래스를 상속받아서 구현하지 않아도 된다.
POJO가 되기 위해서는 외부의 의존성을 두지 않고 순수한 JAVA로 구성이 가능해야한다.
2. 특정 환경에 종속되지 않는다.
만일 특정 비즈니스 로직을 처리하는 부분에 외부 종속적인 http request, session 등이 있을 경우, POJO를 위배한 것으로 간주한다.
대표적으로 아래 3가지는 POJO가 아닌 경우이다.
(1) 클래스 확장
public class Foo extends javax.servlet.http.HttpServlet { ...
(2) 인터페이스 구현
public class Bar implements javax.ejb.EntityBean { ...
(3) Annotation 포함
@javax.persistence.Entity public class Baz { ...
POJO Framework
POJO를 지향하고 객체지향적인 설계를 위해 POJO Framework가 등장했다.
대표적으로 Spring과 Hiberate가 있다.
Spring은 자바 플랫폼을 위한 오픈소스 어플리케이션 프레임워크로, 웹 백엔드 개발자에게는 친숙한 프레임워크다.
Hiberate는 ORM(Object-relational mapping, 객체 관계 매핑) 프레임워크로, 상세설명은 아래와 같다.
(1) ORM (Object Relation Mapping)
- 가상의 Object DB를 효과적으로 만들어 관계형 데이터베이스(RDB)를 OOP 언어의 개념(객체)으로 연계(매핑)하는 기술
- 쉽게 말해 객체가 테이블이 되도록 매핑시켜 주는 기술
- 예를들어 User 테이블에서 데이터를 출력하기 위해서 MySQL에서는 SELECT * FROM user라는 Query를 실행해야하지만, ORM을 사용하면 User 테이블과 매핑된 객체를 user라 할 때 user.findAll()라는 메서드 호출로 데이터 조회가 가능하다.
- Query를 직접 작성하지 않고 메서드 호출만으로 Query를 수행하다보니 ORM을 사용하면 생산선이 매우 높아진다.
- 하지만 Query가 복잡할수록 ORM으로 표현하는데 한계가 있고, 성능이 Raw query에 비해 느리다는 단점이 있다.
(2) JPA (Java Persistent API)
- 자바 ORM 기술에 대한 API 표준
- 쉽게 말해 ORM을 사용하기 위한 인터페이스를 모아둔 것
- 내부적으로 JDBC(Java Database Connecticity)를 활용한다.
- JPA를 사용하기 위해서는 JPA를 구현한 Hibernate, EclipseLink와 같은 ORM 프레임워크를 사용해야 한다.
(3) JDBC (Java Database Connecticity)
- DB에 접근할 수 있도록 Java에서 제공하는 API
- 모든 Java Data Access 기술의 근간으로, JPA는 내부적으로 JDBC API를 사용한다.
(3) Hibernate
- 대표적인 JPA 구현체(프로바이더)
- 객체지향 프로그래밍과 관계형 데이터베이스의 차이로 인해 발생하는 제약사항의 해결책으로 등장
* 어떤 제약사항을 해결하나? : 데이터베이스는 데이터들의 집합 개념을 기반으로 하기 때문에 객체지향 개발방식과는 근본적으로 다른 점들이 있다. 예를 들어, 객체 간 관계를 데이터베이스에 그대로 저장하기에는 어려운 문제가 있다.
- JPA를 잘 사용하기 위해서는 알아야할 것이 많다. 이러한 복잡성을 해결하고자 최근에는 SpringrData JDBC가 주목받고 있다.
참고 자료
POJO란 ? - https://m.blog.naver.com/writer0713/220700687650
POJO 이해하기 - https://needjarvis.tistory.com/585
Hibernate(하이버네이트)란? - https://sarc.io/index.php/development/1132-hibernate
ORM과 JPB 그리고 Hibernate - https://victorydntmd.tistory.com/195
Hibernate? ORM? JPA? - https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=rorean&logNo=221411555979
'👩🏻💻 Programming > SpringBoot' 카테고리의 다른 글
Bean vs Component (0) | 2021.08.10 |
---|---|
AOP (Aspect Oriented Programming) (0) | 2021.08.10 |
IoC(제어의 역전)와 DI(의존성 주입) (0) | 2021.08.08 |
SpringBoot의 Object Mapper (0) | 2021.08.05 |
GET과 Query Parameter, POST와 Databody (0) | 2021.08.03 |