Early Return 빠른 반환..?
회사에서 Batch Job 을 개발해야하는 일이 생겼는데, 의도치 않게 반복문이 여러번 등장하고 반복문 안에서 continue 가 여러차례 사용해야하는 일이 생기게 되었다.
- 기존 코드
//
List<UserModel> users = userRepository.select();
for(int i = 0; i < loopCount; i++){
UserModel user = users.get(i);
String userId = user.getId();
PostModel post = postRepository.select(userId);
if(!post){
continue;
}
...
if(sampleCondition){
continue;
}
...
}
//
위와 같은 형태로 코드가 작성이 되었을때 조건이 너무 많고, 로직을 이해하기가 까다로울 수 있어 Early Return 형태의 함수로 작성하는게 어떻겠냐는 선임 개발자 분의 피드백이 있었다.
반드시 그래야 하는것도 아니고, 무조건적인 부분은 아니나 권장하는 방법이라며 조심스럽게 말씀을 주셨고, 당시의 나는 early return 이 대체 뭐지? 라는 생각으로 찾아보게 되었다.
추가로 java 에 foreach 형태의 함수도 제공하고 있다는 의견도 주셔서 적극 반영을 하게 되었고, early return 을 적용한 코드는 아래와 같다.
- 개선 코드
//
private void checkUserCondition(UserModel user){
String userId = user.getId();
PostModel post = postRepository.select(userId);
if(!post){
return;
}
...
if(sampleCondition){
return;
}
...
}
// 반복문 안에서 continue의 조건을 확인 해가며, 로직을 전부 이해 하지 않아도 된다.
List<UserModel> users = userRepository.select();
for(UserModel user : users){
checkUserCondition(user);
}
//
차이점
- 반복문 내부에 여러 조건이 있는 로직을 기재하게 된다면 다른 작업자가 해당 코드를 확인할때 내부 로직을 이해하기 번거롭거나 덜 직관적일 수 있다.
- 반복문이 있는 함수는 반복문만 하도록 단일 정체성을 갖게 하는것이 다음 작업자의 이해를 도울 수 있다.
- 비즈니스 로직을 별도로 두어, 반복문과 연관이 있는 continue 를 생각할 필요 없이 validation 의 역할을 별도의 함수 내부에 갖추는게 이해하거나 재사용할때 도움이 될 가능성이 높아 보인다.
- 결국 가독성과 재사용성, 그리고 함수명을 이용한 직관적인 의미 전파를 위해 사용을 하게 되는 것 같다.
'Server Etc.' 카테고리의 다른 글
nginx 기본 명령어 및 버전 확인 (0) | 2023.01.07 |
---|
댓글