๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Today I Learned(TIL)/์ŠคํŒŒ๋ฅดํƒ€ ๋‚ด์ผ๋ฐฐ์›€์บ ํ”„

[ TIL ] ์ฃผํŠน๊ธฐ ์‹ฌํ™”_Day 3

by carrot0911 2025. 1. 1.

์˜ค๋Š˜ ํ•œ ๊ณต๋ถ€ ๐Ÿง 

  • ์‹ฌํ™” Spring 3์ฃผ์ฐจ ๊ฐ•์˜ ๋“ฃ๊ธฐ
  • TIL ๋ธ”๋กœ๊ทธ ์ž‘์„ฑ

 

์˜ค๋Š˜ ์–ป์€ ๋‚ด์šฉ ์ •๋ฆฌ โœ๏ธ 

์‹ฌํ™” Spring ๊ฐ•์˜ ๋“ฃ๊ธฐ

  • @PostConstruct, @PreDestroy annotation์€ ํ‘œ์ค€ annotation์ด๊ธฐ ๋•Œ๋ฌธ์— ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์ ์šฉ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.
    → ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์ดˆ๊ธฐํ™”, ์ข…๋ฃŒ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” @Bean์˜ initMethod, destroyMethod๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.
  • Bean Scope
    • Spring ์ปจํ…Œ์ด๋„ˆ์—์„œ Bean์ด ์–ด๋–ป๊ฒŒ ์ƒ์„ฑ๋˜๊ณ  ๊ด€๋ฆฌ๋˜๋Š”์ง€๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฐœ๋…์ด๋‹ค.
  • @ExceptionHandler annotation์ด ์„ ์–ธ๋˜์ง€ ์•Š์€ ์ปจํŠธ๋กค๋Ÿฌ์˜ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋Š” ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.
Annotation ์šฉ๋„ ๋ฐ˜ํ™˜ ํ˜•์‹ ์˜ˆ์‹œ ์ฒ˜๋ฆฌ ๋ฒ”์œ„
@ExceptionHandler ํŠน์ • ์ปจํŠธ๋กค๋Ÿฌ ๋‚ด์—์„œ ๋ฐœ์ƒํ•œ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๋ทฐ ์ด๋ฆ„,
String ๋“ฑ
๋‹จ์ผ ์ปจํŠธ๋กค๋Ÿฌ ๋‚ด
@ControllerAdvice ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์ฒด์—์„œ ๋ฐœ์ƒํ•œ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๋ทฐ ์ด๋ฆ„,
String ๋“ฑ
๋ชจ๋“  ์ปจํŠธ๋กค๋Ÿฌ์— ์ „์—ญ ์ ์šฉ
@RestControllerAdvice REST API์—์„œ ๋ฐœ์ƒํ•œ ์˜ˆ์™ธ๋ฅผ JSON ํ˜•์‹์œผ๋กœ ์ฒ˜๋ฆฌ ResponseEntity
(JSON)
๋ชจ๋“  ์ปจํŠธ๋กค๋Ÿฌ์— ์ „์—ญ ์ ์šฉ
(RESTful ์„œ๋น„์Šค)

๊ฐ•์˜๋ฅผ ๋“ฃ๋‹ค๊ฐ€ ๊ถ๊ธˆํ–ˆ๋˜ ์ 

500 Error๋Š” ๋ฐ˜ํ™˜๋˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์€ ์„œ๋ฒ„์ด๋‹ค. ๊ทธ ์ด์œ ๋Š” ๋ฌด์—‡์ผ๊นŒ??

  1. ์‚ฌ์šฉ์ž ๊ฒฝํ—˜(UX)์˜ ์ €ํ•˜
  2. ๋ฌธ์ œ์˜ ๋ถˆ๋ช…ํ™•์„ฑ
  3. ๋ณด์•ˆ ๋ฌธ์ œ
  4. ์„œ๋ฒ„ ๊ด€๋ฆฌ์˜ ๋ฏธํกํ•จ์„ ์˜๋ฏธ
  5. ๋Œ€์ฒด ์‘๋‹ต ์ œ๊ณต ๊ฐ€๋Šฅ
  6. ์˜ˆ์™ธ ์ฒ˜๋ฆฌ์™€ ๋กœ๊น…

@RestControllerService annotation์˜ ๊ณตํ†ต๋œ ์‘๋‹ต ํ˜•ํƒœ๋Š” ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์„๊นŒ??

์ผ๋ฐ˜์ ์ธ ๊ณตํ†ต ์‘๋‹ต ๊ตฌ์กฐ

{
  "status": "SUCCESS",  // ๋˜๋Š” "FAIL", ์š”์ฒญ ์„ฑ๊ณต ์—ฌ๋ถ€๋ฅผ ๋‚˜ํƒ€๋ƒ„
  "code": 200,          // HTTP ์ƒํƒœ ์ฝ”๋“œ
  "message": "์š”์ฒญ์ด ์„ฑ๊ณต์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.", // ์‘๋‹ต์— ๋Œ€ํ•œ ์„ค๋ช…
  "data": {             // ์š”์ฒญ์˜ ๊ฒฐ๊ณผ ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จ
    // ์‹ค์ œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด๊ฐ€๋Š” ์˜์—ญ
  }
}

@MappedSuperClass์™€ @Embeddable์˜ ๋‹ค๋ฅธ ์ ์ด ๋ญ˜๊นŒ??

@MappedSuperclass
Entity ํด๋ž˜์Šค๋“ค ๊ฐ„์— ๊ณตํ†ต๋˜๋Š” ๋งคํ•‘ ์ •๋ณด๋ฅผ ์ƒ์†๋ฐ›๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค.

ํŠน์ง•

  • ์ง์ ‘์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”๋กœ ๋งคํ•‘๋˜์ง€ ์•Š๋Š”๋‹ค.
  • ์ƒ์†๋ฐ›๋Š” Entity ํด๋ž˜์Šค์—์„œ๋งŒ ์‚ฌ์šฉ๋˜๊ณ , ํ…Œ์ด๋ธ”์— ๋งคํ•‘๋  ์ปฌ๋Ÿผ์ด ํฌํ•จ๋œ๋‹ค.
  • ๋ถ€๋ชจ ํด๋ž˜์Šค์— ์„ ์–ธ๋œ ํ•„๋“œ๋“ค์ด ์ž์‹ ํด๋ž˜์Šค์˜ Entity ํ…Œ์ด๋ธ”์— ์ปฌ๋Ÿผ์œผ๋กœ ์ถ”๊ฐ€๋œ๋‹ค.

@Embeddable
๊ฐ์ฒด๋ฅผ ๊ฐ’ ํƒ€์ž…์œผ๋กœ ๋งคํ•‘ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค. ํ•œ Entity ์•ˆ์—์„œ ๋‹ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์ปฌ๋Ÿผ์œผ๋กœ ์ž„๋ฒ ๋“œํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋ ค๋Š” ๊ฒฝ์šฐ์— ์‚ฌ์šฉ๋œ๋‹ค.

ํŠน์ง•

  • ๊ฐ’ ํƒ€์ž… ๊ฐ์ฒด๋ฅผ ์ •์˜ํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.
  • ํ•ด๋‹น ํด๋ž˜์Šค๋Š” ๋ณ„๋„์˜ ํ…Œ์ด๋ธ”๋กœ ๋งคํ•‘๋˜์ง€ ์•Š๊ณ , ์ด๋ฅผ ํฌํ•จํ•˜๋Š” Entity ํ…Œ์ด๋ธ”์— ์ปฌ๋Ÿผ์œผ๋กœ ๋งคํ•‘๋œ๋‹ค.
  • ๋ณตํ•ฉ์ ์ธ ๊ฐ’ ํƒ€์ž…์„ ํ‘œํ˜„ํ•˜๊ธฐ์— ์ ํ•ฉํ•˜๋‹ค.

๋‘˜์˜ ์ฐจ์ด์ 

ํŠน์ง• ์šฉ๋„ ํ…Œ์ด๋ธ” ๋งคํ•‘ ์—ฌ๋ถ€ ์‚ฌ์šฉ ๋ฐฉ์‹ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ
ํ‘œํ˜„
@MappedSuperclass ๊ณตํ†ต ๋งคํ•‘ ์ •๋ณด ์ƒ์† ๋ถ€๋ชจ ํด๋ž˜์Šค ์ž์ฒด๋Š” ํ…Œ์ด๋ธ”๋กœ ๋งคํ•‘๋˜์ง€ ์•Š์Œ Entity ๊ฐ„ ์ƒ์† ๊ตฌ์กฐ์—์„œ ์‚ฌ์šฉ Entity์˜ ๊ณตํ†ต๋œ ํ•„๋“œ๋ฅผ ์ƒ์†๋ฐ›์•„ ํ…Œ์ด๋ธ”์— ๋งคํ•‘
@Embeddable ๊ฐ’ ํƒ€์ž…์„ Entity์— ํฌํ•จ ๋ณ„๋„์˜ ํ…Œ์ด๋ธ”๋กœ ๋งคํ•‘๋˜์ง€ ์•Š๊ณ  Entity ํ…Œ์ด๋ธ”์— ํฌํ•จ ๊ฐ’ ํƒ€์ž… ๊ฐ์ฒด๋ฅผ ํ‘œํ˜„ํ•˜๊ณ  ์‚ฌ์šฉํ•  ๋•Œ ์‚ฌ์šฉ ๊ฐ’ ํƒ€์ž… ํ•„๋“œ๋ฅผ ์ž„๋ฒ ๋“œํ•˜์—ฌ Entity ๋‚ด๋ถ€์— ํฌํ•จ

@Embeddable๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

  • ๊ฐ’ ํƒ€์ž…์˜ ํ‘œํ˜„
    • ํ•œ Entity ์•ˆ์—์„œ ๊ฐ’ ํƒ€์ž… ๊ฐ์ฒด๋ฅผ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•œ๋‹ค.
  • ์žฌ์‚ฌ์šฉ์„ฑ
    • ๋™์ผํ•œ ๊ฐ’ ํƒ€์ž… ๊ฐ์ฒด๋ฅผ ์—ฌ๋Ÿฌ Entity์—์„œ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ์บก์Šํ™”์™€ ๊ฐ€๋…์„ฑ
    • ๊ฐ’ ํƒ€์ž… ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ์ดํ„ฐ ๋ชจ๋ธ์„ ์บก์Šํ™”ํ•˜์—ฌ Entity๋ฅผ ๋” ๊น”๋”ํ•˜๊ณ  ์ฝ๊ธฐ ์‰ฝ๊ฒŒ ์„ค๊ณ„ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํ…Œ์ด๋ธ” ์„ค๊ณ„ ๋‹จ์ˆœํ™”
    • Entity ํ…Œ์ด๋ธ”์˜ ์ผ๋ถ€๋กœ ํฌํ•จ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณ„๋„์˜ ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•˜์ง€ ์•Š์•„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค๊ณ„๊ฐ€ ๋‹จ์ˆœํ•ด์ง„๋‹ค.

 

์˜ค๋Š˜ ํ•˜๋ฃจ ์ƒ๊ฐ ์ •๋ฆฌ โœ๏ธ

์ƒˆํ•ด๊ฐ€ ๋ฐ์•˜๋‹ค!!๋ผ๋Š” ์ƒ๊ฐ์œผ๋กœ ์˜ค๋Š˜ ์‰ด๊นŒ ๋ง๊นŒ๋ฅผ ๊ณ„์† ๊ณ ๋ฏผํ–ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค..

ํ•˜์ง€๋งŒ ๋‚ฎ์ž ์„ ์กฐ๊ธˆ ์ž๊ณ  ๋ฐ”๋กœ ๊ฐ•์˜๋ฅผ ๋“ฃ๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค. ๋ฌผ๋ก  ์ง‘์ค‘๋ ฅ์ด ๊ทธ๋ ‡๊ฒŒ ์ข‹์ง€๋Š” ์•Š์•„์„œ ๊ฐ•์˜๋ฅผ ๋‹ค ๋“ฃ๊ณ  ๋‚˜๋‹ˆ๊นŒ ๋จธ๋ฆฟ์†์— ๋‚จ์€ ๋‚ด์šฉ์ด ๊ฑฐ์˜ ์—†์—ˆ๋‹ค.. ๊ทธ๋ž˜๋„ ์‰ฌ๋Š” ๋‚  ๊ฐ•์˜๋ฅผ ๋“ค์—ˆ๋‹ค๋Š” ๊ฒƒ์— ์˜์˜๋ฅผ ๋‘์ž!

๊ทธ๋ฆฌ๊ณ  ๊ฐ•์˜ ๋“ค์œผ๋ฉด์„œ ๊ถ๊ธˆํ–ˆ๋˜ ๋ถ€๋ถ„๋“ค์„ ๋”ฐ๋กœ ์ •๋ฆฌํ–ˆ๋‹ค! ์ค‘์š”ํ•œ ๋ถ€๋ถ„์ธ์ง€๋Š” ์ž˜ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ๋‚ด๊ฐ€ ์ดํ•ด๊ฐ€ ์•ˆ ๋˜๋Š” ๋ถ€๋ถ„์€ ์งš๊ณ  ๋„˜์–ด๊ฐ€์•ผ ํ•œ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค. ์ตœ๊ทผ์—๋Š” ๋…ธ์…˜์— 1์ฐจ๋กœ ๋จผ์ € ์ •๋ฆฌ๋ฅผ ํ•œ ํ›„, 2์ฐจ๋กœ TIL ๋˜๋Š” ๋ธ”๋กœ๊ทธ์— ๋”ฐ๋กœ ์ •๋ฆฌํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ๋‹ค! ์ •๋ฆฌํ•˜๋ฉด์„œ ๋‚ด ๊ฒƒ์œผ๋กœ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์ง€๋งŒ ์‰ฝ์ง€๋Š” ์•Š์€ ๊ฒƒ ๊ฐ™๋‹ค..! ์ด๋ ‡๊ฒŒ ์ •๋ฆฌํ•ด ๋‘๋ฉด ์–ธ์  ๊ฐ€๋Š” ๋‚ด ๊ฒƒ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์ง€ ์•Š์„๊นŒ ์ƒ๊ฐํ•œ๋‹ค!

์‰ฌ๋Š” ๋‚ ์—๋„ ์ƒ๊ฐ๋ณด๋‹ค ๋งŽ์€ ๊ฒƒ์„ ํ•œ ๋Š๋‚Œ์ด๋‹ค(?) ๋ฌผ๋ก  ์•„๋‹ ์ˆ˜๋„ ์žˆ๋‹ค..
๊ทธ๋ž˜๋„ ๋ญ๋ผ๋„ ํ•œ ๊ฒƒ์— ๋ฟŒ๋“ฏํ•˜๋‹ค!! ๋‚จ์€ ์‹œ๊ฐ„๋„ ์ž˜ ๋ณด๋‚ด๊ณ  ๋‚ด์ผ๋ถ€ํ„ฐ ๋˜ 12์‹œ๊ฐ„์”ฉ ์—ด์‹ฌํžˆ ๊ณต๋ถ€ํ•ด์•ผ์ง€!
์ปจ๋””์…˜์ด๋ž‘ ์ฒด๋ ฅ ์ž˜ ๊ด€๋ฆฌํ•˜๋ฉด์„œ ์ด๋ฒˆ ์ฃผ๋„ ์ž˜ ๋งˆ๋ฌด๋ฆฌํ•˜์ž ๐Ÿ˜ƒ

 

๋‚ด์ผ ๊ณ„ํš โฐ

  • ๊ฐœ์ธ ๊ณผ์ œ ํ•„์ˆ˜ ๋๋‚ด๊ธฐ
  • ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ๋ณต์Šต
  • TIL ๋ธ”๋กœ๊ทธ ์ž‘์„ฑ

+ ์ถ”๊ฐ€๋กœ ๊ณ„ํš์ด ๋” ์ถ”๊ฐ€๋  ์ˆ˜๋„ ์žˆ์–ด์š”~_~