예를 들어 중개료 계약서 관리 라는 시스템을 만든다고 하겠습니다.계약서의 항목은 다음과 같습니다.
가장 쉽게 domain 클래스를 작성해보면 아래와 같습니다.
Contract.java
@Entity
public class Contract {
@Id
@GeneratedValue
private Long id;
@Column(nullable = false)
private String company;
@Column(nullable = false)
private double commission; // 수수료
@Column(nullable = false)
private String commissionType; // 수수료 타입 (예: 퍼센테이지, 금액)
@Column(nullable = false)
private String commissionCutting; // 수수료 절삭 (예: 반올림, 올림, 버림)
public Contract() {}
public Contract(String company, double commission, String commissionType, String commissionCutting) {
this.company = company;
this.commission = commission;
this.commissionType = commissionType;
this.commissionCutting = commissionCutting;
}
public Long getId() {
return id;
}
public String getCompany() {
return company;
}
public double getCommission() {
return commission;
}
public String getCommissionType() {
return commissionType;
}
public String getCommissionCutting() {
return commissionCutting;
}
}
대부분이 String으로 이루어진 간단한 domain입니다.
(company의 경우 이번 시간에 주요 항목이 아니기 때문에 별도의 테이블 분리 없이 문자열로 다루겠습니다. 원래는 테이블로 분리해야할 대상입니다^^)
domain클래스를 보시면 setter가 없습니다. 이는 의도한 것인데, getter와 달리 setter는 무분별하게 생성하지 않습니다.
domain 인스턴스에 변경이 필요한 이벤트가 있을 경우 그 이벤트를 나타낼 수 있는 메소드를 만들어야하며, 무분별하게 값을 변경하는 setter는 최대한 멀리하시는게 좋습니다. (예를 들어, 주문취소 같은 경우 setOrderStatus()
가 아니라 cancelOrder()
를 만들어서 사용하는 것입니다.똑같이 orderStatus를 변경할지라도, 그 의도와 사용범위가 명확한 메소드를 만드는것이 중요합니다.)
그리고 이 domain을 관리할 repository를 생성하겠습니다.
ContractRepository.java
public interface ContractRepository extends JpaRepository<Contract, Long>{
Contract findByCommissionType(String commissionType);
Contract findByCommissionCutting(String commissionCutting);
}