🍳

초보 개발자의 일상

Java/SpringBoot

.of() 메서드

dev.jelee 2024. 11. 6. 00:28

강사님이 작성해준 소스코드를 분석하는데 어려운 용어 투성이다.

.of() 메서드를 보았는데 객체를 쉽게 만들 수 있게 해주는 거라는 설명을 보았다.

깊게는 설명을 읽지 않았는데 아래 소스코드를 보고 의문이 들었다.

인스턴스를 만드는건데 안에 .of() 메서드를 사용해서 또 객체를 만든다는 말인가? 혼란스러웠다.

그래서 chat gpt한테 설명과 예시를 몇가지 들어달라고 했다.


ErrorResponse errorResponse = ErrorResponse.of(e.getErrorCode());
  • of() 메서드는 ErrorResponse 객체를 간편하게 생성하기 위한 팩토리 메서드입니다. 즉, 이 메서드를 통해 ErrorResponse 객체를 쉽게 생성하고, 필요한 데이터(예: e.getErrorCode())를 넣어줄 수 있는 방식입니다.

왜 of() 메서드를 사용할까요?

  • of() 메서드를 사용하는 이유는 객체 생성 방식을 간결하게 만들기 위해서입니다. 보통 of() 메서드는 복잡한 객체 생성 로직을 캡슐화하고, 객체 생성을 간소화하려는 목적으로 사용됩니다.
    ErrorResponse.of()처럼 사용하면 ErrorResponse 객체 생성 시 필요한 데이터를 메서드 인자로 넘기기만 하면 되므로 코드가 더 간결하고, 객체 생성에 필요한 복잡한 로직을 내부에서 처리할 수 있습니다.

예시

1. ErrorResponse 클래스 (간단한 예시)

public class ErrorResponse {

    private String errorCode;
    private String errorMessage;

    // 생성자 (private으로 두어 직접 생성하는 방식은 막을 수 있음)
    private ErrorResponse(String errorCode, String errorMessage) {
        this.errorCode = errorCode;
        this.errorMessage = errorMessage;
    }

    // Getter methods
    public String getErrorCode() {
        return errorCode;
    }

    public String getErrorMessage() {
        return errorMessage;
    }

    // 'of' 팩토리 메서드: 주어진 errorCode에 맞는 ErrorResponse 객체를 생성
    public static ErrorResponse of(String errorCode) {
        String errorMessage = "";

        // errorCode에 맞는 메시지를 설정하는 예시
        switch (errorCode) {
            case "404":
                errorMessage = "Not Found";
                break;
            case "500":
                errorMessage = "Internal Server Error";
                break;
            case "403":
                errorMessage = "Forbidden";
                break;
            default:
                errorMessage = "Unknown Error";
        }

        // ErrorResponse 객체를 반환
        return new ErrorResponse(errorCode, errorMessage);
    }
}

 

2. 사용 예시
이제 ErrorResponse.of(e.getErrorCode())가 어떻게 작동하는지 살펴보겠습니다:

public class Main {
    public static void main(String[] args) {
        String errorCode = "404";  // 예시로 404 에러 코드 사용

        // ErrorResponse.of() 메서드를 사용하여 ErrorResponse 객체 생성
        ErrorResponse errorResponse = ErrorResponse.of(errorCode);

        // 생성된 ErrorResponse 객체에서 에러 코드와 메시지를 출력
        System.out.println("Error Code: " + errorResponse.getErrorCode());
        System.out.println("Error Message: " + errorResponse.getErrorMessage());
    }
}

 

3. 동작 원리

  1. e.getErrorCode()가 "404"를 반환했다고 가정해봅시다.
  2. ErrorResponse.of("404") 호출 시, of() 메서드가 실행됩니다.
    • 이 메서드는 errorCode에 해당하는 errorMessage를 찾아서 ErrorResponse 객체를 생성합니다.
    • "404" 코드에 해당하는 에러 메시지 "Not Found"를 생성하여 ErrorResponse 객체를 반환합니다.
  3. ErrorResponse 객체에는 "404"와 "Not Found"가 설정되고, 이후 getErrorCode()와 getErrorMessage()를 통해 해당 값을 꺼낼 수 있습니다.

 

4. 출력

Error Code: 404
Error Message: Not Found

왜 ErrorResponse.of()를 사용하는 걸까요?

  • 간결함: ErrorResponse.of() 메서드를 사용하면, ErrorResponse 객체를 직접 생성하는 복잡한 과정을 숨길 수 있고, 코드가 더 간단하고 직관적으로 보입니다.
  • 유연성: of() 메서드 내부에서 errorCode에 따라 적절한 errorMessage를 결정하는 로직을 넣을 수 있습니다. 이처럼 객체 생성 과정에 복잡한 처리가 필요한 경우 of() 메서드를 사용하여 모든 로직을 한 곳에서 관리할 수 있습니다.
  • 불변 객체 생성: ErrorResponse 객체는 불변 객체(immutable object)로 만들 수 있습니다. 이를 위해 객체 생성자는 private으로 두고, 객체를 생성하는 유일한 방법은 of() 메서드를 통해서만 가능하게 할 수 있습니다.

1. of() 메서드를 사용하지 않은 경우

ErrorResponse.of()를 사용하지 않고 객체를 생성하려면, 객체를 직접 생성하는 방식으로 코드를 작성해야 합니다. 예를 들어, ErrorResponse 클래스의 생성자를 직접 호출하여 객체를 만들 수 있습니다.

2. of() 메서드를 사용하지 않고 createErrorResponse()로 객체 생성하기

createErrorResponse() 메서드를 사용하여 ErrorResponse 객체를 생성하는 방식입니다.

사용 예시:

public class Main {
    public static void main(String[] args) {
        String errorCode = "404";  // 예시로 404 에러 코드 사용

        // ErrorResponse 객체를 생성하기 위해 직접 메서드 호출
        ErrorResponse errorResponse = ErrorResponse.createErrorResponse(errorCode);

        // 생성된 ErrorResponse 객체에서 에러 코드와 메시지를 출력
        System.out.println("Error Code: " + errorResponse.getErrorCode());
        System.out.println("Error Message: " + errorResponse.getErrorMessage());
    }
}

 

출력:

Error Code: 404
Error Message: Not Found

 

of() 메서드를 사용하지 않은 경우의 차이점

  1. 객체 생성 방식의 변화:
    • ErrorResponse.of(errorCode)를 사용할 때는 팩토리 메서드를 사용하여 객체를 간편하게 생성할 수 있지만, createErrorResponse()와 같은 메서드를 직접 만들면 객체 생성에 필요한 로직을 명시적으로 정의해야 합니다.
    • 물론 이 방법도 ErrorResponse 객체를 생성하는 데 문제가 되지는 않지만, of() 메서드를 사용하는 것보다 더 길고, 중복되는 코드가 될 수 있습니다.
  2. 유연성의 차이:
    • of() 메서드를 사용하면 객체 생성 과정이 캡슐화되어 코드가 간결하고 재사용이 쉬워집니다. 예를 들어, of() 메서드 내부에서 여러 가지 복잡한 로직을 처리할 수 있습니다.
    • createErrorResponse()와 같은 방식으로 직접 처리하면, 객체 생성에 필요한 로직이 메서드 내에 다 들어가므로 추후에 변경이 필요할 경우, 여러 곳에서 이 로직을 수정해야 할 수도 있습니다.
  3. 코드 가독성:
    • ErrorResponse.of()처럼 이름이 잘 지어진 메서드를 사용하면 코드의 의도를 쉽게 알 수 있습니다. 코드만 보고도 of()가 "객체를 생성하는 메서드"라는 것을 직관적으로 이해할 수 있습니다.
    • 반면에 createErrorResponse()처럼 메서드를 직접 사용하면 메서드 이름을 봐야만 해당 메서드가 객체를 생성하는 메서드라는 걸 알 수 있습니다.

3. of() 메서드를 사용하지 않는 대신 생성자를 직접 호출하는 방법

생성자를 직접 호출하여 객체를 만드는 방법도 있습니다. 이 방법은 ErrorResponse 객체를 생성할 때 각 필드 값을 수동으로 지정하는 방식입니다.

public class Main {
    public static void main(String[] args) {
        String errorCode = "404";
        String errorMessage = "";

        // errorCode에 맞는 errorMessage를 수동으로 설정
        switch (errorCode) {
            case "404":
                errorMessage = "Not Found";
                break;
            case "500":
                errorMessage = "Internal Server Error";
                break;
            case "403":
                errorMessage = "Forbidden";
                break;
            default:
                errorMessage = "Unknown Error";
        }

        // ErrorResponse 객체를 직접 생성
        ErrorResponse errorResponse = new ErrorResponse(errorCode, errorMessage);

        // 생성된 ErrorResponse 객체에서 에러 코드와 메시지를 출력
        System.out.println("Error Code: " + errorResponse.getErrorCode());
        System.out.println("Error Message: " + errorResponse.getErrorMessage());
    }
}

 

이 방법도 결국 ErrorResponse 객체를 생성하는 방법이지만, switch나 if 로직이 메서드 외부에 있거나 클래스 내에 여러 곳에서 중복될 수 있기 때문에 코드가 길어질 수 있습니다.


결론

  • of() 메서드를 사용하지 않으면: 객체 생성 과정에서 필요한 로직을 직접 작성해야 합니다. 코드가 길어질 수 있고, 중복이 발생할 수 있습니다.
  • of() 메서드를 사용하면: 객체 생성 로직을 캡슐화하여 코드가 간결하고 재사용하기 쉬운 형태로 만들 수 있습니다. ErrorResponse.of()와 같은 메서드를 사용하면 객체 생성이 훨씬 직관적이고 유연해집니다.

of() 메서드를 사용하는 이유는 코드의 재사용성과 가독성을 높이기 위함입니다. 특히 여러 곳에서 객체를 생성하는 로직이 중복되지 않도록 해주며, 객체 생성 시 필요한 데이터나 로직을 쉽게 관리할 수 있게 해줍니다.