// 이런 코드가 계속 반복되는 거죠...
dataMap.put( "name", StringUtil.equals(dataBean.getPrivateYn(), "Y") ? "비공개": dataBean.getName() );
dataMap.put( "question", StringUtil.equals(dataBean.getPrivateYn(), "Y") ? "비공개": dataBean.getQuestion() );
dataMap.put( "title", StringUtil.equals(dataBean.getPrivateYn(), "Y") ? "비공개":dataBean.getTitle() );

이번 유지보수 업무를 하다 중복되는 get 메소드를 중복해서 호출해야하는 상황이 있었다.

똑같이 privateYn이 "Y"인지 확인하는 로직인데, 뒤에 불러와야 하는 get 메소드만 getTitle(), getCtgNm1() 등등 다 달랐다. 

 

'어떻게 하면 이 똑같은 로직을 한 번에 해결할 수 있을까?' 고민하다가, 자바 8에 추가된 신박한 기능들을 알게 되어서 정리해봤습니다.

 


1. Supplier<String>: 요청하면 값을 '공급'해줌

Supplier는 자바 8에서 추가된 함수형 인터페이스라는 인데,  말 그대로 '공급자' 역할을 한다.

  • 하는 일: 아무런 입력값 없이, 요청이 오면 특정 타입의 값을 '공급'해줌
  • 사용법: Supplier<T> 형태로 쓰는데, <T>에 우리가 받을 값의 타입을 넣어주면 됨.
    • Supplier<String>: 문자열(String)을 공급해 줘!
    • Supplier<Integer>: 숫자(Integer)를 공급해 줘!

이 안에는 get()이라는 메소드 하나만 있는데, 이 메소드를 호출하면 딱! 정해진 값을 뱉어낸다.

 

나는 그래서 중복된 코드를 줄이기 위해 아래와 같이 코드를 만들었다! 

import java.util.function.Supplier;

public String getPublicValue(ExampleBean bean, Supplier<String> valueSupplier) {
    if ("Y".equals(bean.getPrivateYn())) { // privateYn이 Y면
        return "비공개";                  // 무조건 "비공개"를 반환해!
    } else {                              // 아니면
        return valueSupplier.get();     // Supplier가 공급해주는 값을 반환해줘!
    }
}

2. Supplier는 사용하는 람다! 그 중, :: (메소드 레퍼런스)

 

::는 "메소드 레퍼런스" 라고 부르는 문법인데, 쉽게말해 () -> dataBean.getTitle() 같은 람다식을 더 간단하게 쓸 수 있게 해준다! 

 

람다식(Lambda) 메소드 레퍼런스
() -> dataBean.getTitle() dataBean::getTitle
() -> new ArrayList<String>()
ArrayList::new

 

'객체::메소드' 형태로 사용하는데, " 이 객체의 이 메소드를 쓸꺼야! " 라고 딱 지정해주는 느낌이다! 

위의 Supplier<String> 과 함께 쓰면 아래처럼 위에서 만든 메소드를 사용할 수 있다. 

dataMap.put("title", getPublicValue(dataBean, dataBean::getTitle));
dataMap.put("name", getPublicValue(dataBean, dataBean::getName));
dataMap.put("question", getPublicValue(dataBean, dataBean::getQuestion));

// 람다식을 사용한 예시: 람다식으로는 복잡한 로직도 전달 가능
dataMap.put("question", getPublicValue(dataBean, 
	() -> StringUtils.replace(dataBean.getQuestion(), "\n", " ")));

 

 


4.  왜 Supplier와 ::를 사용해야 할까?

Supplier와 메소드 레퍼런스를 활용하면 다음과 같은 중요한 이점을 얻을 수 있다.

  1. 코드 간결성 및 가독성: 반복되는 코드를 제거하고, 로직을 한 곳에 모아 코드를 더 읽기 쉽게 만듭니다.
  2. 재사용성: 특정 기능을 추상화하여 다양한 곳에서 재사용할 수 있는 유연한 코드를 만들 수 있습니다.
  3. 유지보수성: 로직 변경이 필요할 때 한 곳만 수정하면 되므로, 유지보수가 훨씬 용이해집니다.

 

정말 파도파도 끝이없는 라이브러리들과..함수들... 

매번 할때마다 새롭다...

 

 

 

반응형
LIST

+ Recent posts