강사님이 작성해준 소스코드를 분석하는데 어려운 용어 투성이다.
.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. 동작 원리
- e.getErrorCode()가 "404"를 반환했다고 가정해봅시다.
- ErrorResponse.of("404") 호출 시, of() 메서드가 실행됩니다.
- 이 메서드는 errorCode에 해당하는 errorMessage를 찾아서 ErrorResponse 객체를 생성합니다.
- "404" 코드에 해당하는 에러 메시지 "Not Found"를 생성하여 ErrorResponse 객체를 반환합니다.
- 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() 메서드를 사용하지 않은 경우의 차이점
- 객체 생성 방식의 변화:
- ErrorResponse.of(errorCode)를 사용할 때는 팩토리 메서드를 사용하여 객체를 간편하게 생성할 수 있지만, createErrorResponse()와 같은 메서드를 직접 만들면 객체 생성에 필요한 로직을 명시적으로 정의해야 합니다.
- 물론 이 방법도 ErrorResponse 객체를 생성하는 데 문제가 되지는 않지만, of() 메서드를 사용하는 것보다 더 길고, 중복되는 코드가 될 수 있습니다.
- 유연성의 차이:
- of() 메서드를 사용하면 객체 생성 과정이 캡슐화되어 코드가 간결하고 재사용이 쉬워집니다. 예를 들어, of() 메서드 내부에서 여러 가지 복잡한 로직을 처리할 수 있습니다.
- createErrorResponse()와 같은 방식으로 직접 처리하면, 객체 생성에 필요한 로직이 메서드 내에 다 들어가므로 추후에 변경이 필요할 경우, 여러 곳에서 이 로직을 수정해야 할 수도 있습니다.
- 코드 가독성:
- 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() 메서드를 사용하는 이유는 코드의 재사용성과 가독성을 높이기 위함입니다. 특히 여러 곳에서 객체를 생성하는 로직이 중복되지 않도록 해주며, 객체 생성 시 필요한 데이터나 로직을 쉽게 관리할 수 있게 해줍니다.
'Java > SpringBoot' 카테고리의 다른 글
@JsonFormat (0) | 2024.11.07 |
---|---|
messages.properties (0) | 2024.11.07 |
@RestController, @RequestMapping, ResponseEntity, @RequestBody, ResponseEntity.ok() (1) | 2024.11.05 |
CustomUserDetails 클래스Builder 적용, JPA 활용한 UserEntity (0) | 2024.10.28 |
UserDetailsService, UserDetails, GrantedAuthority, SimpleGrantedAuthority, stream (0) | 2024.10.28 |