
POJO 는 Plain Old Java Object 의 약자로, 우리말로는 평범한 옛날 자바 객체 또는 순수 자바 객체 로 번역된다.
이름 그대로, 특정 프레임워크나 기술에 종속되지 않고, 순수하게 자바의 기본적인 문법만으로 만들어진 객체를 의미한다.
2000년대 초반, 당시 유행하던 EJB(EnterPRise JavaBeans)처럼 복잡하고 무거운 엔터프라이즈 프레임워크에 대한 대응으로
POJO 가 생겼다. EJB 는 개발자들이 비즈니스 로직보다는 프레임워크의 특정 규직(특정 인터페이스 구현, 특정 클래스 상속)을
따르는데 더 많은 시간과 노력이 들이게 만들었다.
이에 대해 마틴 파울러 같은 소프트웨어 전문가들을 프레임워크의 제약 없이 비즈니스 로직에 집중하여 객체를 설계하는 것의 중요성을 강조했고, 이런 객체를 POJO 라고 부르기 시작했다.
POJO 의 특징
1. 특정 프레임워크에 얽매이지 않음
- Spring, Hibernate 등 어떤 특정 프레임워크의 클래스를 상속받거나 인터페이스를 구현할 필요가 없다.
2. 간결하고 단순함
- 자바의 기본 문법(변수, 메소드, 생성자 등)만 사용해서 만든다.
3. 테스트 용이성
- 프레임워크에 대한 의존성이 적기 때문에, 단위 테스트를 작성하기 훨씬 쉽고 빠르다.
4. 재사용 및 유연성
- 특정 환경에 얽매이지 않으므로 다른 프로젝트나 환경에서도 쉽게 재사용하거나 변경할 수 있다.
5. 비즈니스 로직에 집중
- 프레임워크의 기술적인 제약에서 벗어나 순수하게 비즈니스 로직을 구현하는 데 집중할 수 있게 도와준다.
일반적으로 데이터를 담는 용도로 많이 사용되는 DTO 나 VO 같은 객체들이 대표적인 POJO 이다.
package com.kh.jpa.dto;
import com.kh.jpa.entity.Board;
import com.kh.jpa.entity.BoardTag;
import com.kh.jpa.entity.Member;
import com.kh.jpa.entity.Reply;
import com.kh.jpa.enums.CommonEnums;
import lombok.*;
import org.springframework.web.multipart.MultipartFile;
import java.time.LocalDateTime;
import java.util.List;
public class BoardDto {
// 게시글 조회
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Builder
public static class Response {
private Long board_no;
private String board_title;
private String board_content;
private String origin_name;
private String change_name;
private LocalDateTime create_date;
private Integer count;
private String user_id;
private String user_name;
private List<String> tags;
public static Response toDto(Board board) {
return Response.builder()
.board_no(board.getBoardNo())
.board_title(board.getBoardTitle())
.board_content(board.getBoardContent())
.change_name(board.getChangeName())
.origin_name(board.getOriginName())
.count(board.getCount())
.create_date(board.getCreateDate())
.user_id(board.getMember().getUserId())
.user_name(board.getMember().getUserName())
.tags(board.getBoardTags()
.stream()
.map(boardTag -> boardTag.getTag()
.getTagName())
.toList())
.build();
}
public static Response toSimpleDto(Board board) {
return Response.builder()
.board_no(board.getBoardNo())
.board_title(board.getBoardTitle())
.origin_name(board.getOriginName())
.count(board.getCount())
.create_date(board.getCreateDate())
.user_id(board.getMember().getUserId())
.build();
}
}
// 게시글 작성
@Getter
@AllArgsConstructor
@Builder
public static class Create {
private String board_title;
private String board_content;
private String board_writer;
private MultipartFile file;
private List<String> tags;
public Board toEntity() {
return Board.builder()
.boardTitle(this.board_title)
.boardContent(this.board_content)
.build();
}
}
// 게시글 수정
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Builder
public static class Update {
private String board_title;
private String board_content;
}
}
그렇다면 " 엔티티도 POJO 아닌가? DB에 대한 정보만을 담고 있잖아. " 라고 생각을 해봤는데, 엔티티는 POJO 와는 거리가 멀다.
그 이유는 엔티티 클래스는 JPA 의 여러가지 어노테이션들을 사용해서 Spring 프레임워크에 많은 영향을 받는 클래스 이기 때문이다. POJO 라는 개념은 프레임워크에 영향을 받지 않는 순수한 자바 객체이다. 그런 면에서 엔티티는 POJO 와 거리가 멀 수 있다고 볼 수 있겠다.
@Getter
@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED) //JPA 스펙상 필수 + 외부 생성 방지
@AllArgsConstructor
@Builder
public class Board
Board 엔티티 클래스 인데, 어노테이션만 봐도 상당히 많은 JPA라는 영속성 프레임워크를 사용하는 것 을 볼 수 있다.
그런면에서 보면 지금 우리가 공부하고 있는 스프링 쪽에서는 DTO, VO 정도만 POJO 라고 볼 수 있겠다.
'JAVA' 카테고리의 다른 글
| [Java] Java 에서는 객체 복제를 어떻게 할까? (0) | 2025.04.26 |
|---|---|
| [Java] Jave 의 컬렉션 프레임워크는 무엇일까? (2) | 2025.04.23 |
| [Java] Generics은 무엇이고 왜 사용할까? (0) | 2025.04.22 |
| [Java] 인터페이스를 사용하는 이유는 무엇일까? (0) | 2025.04.21 |
| [Java] GC(가비지 컬렉션)이란? (1) | 2025.04.21 |