๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๋ฐฑ์—”๋“œ/ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…

๋‚™๊ด€์ ๋ฝ ์‚ฌ์šฉ์‹œ ๋ฒ„์ „์„ ์ดˆ๊ธฐํ™” ํ•˜์ง€ ์•Š์•„ ์ƒ๊ธด ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…

by sh119 2025. 4. 21.

โœ”๏ธ ๋ฌธ์ œ ์ƒํ™ฉ 

Hibernate์—์„œ @Version ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ํ•ด๋Œ• ํ•„๋“œ๊ฐ€ null ์ด๋ฉด ๋‹ค์Œ ์ปค๋ฐ‹ ์‹œ์ ์— NPE๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

 

โœ”๏ธ ์›์ธ 

Hibernate๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ version + 1์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ํ˜„์žฌ ๋ฒ„์ „ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๋Š”๋ฐ,

@Version ํ•„๋“œ๊ฐ€ null ์ด๋ฉด ์ด๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†์–ด ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

 

โœ”๏ธ ํ•ด๊ฒฐ๋ฐฉ๋ฒ•

์ƒ์„ฑ์‹œ version ๊ฐ’์„ ์ดˆ๊ธฐํ™”ํ•ด์ค€๋‹ค. 

...
@Version
private Integer version;

private Limited(UUID limitedProductId, LocalDateTime startDate,
    LocalDateTime endDate, LimitedStatus status) {

    LimitedDateValidator.validateDate(startDate, endDate);

    this.limitedProductId = limitedProductId;
    this.startDate = startDate;
    this.endDate = endDate;
    this.status = status;
    this.version = 0;
}
...

+ ํ˜น์‹œ ๊ธฐ์กด ๋ฐ์ดํ„ฐ๊ฐ€ ๋‚จ์•„ ์žˆ๋‹ค๋ฉด UPDATE SET ์„ ์ด์šฉํ•ด version์— ๊ฐ’์„ ๋„ฃ์–ด์ฃผ๊ฑฐ๋‚˜, ๋ฐ์ดํ„ฐ๋“ค์„ ์‚ญ์ œํ•œ๋‹ค. 

 

โœจ ๊ฒฐ๋ก  

๋”ฐ๋ผ์„œ ๋‚™๊ด€์  ๋ฝ์„ ์‚ฌ์šฉํ•  ๋• ๋ฒ„์ „ ํ•„๋“œ๋ฅผ ํ•ญ์ƒ ์‹ ๊ฒฝ์จ์„œ ๊ด€๋ฆฌํ•ด์•ผ ํ•œ๋‹ค.

๋˜ํ•œ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ์ƒํƒœ์—์„œ ์ €์žฅ๋˜๋Š” ์—”ํ‹ฐํ‹ฐ๋Š” ์ปค๋ฐ‹ ์‹œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Œ์„ ์žŠ์ง€ ๋ง์•„์•ผ ํ•œ๋‹ค.