자바(Java) 강의

JavaBean이란?

삐멜 2019. 9. 2. 06:07

JavaBean이라는 말을 많이 들어 보았을 것이다. 예를들어 스프링을 사용하는 경우 @Bean이라는 어노테이션을 사용해 봤다던가, XML에 아래와 같은 선언을 해본적이 있을 것이다.

<beans>
    <bean name="Service" class="com.fsoftwareengineer.ServiceImpl"/>
</beans>

그렇다면 JavaBean이란 정확히 무엇인가?

JavaBean

JavaBean은 JavaBean API Specification에 따른 Standard이다. 여러분은 클래스이름은 CapitalCase로, 필드나 메서드 이름은 camelCase로 쓰라는 말을 많이 들어 봤을 것이다. 사실 클래스 이름을 Capital Case가 아닌 다른 형식을 사용한다고 누가 잡아가는것은 아니다. 하지만 개발자들 사이에서는 보통 이런 규칙을 지킨다. 이를 Standard라고 한다.

JavaBean이란, 3가지 규칙을 지키는 클래스이다.

  1. 모든 필드는 private이며, getter/setter메서드를 통해서만 접근이 가능하다.
  2. Argument가 없는(no-argument) 생성자가 존재한다.
  3. java.io.Serializable 인터페이스를 구현한다.

다시 말해 아래처럼 생긴 클래스를 JavaBean이라고 부른다.

import java.io.Serializable;

public class SomeBean implements Serializable {
private String beanName;
private int beanValue;

public SomeBean() {
// no-argument constructor
}

public String getBeanName() {
return beanName;
}

public void setBeanName(String beanName) {
this.beanName = beanName;
}

public int getBeanValue() {
return beanValue;
}

public void setBeanValue(int beanValue) {
this.beanValue = beanValue;
}
}

무엇을 위한 규칙인가?

왜 JavaBean을 만들었을까? 왜 이런 제약을 걸었을까? JavaBean의 목적은 여러가지 다른 오브젝트들을 하나의 오브젝트(Bean)에 담기 위함이다. JavaBean의 규칙을 소프트웨어 프로토콜이라고 생각하면 쉽다.

왜 Private 필드와, Getter/Setter만으로 이루어져 있는가? 

이는 JavaBean만의 스탠다드는 아니다. 이런 스탠다드를 지키는 클래스를 POJO(Plain Old Java Object)라고 부른다. private, getter, setter를 이용하는 이유는 Encapsulation을 위해서이다.

왜 No-Argument 생성자를 사용하는가?

예를 들어서, 어떤 다른 소프트웨어가 SomeBean을 프로그램 내에서 생성하고 싶다.

public class BeanCreator {

public Object create() throws ClassNotFoundException, IllegalAccessException, InstantiationException {
String classPath = "SomeBean";
Class cls = Class.forName(classPath);
return cls.newInstance();
}
}

이 때, 생성자에 Argument가 있다면 어떻게 되는가? 이 소프트웨어는 Argument가 몇개인지, 어떤 필드에 맵핑되는지 찾아야 한다. Argument가 없는 생성자를 반드시 만들면 위처럼 오브젝트를 런타임(Runtime)에 생성해 주는 프로그램은 오브젝트 생성 → getter/setter를 이용해 값 설정으로 단순하게 목적을 달성 할 수 있다.

왜 java.io.Serializable 인터페이스를 구현하는가?

JavaBean의 목적은 여러가지 오브젝트들을 하나의 오브젝트에 담기 위함이라고 했다. 담아서 뭘 하는가? 우리는 보통 담아서 네트워크를 통해 전송하거나, 파일/데이터베이스에 저장하거나 한다. 메모리에 존재하는 오브젝트를 네트워크를 통해 전송하거나 파일에 저장하려면 data stream(e.g, byte[])으로 이 오브젝트를 변환시켜줘야 한다. 이 변환 작업을 Serialization이라고 부른다. JavaBean을 저장하거나 전송하는 일이 많기 때문에, Serializable가 스탠다드에 포함되는것으로 추정된다.