궁금증

컨트롤러와 서비스에서 동일한 메서드명을 사용하는 것이 적절할까?

0and24 2024. 12. 6. 23:55

개발자라면 메서드 이름을 지을 때 항상 고민하게 됩니다. 특히 컨트롤러와 서비스에서 동일한 이름의 메서드를 사용하는 것이 적절한지에 대해 의문이 들 때가 있습니다. 이번 글에서는 이 주제에 대해 다뤄보려고 합니다.

https://www.w2solution.co.jp/corporate/tech/mvcsnihureru/

1. 컨트롤러와 서비스의 역할

컨트롤러와 서비스는 서로 다른 역할을 수행합니다.
이 둘의 역할을 명확히 이해하면 메서드 이름을 어떻게 짓는 것이 좋은지 자연스럽게 답이 나옵니다.

컨트롤러의 역할

  • 클라이언트(웹, 앱 등)와 상호작용합니다.
  • HTTP 요청을 받아 적절한 응답을 반환합니다.
  • 사용자 관점에서 이해하기 쉬운 이름을 사용하는 것이 중요합니다.

서비스의 역할

  • 비즈니스 로직을 처리합니다.
  • 데이터 저장소(Repository)와 상호작용하며 데이터를 조작하거나 처리합니다.
  • 내부 동작에 초점을 맞춘 이름을 사용하는 것이 적절합니다.

2. 동일한 이름의 메서드를 사용해도 될까?

컨트롤러와 서비스가 동일한 역할을 수행한다면 같은 이름을 사용하는 것이 가능합니다.
예를 들어, 이메일이 등록되어 있는지 확인하는 기능을 살펴보겠습니다.

동일한 이름 사용 예시

@RestController
public class UserController {
    private final UserService userService;

    @GetMapping("/api/email-exists")
    public boolean isEmailRegistered(@RequestParam String email) {
        return userService.isEmailRegistered(email); // 서비스 호출
    }
}

@Service
public class UserService {
    public boolean isEmailRegistered(String email) {
        return userRepository.findByEmail(email).isPresent();
    }
}
  • 컨트롤러 메서드는 클라이언트 요청을 받아 서비스 메서드를 호출합니다.
  • 서비스 메서드는 비즈니스 로직을 처리합니다.
  • 이름이 동일하더라도, 각 계층의 역할이 명확하므로 문제가 없습니다.

장점

  • 일관된 이름 사용으로 가독성이 좋아집니다.
  • 요청-처리 흐름을 이해하기 쉽습니다.

3. 이름을 다르게 지어야 하는 경우

컨트롤러와 서비스가 유사한 작업을 수행하지만, 역할이 다르다면 이름을 구분하는 것이 좋습니다.

이름 구분 예시

@RestController
public class UserController {
    @GetMapping("/api/check-email")
    public boolean checkEmailExistence(@RequestParam String email) {
        return userService.isEmailRegistered(email);
    }
}

@Service
public class UserService {
    public boolean isEmailRegistered(String email) {
        return userRepository.findByEmail(email).isPresent();
    }
}
  • 컨트롤러 메서드는 클라이언트 요청을 처리하는 외부의 역할에 맞게 checkEmailExistence라는 이름을 사용합니다.
  • 서비스 메서드는 비즈니스 로직을 표현하는 내부의 역할에 맞게 isEmailRegistered라는 이름을 사용합니다.

장점

  • 각 계층의 역할을 더 명확히 드러낼 수 있습니다.
  • 컨트롤러와 서비스 간의 의도를 명확히 구분할 수 있습니다.

4. 메서드 이름을 지을 때 고려해야 할 점

  1. 컨트롤러는 사용자 관점에서 이름을 지으세요.
    • 클라이언트 요청을 처리하는 역할을 명확히 드러내는 이름을 사용합니다.
    • 예: checkEmailExistence, registerUser, loginUser
  2. 서비스는 비즈니스 로직 관점에서 이름을 지으세요.
    • 내부 로직을 설명하는 이름을 사용합니다.
    • 예: isEmailRegistered, saveUser, authenticateUser
  3. 팀 컨벤션을 따르세요.
    • 팀 내 규칙을 정하면 혼란을 줄이고 코드 일관성을 유지할 수 있습니다.
  4. 가독성을 우선으로 생각하세요.
    • 이름만으로도 메서드의 역할이 명확히 드러나야 합니다.

5. 결론

  • 같은 이름 사용: 역할이 동일하고 명확하다면 같은 이름을 사용해도 괜찮습니다.
  • 다른 이름 사용: 컨트롤러와 서비스의 역할이 다르다면 이름을 구분하여 의도를 명확히 표현하세요.

컨트롤러는 사용자 요청을 처리하는 관점,
서비스는 비즈니스 로직을 처리하는 관점에서 메서드 이름을 작성하면 더 읽기 좋은 코드를 만들 수 있습니다.