Backend/Spring Boot

[Spring] CollectionUtils ํ™œ์šฉํ•œ null, empty ์ฒดํฌ

giraffe_ 2025. 8. 11. 12:16

์ž๋ฐ”์—์„œ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•  ๋•Œ ์–ธ์ œ๋‚˜ ์กฐ์‹ฌํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ NullPointerException์ด๋‹ค.

์‹ค์ œ๋กœ ์ตœ๊ทผ ์‹ค๋ฌด์—์„œ null ์ฒดํฌ๋ฅผ ๊ผผ๊ผผํžˆ ์•ˆํ–ˆ๋‹ค๊ฐ€ ์šด์˜์—์„œ ์—๋Ÿฌ๊ฐ€ ์ฐํžˆ๋Š” ์‚ฌํƒœ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค๐Ÿ˜ฑ

 

๊ทธ๋ฆฌ๊ณ  List๊ฐ€ null ์ธ์ง€์™€ ๋น„์—ˆ๋Š”์ง€๋ฅผ ๋ชจ๋‘ ํ™•์ธํ•ด์ค˜์•ผ ํ•  ์ผ์ด ์ƒ๊ฒผ๋Š”๋ฐ, Spring์—์„œ ์ œ๊ณตํ•˜๋Š” CollectionUtils์„ ์“ฐ๋ฉด ํ•œ ๋ฒˆ์— ์ฒดํฌํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ทธ ๋‚ด์šฉ์„ ์ •๋ฆฌํ•˜๊ณ ์ž ํ•œ๋‹ค.

 

 

 

 

 

 

 

 

 

 

1. null vs empty

์šฐ์„  null๊ณผ empty์˜ ์ฐจ์ด์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด๋ณด์ž.

์•„๋ž˜ ๊ทธ๋ฆผ์€ null๊ณผ empty์˜ ์ฐจ์ด๋ฅผ ์•„์ฃผ ์ž˜ ์„ค๋ช…ํ•ด์ฃผ๋Š” ์งค์ด๋‹ค.

 

 

 

 

 

์™ผ์ชฝ ์นธ์„ ๋ณด๋ฉด ํœด์ง€์˜ ์ฃผ์š” ๋‚ด์šฉ๋ฌผ์ธ ํฐ ๋ถ€๋ถ„(๋ฐ์ดํ„ฐ)๊ฐ€ ์—†๊ณ , ํœด์ง€๋ฅผ ๋‹ด๊ณ  ์žˆ๋˜ ํœด์ง€์‹ฌ(๊ฐ์ฒด)๋Š” ์žˆ๋Š” ์ƒํƒœ์ด๋‹ค.

์˜ค๋ฅธ์ชฝ ์นธ์„ ๋ณด๋ฉด ํœด์ง€์‹ฌ(๊ฐ์ฒด) ์กฐ์ฐจ ์—†๋Š” ์ƒํƒœ์ด๋‹ค.

 

 

 

 

 

null

  • ์–ด๋–ค ๊ฐ์ฒด ์ฐธ์กฐ๊ฐ€ ์–ด๋–ค ์ธ์Šคํ„ด์Šค๋„ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ์ง€ ์•Š์€ ์ƒํƒœ
  • ์‹ค์ œ ๊ฐ์ฒด(Objects)๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ์กด์žฌํ•˜์ง€ ์•Š์Œ

 

String str = null;
System.out.println(str.length());  // NullPointerException ๋ฐœ์ƒ
List<String> list = null;
System.out.println(list.size()); // NullPointerException ๋ฐœ์ƒ
System.out.println(list.isEmpty()); // NullPointerException ๋ฐœ์ƒ

 

 

  • null ์ƒํƒœ์—์„œ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด `NullPointerException`์ด ๋ฐœ์ƒํ•œ๋‹ค.

 

 

 

 

 

empty

  • ๊ฐ์ฒด(Objects)๋Š” ์กด์žฌํ•˜์ง€๋งŒ, ๊ทธ ๋‚ด์šฉ์ด ๋น„์–ด ์žˆ๋Š” ์ƒํƒœ

 

String str = "";
System.out.println(str.length());  // 0

 

List<String> list = new ArrayList<>();
System.out.println(list.size()); // 0
System.out.println(list.isEmpty()); // true

 

 

 

 

 

2. CollectionUtils

์˜ˆ์™ธ ์ƒํ™ฉ ๋ฐฉ์–ด๋ฅผ ์œ„ํ•ด null ์ธ ๊ฒฝ์šฐ์™€ empty์ธ ๊ฒฝ์šฐ ๋‘˜ ๋‹ค ๊ฒ€์‚ฌํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ƒ๊ธฐ๊ฒŒ ๋œ๋‹ค.

์•„๋ž˜์™€ ๊ฐ™์ด ๋งŽ์ด ์“ฐ๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค.

 

 

 

AS-IS

  • null ์ธ ๊ฒฝ์šฐ์™€ empty์ธ ๊ฒฝ์šฐ ๋‘˜ ๋‹ค ๊ฒ€์‚ฌํ•ด์•ผ ํ•œ๋‹ค.
  • null์— ๋Œ€ํ•ด .isEmpty()๋ฅผ ๋ฐ”๋กœ ํ˜ธ์ถœํ•˜๋ฉด ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฏ€๋กœ, ์•„๋ž˜์ฒ˜๋Ÿผ ์ˆœ์„œ๋ฅผ ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค.
if (list != null && !list.isEmpty()) {
    ...
}

 

 

 

 

 

 

์ด๊ฑธ ํ•œ ๋ฒˆ์— ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ์žˆ๋‹ค. springframework์—์„œ ์ œ๊ณตํ•˜๋Š” CollectionUtils ํด๋ž˜์Šค์ด๋‹ค.

List, Set, Map ๊ณผ ๊ฐ™์€ Collection ์ž๋ฃŒ ๊ตฌ์กฐ์— ์œ ์šฉํ•œ ๋ฉ”์†Œ๋“œ๋“ค์„ ์ œ๊ณตํ•œ๋‹ค.

 

* ์ด๋ฏธ Spring ํ”„๋กœ์ ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ๋ณ„๋„๋กœ ์ถ”๊ฐ€ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

 

import org.springframework.util.CollectionUtils;

 

 

 

CollectionUtils

Check whether the given Collection contains the given element instance. Enforces the given instance to be present, rather than returning true for an equal element as well.

docs.spring.io

 

 

 

 

  • `isEmpty()` : null ์ด๊ฑฐ๋‚˜ empty์ธ ๊ฒฝ์šฐ ๋ชจ๋‘๋ฅผ ๊ฒ€์‚ฌํ•˜์—ฌ, ๊ฒฐ๊ณผ ๊ฐ’์„ boolean์œผ๋กœ ๋ฆฌํ„ดํ•˜๊ณ  ์žˆ๋‹ค.

 

 

 

 

 

TO-BE

  • null ์ธ ๊ฒฝ์šฐ์™€ empty์ธ ๊ฒฝ์šฐ๋ฅผ ํ•œ ๋ฒˆ์— ๊ฒ€์‚ฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  • NullPointerException์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.
List<String> list1 = null;
List<String> list2 = new ArrayList<>();

if (CollectionUtils.isEmpty(list1)) { // true
    ...
}

if (CollectionUtils.isEmpty(list2)) { // true
    ...
}

 

 

 

 

 

ํ•˜์ง€๋งŒ ์ฝ”๋“œ์˜ ๋ฐฉ์–ด๋ฅผ ์œ„ํ•ด ` CollectionUtils.isEmpty()`๋ฅผ ๋ฌด์ง€์„ฑ์œผ๋กœ ๋‚จ๋ฐœํ•˜๋ฉด ์•ˆ๋œ๋‹ค.

null๋งŒ ํ™•์ธํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ž˜ ๋”ฐ์ ธ์„œ ๊ทธ๋Ÿด ๊ฒฝ์šฐ์—๋Š” `list != null`๋งŒ ์“ฐ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.