Apache Common BeanUtils

프로그래밍/JAVA 2017. 7. 21. 18:01


JSP 내에서 EL문법으로 표시되는 코드는 ${param.userName} 내부적으로 Java 리플렉션을 사용하여 값을 표시하게 됩니다. 

흔히, 리플렉션을 사용하는 코드는 느리다는 편견이 있습니다. 그런 편견에서 벗어나서 좀 더 자유로운 자바 코딩의 재미를 느껴보시길 바랍니다.



Apache Common BeanUtils

http://commons.apache.org/proper/commons-beanutils/

commons-beanutils.jar


Java에서 제공하는 Reflection 과 Introspection API 를 지원하는 유틸클래스


2. JavaBeans 표준

public class Employee {

public Address getAddress(String type);

public void setAddress(String type, Address address);

public Employee getSubordinate(int index);

public void setSubordinate(int index, Employee subordinate);

public String getFirstName();

public void setFirstName(String firstName);

public String getLastName();

public void setLastName(String lastName);

}

BeanUtils 를 사용하기 위해서는 프로퍼티(property) 에 접근할 수 있는 set, get 메소드가 제공되어야 한다.

즉, firstName 프로퍼티에 접근하기 위한 getFirstName(), setFirstName( String) 메소드가 있어야 한다.


BeanUtils 에서 가장 자주 쓰이는 유틸클래스는 PropertyUtils 클래스이며 

PropertyUtils 클래스는 3가지 프로퍼티 유형에 따른 접근 방법을 제공한다.


  • Simple - Employess의 firstName, lastName 프로퍼티 처럼 하나의 값을 인자로 전달하는 경우
  • Indexed - Employess의 subordinate 프로퍼티 처럼 값을 가져오기 위해 index 정보가 요구되는 경우
  • Mapped - Employess의 address 프로퍼티 처럼 값을 가져오기 위해 key 정보가 요구되는 경우


2.2 JavaBean 프로퍼티에 접근하는 방법

  • Simple

Employee emp = new Employee();


PropertyUtils.setSimpleProperty( emp, firstName, "Hong");

=> emp.setFirstName( "Hong");


PropertyUtils.getSimpleProperty( emp, firstName);

=> emp.getFirstName();

<위, 아래 두개의 코드가 하는 결과는 동일하다>

  • Indexed

PropertyUtils.getIndexedProperty( emp, "subordinate[0]");

PropertyUtils.getIndexedProperty( emp, "subordinate", 0);

=> 위 두 메소드의 결과는 같다. getIndexedProperty 를 사용할 메소드는 int index 인자를 갖고 있어야 한다.

subordinate[0] 는 getSubordinate 메소드로 리턴되는 결과의 0 번째 라는 의미이다.


PropertyUtils.setIndexedProperty( emp, "subordinate[0]", subordinate);

PropertyUtils.setIndexedProperty( emp, "subordinate", 0, subordinate);

=> setIndexedProperty 메소드드 또한 int index 인자를 갖고 있어야 한다.


  • Mapped

PropertyUtils.getMappedProperty( emp, "address(home)");

PropertyUtils.getMappedProperty( emp, "address", "home");

=> 위 두 메소드의 실행 결과는 같다


PropertyUtils.setMappedProperty( emp, "address(home)", address);

PropertyUtils.setMappedProperty( emp, "address", "home", address);



2.3 Nested Property Access

String city = emp.getAddress( "home").getCity();

위 처럼 Adress -> home -> city 로 여러번의 걸쳐 정보를 가져오는 경우 

String city = (String)PropertyUtils.getNestedProperty( emp, "address(home).city");


위에 설명한 indexed, mapped 를 혼합하여 사용이 가능한다.

String city = (String)PropertyUtils.getProperty( emp, "subordinate[3].address(home).city");

: