Java Bean 이란?
자바 빈은 속성(데이터), 변경 이벤트, 객체 직렬화를 위한 표준으로, 특정 규약을 지킨 클래스를 자바 빈이라고 부른다.
규약은 다음과 같다.
- 클래스는 인자(Argument)가 없는 기본 생성자(Default constructor)를 갖는다.
- 클래스의 멤버 변수는 프로퍼티(Properties) 라고 하며, private 접근 제한자를 가져야 한다.
- 클래스의 프로퍼티들은 Getter / Setter를 통해 접근 가능해야 한다.
- Getter의 이름은 get{프로퍼티 이름}이고, Setter의 이름은 set{프로퍼티 이름}이어야 한다.
- Getter / Setter의 접근 제한자는 public이어야 한다. (접근 하기 위하여)
- 프로퍼티의 자료형이 Boolean일 경우 is로 시작할 수 있다.
- Getter의 메소드는 인자가 존재하지 않아야 하고, Setter는 하나 이상의 인자가 필요하다.
- Read Only 값인 경우 Setter는 존재할 수 없다.
- 클래스는 직렬화 되어야 한다. (클래스의 상태를 지속적으로 저장 또는 복원 시키기 위해서)
- 패키징 되어야 한다.
해당 사항을 정리하며, 대부분 스프링에서 빈(클래스)을 만들 때 대부분 구현했던 것이다.
그리고 이것들은 일일이 만드는 것에 대한 번거로움으로 lombok 이라는 좋은 친구도 있다.
하지만 "클래스는 직렬화 되어야 한다." 이 부분은 생소하다.
먼저, 직렬화란 무엇인가?
자바 직렬화는 자바 시스템 내부에서 사용되는 객체 또는 데이터를 외부의 자바 시스템에서도 사용할 수 있도록 바이트 형태로 데이터를 변환하는 기술을 말한다. JVM의 메모리에 상주(힙 또는 스택) 되어 있는 객체 데이터를 바이트 형태로 변환하는 기술이다.
쉽게 말하면, 생성한 객체를 파일로 저장해야 된다거나, 저장한 객체를 읽어야 되거나, 다른 서버에서 생성한 객체를 받을 일이 생길 수 있기 때문이다. 이러한 작업을 하려면 반드시 Serializable 인터페이스를 구현해야 한다.
간단히 말해, implements java.io.Serializable 만 해주면 된다.
위와 같은 직렬화는 서블릿 세션, 캐시, 자바 RMI를 사용한다면 거의 반드시 필요할 것이다.
돌아와서, 자바 빈 예제
다시 자바 빈 이야기로 돌아와서, 다음 아래와 같이 "자바 빈" 이라고 부를 수 있는 클래스를 구현하였다.
Person 클래스는 java.test에 패키징 되었고 => 5번째 조건 만족
그리고 implements java.io.Serializable 를 상속받는다. => 4번째 조건 만족
public Person() 으로 인자가 없는 기본 생성자가 있다. => 1번째 조건 만족
멤버 변수 name, birth, use는 모두 private 접근 제한자를 가진다. => 2번째 조건 만족
세 개의 프로퍼티는 Getter, Setter로 접근이 가능하다. => 3번째 조건 만족
package java.test;
import java.util.Date;
public class Person implements java.io.Serializable {
private String name;
private Date birth;
private Boolean use;
public Person() {
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public Date getBirth() {
return this.birth;
}
public void setBirth(Date birth) {
this.birth = birth;
}
public Boolean isUse() {
return this.use;
}
public void setUse(Boolean use) {
this.use = use;
}
}
정리하고 난 뒤
내가 평소에 수 없이 만들던 클래스가 자바 빈이었구나.. 다시 한 번 제대로 자바 빈이라는 개념을 명확히 할 수 있어 좋았다.
그리고 이제 자바 빈이 무엇인가 하면 옆에 조용히 가서 소근소근 얘기해줄 수 있겠다.
또, 자바 직렬화는 기회가 된다면 더 정확히 한 번 다루어 정리하는 것이 좋을 것 같다.
참조 글
- https://techblog.woowahan.com/2550/
- https://ko.wikipedia.org/wiki/자바빈즈
- https://hbase.tistory.com/161
- https://pjh3749.tistory.com/75
- https://devlog-wjdrbs96.tistory.com/268
- https://steady-coding.tistory.com/576