[Java] 객체에서 null인 값 털어내기

dev asdf·2023년 12월 23일
0

Java

목록 보기
2/3

VER: Java8 ⬆

프론트와 JSON을 주고받다보면, 다음과 같은 상황에 맞닥뜨리는 경우가 종종 생긴다.


CASE 1.

{
	"birthday" : "800101", // 생년월일 
    "businessNumber" : null  // 사업자번호
} 
// 프론트는 생년월일 또는 사업자번호를 전송함

CASE 2.

{
	"email" : null, // 이메일
    "id" : "test_id", // 아이디
    "phoneNumber" : null // 전화번호
    ...
} 
// 프론트는 이메일, 아이디, 전화번호 중 하나만 전송함

이런 경우, 어느 필드에 값이 들어있는 지 확인하려면 대충 다음과 같은 방법으로 확인하게 될 것이다.

CASE 1. if문 노가다

String certNumber;
if(birthday != null){
  certNumber = birthday;
}
else if(businessNumber != null){
  certNumber = businessNumber;
}
 // ... 생년월일/사업자번호에 대한 인증 수행
...

CASE 2. if문 노가다

String loginToken;
if(email != null){
	loginToken = tokenGetByIdLogin(login,password);
}
else if(id != null){
	loginToken = tokenGetByEmailLogin(login,password);
}
else if(phoneNumber != null){
   loginToken = tokenGetByMoblieLogin(login,password);
}
...

그러나 이 방법은 빈 값으로 전송하는 필드가 증식할때마다 if - else 조건문을 추가해줘야 하므로 상당히 귀찮다.



물론 필드를 다음과 같이 수정하는 방법도 있다.

CASE 1. 필드 수정

{
   "certType" : 0, // 0: 생년월일, 1: 사업자번호
   "certNumber" : "800101"
}

CASE 2. 필드 수정

{
	"loginType" : 0, // 0: 아이디, 1: 이메일, 2: 전화번호 
    "login" : "test_id" 
} 

CASE 1. 이렇게?

Strint certNumber;
CertType certTypeFindByCode = CertType.of(certType); // enum 변환
if(certTypeFindByCode == CertType.BIRTH){
	certNumber = birthDay;
} 
if(certTypeFindByCode == CertType.BUSINESS){
	certNumber = businessNumber;
}
 // ... 생년월일/사업자번호에 대한 인증 수행

CASE 2. 이렇게?

LoginType loginTypeFindByCode = LoginType.of(loginType); // enum 변환
String loginToken = switch(loginTypeFindByCode) {
    // 이 문법은 java14 이상에서만
	case ID -> tokenGetByIdLogin(login,password);
    case EMAIL -> tokenGetByEmailLogin(login,password);
    case MOBILE -> tokenGetByMoblieLogin(login,password);
    ....
};

보통 이런식으로 하지 않을까 싶다.


그러나 JSON 형태를 수정할 수 없는 경우라면, 기존 객체에서 값이 존재하는 필드만 추출해야 할 것이다.

국밥같은 Stream만 있으면 된다.

CASE 1. 이렇게!

String certNumber = Stream.of(
            certRequest.getBirthDay(),
            certRequest.getBusinessNumber()
        )
        .filter(val -> val != null && !val.isEmpty())
        .findFirst()
        .orElse("");
 // ... 생년월일/사업자번호에 대한 인증 수행

CASE 2. 이렇게!

String loginToken;

String loginString = Stream.of(
            loginRequest.getEmail(),
            loginRequest.getId(),
            loginRequest.getPhoneNumber()
        )
        .filter(val -> val != null && !val.isEmpty())
        .findFirst()
        .orElse("");
        
if(!login.isEmpty()){
  // 비슷한 동작을 하는 토큰 발급 메서드를 하나로 통일
   loginToken = tokenGetByLoginString(loginString,password); 
}

Stream을 통해 1:n 인 필드 구조를 1:1로 변환하여 사용할 수 있게 되었다.


예제 코드

import java.util.*;
import java.lang.*;
import java.io.*;
import java.util.stream.Stream;

class Cert{
        private String birthDay;
        private String businessNumber; 

        Cert(){}
    
        Cert(String birthDay, String businessNumber){
            this.birthDay = birthDay;
            this.businessNumber = businessNumber;
        }
        
        public String getBirthDay(){
            return birthDay;
        }
        public String getBusinessNumber(){
            return businessNumber;
        }
    }

class Login{
        private String id;
        private String email;
        private String phoneNumber;

        Login(){}
    
        Login(String id, String email, String phoneNumber){
            this.id = id;
            this.email = email;
            this.phoneNumber = phoneNumber;
        }
        
        public String getId(){
            return id;
        }
        public String getEmail(){
            return email;
        }
        public String getPhoneNumber(){
            return phoneNumber;
        }
    }

class Main {
    public static void main(String[] args) {
        Cert certRequest = new Cert("800101",null);
        String certNumber = Stream.of(
            certRequest.getBirthDay(),
            certRequest.getBusinessNumber()
        )
        .filter(val -> val != null && !val.isEmpty())
        .findFirst()
        .orElse("");
        System.out.println(certNumber);

        Login loginRequest = new Login(null,"example@google.com","");      
        String loginString = Stream.of(
            loginRequest.getId(),
            loginRequest.getEmail(),
            loginRequest.getPhoneNumber()
        )
        .filter(val -> val != null && !val.isEmpty())
        .findFirst()
        .orElse("");
        System.out.println(loginString);
    }
}

0개의 댓글

관련 채용 정보