VER: Java8 ⬆
프론트와 JSON을 주고받다보면, 다음과 같은 상황에 맞닥뜨리는 경우가 종종 생긴다.
{
"birthday" : "800101", // 생년월일
"businessNumber" : null // 사업자번호
}
// 프론트는 생년월일 또는 사업자번호를 전송함
{
"email" : null, // 이메일
"id" : "test_id", // 아이디
"phoneNumber" : null // 전화번호
...
}
// 프론트는 이메일, 아이디, 전화번호 중 하나만 전송함
이런 경우, 어느 필드에 값이 들어있는 지 확인하려면 대충 다음과 같은 방법으로 확인하게 될 것이다.
String certNumber;
if(birthday != null){
certNumber = birthday;
}
else if(businessNumber != null){
certNumber = businessNumber;
}
// ... 생년월일/사업자번호에 대한 인증 수행
...
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 조건문을 추가해줘야 하므로 상당히 귀찮다.
물론 필드를 다음과 같이 수정하는 방법도 있다.
{
"certType" : 0, // 0: 생년월일, 1: 사업자번호
"certNumber" : "800101"
}
{
"loginType" : 0, // 0: 아이디, 1: 이메일, 2: 전화번호
"login" : "test_id"
}
Strint certNumber;
CertType certTypeFindByCode = CertType.of(certType); // enum 변환
if(certTypeFindByCode == CertType.BIRTH){
certNumber = birthDay;
}
if(certTypeFindByCode == CertType.BUSINESS){
certNumber = businessNumber;
}
// ... 생년월일/사업자번호에 대한 인증 수행
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만 있으면 된다.
String certNumber = Stream.of(
certRequest.getBirthDay(),
certRequest.getBusinessNumber()
)
.filter(val -> val != null && !val.isEmpty())
.findFirst()
.orElse("");
// ... 생년월일/사업자번호에 대한 인증 수행
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);
}
}