JPA 의 Entity 는 반드시 public 또는 protected 로 선언된 기본생성자가 필요하다.
Entity 의 모든 필드에 대해 Setter 를 생성하고, 기본생성자를 public 으로 선언할 경우,
개별 단위로 필드가 자유롭게 수정될 수 있기때문에
다른 팀원, 혹은 시간이 흐른후 자신이 봐도 그 의도를 파악하기 어렵고, 객체의 일관성을 보장할 수 없다.
Setter 를 생성하는 것 보다 별도의 Business method 를 생성하는 것이 누가 보더라도 의도를 쉽게 파악할 수 있고,
일관성을 유지할 수 있다.
JPA 의 구현체인 hibernate 에서 제공하는 다양한 기능은
개발자가 만든 Entity 자체에서 작동되지 않고 hibernate 가 만든 proxy 객체에서 진행되는데,
proxy 객체를 생성하기 위해서 hibernate 는 Entity 의 기본생성자를 통해서 만들게 된다.
이때 public 으로 모든 계층에 생성자를 열어두면 Setter 를 사용했을 때 와 비슷한 문제가 발생해,
hibernate 만 생성자를 쓸 수 있게 protected 로 보호해주어야 된다.