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

Hika Maeng님의 프로필 이미지

작성한 질문수

오브젝트 - 기초편

1-1. 영화 예매 도메인

영화가 가격을 갖고 있는 이유가 궁금해요.

해결된 질문

24.07.27 09:53 작성

·

439

2

고객이 구매하는건 상영인데 왜 영화가 가격을 들고 있을까요. 상식적이라면 상영이 가격을 들고 있을거 같아요.

답변 2

3

조영호님의 프로필 이미지
조영호
지식공유자

2024. 07. 27. 15:45

Hika Maeng님 안녕하세요. 🙂

영화 예매 도메인에서 사용자가 실제로 구매하는 상품은 상영입니다.

반면에 영화는 여러 상영이 공유하는 공통 정보를 포함합니다. 이 공통 정보에는 영화의 제목과 가격, 러닝타임 등이 포함됩니다.

이 공통 정보를 상영에 포함시킨다면 아래 그림의 왼쪽처럼 다수의 상영에 데이터가 중복으로 들어가기 때문에 오른쪽 그림처럼 공통 정보를 가지는 영화를 하나 만들고 다수의 상영이 영화를 고유하게 만들었습니다.

이렇게 판매되는 여러 상품들 사이의 정보를 공유하게 만드는 것을 명세 개념적 클래스(specification conceptual class)라고 부릅니다.

screening.png

 

그리고 영화에 포함된 가격은 영화의 정가를 의미합니다.

할인 정책과 할인 조건을 조합해서 계산한 할인 금액을 영화의 정가에서 차감한 금액이 상영의 가격이 됩니다.

상영의 실제 가격을 계산하는게 예제의 목적이기도 하구요.

아마도 영화의 가격과 상영의 가격을 동일하게 생각하신것 같습니다.

답변이 되었는지 모르겠네요. 🙂

0

Hika Maeng님의 프로필 이미지
Hika Maeng
질문자

2024. 07. 27. 20:42

넵. 답변 감사합니다. 예제의 의도를 이해했습니다.

그냥 현실적으로는 상영이 가격을 따로 갖고 있는 경우가 대부분이라 궁금했습니다. 아이맥스 상영관, 4DX상영관 등 영화가 가격을 갖고 있는 것으로는 각 상영의 상세를 너무 많이 알아야 할 거 같다는 생각이 든거죠.
그런 연장선에서 예제가 적절한 현실의 축소판이긴 해도, 각 상영이 가격을 갖고 영화의 공통 정보에 포함할게 아니지 않나 라는 생각을 했습니다.

조영호님의 프로필 이미지
조영호
지식공유자

2024. 07. 27. 22:17

네 이 부분에 대해서 몇 가지 부연 설명 드리면 좋을것 같네요. :)

현재의 예제는 영화 예매 시스템을 현실적으로 구현하는데 목적이 있지 않고 객체지향의 다양한 개념을 가장 적은 코드로 표현하는데 중점을 두고 있습니다.

최초의 설계는 현실적인 부분을 감안해서 만들었는데 책이나 강의의 예제로 설명하기에는 너무 사이즈가 커지고 객체지향 개념이 아니라 예제 자체를 설명하는데 너무 많은 노력이 들어가더라구요.

뒤에 보시면 아시겠지만 코드를 리팩토링하는 경우도 있는데 이 경우 코드가 너무 복잡해지면 원래의 취지를 살리기 어렵기 때문에 최대한 코드는 단순화시켰습니다.
현재의 도메인 범위 안에서 강의를 들어주시면 감사하겠습니다. 🙂

추가로 아래 내용도 부연 설명드립니다.

 

1. 영화의 정가와 상영의 가격

앞에서 말씀드린 것처럼 영화에 있는 가격은 영화의 정가입니다.

상영의 가격은 런타임에 계산이 되기 때문에 현재 도메인 상에서 영화의 기본 정보를 영화가 아니라 모든 상영에 중복해서 넣는게 더 이상할것 같습니다.

현재의 도메인을 그래도 유지한다면 오히려 영화의 정가는 영화에 그대로 두고 계산되는 결과를 상영에 미리 계산해서 저장해 둘 수는 있을것 같습니다.

이렇게 계산되는 값을 derived value라고 부르고 필드에 저장되는 값을 stored value라고 부르는데 객체 인터페이스를 바꾸지 않는 선에서 성능 이슈나 동기화 이슈를 고려해서 둘 중 한 가지를 선택하면 될것 같습니다.


2. 도메인의 범위에 따라 결정하면 됩니다.

강의에서 설명드린 것처럼 도메인의 범위를 어디까지로 잡느냐에 따라서 분석의 결과가 달라지게 될것 같아요.

지금은 강의에 맞추느라 많은 부분을 드랍시켰지만 처음 만들었던 예제는 실제와 비슷하게 영화관의 좌석을 선택하는 것까지 예매 프로세스에 포함시켰습니다.

이렇게 도메인을 정할 경우 실제로 사용자가 구매하는 상품은 상영이 아니라 좌석이 됩니다.

좌석별로 가격이 다른 경우가 있기 때문에 이 경우에는 좌석별로 가격을 할당하는게 맞을까요?

아마 그렇지 않을겁니다.

즉, 실제 영화 예매 시스템으로 확장한다면 사용자들이 구매하는 상품은 특정 상영 시간에 포함되는 특정 좌석이기 때문에 상영에 가격을 할당하는 것도 합리적이라고 볼 수는 없겠죠.

도메인의 범위에 따라서 트레이드오프를 해야 한다는 점을 말씀을 드리고 싶습니다. :)

 

3. 아이맥스, 4DX 상영관에 따라 가격이 달라지는 경우

앞에서 말씀 드린 것처럼 실세계 영화 예매에서 상품은 상영이 아니라 좌석이기는 하지만 일단 좌석은 배제하고 도메인을 확장해서 상영관의 개념을 포함한다고 할 경우 동일한 상영관에의 상영은 가격이 동일할 겁니다.

따라서 가격을 상영마다 할당하지 않고 상영관에 기본 가격을 할당하고 영화의 정가나 다른 요소들을 포함해서 상영의 가격을 결정할 수 있을거에요.

이 경우 역시 요구사항에 따라 다양한 해법이 있을 수 있는데(어떤 요소가 달라지는가가 가장 큰 고려 요소가 되겠죠) 다른 요소들은 고려하지 않고 단순히 상영이 가격을 가져야한다고 단정짓는 것은 무리가 있을것 같습니다.

 

답변이 되었는지 모르겠네요. :)

Hika Maeng님의 프로필 이미지
Hika Maeng
질문자

2024. 07. 27. 22:44

감사합니다. 특히 좌석까지도 갈 수 있지 않냐는 말씀이 와닿네요. 말씀듣고 역시 적절한 트레이드 오프라고 느껴집니다!
이전에 극장시스템 구축에 직접 참가했었는데, "조조할인 시 현대카드포인트를 적용할 때는 CGV포인트와 같이 적용할 수 없지만 VIP는 예외다" 같은 거지같은 구조였던 게 기억나서 괜히 이 부분에 감정이입을 했던 것 같습니다 ^^

조영호님의 프로필 이미지
조영호
지식공유자

2024. 07. 27. 23:18

양해해 주셔서 감사합니다. ^^
저도 질문 받고 다시 생각해볼 수 있어서 너무 즐거웠습니다!
제가 잘못 생각하는 부분도 있기 때문에 중간중간 이상하거나 논의하고 싶은 부분 문의 주시면 최대한 빠르게 답변 드리도록 하겠습니다!
주말인데 귀한 시간 내서 강의 들어주시고 피드백 주셔서 너무 감사드립니다. 🙂