Junhan0037/blog-code

기본설정


예를 들어 중개료 계약서 관리 라는 시스템을 만든다고 하겠습니다.계약서의 항목은 다음과 같습니다.

가장 쉽게 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);
}