inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

토비의 클린 스프링 - 도메인 모델 패턴과 헥사고날 아키텍처 Part 1

회원 애플리케이션 서비스 테스트 (1)

Member#register() 메서드명이 모호하게 느껴집니다.

218

Dompoo

작성한 질문수 14

0

Member#create() 메서드를 register로 공통언어를 바꾸셨는데, 뜻이 모호해진 것 같아서 질문드립니다!

 

제가 생각하기에 register(등록)이라는 단어는 생성과 영속화라는 두가지의 행위를 함축한 단어로 느껴집니다. 따라서 MemberService#register()는 너무 자연스럽습니다. 실제로 Member를 생성한 후에 MemberRepository를 통하여 영속화까지 하는 내용으로 구현되어있습니다.

하지만 Member#register()는 이와 다르게 Java 객체를 생성하기만 하는 것이라, 메서드명과 실제 동작이 불일치한다고 느껴집니다.

 

하지만 또 동시에 도메인 모델을 글로 작성하는 과정에서 '멤버를 등록한다.' 라는 말을 쓰는 것은 자연스럽습니다. 그 구현이 코드적으로 Member에 있는 것만이 부자연스럽습니다.

이런 경우에는 Member라는 객체만으로 도메인 모델을 온전히 표현해내기가 어려운 것일까요? 해당 모델을 표현하기 위해서는 MemberService 같은 코드가 꼭 필요한 걸까요?

java spring spring-boot jpa 리팩터링 ddd

답변 1

2

토비

가장 어려운 게 이름을 정하는 것인데요. register라는 말의 일반적인 의미로 생각하면 뭔가 더 많은 단계를 거쳐야 할 것처럼 느껴지기도 하죠. 그런데 굳이 create를 쓰지 않고 register라는 말을 선택한 이유는 이 개발팀의 도메인의 보편 언어에서 그런 선택을 하기로 결정했기 때문입니다. 물론 제가 일방적으로 한 것이긴하지만요. ㅎㅎ

어쨌든 엔티티가 생명주기로 볼 때 그 온전한 기능을 사용할 수 있게 되는 활성 상태가 되는게, 이를 최초로 만드는 작업에 의해서 결정되는 경우(아직 구현은 안 했지만 강사가 강의를 만드는 것)와 생성 이후 어떤 조건을 충족해야 비로소 그 엔티티의 기능을 수행할 수 있게 되는 것으로 구분하기로 한 것입니다. 그때 선택한 우리 개발팀의 보편 언어로 "등록"과 "생성"을 구분한 것입니다.

뭔가 누구나 딱 들으면 완벽하게 이해가 되는 단어를 선택할 수 있으면 좋겠다 싶지만, 많은 경우 그러기는 힘들죠. 그래서 우리가 말하는 등록/register라는 것은 이런 의미이고 이런 규칙을 가지고 사용하자라는 스프런 도메인 모델을 이해하는 것이 먼저 선행되어야 할 필요가 있습니다.

아마도 그런 논의를 하는 과정을 제가 강의에서 충분히 느끼시도록 시연 같은 것을 하지 못해서 단어의 의미를 평소 알고 계신 그 이해로 생각하고 보시면 뭔가 어색할 수도 있을 겁니다. 그래도 강의에서도 말씀드렸고, 위에 적은 것처럼 등록/register라는 스프런의 보편 언어는 이렇게 쓰인다고 이해해주시면 좋겠습니다.

등록/reigster는 생성후 일정 조건이 충족되는 것을 대기하는 상태로 만들어지는 것을 부르는 우리 도메인의 언어이다라고요.

1

Dompoo

팀에서의 보편 언어를 그렇게 정한거군요!

 

만약 제가 토비님과 같은 팀이었다면 보편 언어를 정하는 시점에서 위와 같은 논의를 같이 하고 도메인에 잘 부합하는 언어를 찾기 위한 노력을 같이 했겠네요. 😀

 

이 부분에서도 보편언어의 중요성이 잘 드러나는 것 같습니다. 토비님과 제가 생각하는 언어의 뜻이 달라서 이해의 어려움이 발생하네요. 좋은 경험 한 것 같습니다! 답변 감사드립니다!!

N+1 관련해서 질문있습니다.

0

46

3

도메인 모델에서 관계와 규칙을 구분하는 방법

0

61

2

헥사고날 아키텍처에서의 배치, 시큐리티, 비동기 이벤트 처리는 어떻게 하나요?

0

140

2

어댑터에서 도메인에 직접 의존하는 경우에 대해

0

136

2

Member 도메인이 PasswordEncoder를 받는 구조 질문 있습니다.

0

118

2

MemberService와 EmailSender 책임 분리에 대한 질문

0

111

2

NonNullApi를 NullMarked로 대체하라고 합니다.

0

133

2

39. 문서와 코드 다듬기 updateInfo 테스트 질문 있습니다.

0

82

2

Repository Adapter 설계에 대해 피드백을 부탁드립니다

0

112

2

헥사고날 part2 강의 출시 예정일 문의 드립니다.

0

264

2

PT 문의사항

0

104

1

초기 어플리케이션 구동 시 compose.yml 파싱 오류

0

154

2

애플리케이션의 JPA 리턴과 도메인 모델

0

131

2

애그리거트 루트의 하위 도메인들의 depth가 깊어질 때 문의

0

140

2

페이징 처리를 해야한다면 어떻게 해야할까요?

0

198

2

애그리거트의 repository

0

128

2

Domain Expert가 정확히 어떤 역할을 하는 사람인가요?

0

240

1

회원 애플리케이션 서비스 테스트 (1)

0

110

2

정적 팩토리 메서드 관련 질문드립니다!

0

112

2

spotbug + @NonNullApi 로만 Null 방어가 될까요?

0

132

2

required 포트에 관해서

0

96

2

혹시 다음 편은 언제쯤 오픈할까요?

0

173

2

서비스 단위 테스트 코드 작성

0

104

2

domain 모듈에 entity를 정의한다고 했을때

0

106

2