http://wiki.javajigi.net/display/WEB20/4.+Ajax+Application+Examples
위 링크에 있는 포함되어 있는 소스코드를 살펴보다가 재밌는 코드를 발견했습니다.

import java.io.Serializable;

import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;

/**
 * 주석을 넣어 주세요. 배가 고파요.
 *
 * @author 박재성(자바지기 - javajigi@gmail.com)
 */
public class BaseObject implements Serializable {
    public String toString() {
        return ToStringBuilder.reflectionToString(this,
                ToStringStyle.MULTI_LINE_STYLE);
    }

    public boolean equals(Object o) {
        return EqualsBuilder.reflectionEquals(this, o);
    }  

    public int hashCode() {
        return HashCodeBuilder.reflectionHashCode(this);
    }
}

박재성님께서 작성하신 클래스 같은데요. Entity가 될 도메인 클래스에서 위의 클래스를 상속받으면 도메인 클래스에서 equals()와 hashCode() 그리고 toString()을 오버라이딩 할 필요가 없어집니다.

equals()와 hashCode()는 객체의 동일성을 검사할 때 사용하는 메소드로 Hash Code를 사용하는 콜렉션(HashSet 같은)을 사용할 때 꼭 구현해 줘야 하며, EJB 3.0의 JPA나 Hibernate 같은 ORM을 사용하여 객체를 유일한 단위로 식별해야할 필요가 있는 클래스는 반드시 오버라이딩하도록 권장하고 있는 메소드들이기도 합니다.

따라서 일일히 도메인 클래스마다 구현해야할 메소드를 리플랙션을 사용해서 구현해 놓은 것 같은 Commons Lang API를 사용하면 개발 시간이 엄청나게 단축됩니다. 특히나 이 jar파일은 spring.jar파일이 의존하고 있는 유일한 jar파일 이기도 하기 때문에 라이브러리 추가로 인한 추가 비용이 제로에 가깝다고 할 수 있습니다.

왜 이렇게 좋은 API를 이제야 알았는지 모르겠네요. 박재성님께서 쓰신 Spring 워크북에서도 얼핏 보고 그냥 지나친 것 같은데 그 때 좀 더 자세히 살펴볼 걸 하는 아쉬움이 생깁니다.