inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

Readable Code: 읽기 좋은 코드를 작성하는 사고법

SRP: Single Responsibility Principle

안녕하세요 강사님 SRP에 관한 질문입니다!

255

진짜 잘하고싶다

작성한 질문수 30

0

이번 강의 내용과 관련하여 JPA를 사용하여 CRUD를 구현할 때 질문입니다!

 

JPA를 이용한 간한단 CRUD를 구현할 때,

POST와 USER Entity는 서로 연관관계 매핑이 되어있습니다.

 

Post(게시글)을 작성한다고 가정하면 PostService에는 UserRepository를 사용하여 User객체를 얻어야 하는데, 이러한 경우 단일 책임 원칙 위반이라고 얘기할 수 있는 건가요?

 

댓글을 작성한다고 가정하면, CommentService에 UserRepository, PostRepository를 사용하여 User와 Post 객체를 얻어야 합니다.

 

제가 생각했을 때 이러한 경우

  1. 단일 책임 원칙이 위반 되었는지가 궁금합니다.

  2. 게시글 작성, 댓글 작성이라는 행위에 다른 도메인이 침투해있으니까 단위테스트 작성도 어렵고 가독성이 떨어진다고 생각하는데, 맞을까요?

  3. 그럼 2번을 개선하기 위해서는 어떻게 해야 되는지 궁금합니다. 너무 얘기가 길어지면 어떤 책or글을 참고하는게 좋을지 가르쳐주시면 너무 감사하겠습니다!!

강사님 이전 테스트 코드 강의도 보고 지금 강의도 보고있지만 아직 너무 어려워서 따라가기가 힘드네요 ㅠㅠ....

항상 감사합니다!

 

객체지향 리팩토링 클린코드-기획전

답변 2

0

박우빈

안녕하세요, 진짜 잘하고 싶다 님!

AI 인턴이 잘 설명해주었지만, 책임이라는 것은 Entity와는 전혀 다른 관점입니다.

 

Post(게시글)을 작성한다고 가정하면 PostService에는 UserRepository를 사용하여 User객체를 얻어야 하는데, 이러한 경우 단일 책임 원칙 위반이라고 얘기할 수 있는 건가요?
댓글을 작성한다고 가정하면, CommentService에 UserRepository, PostRepository를 사용하여 User와 Post 객체를 얻어야 합니다.

이 경우 PostService와 CommentService가 담당하는 책임은 각각 무엇일까요?
PostService라 Post Entity만 사용해야 할 것 같은데, User를 사용하게 되어 단일 책임이 아니게 된걸까요?

그렇지 않습니다. PostService는 '게시글 작성'의 책임, CommentService는 '댓글 작성'의 책임을 가지는 것이고, 이 과정에서 UserRepository를 통해 User 받아 사용하게 되는 현상은 매우 자연스럽습니다.
다른 도메인이 침투한 것이 아니라, 도메인 객체 간 협력이 일어나는 장소가 Service라고 생각하시면 좋습니다.

물론, PostService에서 User의 정보를 직접적으로 변경한다거나 하는 필요 이상의 접근이 생길 경우는 책임이 위반되었다고 볼 수도 있습니다.
이런 경우는 User를 변경하는 일을 맡고 있는 다른 객체에 잘 위임하여 관련 행위를 수행하도록 해야 합니다.

한번 고민해 보세요 ㅎㅎ
감사합니다 🙂

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다.

님의 질문에 대해 답변 드리겠습니다.

  1. 단일 책임 원칙(Single Responsibility Principle, SRP)은 하나의 클래스나 모듈이 하나의 기능만을 가지고, 그 기능을 완전히 캡슐화 해야 한다는 원칙입니다. 서비스 레이어에서 다른 도메인의 리포지토리를 참조하여 사용하는 것 자체가 SRP를 위반하는 것은 아닙니다. 중요한 것은 해당 서비스가 담당하는 비즈니스 로직의 ‘책임’과 분리 없이 관련 기능을 수행하는지 여부입니다. 예를 들어, PostServiceUserRepository를 사용해서 사용자 정보를 가져오는 것은, 게시글 작성 기능을 수행하기 위해 필요한 절차일 수 있습니다. 이 경우 PostService는 게시글 작성이라는 한 가지 책임을 지고 있다고 볼 수 있습니다.

  2. 다른 도메인의 객체를 서비스 레이어에서 함께 사용한다고 해서 반드시 단위 테스트 작성이 어렵거나 가독성이 떨어지는 것은 아닙니다. 가독성이나 테스트 용이성은 코드의 설계와 구현 방식에 더 크게 영향을 받습니다. 하지만, 도메인 간의 관계가 복잡할수록 이에 대한 이해가 필요하고, 그로 인해 복잡도가 증가할 수 있다는 점은 맞습니다.

  3. 개선책으로는 도메인 간의 연관 관계를 최소화하거나, 도메인 서비스를 사용하여 복잡한 비즈니스 로직을 처리하는 방법이 있습니다. 도메인 간의 연관 관계를 최소화하기 위해서는 객체의 결합도를 낮추는 설계 기법들을 고려해볼 수 있습니다. 또한, 복잡한 비즈니스 로직을 별도의 도메인 서비스 레이어에 위임하여 처리하도록 설계하는 것도 한 방법입니다. 이를 통해 각 도메인 클래스나 서비스의 단위 테스트가 용이해지고, 가독성 또한 향상될 수 있습니다. 참고할 만한 책으로는 “클린 코드”, “클린 아키텍처” 같은 로버트 C. 마틴의 시리즈가 있으며, “도메인 주도 설계”에 대한 책도 유용하게 참고하실 수 있습니다.

마지막으로, 강의의 내용이 어렵게 느껴질 수 있지만, 꾸준히 학습하며 실습해 보는 것이 중요합니다. 이론적인 지식 뿐만 아니라, 직접 코드를 작성하면서 이해도를 높여가시길 권장드립니다.

항상 응원합니다!

[강의 질문] 메서드 선언부

0

90

1

[강의 질문] 메서드와 추상화

0

61

2

DIP 개념에 대한 질문입니다.

0

64

1

만약 보드를 이용한 게임의 종류가 더 다양해진다면 어떻게 될 수 있을지에 대한 고민

0

86

2

DIP 설명 후반부에 IOC에 대한 질문 드립니다.

0

80

2

안녕하세요 ! 혹시 자바가 아닌 다른 객체지향 언어를 알고있어도 강의를 들어도 괜찮을까요 ?!

0

71

1

안녕하세요 메서드명 때문에 고민이 있어서 질문드립니다.

1

64

2

자바 record 사용에 대해서 질문 드립니다!

0

128

2

강의 내용 정리 및 자료 제작 툴 문의 드립니다.

0

136

2

사용할 변수 가깝게 선언하기 질문

0

93

1

오버 엔지니어링

0

151

2

학습용 java/spring 오픈소스 추천

1

368

2

중복된 메서드 줄이는 방법

0

185

2

MarketPlace에서 Sonarlint 검색이 안됩니다.

0

417

3

isLandMineCell() 메서드 질문

0

209

1

Cell[][]BOARD 매개변수받기

0

153

2

ConsoleInputHandler에서 왜 final붙여야 하는지

0

194

1

정적 생성자 메서드 of, from

0

266

2

Getter관해서

0

148

3

이름 바꾸기

0

129

2

stack 대신 queue 를 사용해 bfs 로 변경해도 되나요??

0

164

2

현업에서 ISP를 도입하려는데 인터페이스 설계에 있어서 의문이 있습니다.

0

209

2

null을 가질 수 있는 값을 인자로 넘겨야 하는 경우

0

253

3

리팩토링을 하고 난 뒤 다시보면 오히려 더 복잡해 보이는것 같은 느낌입니다..

0

255

2