๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๋ฐฑ์—”๋“œ32

Feign Client ์—์„œ ์‘๋‹ต ๋ฐ›์„ ๋•Œ Jackson ์—ญ์ง๋ ฌํ™” ์ด์Šˆ โœ… ๋ฌธ์ œ ์ƒํ™ฉ record ๊ธฐ๋ฐ˜ ํด๋ž˜์Šค์—์„œ ํ•„๋“œ๋ช…์ด ๋‹ค๋ฅธ ์ด์Šˆ๊ฐ€ ์ƒ๊ฒจ์„œ Feign Client ์‘๋‹ต ํŒŒ์‹ฑ์ด ์‹คํŒจํ•˜๋Š” ์ด์Šˆ๊ฐ€ ์ƒ๊น€public record OrderCreateResponse( UUID orderId, // feign client์—์„œ๋Š” id ๋ผ๋Š” ํ•„๋“œ๋ช…์œผ๋กœ ์‘๋‹ตํ•˜๊ณ  ์žˆ์Œ UUID productId, Long userId, ...) {} โœ… ์›์ธrecord๋Š” ๋ชจ๋“  ํ•„๋“œ๊ฐ€ final์ด๊ณ  ์ƒ์„ฑ์ž๋ฅผ ์•”์‹œ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ๋•Œ๋ฌธ์—, Jackson์ด ์ƒ์„ฑ์ž ํŒŒ๋ผ๋ฏธํ„ฐ ์ด๋ฆ„์„ ์•Œ ์ˆ˜ ์—†์–ด ๋งคํ•‘ ์‹คํŒจํ•จ โœ… ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ƒ์„ฑ์ž์— @JsonProperty ์–ด๋…ธํ…Œ์ด์…˜์„ ๋‹ฌ์•„์„œ ์ง์ ‘ ๋ช…์‹œ๋ฅผ ํ•ด์ฃผ๋ฉด ๋จpublic record OrderCreateResponse( @JsonProperty("id") .. 2025. 4. 21.
Feign Client์—์„œ ์ปค์Šคํ…€ ์–ด๋…ธํ…Œ์ด์…˜ ์‚ฌ์šฉ์‹œ ์ฃผ์˜์‚ฌํ•ญ โœ”๏ธ ๋ฌธ์ œ์ƒํ™ฉFeign Client ์ธํ„ฐํŽ˜์ด์Šค ๋ฉ”์„œ๋“œ์— @RequestHeader("X-User-Id) ๋Œ€์‹  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ปค์Šคํ…€ ์–ด๋…ธํ…Œ์ด์…˜์„ ์ƒ์„ฑํ•˜์—ฌ,@CurrentUserId ๋ฅผ ํ†ตํ•ด ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ์•„๋ž˜์™€ ๊ฐ™์€ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ๋นŒ๋“œ๊ฐ€ ์‹คํŒจํ–ˆ๋‹ค. Method has too many Body parameters ์•„๋ž˜ ์ฝ”๋“œ์™€ ๊ฐ™์ด ์ปค์Šคํ…€ ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•ด์„œ ํ—ค๋”๋ฅผ ์ „๋‹ฌํ•˜๊ฒŒ ๋˜๋ฉด, ์ปค์Šคํ…€ ์–ด๋…ธํ…Œ์ด์…˜์ด ๋ฌด์‹œ๋˜๋ฉด์„œ userId๊นŒ์ง€ @RequestBody๋กœ ์ธ์‹์ด ๋˜์–ด ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธด ๊ฒƒ์ด๋‹ค. (Body ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ 2๊ฐœ ์ด์ƒ์ด ๋จ)@FeignClient(name = "order-service")public interface OrderFeignClient { @PostMapping OrderCr.. 2025. 4. 21.
๋‚™๊ด€์ ๋ฝ ์‚ฌ์šฉ์‹œ ๋ฒ„์ „์„ ์ดˆ๊ธฐํ™” ํ•˜์ง€ ์•Š์•„ ์ƒ๊ธด ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ… โœ”๏ธ ๋ฌธ์ œ ์ƒํ™ฉ Hibernate์—์„œ @Version ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ํ•ด๋Œ• ํ•„๋“œ๊ฐ€ null ์ด๋ฉด ๋‹ค์Œ ์ปค๋ฐ‹ ์‹œ์ ์— NPE๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. โœ”๏ธ ์›์ธ Hibernate๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ version + 1์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ํ˜„์žฌ ๋ฒ„์ „ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๋Š”๋ฐ,@Version ํ•„๋“œ๊ฐ€ null ์ด๋ฉด ์ด๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†์–ด ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. โœ”๏ธ ํ•ด๊ฒฐ๋ฐฉ๋ฒ•์ƒ์„ฑ์‹œ version ๊ฐ’์„ ์ดˆ๊ธฐํ™”ํ•ด์ค€๋‹ค. ...@Versionprivate Integer version;private Limited(UUID limitedProductId, LocalDateTime startDate, LocalDateTime endDate, LimitedStatus status) { LimitedDateValidator.validateDat.. 2025. 4. 21.
PostgreSQL์˜ ๊ฒฉ๋ฆฌ์ˆ˜์ค€๊ณผ ๋น„๊ด€์  ๋ฝ PostgreSQL์˜ ๊ฒฉ๋ฆฌ์ˆ˜์ค€์— ๋Œ€ํ•ดPostgreSQL์˜ ๊ธฐ๋ณธ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์€ READ COMMITTED ์ด๋‹ค. READ COMMITTED๋ž€ ?๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ƒˆ๋กœ ์ปค๋ฐ‹ํ•˜๋ฉด, ํ˜„์žฌ ํŠธ๋žœ์žญ์…˜ ๋„์ค‘์—๋„ ์ตœ์‹  ์ปค๋ฐ‹๋œ ๊ฐ’์„ ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.์ฆ‰, ํ˜„์žฌ ํŠธ๋žœ์žญ์…˜ ์•ˆ์—์„œ ๋™์ผํ•œ row๋ฅผ ๋‘ ๋ฒˆ ์ด์ƒ ์กฐํšŒ ํ–ˆ์„๋•Œ, ์ค‘๊ฐ„์— ๋‹ค๋ฅธ ๊ฐ’์ด ๋‚˜์˜ฌ ์ˆ˜๋„ ์žˆ๋‹ค. ํ•œ์ •๋œ ์ˆ˜๋Ÿ‰์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ํŒ๋งคํ•˜๋Š”, ํ•œ์ •ํŒ๋งค ์ด๋ฒคํŠธ์—์„œ READ COMMITTED ์—ฌ์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๋Š” ๋ฌด์—‡์ผ๊นŒ?* ๋ฐ”๋กœ ์žฌ๊ณ ๊ฐ€ ์ค‘๋ณต ๊ฐ์†Œ ๋˜๋Š” ๊ฒƒ์ด๋‹ค. *์˜ˆ๋ฅผ ๋“ค์–ด A ์™€ B๊ฐ€ ๋™์‹œ์— ์žฌ๊ณ ๋ฅผ ์กฐํšŒํ•˜์—ฌ ๋‘˜ ๋‹ค ๋‚จ์€ ์žฌ๊ณ ๊ฐ€ ํ•œ ๊ฐœ ๋ผ๊ณ  ํ•œ๋‹ค๋ฉด, ๋‘˜ ๋‹ค ์ฃผ๋ฌธ์ด ๊ฐ€๋Šฅํ•  ๊ฒƒ์ด๊ณ , ๋‚จ์€ ์žฌ๊ณ ๋ฅผ ์ดˆ๊ณผํ•˜๋Š” ์ฃผ๋ฌธ์ด ๋ฐœํ–‰๋  ๊ฒƒ์ด๋‹ค.๋”ฐ๋ผ์„œ ๋™์‹œ ์ ‘๊ทผ ์‹œ ๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ์ด ๊นจ.. 2025. 4. 20.
SOLID ์›์น™๊ณผ ์‚ฌ์šฉ ์˜ˆ์‹œ SOLID ์›์น™์€ ๊ฐ์ฒด์ง€ํ–ฅ ์„ค๊ณ„์—์„œ ์œ ์ง€๋ณด์ˆ˜์™€ ํ™•์žฅ์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„ 5๊ฐ€์ง€ ํ•ต์‹ฌ ์›์น™์„ ๋งํ•œ๋‹ค.SRPํด๋ž˜์Šค๋Š” ํ•˜๋‚˜์˜ ์ฑ…์ž„๋งŒ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค.OCPํ™•์žฅ์—๋Š” ์—ด๋ ค ์žˆ๊ณ , ๋ณ€๊ฒฝ์—๋Š” ๋‹ซํ˜€์•ผ ํ•œ๋‹ค.LSP์ž์‹ ํด๋ž˜์Šค๋Š” ๋ถ€๋ชจ ํด๋ž˜์Šค๋ฅผ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.ISP์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ž‘๊ณ  ๋ช…ํ™•ํ•˜๊ฒŒ ๋ถ„๋ฆฌํ•˜๋ผ.DIP๊ตฌ์ฒด ํด๋ž˜์Šค๊ฐ€ ์•„๋‹ˆ๋ผ ์ถ”์ƒํ™”์— ์˜์กดํ•˜๋ผ. ํ•ด๋‹น SOLID ์›์น™์„ ์ด์šฉํ•ด์„œ ์ฝ”๋“œ์— ์ ์šฉ ์‹œํ‚จ ์˜ˆ๋ฅผ ํ•จ๊ป˜ ์ •๋ฆฌํ•ด ๋ณด์•˜๋‹ค. โœ… ๋‹จ์ผ ์ฑ…์ž„ ์›์น™ SRP (Single Responsibility Principle)"ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๋Š” ํ•˜๋‚˜์˜ ์ฑ…์ž„์„ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค."ํด๋ž˜์Šค๊ฐ€ ํ•˜๋‚˜์˜ ๋ณ€ํ™” ์ด์œ ๋งŒ ๊ฐ€์ง€๋„๋ก ์„ค๊ณ„ํด๋ž˜์Šค๊ฐ€ ๋ณ€๊ฒฝ๋  ์ด์œ ๊ฐ€ ๋ช…ํ™•ํ•ด์ง€๊ณ , ์œ ์ง€๋ณด์ˆ˜ ๋ฐ ํ™•์žฅ์„ฑ์— ์ข‹์Œex) purchasOrder์—์„œ ํ•„์š”ํ•œ ์„œ๋น„์Šค๋ฅผ ์ฑ…์ž„์— ๋”ฐ๋ผ .. 2025. 4. 16.
Feign Client๋ฅผ ๊ฐ์‹ธ๋Š” Facade Service Class A-์„œ๋น„์Šค ์—์„œ Feign Client๋ฅผ ์ด์šฉํ•˜์—ฌ B-์„œ๋น„์Šค๋ฅผ ํ˜ธ์ถœํ• ๋•Œ,๊ธฐ์กด A-์„œ๋น„์Šค์˜ Service Class์—์„œ ์ง์ ‘ ํ˜ธ์ถœํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ Application ๊ณ„์ธต์—์„œ Infrastructure ๊ณ„์ธต์„ ์ง์ ‘ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ SRP์™€ DIP๊ฐ€ ์ž˜ ์ง€์ผœ์ง€์ง€ ์•Š๋Š”๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ B์„œ๋น„์Šค๋ฅผ ํ˜ธ์ถœํ•˜๋Š” Service Class ๋ฅผ ํŒŒ์‚ฌ๋“œํ•˜์—ฌ ๋”ฐ๋กœ ์ƒ์„ฑํ•ด์ฃผ๋Š”๊ฒŒ ์ข‹๋‹ค.์ฆ‰, Feign Client ํ˜ธ์ถœ์„ ์œ„ํ•œ Service Class๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด๋‹ค. @Service@Slf4j(topic = "feign client : call product-service")@RequiredArgsConstructorpublic class ProductClientService { private f.. 2025. 4. 14.