아래 요구를 통해 회원 도메인을 설계해보도록 하겠다.
요구사항
- 회원을 가입하고 조회할 수 있다.
- 회원은 일반과 VIP 두 가지 등급이 있다.
- 회원 데이터는 자체 DB를 구축할 수 있고, 외부 시스템과 연동할 수 있다. (미확정)
요구 사항을 보면, 회원 데이터 부분은 현재 결정하기 어렵다. 추후 무엇을 사용하게 될지 아직 미확정이기 때문이다. 따라서 전에 배운 객체 지향 설계 방법을 쓰도록 하겠다.
📌 회원 도메인 설계
- 회원 도메인 협력 관계
- 회원 클래스 다이어그램
- 위의 요구사항을 보면 회원 저장소는 아직 선정되지 않았다. 따라서 MemberRepository는 데이터를 메모리에 저장할 수도 있고, DB에 저장할 수도 있기 때문에 MemberRepository라는 인터페이스를 구현한다. 추후 선정이 되면 이에 따라 구체화한 구현 클래스를 사용하게 된다.
- ⭐ BUT!! MemberService는 왜 인터페이스로 구현되었으며, MemberServiceImpl라는 구현 클래스는 왜 필요할까?
- 역할과 구현을 구분해서 보여주기 위한 예시이다. 인터페이스와 구현체 관점 말고, MemberService를 클래스로 생성해도 된다.
- 서비스에 인터페이스를 도입하는 것은 장단점이 있는데, 만약 구현체를 전혀 변경할 일이 없다면 인터페이스를 도입하는 것은 추상화 관점에서 개발 코드를 이해하기 어렵게 만드는 비용이 될 것이다. (안 좋다는 소리!)
- 따라서 인터페이스를 만드는 것은 좋지만, 인터페이스를 왜 도입하는지? 에 대해 중요하게 생각하고, 도입하는 경우와 도입하지 않는 경우를 잘 고려하여 설계해야 한다.
- 회원 객체 다이어그램
- 객체 다이어그램이 따로 필요한 이유 : 위의 회원 클래스 다이어그램은 MemoryMemberRepository와 DbMemberRepository 모두 설계해야 한다. 어떤 것이 쓰일지는 모르지만 우선 모두 설계한다.
하지만!! 객체 다이어그램에서는 동적으로 결정되는 것들을 설계한다. 즉, 여러 구현체 중 서버가 뜰 때 결정되는 것이 무엇인지 회원 객체 다이어그램을 통해 판단할 수 있다.