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

๐Ÿ’ป ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ7

Jackson SnakeCase / CamelCase ํ•œ๋ฒˆ์— ๋ณ€๊ฒฝ ํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋ฉฐ ์˜ค๋Š˜์€ ํŠน์ • GW์—์„œ๋Š” ์นด๋ฉœ ์ผ€์ด์Šค๊ฐ€ ์•„๋‹ˆ๋ผ ์Šค๋„ค์ดํฌ ์ผ€์ด์Šค๋กœ ์‘๋‹ต์„ ์ค˜์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ด ์ƒ๊ฒผ๋‹ค. ๊ฐœ๋ฐœ์ž๋“ค์€ ์ „ํ†ต์ ์œผ๋กœ ๋ฐ˜๋ณต ์ž‘์—…์„ ์‹ซ์–ดํ•˜๊ณ  key๋ฅผ ๋ฐ”๊พธ๊ธฐ ์œ„ํ•ด์„œ ๋ชจ๋“  key ๋งˆ๋‹ค, @JsonProperty ๋ฅผ ๋„ฃ์–ด์ฃผ๊ธฐ์—”... ๋ฌด๋ฆฌ๊ฐ€ ์žˆ๋‹ค. ์–ด๋…ธํ…Œ์ด์…˜ ํ•˜๋‚˜๋กœ ํŽธ๋ฆฌํ•˜๊ฒŒ ๋ณ€๊ฒฝ์„ ํ•ด๋ณด์ž. @JsonProperty ๋ฉˆ์ถฐ! ํ•ด๋‹น Task๋ฅผ ๋‹ค๋ฅธ ๋ถ„์—๊ฒŒ ๋ถ€ํƒ์„ ํ–ˆ๋”๋‹ˆ Response ๊ฐ์ฒด์˜ Data Class์— @JsonProperty๋กœ ๋–ก์น ์„ ํ•ด๋‘์—ˆ๋‹ค. ๋ฌผ๋ก  ์ด๋ ‡๊ฒŒ ํ•ด๋„ ๊ฐœ๋ฐœ์— ๋ฌธ์ œ๊ฐ€ ์—†๊ณ  ๋™์ž‘์—๋„ ๋ฌธ์ œ๋Š” ์—†๋‹ค. ํ•˜์ง€๋งŒ ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง€๊ณ , ์†”์งํžˆ ๊ท€์ฐฎ๋‹ค. @JsonNaming์„ ์จ๋ณด์ž ์–ด๋…ธํ…Œ์ด์…˜ ํ•˜๋‚˜๋กœ ์†์‰ฝ๊ฒŒ, ์Šค๋„ค์ดํฌ์ผ€์ด์Šค์™€ ์นด๋ฉœ์ผ€์ด์Šค๋ฅผ ๋ณ€๊ฒฝ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์•„๋ž˜์˜ ์˜ˆ์‹œ ์ฝ”๋“œ๋ฅผ ๋ณด์ž. @JsonN.. 2021. 10. 20.
03. Soft Delete ๋” ํŽธํ•˜๊ฒŒ ํ•˜๊ธฐ ๋“ค์–ด๊ฐ€๋ฉฐ DB๋ฅผ ๋งŒ๋“ค๋ฉด์„œ ์šฐ๋ฆฌ๋Š” ์‚ญ์ œ ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค. ๋ฐฉ์‹ ์„ค๋ช… Soft Delete `UPDATE table SET delete = 1 WHERE id = 2` ํ˜•ํƒœ๋กœ ROW๊ฐ€ ์‚ญ์ œ ๋˜์ง€ ์•Š๊ณ  flag๋ฅผ ํ†ตํ•œ ์ œ์–ด ํ•˜๋Š” ๋ฐฉ์‹ Hard Delete DELETE FROM table WHERE id = 2 ํ˜•ํƒœ๋กœ ROW๊ฐ€ ์‹ค์ œ๋กœ ์‚ญ์ œ ๋˜๋Š” ๋ฐฉ์‹ `Hard Delete`๋ฅผ ํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์ง€๋งŒ, `Soft Delete`๋ฅผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋” ๋งŽ๋‹ค. ์ด๋Ÿฐ ๊ฒฝ์šฐ์— JPA Entity Graph ์˜ ๊ฒฝ์šฐ๋Š” `Soft Delete`์‹œ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฐ™์ด ๋‹ด๊ฒจ์„œ ์˜จ๋‹ค. `Application level์—์„œ ํ•„ํ„ฐ ํ•˜๋ฉด ๋˜๋Š”๊ฑฐ ์•„๋‹ˆ๋ƒ? ` ๋ผ๊ณ  ์ƒ๊ฐ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ธ๊ฐ„์ด๊ธฐ ๋•Œ๋ฌธ์— ๋กœ์ง์— ๊ตฌ๋ฉ์ด ๋งŽ์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ.. 2021. 7. 15.
02. ๋‹น์‹ ์˜ @Transactional์˜ readOnly ์˜ต์…˜ ์ž˜ ์“ฐ๊ณ  ์žˆ๋‚˜์š”? ์‹œ์ž‘ํ•˜๋ฉฐ ์˜ค๋Š˜์€ Spring์—์„œ ๋งˆ๋ฒ•์˜ ์–ด๋…ธํ…Œ์ด์…˜์ด๋ผ๊ณ  ๋ถ€๋ฅด๋Š” @Transactional์˜ readOnly ์˜ต์…˜์— ๋Œ€ํ•˜์—ฌ ์ด์•ผ๊ธฐํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค. ์—ฅ? @Transactional์—๋Š” readOnly๋ผ๋Š” ์˜ต์…˜์ด ์—†๋Š”๋ฐ? ์—ฅ? @Transactional์—๋Š” readOnly ์˜ต์…˜์ด ์—†๋Š”๋ฐ ์ด๊ฒŒ ๋ฌด์Šจ์ผ์ด์ฃ ? ์—†๋Š” ๊ฑธ๋กœ ์ด์•ผ๊ธฐ๋ฅผ ํ•˜๋ ค๊ณ  ํ•˜๋Š” ๊ฑด๊ฐ€? ์šฐ๋ฆฌ๋Š” ์ด๋ฒˆ readOnly ์ด์•ผ๊ธฐ๋ฅผ ํ•˜๊ธฐ ์ „์— @Transactional์€ 2๊ฐ€์ง€ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์ด์•ผ๊ธฐํ•˜๊ณ  ๋„˜์–ด๊ฐ€๋ ค๊ณ  ํ•œ๋‹ค. ์ด 2๊ฐ€์ง€๊ฐ€ ๊ถ๊ทน์ ์œผ๋กœ ํ•˜๋ ค๊ณ  ํ•˜๋Š” ์ผ์€ ๋™์ผํ•˜๋‹ค. (์‹ค์ œ Spring AOP ์ƒ์—์„œ๋Š” javax ํŒจํ‚ค์ง€์˜ ํŠธ๋žœ์ ์…˜๊ณผ Spring ํŒจํ‚ค์ง€์˜ ํŠธ๋žœ์ ์…˜๋„ ๋ชจ๋‘ ์ง€์›ํ•˜๊ณ  ์žˆ๋‹ค.) Spring ํŒจํ‚ค์ง€๋ฅผ ํ†ตํ•ด ์ œ๊ณต๋˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜์ด ๋” ๋งŽ์€ ์˜ต์…˜์„ ์ œ๊ณตํ•˜๊ฒŒ ๋œ.. 2021. 2. 4.
01. ์•Œ์•„๋‘๋ฉด ์“ธ๋–ผ์žˆ๋Š” GeneratedValue ์ด์•ผ๊ธฐ Part1 ์‹œ์ž‘ํ•˜๋ฉฐ ์šฐ๋ฆฌ๋Š” Entity๋ฅผ ๋งŒ๋“ค ๋•Œ ์šฐ๋ฆฌ๋Š” PK (Primary Key)๋ฅผ ์ง€์ •ํ•œ๋‹ค. ๊ทธ์ค‘์—์„œ๋„ Primary Key๋ฅผ ์„ ํƒํ•  ๋•Œ, ์ „๋žต์ ์œผ๋กœ ์ƒ๊ฐํ–ˆ์„ ๋•Œ ์ˆœ์ฐจ ์ฆ๊ฐ€ ๊ฐ’์„ ํฌ๊ธฐํ•  ์ˆ˜๊ฐ€ ์—†๋‹ค. ๊ณผ์—ฐ ๊ทธ๋Ÿผ JPA์—์„œ๋Š” ์ด๋Ÿฐ ๋Œ€์ฒด ํ‚ค๋ฅผ ์–ด๋–ป๊ฒŒ ์ƒ์„ฑํ•˜๊ณ , ์–ด๋–ค์‹์œผ๋กœ ๋™์ž‘ํ•˜๋Š”์ง€์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋„๋ก ํ•˜์ž. GeneratedValue๋ž€? import javax.persistence.*; import java.io.Serializable; import java.time.LocalDateTime; @Table(name = "coupon") @Entity @Getter @Setter public class Coupon implements Serializable { private static final long seria.. 2020. 6. 4.
Spring ์ด ์ •๋„๋Š” ํ•ด์ค˜์•ผ์ง€ - 01. ์‹œ์ž‘ํ•˜๋ฉฐ ๊ฑฐ ์ œ๋ชฉ์ด ๋„ˆ๋ฌด ์ž๊ทน์ ์ธ๊ฑฐ ์•„๋‹ˆ์š”? ์ œ๋ชฉ์€ ์›๋ž˜ ์ž๊ทน์ ์ด๊ฒŒ ์ ๋Š”๊ฑฐ๋‹ค. ๊ทธ๋ž˜์•ผ "์ด๋†ˆ๋ณด๊ฒŒ~" ํ•˜๋Š” ์ž๊ทน์„ ์ฃผ๋ฉด์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์œ ์ž…๋˜๊ฒŒ ๋œ๋‹ค. ์‚ฌ์‹ค ์ตœ๊ทผ์— ์ง€์ธ์„ ํ†ตํ•ด @city7310 ๋‹˜์˜ '๋ฐฑ์—”๋“œ๊ฐ€ ์ด์ •๋„๋Š” ํ•ด์ค˜์•ผํ•จ'์—์„œ ์•„์ด๋””์–ด๋ฅผ ์–ป์–ด์„œ, 'Spring ์ด์ •๋„๋Š” ํ•ด์ค˜์•ผ์ง€' ์œผ๋กœ ์ œ๋ชฉ์„ ๊ฐ€์ง€๊ฒŒ ๋˜์—ˆ๋‹ค. ๋ฐฑ์—”๋“œ๊ฐ€ ์ด์ •๋„๋Š” ํ•ด์ค˜์•ผ ํ•จ - 1. ์ปจํ…์ธ ์˜ ๋™๊ธฐ์™€ ๊ฐœ์š” ํ•„์ž๊ฐ€ ๊ณ ๋“ฑํ•™๊ต 1ํ•™๋…„ ๋ง์— ์ฒ˜์Œ์œผ๋กœ ๋ฐฑ์—”๋“œ ํฌ์ง€์…˜์—์„œ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉฐ, ๋ฉ์ฒญํ–ˆ๋˜ ๊ณผ๊ฑฐ ์ด์•ผ๊ธฐ์™€ ์ด ์ปจํ…์ธ ๋ฅผ ๊ธฐํšํ•œ ๋™๊ธฐ๋ฅผ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค. velog.io ์ด ์—ฐ์žฌ๋Š” ์™œ ์‹œ์ž‘ํ•˜๊ฒŒ ๋˜์—ˆ๋‚˜์š”? ์ตœ๊ทผ ์ฃผ๋ณ€์—์„œ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ด์œ ๋กœ, Spring์— ๊ด€์‹ฌ์„ ๊ฐ€์ง€๋Š” ์„ /ํ›„๋ฐฐ๋“ค์ด ๋งŽ์•„์กŒ๋‹ค. ๊ทผ๋ฐ ์ด๋“ค์ด ๋ฌผ์–ด๋ณด๋Š” ๋‚ด์šฉ์ด ๊ฑฐ๊ธฐ์„œ ๊ฑฐ๊ธฐ๊ณ , ๋งค๋ฒˆ ๋˜‘๊ฐ™์€ ๋‚ด์šฉ ๋‹ค์‹œ ์„ค๋ช… ํ•ด์ฃผ๊ธฐ.. 2020. 5. 7.
๋Œ€์šฉ๋Ÿ‰ ํ‘ธ์‹œ ๋ฐœ์†ก ์‹œ์Šคํ…œ ๊ฐœ๋ฐœ๊ธฐ - (1) ์‹œ์ž‘ B2B ์„œ๋น„์Šค์— ๋Œ€ํ•œ ์ง€๋ฃจํ•จ์„ ๋Š๋ผ๋˜ ์ƒํ™ฉ์—์„œ, ํšŒ์‚ฌ ์‹ค์žฅ๋‹˜์˜ ์ถ”์ฒœ์œผ๋กœ B2B ์„œ๋น„์Šค ํŒ€์—์„œ B2C ์„œ๋น„์ŠคํŒ€์œผ๋กœ ํŒ€์„ ์˜ฎ๊ธฐ๊ฒŒ ๋˜์—ˆ๋‹ค. ๋ฌธ์ œ์˜ ์‹œ์ž‘ ์•ฝ 6๋…„๊ฐ„ ๊ณต์„์ด๋˜ B2C ์„œ๋น„์Šค ์„œ๋ฒ„ ๊ฐœ๋ฐœ์ž์˜ ์ž๋ฆฌ์— ๋‚ด๊ฐ€ ๋“ค์–ด๊ฐ€๊ฒŒ ๋˜์—ˆ๋Š”๋ฐ, ์–ด๋Š ์ •๋„ ์˜ˆ์ƒ์€ ํ–ˆ์ง€๋งŒ ๊ณต์„์˜ ๋ฌธ์ œ๋Š” ์ƒ๊ฐ๋ณด๋‹ค ์ปธ๋‹ค. ์ฒ˜์Œ์— ํŒ€์— ์™”์„ ๋•Œ, ์ •๋ง ๋งŽ์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์ง€๋งŒ, ๊ฐ€์žฅ ํฐ ๋ฌธ์ œ๋Š” ํ‘ธ์‹œ ์ „์†ก ์‹œ์Šคํ…œ์ด ์—†์–ด์„œ, ํด๋ผ์ด์–ธํŠธ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ผ๋ช… ๋Œ๋ ค์น˜๊ธฐ (๋•œ๋นต) ํ•˜๋ฉด์„œ ๊ฒจ์šฐ ๊ฒจ์šฐ ์„œ๋น„์Šค๊ฐ€ ์šด์˜๋˜๊ณ  ์žˆ์—ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๋Œ์•„๊ฐ€๋Š”๋ฐ ๋ฌธ์ œ๊ฐ€ ์—†์—ˆ๋ƒ? ๋‹น์—ฐํžˆ ์„œ๋น„์Šค์ ์œผ๋กœ ๋ฌธ์ œ๊ฐ€ ๋งŽ์•˜๊ณ , ๊ทธ๋Ÿฌ๋‹ค ๋ณด๋‹ˆ ์œ ์ €์—๊ฒŒ ์ข‹์ง€ ๋ชปํ•œ ๊ฒฝํ—˜์ด ๋งŽ์ด ๋…ธ์ถœ ๋˜๊ฒŒ ๋˜๊ธฐ๋„ ํ•˜์˜€๊ณ , ๋น„์šฉ์ ์ธ ๊ด€์ ์—์„œ ๋ดค์„ ๋•Œ๋„ ๋น„ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋น„์šฉ์ด ๋งŽ์•˜๋‹ค. ๋˜ํ•œ, ์šฐ๋ฆฌ ํŒ€์˜ 2020๋…„ ๋กœ๋“œ๋งต์„ .. 2020. 3. 9.
MSA ๊ณ ๊ตฐ๋ถ„ํˆฌ๊ธฐ — (1) JAVA์˜ DNS Cache ์ด์Šˆ ํ•ด๊ฒฐ๊ธฐ ๋‚ด๊ฐ€ ๋งŒ๋“  ์„œ๋น„์Šค๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ DNS ๊ธฐ๋ฐ˜์œผ๋กœ ์„œ๋น„์Šค๋ฅผ ๋‹ค ํ•˜๊ณ  ์žˆ๋‹ค. account.yangs.internal , search.yangs.internal, mariadb.yangs.internal ๋“ฑ๋“ฑ.. ์„œ๋น„์Šค์ค‘์— ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๊ฑฐ๋‚˜ ๊ตฌ์„ฑ ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•˜์—ฌ ํ˜น์€ ์•„๋งˆ์กด ๋‚ด๋ถ€์˜ ์ด์Šˆ๊ฐ€ ์ƒ๊ธฐ๋ฉด DNS์— IP๋ฅผ ์Šค์œ„์นญํ•ด์„œ HAํ•˜๋Š” ํ˜•ํƒœ๋กœ ์šด์˜์ค‘์ด์—ˆ๋‹ค. ์–ด๋Š๋‚ ์€ DB์— ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ, ์ž๋™์œผ๋กœ IP๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ๋Š”๋ฐ Application ๋ ˆ๋ฒจ์—์„œ ์ „ํ™˜์ด ์ง„ํ–‰์ด ์•ˆ๋˜์–ด์„œ ์žฌ๊ธฐ๋™์œผ๋กœ ํ•ด๊ฒฐ ํ•œ ๊ธฐ์–ต์ด ์žˆ๋‹ค. DNS ์„œ๋ฒ„ ์„ค์ • ๋ฌธ์ œ์ธ๊ฐ€ ๋ดค๋Š”๋ฐ, DNS์„œ๋ฒ„์˜ ๋ฌธ์ œ๊ฐ€ ์•„๋‹Œ JAVA ํด๋ผ์ด์–ธํŠธ ์˜ DNS Cache ์ •์ฑ…์œผ๋กœ ์ธํ•˜์—ฌ ๋ฐœ์ƒํ•œ ์ด์Šˆ์˜€๋‹ค. ์˜ค๋Š˜์€ ๊ทธ ์ด์•ผ๊ธฐ๋ฅผ ํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค. DNS ๊ณต๊ฒฉ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ JAVA์˜ ์ •์ฑ….. 2020. 1. 6.