티스토리 뷰
보일러플레이트의 어원은?
이전에 우리 문화유산 중에 하나인 금속활자를 생각하면 이해가 빠르실겁니다. 금속활자는 고려시대 우리 선조들이 세계 최초로 인쇄술을 발명하고 실용화한 문화유산인데요, 이런 내용을 신문사업에서 기원하여 나온 영어 단어중 하나 입니다.
https://namu.wiki/w/%EA%B8%88%EC%86%8D%ED%99%9C%EC%9E%90
보일러플레이트 코드란?
1890년대에 광고나 컬럼에 계속 사용되는 텍스트 인쇄판은 부드러운 납 대신 강철로 찍기 시작하였는데, 이것이 보일러플레이트 (Boilerplate) 라고 합니다. 즉, 컴퓨터 프로그래밍에서 말하는 보일러 플레이트 코드는 최소한의 변경으로 여러 곳에서 재사용되면서 반복적으로 사용되는 코드를 의미합니다.
보일러플레이트 코드를 줄이는 방법
프로그래밍 때마다 보일러플레이트 코드를 작성하는 것은 비효율적입니다. 사실 중복되는 내용이다 보니 객체지향형 프로그래밍에서는 절대적으로 비추하는 프로그래밍 기법중에 하나입니다. 하지만 모든 사용자들이 각자 서비스에서 어떤 코드를 개발하였는지 찾아보고 그를 바꾸거나 수정하여 코드를 사용한 경우에는 기존의 코드에 영향도가 있을 가능성이 대단히 높기 때문에 멋대로 수정하기 어렵습니다.
리팩터링을 진행했을 때 보일러플레이트 코드가 자주 발견되곤 하는데, 이를 같이 수정하는 것도 매번 번거로운 일이 됩니다. 그래서 이런 코드를 줄이는 방법에 대해 알아보겠습니다.
1. Lombok 의 사용
Lombok은 우리가 다들 알고 있다시피 getter/setter 및 기본 생성자와 ToString 등 여러가지 플러그인을 어노테이션 만으로도 코드를 줄여주는 역할을 하는 유용한 기술중 하나 입니다. 어노테이션은 여러 가지가 있습니다.
- Getter
- Setter
- NoArgsConstructor
- AllArgsConstructor
- ToString
- RequiredArgsConstructor
- EqualsAndHashCode
- Value
이를 더 줄이기 위해서 사용하는 것 중 하나인 @Data 어노테이션도 존재합니다. Data 어노테이션은 롬복 홈페이지에 정확히 나와있고, 코드부분에서 확인하기 편하도록 인터페이스로도 제공됩니다. 아래 그림에도 나와있지만 Data 는 아래 6가지 어노테이션을 종합해서 사용가능합니다. 이를 사용하는 것은 보일러플레이트 코드의 사용을 줄이는데 매우 효과적입니다.
- Getter
- Setter
- RequiredArgsConstuctor
- ToString
- EqualsAndHashCode
- Value
https://projectlombok.org/features/Data
2. Swagger
API 명세서를 자바 코드를 기반으로 웹 퍼블리싱하여 자동으로 만들어주는 Swagger 도 보일러플레이트 코드를 줄이는 방법중에 하나로 많이 사용됩니다. 기본적으로 제공하고 있는 사용자 인터페이스는 모두 직접 퍼블리싱을 해주어야하고 매번 클라이언트와 서버의 내용을 공유 및 전달하기 위해 일일히 서버 개발자가 웹 페이지를 별도로 제작하는 일이 너무 번거로워지고, 이 또한 코드의 중복성을 재촉시키기 때문에 스웨거를 사용하여 중복을 배제하고 개발자가 수초만에 웹 페이지를 업데이트할 수 있는 기능으로 제공되는 내용입니다.
기본적으로 사용할 수 있는 방법은 제 글에 기록해두었습니다.
3. Java 아닌 Kotlin 언어 사용하기
사실 Kotlin 에서는 Java에서 Optional 클래스로 표현되고 있는 문법이 많이 축약된 형태로 사용하고 있습니다. 이는 코드의 중복 사용을 방지하는 방법 중 하나입니다.
// Java
final Optional<T> optionalObject = Optional.ofNullable(T data);
if(optionalObject.isPresent()) {
val data = optionalObject.get();
data.process();
...
}
// Kotlin
val obj: T?
obj!!.process() // never null
위의 코드처럼 자바에서 nullable 한 객체를 다루기 위해 Optional 이라는 Wrapper 를 사용하여야 하지만 Kotlin 에서는 기본적으로 제공하는 문법의 특성상 간편하게 표현할 수 있습니다.
4. 그 외 많은 라이브러리 사용하기
하나 더 예시를 확인해보겠습니다. String 타입은 nullable 한 값이 들어갈 수 있기 때문에 아무리 null 처리를 잘한다고 하여도 NullPointerException 이 날 수 있습니다.
public String removeDash(String str) {
try {
return str.replaceAll("\-", "");
} catch(NullPointerException e) {
e.printStackTrace();
return "";
}
}
public boolean isBlank(String str) {
try {
return str.isBlank(); // JDK 11 이상
} catch(NullPointerException e) {
return true;
}
}
그렇기 때문에 StringUtils 를 제공하는 apache-common-lang3 라이브러리를 사용하는 경우도 있습니다. 그런 경우 간편하게 변경이 가능하고, 의존성이 부여되긴 하지만 위와 같은 형식의 메소드를 중복구현하지 않아도 되기 떄문에 보일러플레이트 코드의 내용을 줄이는데 효과적입니다.
build.gradle
dependency {
// https://mvnrepository.com/artifact/org.apache.commons/commons-lang3
implementation 'org.apache.commons:commons-lang3:3.12.0'
}
Usage
public void doSomething(String str) {
if(StringUtils.isNotBlank(str)) {
doNextStep();
}
}
마무리
물론 위와 같이 4가지 방법 말고도 보일러플레이트 코드를 자바에서 줄이는 방법은 정말 무궁무진합니다. 앞으로 더 코드를 다듬고 깔끔하게 정리하여 개발을 하고자 하는 니즈가 있고, 불필요한 리팩터링 시간을 줄이는 것이 개발자의 생산성에도 그리고 회사의 기술부채를 줄이는데에도 효과적인 부분이어서 적게 되었습니다 :)
'Server' 카테고리의 다른 글
[Java] 함수형 인터페이스에 대해 알아보기 (0) | 2023.02.01 |
---|---|
[Spring] Security 를 사용했을 때 세션의 만료 체크하기 (0) | 2023.01.31 |
[Java] Serialization 직렬화 분석 및 확장하기 (2023-01 수정) (1) | 2023.01.30 |
[Refactor] 자바 코드 리팩터링하기 - 3부 (0) | 2023.01.27 |
[Refactor] 자바 코드 리팩터링하기 - 2부 (0) | 2023.01.26 |
[Refactor] 자바 코드 리팩터링하기 - 1부 (0) | 2023.01.25 |