당니의 개발자 스토리

회원 도메인 설계 본문

스프링/스프링 핵심 원리 - 기본편

회원 도메인 설계

clainy 2024. 1. 16. 12:34

회원 도메인 설계

이전 시간에 요구사항을 들었고, 이번 시간부터 디테일하게 개발자가 회원 도메인에 대해서 설계를 하는 거에요.

회원 요구사항을 떠올려보면, 회원을 가입하고 조회할 수 있다. 그리고 회원은 일반과 VIP 두가지 등급이 있다. 그리고 회원 데이터는 자체 데이터베이스를 구축할 수도 있고 외부 시스템과 연동할 수도 있는데, 아직 결정이 안났대요.

그래도 여러분은 굉장히 유능한 개발자이기 때문에 일단 설계를 들어갑니다.

회원 도메인을 먼저 설계를 해봐요. 어떻게 되냐면, 이 클라이언트가 회원 서비스를 호출을 합니다. 근데 이 회원 서비스는 회원을 가입하고 조회하는 두 가지 기능을 제공해요.

그 다음에 회원 저장소라는 걸 별도로 만듭니다. 왜냐하면 회원 DB를 자체 구축할 수도 있고, 외부 시스템과 연동할 수 있다 했잖아요. 그러니까 회원 데이터에 접근하는 계층을 따로 만들어야겠다고 생각을 하는 거예요. 그렇게 해서 회원 저장소라는 인터페이스를 만들 거예요.

이 세 가지, 네모칸 각각은 역할이죠. 클라이언트 역할, 회원 서비스 역할, 회원 저장소 역할.

근데 이 회원 저장소 역할의 구현을 어떻게 할거냐면,

메모리 회원 저장소, DB 회원 저장소, 그 다음 외부 시스템 회원 저장소로 나눌 겁니다. 이 셋 중에 하나를 꼽으면 되는 거죠. 즉, 구현체를 선택하면 되는 거죠.

그런데 지금 자체 DB도 선택이 안 됐고, 외부 시스템 연동하는 그런 것들도 아직 다 미확정인 거예요. 그렇다고 개발을 손놓고 있을 수는 없잖아요.

그래서 여러분이 어떤 선택을 하게 되냐면, 정말 간단한 자바 코드로, 메모리로 회원 객체를 넣었다 뺐다 할 수 있는, 또 저장하고 불러올 수 있는 메모리 회원 저장소를 일단 만들어서 개발을 진행하기로 했습니다.

이 메모리 회원 저장소는 테스트할 때도 쓰이고, 로컬에서 개발할 때도 쓰이고 할 거예요 그런데 메모리이기 때문에 컴퓨터를 껐다가 켜면, 즉 서버가 재부팅되면 데이터가 다 날아가겠죠. 그러니까 딱 개발용으로만 쓰는 거예요. 이렇게 개발하다가 나중에 데이터베이스나, 외부 시스템 회원 저장소가 선택이 되면 그때 그 부분만 딱 구현해가서 교체하면 되겠죠. 이 시나리오로 딱 생각을 한 거예요.

역할과 구현을 나누고, 구현 부분을 딱 갈아끼는 거죠.

이 그림은 도메인에 대한 큰 그림을 그린 거구요.


그 다음 이제 실제 구현 레벨로 내려오면, 회원 클래스 다이어그램이 이렇게 그려집니다.

회원 도메인에 있던 회원 서비스, MemberService 라는 역할을 인터페이스로 만들고, 그 다음에 그거에 대한 구현체로 MemberServiceImpl, implement가 구현이란 뜻이거든요. 회원 서비스 인터페이스를 구현할 거는 하나밖에 없어서, MemberServiceImpl 라고 해서 이렇게 만듭니다.

그 다음에 MemberRepository 가 있죠? 회원 도메인 그림에 있던 회원 저장소의 역할이 MemberRepository 인터페이스가 되는 겁니다. 여기에 대한 구현 클래스로, MemoryMemberRepository 와 DbMemberRepository를 만들 겁니다. 그런데 추가해서, 외부 시스템 연동 회원 저장소도 만들어질 수 있어요. 딱 이대로 코딩 하면 되는 거예요.


이제 회원 객체 다이어그램은 뭐냐면,

이게 실제 서버에 올라오면, 아까는 클래스 다이어그램이고 지금 이 그림은 객체 다이어그램인데요. 객체 간의, 또 메모리 간의 참조들이 어떻게 되는지를 그린 거예요.

클라이언트는 이 회원 서비스, 정확히는 MemberServiceImpl을 바라보고, MemberServiceImpl은 MemoryMemberRepository를 바라보게 됩니다. 실제 객체 간의 메모리 참조는 이렇게 된다고 보시면 돼요.

그러니까 서버가 떠서 클라이언트 객체가 실제 사용하는, 실제로 참조하는 주소값에 있는 인스턴스는 MemberServiceImpl 인 겁니다. 그리고 처음 회원 저장소는 MemoryMemberRepository 가 될 겁니다. 그래서 결과적으로 객체 다이어그램 그림과 같이 만들거에요.

 

항상 크게 세 가지로 이 그림들이 개념적으로 그려집니다.

이 도메인 협력관계는 기획자들도 볼 수 있는 그림이에요. 이 그림을 바탕으로 개발자가 구체화해서 클래스 다이어그램을 만들어 내고요.

이 클래스 다이어그램은 인터페이스랑 구현체들이 다 보이겠죠. 그런데 클래스 다이어그램은 실제 서버를 실행하지 않고, 클래스들만 분석해서 볼 수 있는 그림이에요.

그런데 이 구현체들 있잖아요. MemoryMemberRepository를 넣을지, DbMemberRepository를 넣을지 이런 것들은 동적으로 결정되는 거거든요.

무슨 말이냐면, 서버가 뜰 때 new 해서 "뭘 넣을 거야?" 해서 그때 결정되기 때문에 클래스 다이어그램만으로 판단하는 게 어려워요.

그래서 이 객체 다이어그램이라는 게 따로 있어요.

그래서 서버가 실제로 떠서, 클라이언트가 실제 사용하는 MemberServiceImpl, MemoryMemberRepository, 이렇게 해서 실제 유한 인스턴스끼리의 참조라고 보면 될 것 같습니다.


이렇게 해서 회원 도메인 설계에 대해서 알아봤구요.

다음 시간에는 이거를 개발 해보겠습니다.

'스프링 > 스프링 핵심 원리 - 기본편' 카테고리의 다른 글

회원 도메인 실행과 테스트  (0) 2024.01.17
회원 도메인 개발  (0) 2024.01.16
비즈니스 요구사항과 설계  (0) 2024.01.16
프로젝트 생성  (0) 2024.01.16
객체 지향 설계와 스프링  (0) 2024.01.16