본문 바로가기
프로그래밍/Java

Java Long 타입의 비교 에피소드?

by Mr-후 2023. 2. 2.
반응형

Long타입의 변수가 2개 있다.
두 값을 비교해서 같을 때 데이터베이스의 특정 컬럼의 값을 업데이트 하는 로직이다. 
아주 간단한 작업이다. 

로컬에서 테스트할 때 로컬 데이터베이스에 있는 Row를 가지고 테스트했을 때는 잘 되었다. 
분명 값이 변경되는걸 확인했고 스웨그로 몇 번을 테스트했다. 

그리고 개발 서버에 배포를 하고 프론트 개발자분들에게 API가 개발되었다고 이야기했다. 
퇴근길에 안된다는 메일을 받았고 온통 왜지? 라는 물음을 가지고 있었다. 

출근을 해서 소스를 열어보고 테스트를 진행했다. 
클라이언트에서 테스트한 Long형 값을 가지고 개발 데이터베이스와 연결했는데, 정말 변경이 일어나지 않는다. 
뭔 일이지? 하는 마음에 혹시 비교가 잘못되나 싶어 if문에 log를 남겨보았다. 역시나 서로 다르다고 찍힌다. 
내가 비교했던 구문은 이렇다. 

Long ptrId = 4876L; 

if (ptlId == item.getId()) {
    //업데이트 
 } else { 
    //서로 다름 
 }

뭔가 이상하다는 느낌을 받았다. 
Objective-c, Swift위주로 문법 작업을 했던터라, 자바의 기초 문법에 약한 나는 비교가 이게 아니라는걸 직감했다. 
그래서 아래와 같이 변경 후 테스트를 진행하니 정상적으로 업데이트가 일어났다. 

Long ptlId = 4876L; 
if (ptlId.equals(item.gitId())) {
    //업데이트 
} else {
    //서로 다름
 }

로컬 서버에서 테스트할 때는 그 값의 범위가 -127 ~ 127 사이의 값으로 했었고, 잘 비교가 되었지만 그보다 큰 값으로 할 경우는 정상적으로 비교가 되지 않으니, 참조형 오브젝트 타입의 변수를 사용할 때는 equals 을 이용해서 비교하는 것이 안전하다는 것을 배웠다. 

 

 

반응형