한이음 프로젝트

[한이음]Controller는 SRP(단일 책임 원칙)을 지키는걸까..?

딤섬뮨 2022. 8. 11. 13:33
728x90

최근 다음과 같은 로직의 코드를 짰다. 처음에 리팩토링이 아니라 통짜로 코드를 짜서 멘토님께서 리팩토링을 하라고 하셨다. 이 일은 내게 엄청난 고민을 안겨주었고 사실 해결은 못했지만.. 일단은 생각을 기록하는 의미로 기록해놓는다.! 

 

 

구현하고 싶은 것

  • 새로운 평가 등록 -> 기존 등급 내역을 불러옴 -> 새로운 평가를 반영 -> 새로운 등급 산출 -> 등급 갱신

 

참고 사항 

  • 새로운 평가란? : 아이디, 성실성, 적극성, 기술성, 협동력, 참여도
  • 등급 테이블 구성?: 총 평가 인원, 아이디, 총합, 평균값, 등급(Gold, Silver, Bronze, Black)

1. 새로운 평가 등록(각 5점씩 5가지 항목)

ex) 5 5 5 5 5 = 25점

 

2. 등급 테이블에서 총 평가 인원을 불러오기
총 평가 인원 += 새로운 평가(1명)

 

3. 평균 구하기

총합 / 총 평가인원

 

4. 평가를 산출한 걸 바탕으로 등급 반환 Gold 20~25
Silver 15~20
Bronze 10~15
Black 그 이하

 

생각해본 사항

 

(1) 위의 1,2,3, 4 단계를 각각 메서드로 분리한 뒤
getFinalGrade()라는 메서드 안에서 1ㅡ2ㅡ3ㅡ4 메서드를 호출하여 등급을 얻어내는 방법을 생각

하지만 그렇게 되면 getFinalGrade() 메서드는 단일 책임 원칙을 벗어나는 거 아닌가 싶어서 고민

 

(2) 디자인 패턴을 공부하며 고민 중이긴 한데 어떤 게 최적인지 아직 모르겠다..

 

(3) 아이예 계산을 해주는 서비스를 다른 클래스로 생성한 뒤, Controller -> 등급 Service ->계산 Service로 호출해도 되는가..?

 

이와 같은 고민들 중에 생각해본 게 1번에서 getFinalGrade() 메서드를 따로 구현할게 아니라 controller가 그 역할을 하면 되는 거 아닌가..? 싶었다. 

 

그래서 mvc의 controller는 단일 책임 원칙을 위배하는 것처럼 보여도 되는 것인가..? 싶었는데 나와 같은 고민을 한 글을 찾았다.

 

design - MVC: Does the Controller break the Single Responsibility Principle? - Software Engineering Stack Exchange

 

 

나와 같은 고민을 하였다. 

 

그중 채택이 제일 많이 된 답변이다.

가장 답변이 된 부분은 

i can agree that the controller has more than one responsibility However these are "lower" responsibities and that is not a problem because at the highest abstraction level it only has one reponsibility....

 

요약하자면 "낮은"책임이며 가장 높은 추상화 수준에서는 하나의 책임만을 가지고 있으므로 SRP를 위반하지 않기 때문에 문제가 되지 않는다고 한다.

 

예를 들어 가족 아침식사를 준비한다면..

가족 아침식사 안에는 계란 프라이를 하고 시리얼을 담든 여러 가지 역할이 있지만 어쨌든 "아침식사"라는 하나의 높은 책임을 가지고 있기에 srp를 위배하지 않는다고 보는 것 같다.

 

물론 이 사람 말이 정답이 아닐 수 있지만 여하튼 내 고민은 이 사람을 믿고 구현을 해봐야겠다.

 

 

 

728x90