본문 바로가기
Java & Spring

Spring에서 DTO 생성 시 Primitive Type과 Reference Type 중 어떤 것을 쓰는게 좋을까?

by devlect 2023. 12. 10.

너무 흘려보내는 것들이 많아 뭐라도 조금씩 매일 끄적여 보려 한다. 확실히 관성은 무섭고 한번 쓰지 않기 시작하니 백지에 뭔가를 적어 내려가는데 시작도 하기 전에 부담스러워지기 시작한다. 원래는 글쓰기가 너무 재미있었는데 말이지. 각설하고.

--

 

Spring 에서 Controller - Service - Repository 간 데이터를 주고받을 때 DTO를 사용하는데 이때 각 멤버변수를 Primitive Type(원시 타입)을 사용할지, Reference Type(참조 타입)을 사용할지 고민스럽다. 예를 들어, 어떤 활성화 상태를 나타내는 enabled라는 변수가 있을 때 다음 둘 중 어떤 타입을 쓰는 게 좋을까?

# Primitive Type
private boolean enabled;

# Reference Type
private Boolean enabled;

 

잘 보면 하나는 소문자 b로 시작하는 boolean이고, 다른 하나는 대문자 B로 시작하는 Boolean이다. boolean은 원시 데이터 타입이므로 Null을 가질 수 없다. true나 false 중 무조건 하나를 가져야 한다. 반면 Boolean은 참조 데이터 타입으로 Null을 가질 수 있다. 

 

이런 특징은 클라이언트로부터 Optional한, 그러니까 사용자가 입력을 안 할 수도 있는 Controller에서 DTO 클래스 생성 시 특히 유용하다. 변경 가능한 20개의 데이터 중 Controller에서 입력받은 일부 데이터만 HTTP Patch method를 이용해 Request Body에서 입력받고 처리를 하고 싶은 경우 boolean을 쓰면 무조건 true, false 중 하나의 값이 필요하다. @Valid를 이용한 유효성 검사에서도 @NotNull을 명시할 수도 있고 @NotNull을 쓰지 않으면 Null도 받을 수 있다. 

 

클라이언트에서 입력값을 받는 Controller DTO 이외에 Service나 Repository와 관련된 DTO는 상황에 따라 boolean를 의도적으로 사용할 수 있다. 클라이언트 입력은 우리가 제어할 수 없지만 그 뒤로 이동하는 데이터는 우리가 적절한 유효성을 가지게 변환하고 제어할 수 있다. 

 

Boolean뿐만 아니라 다른 자료형도 상황에 따라 적절히 사용하면 Reference Type이 가지는 Null을 선택적으로 허용하기도 하고, Primitive Type이 가지는 데이터 강제 효과를 통해 Null reference exception이나 데이터 정합성을 확보할 수 있게 된다.

댓글