Lombok: ํ•ด์‹œ ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ์—์„œ ์‚ฌ์šฉ๋  ๋•Œ null ์†์„ฑ์˜ hashCode() ๋ฌธ์ œ

์— ๋งŒ๋“  2019๋…„ 07์›” 19์ผ  ยท  3์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: projectlombok/lombok

pk ์™€ ๊ฐ™์€ Long ์†์„ฑ์„ ์‚ฌ์šฉํ•˜๋Š” @EqualsAndHashCode ์ฃผ์„์€ ํ•ด์‹œ ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ(์˜ˆ: HashSet)์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๋•Œ ์ผ๋ถ€ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋™์ž‘์„ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ:

<strong i="9">@Entity</strong>
@EqualsAndHashCode(of = "pk")
class Foo {

    <strong i="10">@Id</strong>
    private Long pk;

    private LocalDate createdAt;

}
<strong i="13">@Entity</strong>
class Foo {

    <strong i="14">@Id</strong>
    private Long pk;

    private LocalDate createdAt;

    public int hashCode() {
        int PRIME = true;
        int result = 1;
        Object $pk = this.getPk();
        int result = result * 59 + ($pk == null ? 43 : $pk.hashCode());
        return result;
    }

    public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }
}

๋”ฐ๋ผ์„œ pk = null์ธ ์ธ์Šคํ„ด์Šค์™€ pk = 43์ธ ๋‹ค๋ฅธ ์ธ์Šคํ„ด์Šค๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ๋™์ผํ•œ ํ•ด์‹œ ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  ํ•ด์‹œ ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ์—์„œ ๋™์ผํ•œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  toString ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” OmniFaces ListConverter๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋„ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•˜๋“œ์ฝ”๋”ฉ๋œ ์ƒ์ˆ˜๊ฐ€ ์•„๋‹Œ ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค์˜ ํ•ด์‹œ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฏธ ์ด ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์ˆ˜ํ–‰ํ–ˆ๊ฑฐ๋‚˜ ์ด ์ƒํ™ฉ์„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?!

๋ฒ„์ „ ์ •๋ณด

  • ๋กฌ๋ณต => 1.18.8
  • ํ”Œ๋žซํผ => Windows 10 JDK 11.0.4 IntelliJ

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

43์€ ์•„๋งˆ๋„ ๋‹ค๋ฅธ ์ˆซ์ž๋งŒํผ ์ข‹๊ณ  -1, 0 ๋ฐ 1๋ณด๋‹ค ๋‚ซ์Šต๋‹ˆ๋‹ค. ์„ค์ •์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋ฉด ๋งค์šฐ ๋‚ฎ์€ ๋ถ€๊ฐ€๊ฐ€์น˜์— ๋Œ€ํ•œ ์œ ์ง€ ๊ด€๋ฆฌ ๋ถ€ํ•˜๊ฐ€ ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.

null์— ๋Œ€ํ•ด ID ํ•ด์‹œ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด equals ๊ณ„์•ฝ์ด ๊นจ์ง‘๋‹ˆ๋‹ค.

๋ชจ๋“  3 ๋Œ“๊ธ€

๋”ฐ๋ผ์„œ pk = null์ธ ์ธ์Šคํ„ด์Šค์™€ pk = 43์ธ ๋‹ค๋ฅธ ์ธ์Šคํ„ด์Šค๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ๋™์ผํ•œ ํ•ด์‹œ ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ ๋ฌด์—‡์„ ์„ ํƒํ•˜๋“  ํ•ญ์ƒ ํ•ด์‹œ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

Arrays.hashCode , String.hashCode ๋ฐ ๊ธฐํƒ€ ๋งŽ์€ ๊ฒƒ๋“ค์€ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ์ˆ˜๋งŽ์€ ์ถฉ๋Œ์„ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.

ํ•˜๋“œ์ฝ”๋”ฉ๋œ ์ƒ์ˆ˜๊ฐ€ ์•„๋‹Œ ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค์˜ ํ•ด์‹œ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ˆ˜๋™์œผ๋กœ ์ž‘์„ฑํ•œ ์ฝ”๋“œ์—์„œ id ๊ฐ€ ํ• ๋‹น๋˜๊ธฐ ์ „์— ํ˜ธ์ถœ๋˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ฃผ์žฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ํ™•์‹คํžˆ ์ด์ƒํ•˜์ง€๋งŒ ๋ชจ๋“  ๋Œ€์•ˆ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.

์ด ๊ฒฝ์šฐ PK๊ฐ€ null์ผ ๋•Œ ์–ด๋–ค ๊ฐ’์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€ ์•Œ๋ ค์ฃผ๋Š” ์ฃผ์„ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ 43์˜ ๊ฒฝ์šฐ.

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋” ๋งŽ์€ ์ œ์–ด ๊ถŒํ•œ์ด ๋ถ€์—ฌ๋ฉ๋‹ˆ๋‹ค.

@EqualsAndHashCode(of = "pk", ifAnyNull = -1)

๋”ฐ๋ผ์„œ null์ธ ๋ชจ๋“  ํ•„๋“œ์— ๋Œ€ํ•ด 43 ๋Œ€์‹  -1์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

43์€ ์•„๋งˆ๋„ ๋‹ค๋ฅธ ์ˆซ์ž๋งŒํผ ์ข‹๊ณ  -1, 0 ๋ฐ 1๋ณด๋‹ค ๋‚ซ์Šต๋‹ˆ๋‹ค. ์„ค์ •์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋ฉด ๋งค์šฐ ๋‚ฎ์€ ๋ถ€๊ฐ€๊ฐ€์น˜์— ๋Œ€ํ•œ ์œ ์ง€ ๊ด€๋ฆฌ ๋ถ€ํ•˜๊ฐ€ ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.

null์— ๋Œ€ํ•ด ID ํ•ด์‹œ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด equals ๊ณ„์•ฝ์ด ๊นจ์ง‘๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰