JPA Entity 는 왜 빈(empty) 생성자를 필요로 하는가?

jpa를 이용하여 엔티티를 작성하는 경우 간혹 비어있는 생성자를 만들어야 하는 경우가 있다.여기서 말하는 “간혹”이라는 경우는, 사용자가 자바에서 제공하는 기본 생성자를 사용하지 않고,생성자를 재정의 하는 경우인데, 이 때 재 정의하는 생성자가 파라미터를 필요로 하는 경우이다.


public Member(long memberId) {

this.memberId = memberId;
....
}

이렇게 생성자를 재정의 해 놓게 되면, 하이버네이트 등의 프레임워크에서 리플렉션을 이용해 해당 객체를 생성할 때 해당 객체(엔티티)의 기본 생성자를 호출하게 되는데 위와 같이 파라미터가 필요한 생성자로 재정의 한다면

Class<T>.newInstance

를 이용해서 해당 엔티티의 객체를 만들어 낼 수 없게 된다.

그래서, 사용자가 파라미터가 필요한 생성자를 재정의 하는 경우에는 반드시 파라미터가 없는 기본 생성자를 제공해 주어야 한다.

참고로 스프링 데이터를 사용하는 경우라면 위와 같은 파라미터가 필요한 생성자를 재정의하더라도 @PersistenceConstructor 어노테이션을 재정의한 생성자에 붙이게 되면 굳이 비어있는 생성자를 호출하지 않아도 된다.

@PersistenceConstructor
public Member(Long memberId) {
this.memberId = memberId;

….
}
참고로 jpa 2.0 스펙에 다음과 같이 명시되어 있다.

“엔티티는 반드시 파라미터가 없는 (no-arg) public 또는 protected 생성자가 있어야 한다.”

비난하기

비난하기
대학에 다니던 시절에 꽤 오랜시간을 일식집 주방에서 파트타이머로 근무 했었다. 일하던 기간동안 주방장이 몇 차례 바뀌었는데 이상하게도 새로 들어온 주방장은 꼭 이전 주방장이 만들어 놓았던 소스류의 맛이나 주방 시스템 체계등을 비난하면서 일을 시작하는 것이다. 
계속 근무하고 있던 입장인 나는 이전 주방장과 더 친밀한 관계를 가지고 있는데 그런 비난을 듣고 있자니 여간 불편한게 아니었다. 
더구나 비난의 대상이 되는 주방 시스템(일하는 체계)은 몇년동안 해당 환경에서 시행착오를 거치면서 최적화 된 시스템이었고, 새로 막 들어온 사람이라면 그 배경을 모르고서는 이해할 수 없는 여러가지 복잡한 이유를 바탕으로 구축된 체계였으며 비난하던 당사자도 결국에는 당신이 비난하던 그 비슷한 모습으로 시스템을 변화시켜 나가고는 했다.

 

지금 나는 소프트웨어 아키텍트로 일하고 있는데, 거의 대부분의 경우 먼저 만들어져 있는 아키텍처 기반에서 작업을 하는 경우가 많다. (새로운 주방에서 일을 시작하는 주방장처럼..)
보통 많은 아키텍트(나를 포함)들이 신규 사이트에 들어오면서 기존(as-is)의 아키텍처를 부정(비난)하는 것으로 부터 일을 시작하는 경우를 많이 본다.
모든 경우에 그런 것은 아니겠지만, 그렇게 함으로서 자신의 능력이 더욱 돋보일거라 생각하는 측면이 없지는 않을 것이다. 
얼마전 우연하게  근무하던 전 직장에서 수행한 프로젝트의 아키텍를 비난하는 얘기를 들은적이 있다. 

그 당시에는 내가 역량이 많이 부족하기 했지만, 사실 비난 받았던 이유는 그런 측면이 아니었다. 내가 그 시스템을 구축하던 당시의 상황과 배경정보를 전혀 고려하지 않고 현재의 상황에 대입해서 비난을 하고 있다고 생각하니 화도 많이 나기도 했지만 억울하기도 한 생각이 들었다.
그러면서 들었던 생각은, 그 동안 내가 비난했던 많은 레거시들도 지금의 그 모습을 갖게 되기 까지는 그 때 당시의 당면한 많은 문제들을 해결하고, 수많은 이해 관계 당사자들의 요구사항을 만족시키기 위해 나보다 훨씬 훌륭한 사람들이 깊은 고민을 한 결과일지도 모른다는 것이다. 
그래서 되도록 이미 만들어진 어떤 결과를 평할 때에는 지금의 기준에 비추어 보아 부족한 부분이 많이 보이더라도, 무턱데고 비난하기 보다는 그 모습을 갖게 된 그 당시의 시대적(?)상황을 이해해 보려고 노력하는 편이다. (하지만 아무리 그러려고 해도 도저히 이해하지 못할 경우도 많이 경험하곤 한다. -_-)
전임 주방장의 고충을 잘 이해하고 나면, 훨씬 더 훌륭한 주방장이 될 수도 있지 않을까? 혹은 내 비난이 부메랑이 될 수도 있을 거라는 그런 생각이 드는 오늘이다.