자바빈(JavaBean) 이란?
자바빈이란 특정한 기능을 지닌 컴포넌트를 말하는 것이 아닙니다.
간단히 말하자면 자바빈 규약 또는 자바빈 관례에 따라 만들어진 클래스를 의미합니다.

자바빈 사용 배경
자바빈은 원래 비주얼 툴에서 조작하는 컴포넌트를 의미했지만 자바가 웹기반 엔터프라이즈 플랫폼이 주력이 되면서 비주얼 툴은 인기를 잃어갔습니다. 그러나 비주얼 툴에서의 자바빈의 몇 가지 코딩 관례(또는 패턴)는 Java EE의 JSP 빈, EJB 등의 표준기술과 자바빈을 이용하는 오픈소스 기술들을 통해 사용되어져 왔습니다. 자바빈 관례를 이용하여 어플리케이션 개발 개발 생산성을 늘릴 수 있는 기술들이 많이 등장했기 때문입니다. 자바빈의 코딩 관례는 대표적으로 jsp나 스프링에서도 흔히 볼 수 있습니다.
ex) 스프링의 <bean>, <property> 태그, jsp <jsp:useBean>, <jsp:setProperty> 태그 등..


자바빈 규약
자바빈은 자바빈 규약(관례, 규칙) 을 따르는 클래스라고 하였습니다.
자바빈 규약에는 다음과 같은 규칙들이 있습니다.


1. 패키지 - 자바빈은 기본(default)패키지 이외의 특정 패키지에 속해 있어야 한다.
자바빈은 기본 패키지가 아닌 특정한 패키지에 속해 있어야 합니다.

아래 BeanSample 클래스는 default package 에 속해 있으므로 자바빈 규약에 만족하지 않습니다.
클래스 코드를 보아도 어느 패키지에 속하는지 package 키워드가 명시되어 있지 않습니다.

 

1
2
3
4
public class BeanSample {                                
 
}
 
cs

 

자바빈 규약을 만족하기 위해서는 다음과 같이 특정 패키지에 속해 있어야 합니다.

 

1
2
3
4
5
package com.myapp.bean;
 
public class BeanSample {                            
 
}
cs


 



2. 기본 생성자가 존재해야 한다.
자바빈은 다음과 같이 오버로딩 되지 않은, 즉 매개변수 값이 없는 기본 생성자가 존재해야 합니다.
1
2
3
4
5
6
package com.myapp.bean; 
 
public class BeanSample { 
     public BeanSample(){}                                 
     
}
cs

 



3. 멤버변수의 접근제어자는 private로 선언되어야 한다.
멤버변수는 직접 접근할 수 없도록 private로 선언되어야 합니다.
1
2
3
4
5
6
7
8
9
package com.myapp.bean; 
 
public class BeanSample { 
     
     private String beanProperty;                             
 
     public BeanSample(){} 
     
}
cs

 


4. 멤버변수에 접근 가능한 getter 와 setter 메서드가 존재해야 한다.
위 3번 규칙때문에 해당 멤버변수에 접근 가능한 getter 메서드와 setter 메서드가 필요합니다.
메서드를 작성할때에도 규칙이 있는데 getter의 경우 get멤버변수이름 setter의 경우에는 set멤버변수이름 과 같은 식으로 작성해야 합니다.
이때 멤버변수이름의 첫 글자는 대문자로 바꿔 주어야 합니다. ex)getBeanProperty(), setBeanProperty()

 


5. getter 와 setter는 접근자가 public으로 선언되어야 한다.
4번과 연결되는 규칙입니다. getter와 setter는 어느 패키지에서나 접근 가능하도록 public으로 선언되어져야 합니다.
4번 규칙과 5번 규칙을 따르면 자바빈 클래스에는 다음과 같은 getter와 setter 메서드가 만들어집니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package com.myapp.bean; 
 
public class BeanSample { 
     
     private String beanProperty; 
 
     public BeanSample(){} 
 
     public String getBeanProperty() { 
           return beanProperty; 
     }
 
     public void setBeanProperty(String beanProperty) {                     
           this.beanProperty = beanProperty; 
     }
     
}
cs

 

 

멤버변수가 배열인 경우
멤버 변수가 배열형인 경우에는 다음과 같이 두가지 방법으로 getter와 setter를 만들 수 있습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package com.myapp.bean; 
 
public class BeanSample { 
     
     private String[] beanProperty; 
 
     public BeanSample(){} 
 
     public String[] getBeanProperty() { 
           return beanProperty; 
     }
 
     public void setBeanProperty(String[] beanProperty) {                     
           this.beanProperty = beanProperty; 
     }
 
 
}
cs

 

배열의 경우 이후 다음과 같이 배열의 일부 값을 가져오거나 일부 값을 설정하도록 getter와 setter를 추가할 수 있습니다.
1
2
3
4
5
6
7
8
     public String getBeanProperty(int index) {
           return beanProperty[index];
     }
 
     public void setBeanProperty(String beanProperty, int index) {                        
           this.beanProperty[index] = beanProperty;
     }
 
cs

 


6. 직렬화 되어 있어야 한다. (선택사항)
객체 직렬화란 객체를 입출력에 사용할 수 있도록 객체의 멤버들을 바이트 형태로 변환시키는 것입니다.
java.io.Serializable 인터페이스를 상속하여 직렬화할 수 있습니다.
객체를 바이트 스트림으로 변환하는 것을 마샬링(Marshalling) 이라고 하며, 반대로 객체화 하는것을 언마샬링이라고 합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package com.myapp.bean;
 
import java.io.Serializable;
 
public class BeanSample implements Serializable {
     
     private static final long serialVersionUID = 1679166037496682065L;
     
     private String beanProperty;
 
     public BeanSample(){}
 
     public String getBeanProperty() {
           return beanProperty;
     }
 
     public void setBeanProperty(String beanProperty) {
           this.beanProperty = beanProperty;
     }
     
}
 
cs

 

지금까지 자바빈 규약에 대해 알아 보았습니다.
자바빈 규약에 따라 클래스를 작성하는 것은 번거로울 수 있습니다. 또한 작성하다가 get,setter에 멤버변수명을 소문자로 시작한다든지 하는소스코드에 오타가 발생하는 경우 자바빈을 사용하는 기술이 동작하지 않을 수 있습니다.

이럴때에는 이클립스 등의 IDE의 기능을 이용하여 조금 더 쉽게 자바빈을 작성할 수 있습니다.

블로그 이미지

도로락

IT, 프로그래밍, 컴퓨터 활용 정보 등을 위한 블로그

댓글을 달아 주세요! 질문 환영합니다!