JAVA

POJO

euicheol0910 2025. 5. 21. 10:28

POJO란?

POJOPlain Old Java Object의 약자로,
단순하고 일반적인 자바 객체를 의미합니다.

 

POJO의 특징

  • 특별한 상속이나 구현 없이, 그냥 일반적인 자바 클래스(객체)이다.
  • 보통 필드(private) + getter/setter + 기본 생성자 형태를 가진다.
  • JavaBean과 비슷하지만, JavaBean이 되려면 좀 더 엄격한 규칙(Serializable 구현, 기본 생성자 필수 등)이 필요하지만 POJO는 그런 제약이 없다.
  • 프레임워크에 종속적이지 않고, 특정 어노테이션이나 인터페이스를 꼭 구현하지 않아도 됨.

 

POJO 예시

 

public class User {
    private String name;
    private int age;

    public User() {}  // 기본 생성자

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

    public int getAge() { return age; }
    public void setAge(int age) { this.age = age; }
}

 

 

POJO가 아닌 경우

  • 특정 프레임워크의 클래스를 상속받거나,
  • 특정 인터페이스를 구현해야 하거나,
  • 복잡한 의존성 주입이나 특정 API에 종속적인 경우.

 

public class MyServlet extends HttpServlet {
    // HttpServlet 상속 → POJO 아님
}

public class SpringBean implements ApplicationContextAware {
    // 스프링 프레임워크 특정 인터페이스 구현 → POJO 아님
}

@Entity
public class UserEntity {
    @Id
    private Long id;
    // JPA 어노테이션 사용 → 엄밀히 말하면 POJO라기 보단 엔티티 객체
}

 

참고:
엄밀히 따지면 @Entity 붙은 JPA 엔티티도 보통 POJO 스타일이지만, 프레임워크에 특화된 기능 때문에 “POJO”라고 부르지 않는 경우도 많습니다.

구분  POJO  POJO 아님
상속/구현 없음 프레임워크 클래스 상속/인터페이스 구현
어노테이션 없음 또는 단순한 POJO 어노테이션 특정 프레임워크 전용 어노테이션 사용
의존성 독립적, 프레임워크 비종속 프레임워크에 의존
목적 단순 데이터 저장, 전달 특정 기능 수행(서블릿, 빈 등)

 

 

OJO 작성 시 좋은 관례 (Best Practices)

POJO는 "단순한 자바 객체"지만, 유지보수성과 재사용성을 위해 다음과 같은 규칙을 지키는 것이 좋습니다.

 

1. 필드는 private로 선언하고 getter/setter 제공

  • 캡슐화를 유지하기 위함.
private String name;

public String getName() {
    return name;
}

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

(옛 생각이 나는구만...)

 

2. 기본 생성자(Default Constructor) 제공

  • 프레임워크, 라이브러리, 리플렉션에서 객체 생성 시 사용됨.
public User() {
    // 기본 생성자
}

 

3. toString(), equals(), hashCode() 재정의

  • 디버깅이나 컬렉션(Set, Map)에서 정확한 동작을 위해
@Override
public String toString() {
    return "User{name='" + name + "', age=" + age + "}";
}

 

4. 불변성(Immutable) 객체가 필요한 경우, setter를 없애고 final 사용

public class User {
    private final String name;

    public User(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

'JAVA' 카테고리의 다른 글

SpringBoot VS Spring  (1) 2025.06.16
프록시 패턴과 AOP  (0) 2025.05.26
JAVA 깊은 복제와 얕은 복제  (1) 2025.04.28
JAVA 어노테이션  (0) 2025.04.28
자바의 제네릭에 대하여  (3) 2025.04.23