안녕하세요, 졸린 개발자입니다.
오늘은 회사에서 코딩을 하던 중
코드 개선부터 시작하여, 의사소통의 비효율을 깨달았던 경험을 공유하려고 합니다
여느 때와 다름없이 코드를 찍어내던 중.......
요즘 회사가 엄~청 바쁘네요
그 핑계로 큰 생각없이 코드를 마구마구 찍어내고 있었습니다
그러다가 아래와 같은 코드를 찍어내게 되었죠 (회사 코드와 전혀 무관한 각색된 코드입니다)
class Group {
// 그룹 멤버
private List<User> users;
// 숨겨진 그룹 멤버
private List<User> hiddenUsers;
/*
* 숨겨진 그룹 멤버가 Active 상태인가?
* true면 -> hiddenUsers도 그룹 멤버
* false면 -> hiddenUsers는 그룹 멤버가 아님
*/
private boolean isHiddenUserActive;
}
간단한 클래스 하나를 정의했습니다
그룹 멤버를 가져올때는 아래와 같이 가져올 수 있습니다.
isHiddenUserActive 가 true면 => users + hiddenUsers
isHiddenUserActive 가 false면 => users
이렇게 그룹 멤버를 가져오는 부분은
엄청나게 많은 곳에서 사용되었죠
문제의 시작: 비효율적인 코드
위의 클래스를 보셨을때 눈치채셨겠지만,
그룹 멤버를 가져오는 메소드가 정의되어있지 않았습니다
그래서, 그룹 멤버를 가져오는 코드가 중복되어 코드 여러 부분에 흩여져 있었습니다
if (isHiddenUserActive) {
return users + hiddenUsers;
}
return users;
해결 방법도 간단했습니다.
위의 로직을 하나의 메소드로 뽑아서 Group에 넣으면 되는것이죠
하지만 여기서 얘기치 못한 난관에 부딪혔습니다.
이런 유저들은 어떤 용어로 불러야하지?
새로운 도메인 용어를 정의하다
해당 부분에 대한 도메인 용어가 없다는 것을 깨달았습니다.
용어는 간단하게 정의할 수 있었습니다.
Group에 Active한 User라는 의미로
Group.activeUser 라는 용어로 정의를 하고,
getActiveUsers() 라는 메소드를 신설했죠
class Group {
// 이전과 동일 - 그룹 멤버
private List<User> users;
// 이전과 동일 - 숨겨진 그룹 멤버
private List<User> hiddenUsers;
/*
* 이전과 동일
*
* 숨겨진 그룹 멤버가 Active 상태인가?
* true면 -> hiddenUsers도 그룹 멤버
* false면 -> hiddenUsers는 그룹 멤버가 아님
*/
private boolean isHiddenUserActive;
// 추가된 코드
public List<User> getActiveUsers() {
if (isHiddenUserActive) {
return hiddenUsers + users;
}
return users;
}
}
비즈니스 로직을 관련자들과 복잡하게 소통했던 사실을 깨닫다
여기서 관련자는 개발에 참여하는 모든 인원 (QA, 기획, 개발자, 등등....) 입니다.
이전까지는 자연스럽게 아래처럼 설명했죠
A 기능
- "숨겨진 유저를 활성화했을때는 숨겨진 유저를 포함하고, 아니면 제외한 모든 그룹 멤버"에 대해 A기능이 이렇게 동작한다
B 기능
- "숨겨진 유저를 활성화했을때는 숨겨진 유저를 포함하고, 아니면 제외한 모든 그룹 멤버"에 대해 B기능이 이렇게 동작한다
C기능, D기능, ......
한 3~4번을 이렇게 반복하니,
아래 문장을 거의 랩처럼 리듬을 타면서(...) 할 수 있게 되더라구요
숨겨진 유저를 활성화했을때는 숨겨진 유저를 포함하고, 아니면 제외한 모든 그룹 멤버
새로운 용어를 정의하고 나니
의사소통이 엄청 간결해졌습니다
A 기능
- 그룹에 활성화된 멤버에 대해 A기능이 이렇게 동작한다
B 기능
- 그룹에 활성화된 멤버에 대해 B기능이 이렇게 동작한다
C기능, D기능, ......
로직으로만 보면, 되게 간단한 문제였습니다 (회사 코드는 조금 더 복잡하긴 합니다만...)
이번에 놀랐던 점은
도메인 용어를 정의한다는것이, 코딩을 편하게 해주는 것의 의미만 있는것이 아니라
현실 세계에서 의사소통을 할때에도, 훨씬 효율적으로 할 수 있게 변했다는 것에 꽤나 충격을 받았습니다
앞으로
의사소통을 효율적으로 할 수 있는 방법을 깨달았으니, 이제는 실천하는 단계입니다
앞으로 관련자들에게 로직을 복잡하게 설명하는 일이 있으면
그 로직을 추상화한 도메인 용어를 정의하여, 효율적으로 일을 해야겠다는 다짐과 함께
글을 마칩니다