POJO란 무엇일까?

2025. 5. 21. 09:29·JAVA

 

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
'JAVA' 카테고리의 다른 글
  • [Java] Java 에서는 객체 복제를 어떻게 할까?
  • [Java] Jave 의 컬렉션 프레임워크는 무엇일까?
  • [Java] Generics은 무엇이고 왜 사용할까?
  • [Java] 인터페이스를 사용하는 이유는 무엇일까?
동준1234
동준1234
공부 기록
  • 동준1234
    dongjundev
    동준1234
  • 전체
    오늘
    어제
  • GitHub
    • 분류 전체보기 (150)
      • 일상 (1)
      • 복습 및 회고록 (26)
      • Spring (17)
      • JAVA (32)
      • kubernetes (1)
      • Front-End (13)
      • Server (11)
      • SQL (20)
        • JDBC (1)
      • 자격증 (7)
        • 정보처리기사 필기 준비 (6)
        • 정보처리기사 실기 준비 (0)
        • SQLD (1)
      • project (18)
        • 백준 및 코딩테스트 공부 (6)
        • 대학교 캡스톤 디자인 (6)
        • 4학년 캡스톤 디자인 및 전시회 (3)
      • 네트워크 (3)
      • AI 머신러닝 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • GitHub
  • 공지사항

  • 인기 글

  • 태그

    react
    프론트
    jQuery
    JavaScript
    개발자
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
동준1234
POJO란 무엇일까?
상단으로

티스토리툴바