스프링을 배우다가 아주 사소한 코드를 보면서 이게 Single Responsibility Principle 원칙을 문득 떠올렸다.
- 멤버정보를 저장하는 MemberDao가 있다. 그러다 갑자기 저장된 Member의 모든 정보를 출력하고 싶어졌다.
- 나는 아마도 MemberDao에서 printAll 이라는 메서드를 만들어서 저장된 Member 정보를 모두 출력할 것이다.
- 개발자마다 생각은 다르겠지만 이건 내 생각에는 SRP에 어긋난다. MemberDao의 책임은 Member 데이터를 관리하는 것이다.
그러면 어떻게 할것인가?
1
2
3
4
5
6
| public class MemberPrinter
public void print(Member member){
System.out.printf("회원 정보: 아이디=%d, 이메일=%s, 이름=%s, 등록일=%tF\n",
member.getId(), member.getEmail(), member.getName(), member.getRegisterDateTime());
}
|
- 우선 MemberPrinter를 만들어서 이 클래스는 멤버의 정보를 받아서 출력하는 책임만을 준다.
- 이 MemberPrinter는 오로지 멤버정보를 받아서 출력하는 책임만을 가진다.
이제 실행은 누가 해줄 것인가?
- MemberDao, MemberPrinter 두 클래스는 만들었고, 각각은 하나의 책임만을 가진다. 다만 이것을 누가 실행해 줄 것인가??
- MemberDao는 멤버정보 관리의 책임을 MemberPrinter는 멤버 정보 출력의 책임을. 그려면 이제 멤버정보를 받아서 멤버정보를 출력하라고 명령하는 책임의 클래스가 필요하다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| public class MemberListPrinter{
private MemberDao memberDao = null;
private MemberPrinter printer = null;
public MemberListPrinter(MemberDao memberDao, MemberPrinter printer){
this.memberDao = memberDao;
this.printer = printer;
}
public void printAll(){
Collection<Member> members = memberDao.selectAll();
members.forEach(m -> printer.print(m));
}
}
|
- MemberListPrinter도 위 2가지 클래스와 마찬가지로 MemberDao와 MemberPrinter를 생성자로 받아서 출력한다. 즉 한가지 책임만을 가진다.(물론 이건 사람마다 생각하는 것이 다를거다.)
이렇게 변경하면 무엇이 좋은가?
- 나도 이런 내용을 책에서 봤는데 SRP를 지키는 것은 참 좋다만 무엇이 좋은 것인가? 라는 의구심이 생겼었다.
- 곰곰히 생각해보니 결국 DI의 연장선상에서 추상화와 관련되어있고, Interface와 관련이 있었다.
이게 무슨 x소리인가??
- 가령 내가 멤버를 출력하는 이 부분을 동료나, 혹은 API로 다른 사람에게 사용할 수 있도록 한다고 해보자.
- 나는 현재 내가 저장한 모든 멤버의 출력을 위해서 MemberListPrinter 클래스만 알려주면 된다. 나머지 MemberDao, MemberPrinter는 사용하는 사람입장에서는 전혀 알 필요가 없다.(스프링이라는 가정하에!)
그래서 무엇이 좋은가?
- 설명이 너무 길어져서 간단하게 얘기하자면, 이렇게 추상화를 시켜서 만들면 추후에 Member에 주소나, 별명, 가입일등이 추가가 된다고 하더라도 MemberListPrinter는 변경되는 것이 없다.(물론 변경점이 어마어마 하다면 얘기는 달라지겠지만)
- 나는 이렇게 해서 객체지향에서 지켜야하는 SOLID원칙에서 S를 지켰고, O(개방 폐쇠 원칙)도 지켰다.(고 생각한다.)
마무리
- 스프링을 공부하는 것도 중요하지만 객체지향에 대해서도 같이 열심히 공부하자.
- 스프링은 관점지향(AOP)라고 말하는데 결국 AOP는 객체지향을 더 객체지향스럽게 만들어주는 방법이라고 배웠으니 말이다.
Leave a comment