인프런 커뮤니티 질문&답변

강우석님의 프로필 이미지

작성한 질문수

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

주문, 주문상품 엔티티 개발

Entity 내의 로직들, 생성 함수에 대한 질문

23.01.08 18:25 작성

·

1.3K

0

안녕하세요! 간단한 질문이 있어서 살짝 남겨보게 되었습니다.

1. 지금까지 JPA 강의를 들으면서 - "Entity 에는 Setter 를 열어두지 말고, Getter 만 열어둔채, 초기값 Setting 에는 생성자를 사용하라. 그리고 변경에 대해서 setter 가 필요하다면 그 때 열어두고, 연관관계에 대해 수정시 setting 외의 로직을 수행해야 하기 때문에 change, modify 등의 수식어를 사용해서 함수를 만들어라 ". 정도로 이해하고 있었습니다. 이 관점에서 createOrder() 함수는 설명해주신대로 그냥 Order 을 생성해주는 함수고, 초기값을 setting 해주는 함수인데, 이게 생성자와 어떤 점에서 다른지 이해가 잘 되지 못했습니다.

public Order(Member member, Delivery delivery, OrderItem ... orderItems){
    this.member = member;
    this.delivery = delivery;
    ... OrderItem for 문
    this.status = OrderStatus.ORDER;
    this.orderDate = LocalDateTime.now();
}

위처럼 그냥 생성만 해주는 함수와 어떤 차이가 있는지 이해를 못하였습니다 ㅠㅠ

2. 비즈니스 로직들을 Service 단에서 수행하지 않고, Entity Class에서 모두 짜는 이유가 잘 이해가 되지 않았습니다 ㅠ 애를 들면 cancel() 의 명령어 같은 경우,

~~ /orderItem/cancel/3 이런식으로 들어오게 된다면, Service Layer 에서 OrderItem 조회하고, Repository 를 호출하며 Order에 대한 \ 필요 로직 수행, Item에 대한 필요로직 수행을 하는것으로 생각을 했어서 그런 것 같습니다. 지금 현재 강의 부분과 같은 설계는 약간 영속성 컨텍스트를 계속 관리하면서 필요 SQL들이 자연스럽게 호출되게 하는 방식인 느낌인데 이런 방향이 맞을까요?

답변 1

0

y2gcoder님의 프로필 이미지

2023. 01. 09. 11:01

안녕하세요, 강우석 님. 공식 서포터즈 y2gcoder 입니다.

위처럼 그냥 생성만 해주는 함수와 어떤 차이가 있는지 이해를 못하였습니다 ㅠㅠ

createOrder는 말씀하신 것처럼 생성자와 역할이 똑같습니다. 생성자를 사용하지 않고 이렇게 생성하는 메서드를 따로 쓴 이유는, 생성자와 달리 이름을 줄 수 있어 메서드의 의도를 명확하게 표현할 수 있기 때문입니다. 실제로 생성자만이 아니라 해당 경우처럼 명확함을 위해 이름을 가진 메서드를 만들어 객체 생성의 역할을 하는 경우도 많이 있습니다.

 

비즈니스 로직들을 Service 단에서 수행하지 않고, Entity Class에서 모두 짜는 이유가 잘 이해가 되지 않았습니다

해당 부분은 다음 답변을 참고해주세요!


감사합니다.

start1234님의 프로필 이미지

2023. 08. 12. 21:31

혹시 이것이 생성자를 사용하지 않고 정적 팩토리 메소드를 사용한 예시일까요..?