코딩딩/Error

Null값이 들어올 수 없는 @PathVariable에도 Wrapper class를 사용해야 할까?

전낙타 2023. 12. 28. 10:56
@PostMapping("/{appointment_seq}/reviews")
public void createReview(@PathVariable Long appointment_seq, Principal principal, @RequestBody RequestReviewFormDto dto)

 

부트캠프에서 파이널 프로젝트를 진행하다 생각없이 짠 코드에 멘토님이 코멘트를 달아주셨다.

 

appointmentSeq 경우 pathvariable 로 받고 있어 null 일수가 없는데 reference type 를 사용한 이유가 있을까요?

 

망치로 머리를 얻어맞은 기분이였다.

과연 null값이 들어올 수 없는 PathVariable에도 Wrapper class를 사용하는 의미가 있을까?

 

하이버네이트 공식 문서에서 엔티티의 내부 스펙을 Wrapper class로 선언하는것을 권고한다는 내용이 있지만,

조회에 사용할 id값인 appointmentSeq는 굳이 Long타입으로 사용할 이유가 있는지 한번 찾아보았다.

 

GPT 답변

더보기
You
- Null값이 들어올 수 없는 @PathVariable에도 Wrapper class를 사용해야 할까?
 
ChatGPT

- Wrapper 클래스를 사용하는 것은 주로 값이 null일 수 있는 상황에 대비하여 사용됩니다.

그러나 @PathVariable은 기본적으로 요청된 URL 경로에서 변수를 추출하는 데 사용됩니다. 이는 요청의 일부로부터 정보를 얻어오기 때문에 값이 없는 경우 (즉, null 값이 들어오는 경우) 해당 경로를 매핑하는 데 문제가 발생할 수 있습니다.

만약에 해당 경로 변수가 null이 될 수 없는 경우, 즉 요청이 해당 변수를 항상 포함하고 있어야 하는 경우 Wrapper 클래스 대신 기본 자료형을 사용하는 것이 일반적입니다. 이렇게 하면 해당 변수가 없는 요청이 들어오면 Spring 프레임워크에서 적절한 에러를 반환하여 요청 처리에 문제가 있음을 알려줄 수 있습니다.

그러나 경우에 따라서는 Wrapper 클래스를 사용하여 더 많은 유연성을 제공하고, 변수가 없는 경우에 대한 추가 로직을 처리할 수도 있습니다. 이는 프로젝트의 요구사항과 설계 결정에 따라 달라질 수 있습니다.

 

GPT도 null이 들어올 수 없는 경우에는 원시타입을 사용하는것이 일반적이라고 한다.

 

그럼 해당 값을 Long으로 가져갔을때 얻을 수 있는 장점이 무엇이 있을까?

 

1. null값이 허용된다.

- 위와 같은 상황에는 null값이 들어올 상황이 없음으로 해당 사유는 Wrapper class를 사용할 이유가 되지 않는다.

 

2. Long에서 제공하는 메서드들

- 단순 조회에 필요한 시퀀스값으로 이 값을 String으로 변환하거나 비교할 일이 있을까?

 

3. java.util 패키지의 클래스는 객체만 처리한다.

- 이미 값이 할당된 Seq에는 해당되지 않는 이유인것같다. 그리고 ArrayList<Long> 같은 배열에 Seq값을 넣어야 한다고 해도 오토 박싱이 되어 이 문제또한 Long타입을 사용할 이유가 되지 못한다.

 

4. 멀티스레딩에서 동기화를 지원하려면 객체가 필요하다.

- 스프링은 대부분의 상황에서 Thread-safe한 방식으로 설계되어 있다. 스프링에서는 주로 빈(Bean)이나 컴포넌(Component)들을 관리하고, 이들은 주로 멀티스레드 환경에서 안전하게 작동하도록 설계되어 있다.

 

솔직히 다음과 같은 상황에 어떤 타입을 써야할지 모르겠다.

명확한 답을 내기 힘든 문제인것같다.

 

나중에 멘토님이 Wrapper class와 원시타입의 차이를 명확히 알고있는지 궁금해서 물어본거라고 답을 해주셨지만 이런 세세한 부분까지 신경써서 고민해볼 수 있는 개발자가 되고싶다