본문 바로가기

개발 일기

[Spring] Failed to convert value of type 'java.lang.String' to required type 'long'

[ 에러 배경 ]

현재 구현하고자 하는 기능은 HLS 프로토콜을 통해 분할된 m3m8 파일과 ts 파일을 클라이언트에게 전송하는 api 다.

 

사용자가 동영상을 업로드하고 이후 동영상 id 만으로 동영상을 불러올 수 있도록 하는 게 목표다. 

데이터 베이스에 저장된 형식 (m3m8 의경로를 잡고 있으며 동일한 경로에 ts 파일이 존재한다.)
코드를 개선해나가면서 폴더 이름에 파일 확장자가 사라지게끔 설계했다.

저장할 때 경로는 src/main/resource/static/hls/chanel-{chanelId}/{title} 로 지정했다.

 

프론트에서 사용하는 api 는 아래와 같았다.

 

// 기존
@GetMapping("{movieId}")

//현재
@GetMapping("{moveId-Name}/chanel/{chanelId}")

 

해당 api 로 데이터를 불러오던 중 에러가 발생했다. String 을 long 으로 바꿀 수 없다는 내용의 에러였다.

처음 이 부분만 봤을 때는 Id 만 변환하면 되는 건데 무슨 말인가 싶었고 계속 상태를 체크하다보니 알 수 있었다.

 

- Failed to convert value of type 'java.lang.String' to required type 'long';
    
    2024-06-13T16:44:55.347+09:00  WARN 16549 --- [Mytube] [nio-8080-exec-6] .w.s.m.s.DefaultHandlerExceptionResolver 
    : Resolved [org.springframework.web.method.annotation.MethodArgumentTypeMismatchException
    : Failed to convert value of type 'java.lang.String' to required type 'long'
    ; For input string: "master_00000000.ts"]

가져온 경로를 로그로 찍었을 때

 

 

첫째. id 를 통해 파일 경로를 가져오는 것은 성공적으로 이뤄진다.

둘째. m3m8 파일을 전송하고 나서 {fileName}.ts 파일도 함께 api 를 통해 전송된다는 것이다.

ts 파일은 파일 이름과 확장자까지 api 에 포함되어 전송된다. 그러다보나 String 을 숫자로 바꿀 수 없다는 에러가 발생한 것이다.

 

이에 문득 의문이 생겼다. m3m8 이 담겨졌던 위치에 ts 파일 이름이 담겨서 넘겨질까, 아니면 정해진 위치가 있는 것일까.

한번 테스트를 해보았다.

 

// 기존
@GetMapping("{movieId}")

//현재
@GetMapping("{moveId-Name}/chanel/{chanelId}")

 

 

- movieId-Name : String

- chanelId : Integer

 

으로 설정하고 요청을 전송했다. 그러자 아래와 같은 상황을 마주했다.

 

movieId 가 담겼던 위치에 ts 파일이 함께 전송되는 것이 아니라 마지막 매개변수 위치에 자리하여 전송되는 것이다.

 

이에 아래와 같이 api 를 수정햇다.

// 기존
@GetMapping("movieId")
//현재
@GetMapping("{subject}/chanel/{chanelId}/{fileName}")

 

- subject: String

- chanelId: Integer

- fileNme: String

 

 

 

 

결론

hls 프로토콜을 타는 api 의 특성 때문인 것 같다.

m3m8 파일을 찾아서 클라이언트로 전송하면 클라이언트는 m3m8 파일을 읽고 ts 파일의 이름을 찾는다.

m3m8 을 요청했던 api 경로를 그대로 이용하여 ts 파일의 이름을 삽입해 데이터를 요청한다.

이때 ts 파일 이름이 들어가는 위치는 아마도 api 에서 가장 마지막 PathValiabe 에 들어간다.

 

나는 movie id 만을 가지고 스트리밍 서비스를 이용하는 api 를 개발 중이었기 때문에 이런 상황에 봉착한 것 같다.

 

[내가 선택한 해결 방안]

api 에서 마지막 PathValiabe 에 movieId 와 파일 이름을 같이 다룰 수 있도록 String 형태로 받는다.

movieId 로 받은 부분이 숫자로 변환이 가능하다면 id, 숫자로 변환이 불가능하다면 filename 을 받은 것으로 처리하도록 로직을 전개했다.

'개발 일기' 카테고리의 다른 글

[ 0510 ] 오류 일기 (MyBatis, SpringBoot)  (0) 2024.05.10