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

godmercury님의 프로필 이미지
godmercury

작성한 질문수

스프링 핵심 원리 - 기본편

회원 도메인 개발

강의 관련 질문

작성

·

319

0

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.

1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)

질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? 예
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예
3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예

[질문 내용]
안녕하세요. 강의를 들으며 헷갈리는 부분 질문 남깁니다.

  • 회원을 가입하고 조회할 수 있다.

  • 회원은 일반과 VIP 두 가지 등급이 있다.

  • 회원 데이터는 자체 DB를 구축할 수 있고, 외부 시스템과 연동할 수 있다. (미확정)

먼저 회원은 가입하고 조회할 수 있는 기능이 있고 이를 역할과 구현으로 구분하기 위해 역할인 MemberService와 구현인 MemberServiceImpl을 생성했다고 이해했습니다.

 

그 다음부터 헷갈리기 시작하는데요. 여기서부터 질문입니다.

 

  1. MemberRepository 라는 interface를 생성했는데. 일단 저는 Repository를 현업에서 거의 사용한 적이 없어서 명칭부터가 익숙치 않았는데요. 제가 이해하기로는 주로 외부와의(DB) 통신을 담당하는 친구로 DAO와 유사한 역할을 하는 것으로 이해했습니다. 맞나요?

 

  1. 다만, 자체 DB를 구축할지 외부시스템과 연동할지 정해지지 않았기 때문에 Interface로 생성한거고, 만약 정해져 있다면 굳이 Interface로 생성하지 않아도 될 것 같은데 맞나요?

 

  1. 제가 현업에서 일하면서 Service와 DAO를 연결할때는 보통 같은 기능명칭을 사용했는데 여기서는 join을 save로, findMember를 findById로 사용하더라구요. 명칭을 다르게 하는 이유가있나요?

 

답변 1

0

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

MemberRepository 라는 interface를 생성했는데. 일단 저는 Repository를 현업에서 거의 사용한 적이 없어서 명칭부터가 익숙치 않았는데요. 제가 이해하기로는 주로 외부와의(DB) 통신을 담당하는 친구로 DAO와 유사한 역할을 하는 것으로 이해했습니다. 맞나요?

=> 맞습니다. 영한님께서는 다음 링크(클릭)으로 구분하고 계십니다!

 

다만, 자체 DB를 구축할지 외부시스템과 연동할지 정해지지 않았기 때문에 Interface로 생성한거고, 만약 정해져 있다면 굳이 Interface로 생성하지 않아도 될 것 같은데 맞나요?

=> 개인적으로는 방식을 정해놓고 해당 방식을 영원히 사용할 것이라면 interface와 구현체로 나누지 않아도 될 것 같습니다. 다만 데이터 저장, 조회 기술은 현재 RDBMS 뿐만 아니라 Redis, DocumentDB 등 다양하게 사용하고 있는 만큼 변경될 여지가 많다고 생각합니다. 그래서 영한님께서는 인터페이스와 구현체로 나누어 역할과 책임을 분리한 유연한 구조로 구성하셨다고 생각합니다. 또한 RDBMS도 Mybatis, JPA, JDBC 등이 있고 이를 구현체로만 연결했을 때는 서비스 쪽 코드도 손을 대야 하지만, 인터페이스만 의존하게끔 코드를 짰을 때는 서비스 쪽 코드는 손댈 필요 없이 구현체만 바꿔주면 된다는 장점이 또 있을 것 같습니다.

 

제가 현업에서 일하면서 Service와 DAO를 연결할때는 보통 같은 기능명칭을 사용했는데 여기서는 join을 save로, findMember를 findById로 사용하더라구요. 명칭을 다르게 하는 이유가있나요?

=> 이 부분은 두 가지 정도의 이유가 있을 수 있다고 생각합니다. spring data jpa 에서는 위와 같은 메서드를 가진 Repository를 자동으로 생성해주는 기능이 있습니다. 이렇게 인터페이스 메서드들을 사용하면 나중에 spring data jpa로 변경했을 때 아주 쉽게 변경할 수 있기 때문에 미리 jpa 의 명명법대로 변경했을 수도 있습니다.
또 한가지는 해당 영역이 비즈니스 영역이 아닌 Repository 영역이기 때문일 수 있다는 것입니다. DDD에서는 Repository가 데이터 저장, 조회의 역할만 할 뿐 비즈니스에 대해서는 몰라야 한다고 합니다. 그래서 영속성 저장소인 Repository에서는 주로 데이터의 CRUD 연산과 관련된 표준화된 이름을 사용합니다 (save, findById, findAll 등). 이렇게 함으로써, 영속성 영역과 도메인 로직을 명확하게 분리하고, 각 영역의 책임을 명확히 할 수 있습니다

 

감사합니다.

godmercury님의 프로필 이미지
godmercury

작성한 질문수

질문하기