클래스의 관심사는 하나인게 이상적인가요?
357
작성한 질문수 2
안녕하세요. 하나의 클래스는 무조건 하나의 관심사만 가지는 것이 좋나요? 여러 가지의 관심사를 가지는 경우는 무조건 피해야 하나요?
수업에서 Client가 두 가지 관심사를 가지고 있다고 하셨고 (PaymentService 이용해서 비즈니스 로직 처리 + PaymentService의 내부 의존관계 설정), 후자의 책임은 오브젝트 팩토리로 옮겨버리셨는데요.
'하나의 클래스는 하나의 관심사만 처리하도록 코드를 짜는게 좋다'라고 이해해도 괜찮을까요?
하나의 클래스가 여러 가지 관심사를 가져도 되는 경우도 있는지 궁금합니다.
답변 1
0
관심사라는 것을 어떻게 정의하고 보는지에 따라서 사실 얼마든지 다르게 분리할 수 있습니다. 클래스는 가장 작은 단위의 모듈인데, 이보다 더 큰 패키지나 jar 파일, 서버도 같은 관심사의 분리라는 관점으로 나눌 수가 있죠. 이때의 관심사 단위는 꽤 큽니다.
관심사가 혼재되어있으면 앞으로 코드가 발전하고 변경되고, 나중에 코드를 이해할 때 어떤 불편함이 있을지를 생각해보시면 좋습니다. 사실 예제의 Client 수준에서야 그 정도의 관심사가 섞여 있어도 괜찮아 보입니다. 그래서 저도 처음부터 그걸 나누지 않고 자연스럽게 Client main() 안에 만들었죠. 하지만 책임을 명확하게 구분해보면, 의존관계설정 책임은 대상이 점점 늘어나서 나중에 수백 개가 될 수도 있겠죠. 그게 페이먼트라는 기능 하나를 이용하는 클라이언트, 실전이라면 아마 컨트롤러가 되겠죠. 그 안에 들어가 있으면 이상하겠죠? 그래서 그런 명확한 관심사가 다른 코드는 분리하는 습관을 들이시면 좋습니다. 그렇다고 너무 급하게 하지는 않으셔도 됩니다.
스프링의 @Controller, @Service, @Repository로 대표되는 스테레오타입 애노테이션은, 정말 이건 꼭 분리해야한다는 오래된 경험에서 나온 관심사 분리를 적용할 대상을 명시하도록 하는, 최소한의 작업에 쓰라고 만든 것이죠. 실제로는 이보다 더 자세히, 비즈니스 관점에서 혹은 기능적인 관점에서 관심사가 다르다고 느껴지면 적절한 시점에 분리하는 습관이 중요합니다.
클래스가 그 중에서 가장 기본적인 단위이기 때문에 클래스부터 분리하는 연습을 하면 좋습니다. 리팩터링을 공부하시면 어떤 경우에 클래스를 나누는지, 혹은 인터페이스나 수퍼 클래스로 추출하는지 등에 관한 좋은 아이디어를 얻으실 수 있을 겁니다.
수업을 잘 듣고 있습니다.
0
103
2
jackson(3.0.2 버전) ObjectMapper.readValue 에러타입
0
108
2
템플릿과 콜백의 역할 경계를 구분하는 기준
0
99
1
테스트를 작성하지않아도 되는 경우
0
86
2
오브젝트 정의 중 배열에 대해서
0
63
2
스프링 레거시를 이용하는 회사에서 일을 하게 될것같은데
0
109
2
JpaTransactionManager에 대해 궁금합니다.
0
81
2
스프링빈과 Clock 클래스 관련
0
44
2
Seprate Interface 패턴에 대한 궁금증
0
46
2
테스트의 기준을 어떤식으로 설정하는 것이 바람직한 테스트일까요 ?
0
51
2
오브젝트와 인스턴스
0
38
1
WebApiExRateProvider 템플릿 콜백 패턴을 적용하면서 테스트 코드를 만들어보았습니다.
0
62
2
템플릿 콜백 패턴 관련하여 궁금한 것이 있습니다!
0
60
2
상태 변경 API 질문
0
120
2
빈에 대한 질문
0
97
1
안녕하세요.
0
145
2
Payment 엔티티에 exRateProvider 주입
0
101
1
@Transactional private 사용유무
0
157
1
JdbcClient 생성 질문
0
190
2
안녕하세요 PaymentConfig 질문드립니다.
0
110
2
[공유] 윈도우 사용자를 위한 http 명령어 오류 해결 방법
0
245
2
생성자 파라미터성자 파라미터
0
238
2
토비님 ! BigDecimal 관련 링크를 못찾겠어요
2
344
2
인터페이스 사용에 관하여 질문드립니다.
0
308
3





