자바 객체지향 원칙인 SOLID 중 하나인 단일 책임 원칙(SRP) 개념을 알아보겠습니다.
단일 책임 원칙 (SRP, Single Responsibility Principle)
1. SRP란?
단일 책임 원칙 SRP는 로버트 C. 마틴이 제안한 객체지향 설계 원칙인 SOLID의 다섯가지 원칙 중 하나입니다. 해당 원칙을 준수하여 프로그래밍을 하면 객체지향 설계가 가능하며, 프로그래머가 개발을 한 후에 비즈니스 로직에 변경이 일어나도 유지 보수와 확장성 있는 프로그램을 만들 수 있도록 도움을 줍니다.
클래스는 단 하나의 책임을 가져야하며, 변경하는 이유는 단 한가지여야 한다.
로버트 C. 마틴
SRP 원칙에는 책임이라는 용어가 사용됐는데요. 용도나 목적같은 의미를 갖는 것 같다고 얼추 생각이 들지만 정확히 어떤 의미인지를 고민해볼 필요가 있어보입니다.
2. 책임이란?
책임은 변경과 관련이 있습니다. 어떤 클래스의 한 메서드에서 변경이 일어났을 때, 이를 호출해서 사용하고 있는 메서드에서도 변경사항이 생기는지 여부를 확인하는 것 입니다. 아래 예를 들어 설명하도록 하겠습니다.
변경이 생기는 케이스 예시
- 나라별 현재 시간을 24시간제로 반환하는 메서드 (TIme 클래스, getCurrentTime 메서드)
- 위 메서드를 사용중인 코드
1. 한국 시간을 구하는 컨트롤러
2. 미국 시간을 구하는 컨트롤러
예상 문제점
이때 미국 시간은 앞으로 12시간제로 변경해달라는 요구사항이 오면, getCurrentTime 메서드를 변경하여 12시간제의 결과를 반환하도록 수정해야합니다. 근데 이때 한국 시간을 구하는 컨트롤러도 이 메서드를 같이 사용하고 있기 때문에 영향을 받아 같이 수정해야하는 문제가 발생합니다.
지금은 호출부가 2곳밖게 없지만 예를들어 100곳에서 호출하여 사용하는 메서드라고 하면, 호출부를 일일이 찾기도 힘들고 찾아서 수정한다고 하더라도 또다른 요구사항이 올 수도 있기 때문에 변경에 아주 취약한 상태임을 알 수 있습니다.
Time 클래스는 현재 시간을 반환한다는 하나의 책임을 충족하고 있는 것 처럼 보였으나, 시간의 유형을 변경하는 요구사항에 영향을 받았습니다. 그 말은 결국 어떤 클래스가 하나의 기능을 가지는 것이 하나의 책임을 가진다는 것과는 다른 의미라는 것을 알 수 있습니다.
3. 정리
따라서 단일책임원칙은 책임에 대해 기준을 잘 세우는 것이 필요합니다. 클래스의 변경가능한 지점이 있는지 또 그 지점이 하나의 책임을 맡고 있는지와 그 용도에 대해서 잘 고민하여 적용해야 할 것으로 생각됩니다.
더 생각해볼 부분 / 추가로 알아볼 부분
1. 클래스가 여러 public 메서드를 가진다면 복수의 책임을 갖는지
2. 클래스가 다중 상속 또는 다중 구현을 하면 복수의 책임을 갖는지
3. 해당 클래스를 의존하는 클라이언트의 유형이 여럿이라면 변경되는 이유가 여러가지인지?
'백엔드 기술면접 > 개념정리' 카테고리의 다른 글
[WEB] HTTP와 HTTPS 차이점 (0) | 2022.12.11 |
---|---|
HTTP 상태 메시지 종류 및 예시 (1) | 2022.08.25 |
최근댓글