POJO란?
POJO는 Plain 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 |