boolean 변수 바인딩 에러

김주영·2023년 9월 14일

에러 해결

목록 보기
2/3

우선, Boolean과 boolean의 차이부터 짚고 넘어가자.

Boolean과 boolean은 참조타입과 원시타입이다.

우선 원시타입(Primitive Type) 은 기본 데이터 유형을 나타낸다. 이러한 타입은 자바에서 미리 정의되어 있으며, 데이터를 단일 값으로 저장한다. 종류로는 int,double,boolean,char 등등이 있다. 원시 타입 변수는 값을 직접 저장하므로 메모리 사용이 효율적이다(Unboxing을 해줄 필요가 없기 때문에 시간을 단축시킬 수 있다). 하지만 원시타입 변수는 null값을 가질 수 없고, 메서드 호출 시 값을 복사하여 전달한다.

참조타입(Reference Type) 은 객체를 나타내며 원시 타입과는 달리 데이터의 구조와 메서드를 포함하는 복합 데이터 유형이다. 참조 타입 변수는 객체에 대한 참조(주소)를 저장하므로 객체 자체가 힙(heap)메모리에 저장되고 변수는 해당 객체를 가리킨다. 종류는 class, Interface,Array,Enum 등이 있고, Integer, Boolean, Double 등도 해당된다. 참조 타입 변수는 null 값을 가질 수 있고, 메서드 호출 시 객체의 참조가 전달된다. 이는 메모리 사용이 상대적으로 많을 수 있지만, 더 많은 유연성을 제공한다.

인턴 업무를 하며 Boolean값을 boolean값으로 바꿔야 하는 일이 있었는데 이유는 두 가지 상황만 판단하면 되는 일이었기에 null 값을 포함하는 Boolean보다는 boolean을 사용하는 것이 방어코딩이 원활하기 때문이다.

그래서 boolean으로 바꿔주고 기본세팅인 false를 html, 화면단에서 true값으로 바꿔주려는데 값이 바뀌질 않았다. dto와 html에서는 문제가 없어보였기에 디버깅을 진행해봤더니

분명 true값을 전달 해줬는데 왜 안될까.. 하며 구글링을 해보니 lombok에서 제공하는 @Getter 혹은 @Setter 어노테이션을 사용할 경우 자동으로 getter/setter메서드를 생성해주는데, 이 때 boolean 타입의 변수에 붙는 prefix는 get이 아닌 is이므로 @RequestBody에서 찾을 수 없어 바인딩 되지 않아 발생하는 문제였다.

@Getter and @Setter
바인딩 에러 참고 블로그

Boolean을 사용하면 쉽게 해결되는 문제였지만 변수명에서 is prefix를 제거하는 방법을 사용하면 간단하게 해결 가능하다. 제거하면 변수명은 부자연스럽지만 일단 해결된다.

그리고 참조타입이 아닌 원시타입을 사용했기 때문에

<div th:if="${patientRegistDto.getIsNewPharmacyPatient() && patientRegistDto.isShowNewPatientModal()}">

보면 앞에는 get을 사용했지만 뒤는 is를 사용했다. 참조변수가 아니기 때문에 Unboxing을 해줄 필요가 없는것이다. 이거 한다고 세시간을 넘게 투자했다.

0개의 댓글