Service단에 매번 선언되는 에러메시지 상수들…(신경쓰임)
프로젝트 전체에서 공통으로 사용되는 에러 메시지를 한 곳에서 관리하고 싶었다. 중복을 피하고 유지보수성을 높일 수도 있고 가독성도 향상되는 효과를 기대하며 아래와 같이 클래스로 관리하기 시작했다.
변경 전
public class FruitService(){
public static final String FRUIT_NOT_FOUND_MESSAGE = "해당하는 과일 없음"
...
}
public class VegitableService(){
public static final String VEGITABLE_NOT_FOUND_MESSAGE = "해당하는 채소 없음"
...
}
public class KitchenService(){
public static final String FRUIT_NOT_FOUND_MESSAGE = "해당하는 과일 없음";
public static final String VEGITABLE_NOT_FOUND_MESSAGE = "해당하는 채소 없음";
public static final String SWEETS_NOT_FOUND_MESSAGE = "해당하는 간식 없음";
...
}
변경 후
public class ErrorMessageConstants {
public static final String FRUIT_NOT_FOUND_MESSAGE = "해당하는 과일 없음";
public static final String ANIMAL_NOT_FOUND_MESSAGE = "해당하는 동물 없음";
…
private ErrorMessageConstants() {
// private 생성자로 인스턴스화 방지
}
}
..
Q. 잠깐 클래스가 아닌 인터페이스로 관리할 수도 있지 않을까?
상수를 관리하는 클래스를 인터페이스로 만들 수도 있지만, Java에서는 주로 인터페이스를 상수만을 위한 목적으로 사용하지 않는 편인데 이유는 아래와 같다.
Java 8 이후의 인터페이스 변경 가능성
Java 8 이전에는 인터페이스에 정의된 모든 멤버가 public static final이어야 했기 때문에, 상수를 관리하는데 주로 인터페이스를 사용했다. 그러나 Java 8부터는 디폴트 메서드와 정적 메서드를 인터페이스에 추가할 수 있게 되어, 이러한 변경 가능성이 있다. 따라서, 인터페이스에 상수만을 위한 용도로 사용하는 것은 권장되지 않는다.
가독성 및 의도 표현
인터페이스는 주로 특정 동작을 강제하는데 사용된다. 따라서 인터페이스를 사용하여 상수만을 정의하는 것은 코드의 가독성을 해칠 수 있다. 반면에 클래스를 사용하면 명시적으로 상수 값을 관리하는 클래스임을 나타낼 수 있다..
Q. 그럼 enum으로는?
enum은 상수를 정의하고 관리하기에 매우 효과적인 방법 중 하나다. 그러나 상수에 대해 더 복잡한 동작이 필요한 경우, 클래스를 사용하는 것이 더 유연할 수 있고, 클래스는 필요한 메서드와 속성을 포함할 수 있으며, 이를 통해 더 복잡한 동작을 지원할 수 있다. 확장성 측면을 고려하여 클래스로 관리하기를 선택했다.
클래스로 관리했을 때의 장점을 어필해보자면...
추가 기능의 필요성
enum은 클래스처럼 메서드를 가질 수 있지만, 클래스보다는 더 특수한 경우에 사용됨. 클래스는 추가적인 메서드나 속성을 가질 수 있어, 더 많은 기능을 필요로 하는 상황에서 클래스를 사용하는 것이 더 편리할 수 있다.
확장성
만약 상수에 대해 더 복잡한 동작이 필요한 경우, 클래스를 사용하는 것이 더 유연할 수 있다. 클래스는 필요한 메서드와 속성을 포함할 수 있으며, 이를 통해 더 복잡한 동작을 지원할 수 있음.
결론: 이렇게 에러 메시지를 한 곳에서 관리할 경우 얻을 수 있는 장점은?
- 중복 제거 및 일관성 유지: 모든 에러 메시지가 한 곳에서 관리되므로 중복을 피하고 일관된 형식을 유지할 수 있습니다. 이는 코드의 가독성을 높이고 유지보수를 용이하게 만듭니다.
- 유지보수성 향상: 프로젝트에서 사용되는 모든 에러 메시지가 한 클래스에 모여 있기 때문에 변경이 필요한 경우 해당 클래스만 수정하면 됩니다. 이는 유지보수성을 향상시키고 변경 사항이 빠르게 적용될 수 있도록 합니다.
- 코드 가독성 증가: 에러 메시지가 분산되지 않고 한 곳에서 관리되기 때문에 코드의 가독성이 향상됩니다. 새로운 개발자가 프로젝트에 참여하거나 기존 코드를 이해해야 할 때 훨씬 쉽게 읽고 이해할 수 있습니다.
- 유연성 증가: 새로운 에러 메시지를 추가하거나 기존 메시지를 변경할 때 클래스 내부에서만 수정하면 되므로 다른 부분에 영향을 미치지 않습니다. 이는 시스템의 유연성을 높여줍니다.
Enum과 인터페이스가 오답이라는 것은 아니다. 프로젝트의 규모에 맞게 선택하는 것이 정답이다. 이렇게 에러메시지를 상수로 한 클래스에서 관리하면서 자연스레 전역 에러 처리에 대해서도 신경을 쓰게 되었고 @ControllerAdvice와 @ExceptionHandler를 사용하여 전역 에러 처리를 하게 되었다.
//글 링크 추가 예정
'💻dev > 🌱Java+Spring' 카테고리의 다른 글
@NotBlank @NotNull @NotEmpty 를 짚고 넘어가자! (0) | 2024.02.28 |
---|---|
DTO는 어떻게 관리하는게 좋을까? 에 대한 고민과 해결책 (0) | 2024.02.21 |
Spring | @Annotation 어노테이션은 어떻게 동작할까? (0) | 2023.10.29 |
Spring Security | 비밀번호 변경 기능 구현 하기 (0) | 2023.08.11 |
Spring Security | 회원정보 수정 기능 구현 (0) | 2023.08.11 |