POJO 클래스는 무엇입니까?

1. 개요

이 짧은 자습서에서는 "Plain Old Java Object" 또는 POJO 의 정의를 간략히 살펴 보겠습니다 .

POJO가 JavaBean과 어떻게 비교되는지, 그리고 POJO를 JavaBeans로 바꾸는 것이 어떻게 도움이 될 수 있는지 살펴 보겠습니다.

2. 일반 오래된 자바 객체

2.1. POJO 는 무엇입니까 ?

POJO에 대해 이야기 할 때 우리가 설명하는 것은 특정 프레임 워크에 대한 참조가없는 간단한 유형입니다. POJO에는 속성 및 메서드에 대한 명명 규칙이 없습니다 .

기본적인 직원 POJO를 만들어 보겠습니다. 세 가지 속성이 있습니다. 이름, 성, 시작일 :

public class EmployeePojo { public String firstName; public String lastName; private LocalDate startDate; public EmployeePojo(String firstName, String lastName, LocalDate startDate) { this.firstName = firstName; this.lastName = lastName; this.startDate = startDate; } public String name() { return this.firstName + " " + this.lastName; } public LocalDate getStart() { return this.startDate; } }

이 클래스는 프레임 워크에 연결되어 있지 않으므로 모든 Java 프로그램에서 사용할 수 있습니다.

그러나 우리는 클래스의 상태를 구성, 액세스 또는 수정하는 실제 규칙을 따르지 않습니다.

이러한 규칙의 결여로 인해 두 가지 문제가 발생합니다.

첫째, 사용 방법을 이해하려는 코더의 학습 곡선을 증가시킵니다.

둘째, 구성보다 규칙을 선호하고, 클래스 사용 방법을 이해하고, 기능을 강화하는 프레임 워크의 기능을 제한 할 수 있습니다.

이 두 번째 요점을 살펴보기 위해 리플렉션을 사용하여 EmployeePojo로 작업 해 보겠습니다 . 따라서 우리는 몇 가지 한계를 찾기 시작할 것입니다.

2.2. POJO로 반사

프로젝트에 commons-beanutils 종속성 을 추가해 보겠습니다 .

 commons-beanutils commons-beanutils 1.9.4 

이제 POJO의 속성을 살펴 보겠습니다.

List propertyNames = PropertyUtils.getPropertyDescriptors(EmployeePojo.class).stream() .map(PropertyDescriptor::getDisplayName) .collect(Collectors.toList());

우리가 인쇄 인 경우 로 propertyNames을 콘솔에, 우리는 볼 것 :

[start] 

여기에서 우리 는 클래스의 속성으로 만 시작 된다는 것을 알 수 있습니다. PropertyUtils 는 다른 두 개를 찾지 못했습니다.

EmployeePojo 를 처리하기 위해 Jackson과 같은 다른 라이브러리를 사용했을 때와 동일한 결과를 볼 수있었습니다 .

이상적으로는 모든 속성 인 firstName , lastNamestartDate를 볼 수 있습니다. 좋은 소식은 많은 Java 라이브러리가 기본적으로 JavaBean 명명 규칙을 지원한다는 것입니다.

3. 자바빈

3.1. 무엇인가 자바 빈즈는 ?

JavaBean은 여전히 ​​POJO이지만 구현 방법에 대한 엄격한 규칙 세트를 도입합니다.

  • 액세스 수준 – 속성은 비공개이며 getter 및 setter를 노출합니다.
  • 메소드 이름 – getter 및 setter는 getXsetX 규칙을 따릅니다 (부울의 경우 getter에 isX를 사용할 수 있음).
  • 기본 생성자 – 인수를 제공하지 않고 인스턴스를 만들 수 있도록 인수가없는 생성자가 있어야합니다 (예 : 역 직렬화 도중).
  • 직렬화 가능 – 직렬화 가능 인터페이스를 구현 하면 상태를 저장할 수 있습니다.

3.2. JavaBean으로서의 EmployeePojo

따라서 EmployeePojo 를 JavaBean으로 변환 해 보겠습니다 .

public class EmployeeBean implements Serializable { private static final long serialVersionUID = -3760445487636086034L; private String firstName; private String lastName; private LocalDate startDate; public EmployeeBean() { } public EmployeeBean(String firstName, String lastName, LocalDate startDate) { this.firstName = firstName; this.lastName = lastName; this.startDate = startDate; } public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } //  additional getters/setters }

3.3. JavaBean으로 반사

리플렉션으로 빈을 검사하면 이제 전체 속성 목록을 얻습니다.

[firstName, lastName, startDate]

4. JavaBeans를 사용할 때의 장단점

그래서 우리는 JavaBeans가 도움이되는 방법을 보여주었습니다. 모든 디자인 선택에는 절충안이 따릅니다.

JavaBeans를 사용할 때 몇 가지 잠재적 인 단점도 염두에 두어야합니다.

  • Mutability – 우리의 JavaBeans는 setter 메소드로 인해 변경 가능합니다. 이것은 동시성 또는 일관성 문제를 일으킬 수 있습니다.
  • Boilerplate – 대부분의 경우 모든 속성 및 setter에 대해 getter를 도입해야합니다.이 중 대부분은 불필요 할 수 있습니다.
  • 인수가없는 생성자 – 객체가 유효한 상태로 인스턴스화되도록 생성자에 인수가 필요한 경우가 많지만 JavaBean 표준에서는 인수가없는 생성자를 제공해야합니다.

이러한 트레이드 오프를 감안할 때 프레임 워크는 수년에 걸쳐 다른 빈 규칙에도 적용되었습니다.

5. 결론

이 튜토리얼에서는 POJO와 JavaBeans를 비교했습니다.

먼저 POJO는 특정 프레임 워크에 바인딩되지 않은 Java 객체이며 JavaBean은 엄격한 규칙 집합을 가진 특수한 유형의 POJO라는 것을 배웠습니다.

그런 다음 일부 프레임 워크와 라이브러리가 JavaBean 명명 규칙을 활용하여 클래스의 속성을 검색하는 방법을 살펴 보았습니다.

평소처럼 예제는 GitHub에서 사용할 수 있습니다.