์ƒˆ์†Œ์‹

๋ฐ˜์‘ํ˜•
Spring

[Spring] ๋กฌ๋ณต์„ ์‚ฌ์šฉํ•œ Builder ํŒจํ„ด Null์ฒดํฌ ํ•˜๋ฉฐ ์‚ฌ์šฉํ•˜๊ธฐ

  • -
๋ฐ˜์‘ํ˜•

๐Ÿ˜’๊ฐœ์š”

๊ธฐ์กด ์ฝ”๋“œ๊ฐ€ ๋กฌ๋ณต์˜ @Builder๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋นŒ๋” ํŒจํ„ด์„ ๊ตฌํ˜„ํ–ˆ๋Š”๋ฐ, ์‚ฌ์šฉํ•˜๋‹ค ๋ณด๋‹ˆ ํ•„๋“œ ๊ฐ’์ด ๋งŽ์•„ ์งˆ ๋•Œ, ๋Œ€์ถฉ ๋งž๊ฒ ์ง€ ํ•˜๋ฉด์„œ ๊ฐ’์„ ์ž…๋ ฅํ–ˆ๋”๋‹ˆ, ๊ฐœ๋ฐœํ•˜๋‹ค ๋ณด๋‹ˆ Builder๋ฅผ ํ†ตํ•ด ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ์‹œ, ๋‚˜์ค‘์— null์ด ๋“ค์–ด๊ฐ€๋Š” ๋ถ€๋ถ„์ด ๊ณ„์† ์ƒ๊ฒจ๋‚ฌ๋‹ค. ๊ทธ๋ƒฅ ๋‚ด ์‹ค์ˆ˜๋ ค๋‹ˆ ํ•˜๊ณ  ๋„˜์–ด๊ฐ€๋‹ค๊ฐ€ ๋ฐ˜๋ณต๋˜๋‹ˆ, ์ด๊ฑด ์ฝ”๋“œ์˜ ๋ฌธ์ œ๋‹ค ์‹ถ์–ด์„œ, ๊ฐ์ฒด ์ดˆ๊ธฐํ™” ํ•  ๋•Œ, ๊ฐ„๋‹จํ•˜๊ฒŒ ํ•„์ˆ˜ ๊ฐ’์„ ๊ฒ€์ฆํ•ด์•ผ๊ฒ ๋‹ค! ๋ผ๋Š” ์ƒ๊ฐ๋ถ€ํ„ฐ ์‹œ์ž‘๋˜๊ฒŒ ๋˜์—ˆ๋‹ค.

์ด๋Ÿฐ ์‹์˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ.. title์„ ๋นผ๋จน๋Š”๋‹ค๊ฑฐ๋‚˜…

๐Ÿ‘ํ•ด๊ฒฐ๋ฐฉ๋ฒ•

1. ์ง์ ‘ Null ์ฒดํฌ

๊ฐ€์žฅ ์ง์ ‘์ ์ธ ๋ฐฉ๋ฒ•์€ Null์ฒดํฌ ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์‹ค์ œ๋กœ ๋งŒ๋“ค์–ด์„œ ์ฒดํฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

 	  
class Post {
    private final String title;
    private final String content;
		
    @Builder
    private Post(String title, String content) {
        checkNull(title, "title์ด Null์ผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.");
        checkNull(content, "content๊ฐ€ Null์ผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.");
        this.title = title;
        this.content = content;
    }

    private void checkNull(Object o, String msg) {
        if (o == null) {
           throw new NullPointerException(msg);
        }
    }
}

์šฐ์„  @AllArgsConstrucor๋Š” ์ธ์Šคํ„ด์Šค ์„ ์–ธ ์ˆœ์„œ์— ์˜ํ–ฅ์„ ๋ฐ›๊ธฐ ๋•Œ๋ฌธ์— ์ง์ ‘ ์ƒ์„ฑ์ž๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ƒ์„ฑ์ž ์œ„์—@Builder (lombok document ๊ถŒ์žฅ)๋ฅผ ๋ถ™์ด๊ณ  checkNull๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“ค์–ด Null์ผ์‹œ NullPointerException์„ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ํ•˜์˜€๋‹ค..

๋” ๋‚˜์•„๊ฐ€ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ๋งŽ์•„์ง€๊ฑฐ๋‚˜ , ๊ฒ€์ฆ ๋ฉ”์„œ๋“œ๋ฅผ ๋ถ„๋ฆฌํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด,

class Post {
    private final String title;
    private final String content;

    @Builder
    private Post(String title, String content) {
        checkNullParams(List.of(title, content));
        this.title = title;
        this.content = content;
    }

    private void checkNull(Object o) {
        if (o == null) {
           throw new NullPointerException();
        }
    }

    private void checkNullParams(List<Object> params) {
        params.forEach(this::checkNull);
    }
}

์œ„์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

2. ๋กฌ๋ณต์˜ @NonNULL์‚ฌ์šฉ

class Post {
    private final String title;
    private final String content;

    @Builder
    private Post(@NonNull String title, @NonNull String content) {
        this.title = title;
        this.content = content;
    }
}

 

์ƒ์„ฑ์ž์˜ ํ•„์ˆ˜ ๊ฐ’ ํŒŒ๋ผ๋ฏธํ„ฐ ์•ž์— @NonNull์„ ๋ถ™์—ฌ ์ƒ์„ฑ๋  ๋•Œ ๋ณ€์ˆ˜์˜ null์„ ์ฒดํฌํ•  ์ˆ˜ ์žˆ๋‹ค.

Post p = Post.builder()
                .title("t")
                .build();

์œ„์˜ ์ฝ”๋“œ์™€ ๊ฐ™์ด content๊ฐ’์„ ๋นผ๋จน๋Š”๋‹ค๋ฉด,

๋‹ค์Œ๊ณผ ๊ฐ™์ด NullPointerException์„ ๋„์šธ ๊ฒƒ์ด๋‹ค.

3. Assert ์‚ฌ์šฉ

class Post {
    private String title;

    private String content;

    @Builder
    private Post(String title, String content) {
        Assert.notNull(title, "title์ด Null์ผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.");
        Assert.notNull(content, "content๊ฐ€ Null์ผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.");
        this.title = title;
        this.content = content;
    }
}

์Šคํ”„๋ง ์œ ํ‹ธ์— ์žˆ๋Š” Assert์˜ notNull์„ ํ™œ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์œ„์™€ ๊ฐ™์ด ํ•„์ˆ˜ ๊ฐ’์— Assert๋กœ ๊ฒ€์ฆ ํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค. 

public static void notNull(@Nullable Object object, String message) {
		if (object == null) {
			throw new IllegalArgumentException(message);
		}
	}

Assert.notNull๋ฉ”์„œ๋“œ๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌํ˜„๋˜์–ด ์žˆ์œผ๋ฉฐ, ๋ฉ”์‹œ์ง€๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ์‚ฌ์‹ค ์ง์ ‘ ๊ตฌํ˜„ํ•œ ์ฝ”๋“œ์™€ ๋‹ค๋ฅด์ง€ ์•Š์•„ ํฐ ์ฐจ์ด๋Š” ์—†๋‹ค.

content๋ฅผ ์ œ์™ธํ•˜๊ณ  ์ƒ์„ฑํ–ˆ์„ ๋•Œ ๋œจ๋Š” ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

๐Ÿ‘‰์ •๋ฆฌ

๊ฐ„๋‹จํ•œ Null์ฒ˜๋ฆฌ๋ฅผ ํ•  ๋•Œ์—๋Š” @NonNull์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ฝ”๋“œ ๋Ÿ‰์„ ์ค„์ผ ์ˆ˜๋„ ์žˆ๊ณ  ๊ฐ„ํŽธํ•ด์„œ ์ ํ•ฉํ•  ๊ฒƒ์ด๋‹ค.

์›ํ•˜๋Š” ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•˜์—ฌ ์˜ค๋ฅ˜์— ๋Œ€ํ•œ ๊ฐ€๋…์„ฑ์„ ๋†’์ผ ๋•Œ, Assert๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.

์˜ˆ์™ธ์— ๋Œ€ํ•œ ์ถ”๊ฐ€์ ์ธ ์ฒ˜๋ฆฌ๋ฅผ ํ•  ๋•Œ(ex. ์ปค์Šคํ…€ ์˜ˆ์™ธ๋ฅผ ๋„์›Œ์•ผ ํ•œ๋‹ค๊ฑฐ๋‚˜ ๋“ฑ)์— ์ง์ ‘ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์ƒ๊ฐํ•ด ๋ณผ ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค.

 

๋ฐ˜์‘ํ˜•
Contents

ํฌ์ŠคํŒ… ์ฃผ์†Œ๋ฅผ ๋ณต์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค

์ด ๊ธ€์ด ๋„์›€์ด ๋˜์—ˆ๋‹ค๋ฉด ๊ณต๊ฐ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.