[Spring Boot][1] ์ž ๊น๐Ÿคš๐Ÿป ์ •๋ฆฌ ํ•˜๊ณ  ๊ฐˆ๊ฒŒ์š” !

sorzzzzyยท2021๋…„ 8์›” 17์ผ
0

Spring Boot - ์ž…๋ฌธํŽธ

๋ชฉ๋ก ๋ณด๊ธฐ
10/10
post-thumbnail

๋“œ๋””์–ด ์Šคํ”„๋ง ์ž…๋ฌธ ๊ฐ•์˜๋ฅผ ๋งˆ์ณค๋‹ค !
.
.
.
.
.
.
..ใ„ฑ..๊ทธ์น˜๋งŒ.. ์ด๋Œ€๋กœ ๋‹ค์Œ ๋กœ๋“œ๋งต์œผ๋กœ ๋„˜์–ด๊ฐ„๋‹ค๋ฉด....ํฐ ์ผ์ด ๋‚˜๊ฒ ์ง€์š”...?
๋จธ๋ฆฌ์†์—์„œ ์•„์ฃผ ๋‚œ๋ฆฌ๋‚œ๋ฆฌ๊ฐ€ ๋‚  ๊ฒƒ์ด ์˜ˆ์ƒ๋˜๊ธฐ ๋•Œ๋ฌธ์—๐Ÿ˜‚

๋กœ๋“œ๋งต1๋กœ ๋„˜์–ด๊ฐ€๊ธฐ ์ „์—, ์ค‘์š”ํ•œ ๊ฐœ๋…๊ณผ ์ดํ•ด๊ฐ€ ์ž˜ ๋˜์ง€ ์•Š์•˜๋˜ ๋ถ€๋ถ„๋“ค์„ ๋‹ค์‹œ ํ•œ ๋ฒˆ ์งš๊ณ  ๊ฐ€๋ ค๊ณ  ํ•œ๋‹ค! ๋น ์ดํŒ…!!!!!!!!! ์‹œ์ž‘!!!!!!!!!!!!!!!!!!!!!

๐Ÿท ํ™˜๊ฒฝ์„ค์ •

์Šคํ”„๋ง๋ถ€ํŠธ ๋ž€โ“
์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ ๊ธฐ๋ฐ˜ ํ”„๋กœ์ ํŠธ๋ฅผ ๋ณต์žกํ•˜๊ฒŒ ์„ค์ •ํ•˜์ง€ ์•Š๊ณ ๋„ ์‰ฝ๊ณ  ๋น ๋ฅด๊ฒŒ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ด๋‹ค!
ํ•˜๋‚˜ํ•˜๋‚˜ ๋ชจ๋“  ์„ค์ •์„ ํ•ด์ฃผ์ง€ ์•Š์•„๋„ ๊ธฐ๋ณธ ์„ค์ •์„ ์•Œ์•„์„œ ํ•ด์ฃผ๋Š” ํŽธ๋ฆฌํ•จ!์ด ํŠน์ง•์ด๋‹ค.


  • ์Šคํ”„๋ง ๊ด€๋ จ ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค์–ด ์ฃผ๋Š” ์‚ฌ์ดํŠธ๋กœ๋Š” ์Šคํ”„๋ง ๋ถ€ํŠธ ์Šคํƒ€ํ„ฐ ์‚ฌ์ดํŠธ๊ฐ€ ์žˆ๋‹ค!
    ์—ฌ๊ธฐ์„œ Dependencies๋ผ๊ณ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ง€์ •ํ•ด ์ฃผ๋Š” ๋ถ€๋ถ„์ด ์žˆ๋Š”๋ฐ, ์‹ค์ œ๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ์—ด์–ด ํ™•์ธํ•ด๋ณด๋ฉด ์‹ค์ œ ์ง€์ •ํ•ด์คฌ๋˜ ๊ฐœ์ˆ˜๋ณด๋‹ค ํ›จ์”ฌ ๋” ๋งŽ์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์ด ์„ค์น˜๋ผ ์žˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค ๐Ÿคญ
    ์—ฌ๊ธฐ์„œ ์•Œ์•„๋ณด๋Š” Gradle์„ ์ผ์„ ๋•Œ์˜ ์žฅ์ ๐Ÿ‘€!
    "Gradle์€ ์˜์กด๊ด€๊ณ„์— ์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์„ ํ•จ๊ป˜ ๋‹ค ๋‹ค์šด๋กœ๋“œ ํ•œ๋‹ค"

  • ์ฒ˜์Œ ์›ฐ์ปด ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ค ๋•Œ ์ •์  ํŽ˜์ด์ง€๋กœ ๋งŒ๋“ค์—ˆ๋Š”๋ฐ, ํ…œํ”Œ๋ฆฟ ์—”์ง„์„ ์‚ฌ์šฉ ํ•˜๋ฉด ๋ชจ์–‘๊ณผ ํ˜•์‹์„ ์ž์œ ์ž์žฌ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค !! -> thymeleaf ํ…œํ”Œ๋ฆฟ ์—”์ง„
    html ํŒŒ์ผ์— <html xmlns:th="http://www.thymeleaf.org"> ์ด ๋ฌธ์žฅ์„ ์“ฐ๋ฉด,
    thymeleaf ๋ฌธ๋ฒ•์„ ํ…œํ”Œ๋ฆฟ ์—”์ง„์œผ๋กœ์จ ์“ธ ์ˆ˜ ์žˆ๋‹ค! (th ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•ด ์ž์œ ๋กญ๊ฒŒ ์‚ฌ์šฉ)

  • @Controller : ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์ด ์ง„์ž…ํ•˜๋Š” ์ง€์ (entry point)์œผ๋กœ ์š”์ฒญ์— ๋”ฐ๋ผ ์–ด๋–ค ์ฒ˜๋ฆฌ๋ฅผ ํ•  ์ง€ ๊ฒฐ์ •๋งŒ ํ•ด์ค€๋‹ค.(์ฒ˜๋ฆฌ๋Š” ๋‹ค๋ฅธ ๊ณณ์—์„œ ํ•จ) ์‚ฌ์šฉ์ž์—๊ฒŒ View๋ฅผ ์‘๋‹ต์œผ๋กœ ๋ณด๋‚ด์ฃผ๋Š” ์—ญํ• ์„ ํ•จ
    -> ์ปจํŠธ๋กค๋Ÿฌ ์ƒ์„ฑ ์‹œ ๊ผญ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜



๐Ÿท ์Šคํ”„๋ง ์›น ๊ฐœ๋ฐœ ๊ธฐ์ดˆ

  • MVC์™€ ํ…œํ”Œ๋ฆฟ ์—”์ง„
    : ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ, HTML์„ ๊ทธ๋ƒฅ ์ฃผ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์„œ๋ฒ„์—์„œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•ด์„œ ๋™์ ์œผ๋กœ ๋ฐ”๊ฟ”์„œ ๋‚ด๋ ค์ฃผ๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค(Model View Controller).
    : ์ •์  ์ปจํ…์ธ ์™€๋Š” ๋‹ฌ๋ฆฌ, MVC๋Š” ๋งˆ์ง€๋ง‰์— HTML ๋ณ€ํ™˜ ๊ณผ์ •์ด ์ถ”๊ฐ€๋œ๋‹ค.

  • API
    : ์„œ๋ฒ„๋ผ๋ฆฌ ํ†ต์‹ ํ•  ๋•Œ ์‚ฌ์šฉ
    : @ResponseBody html์—์„œ์˜ body๊ฐ€ ์•„๋‹Œ http์˜ ์‘๋‹ต body๋ถ€๋ถ„์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ง์ ‘ ๋„ฃ์–ด์ค„ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ. ํ…œํ”Œ๋ฆฟ ์—”์ง„๊ณผ์˜ ์ฐจ์ด๋Š”, view ์—†์ด ์ž…๋ ฅํ•œ ๋ฌธ์ž๊ฐ€ ๊ทธ๋Œ€๋กœ ๋“ค์–ด๊ฐ!

    - @ResponseBody ๋ผ๋Š” annotation์ด ๋ถ™์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์— http ์‘๋‹ต์— ์ด ๋ฐ์ดํ„ฐ๋ฅผ ๊ทธ๋Œ€๋กœ ๋„˜๊ธด๋‹ค.
    (๋งŒ์•ฝ ์•ˆ ๋ถ™์–ด์žˆ๋‹ค๋ฉด, ์ด์ „์˜ template์—์„œ์™€ ๊ฐ™์ด viewResolver์—๊ฒŒ ๋˜์ง)



๐Ÿท ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ

์ด ํ”„๋กœ์ ํŠธ์—์„œ์˜ ๋ฐ์ดํ„ฐ๋Š” ํšŒ์›ID์™€ ์ด๋ฆ„, ๊ธฐ๋Šฅ์€ ํšŒ์› ์กฐํšŒ์™€ ๋“ฑ๋ก๋งŒ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค.

  • ์ผ๋ฐ˜์ ์ธ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌ์กฐ

-> ์ปจํŠธ๋กค๋Ÿฌ: ์›น MVC์˜ ์ปจํŠธ๋กค๋Ÿฌ ์—ญํ• 
-> ์„œ๋น„์Šค: ํ•ต์‹ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๊ตฌํ˜„ ex)ํšŒ์›์€ ์ค‘๋ณต๊ฐ€์ž…์ด ์•ˆ ๋œ๋‹ค
-> ๋ฆฌํฌ์ง€ํ† ๋ฆฌ: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ‘๊ทผ, ๋„๋ฉ”์ธ ๊ฐ์ฒด๋ฅผ DB์— ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌ
-> ๋„๋ฉ”์ธ: ๋น„์ฆˆ๋‹ˆ์Šค ๋„๋ฉ”์ธ ๊ฐ์ฒด, ex) ํšŒ์›, ์ฃผ๋ฌธ ๋“ฑ

  • ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ž‘์„ฑ
    : ๊ธฐ์กด์˜ ํ…Œ์ŠคํŠธ ๋ฐฉ๋ฒ•์€ ์ค€๋น„ํ•˜๊ณ  ์‹คํ–‰ํ•˜๋Š”๋ฐ ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๊ณ  ๋ฐ˜๋ณต์‹คํ–‰๊ณผ ํ•œ๋ฒˆ์— ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์–ด๋ ต๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค
    : Junit์ด๋ผ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•ด์„œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค!
    : ํ…Œ์ŠคํŠธ ํ•  ๋•Œ @Test ์–ด๋…ธํ…Œ์ด์…˜(Test org.junit.jupiter.api)์„ ์‚ฌ์šฉํ•œ๋‹ค

๐Ÿ’ก ์ „์ฒด๋ฅผ ํ…Œ์ŠคํŠธ ํ•  ๋•Œ, ์‹คํ–‰์ˆœ์„œ ๋•Œ๋ฌธ์— ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•๐Ÿ’ก
ํ•˜๋‚˜์˜ ํ…Œ์ŠคํŠธ๊ฐ€ ๋๋‚  ๋•Œ๋งˆ๋‹ค ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ๊น”๋”ํžˆ ๋น„์›Œ์ฃผ๋Š” ์—ญํ• 

  • @AfterEach : ํ•œ๋ฒˆ์— ์—ฌ๋Ÿฌ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ DB์— ์ง์ „ ํ…Œ์ŠคํŠธ์˜ ๊ฒฐ๊ณผ๊ฐ€ ๋‚จ์„ ์ˆ˜ ์žˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๋˜๋ฉด ๋‹ค์Œ ์ด์ „ ํ…Œ์ŠคํŠธ ๋•Œ๋ฌธ์— ๋‹ค์Œ ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํŒจํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค.
  • @AfterEach ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ ํ…Œ์ŠคํŠธ๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ ๋งˆ๋‹ค ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ์‹คํ–‰ํ•œ๋‹ค.
    (์—ฌ๊ธฐ์„œ ์ฃผ์˜ํ•  ์ , ํ…Œ์ŠคํŠธ๋Š” ๊ฐ๊ฐ ๋…๋ฆฝ์ ์œผ๋กœ ์‹คํ–‰๋˜์–ด์•ผ ํ•œ๋‹ค)
  • @BeforeEach : ๊ฐ ํ…Œ์ŠคํŠธ ์‹คํ–‰ ์ „์— ํ˜ธ์ถœ๋˜๋ฉฐ, ํ…Œ์ŠคํŠธ๋ผ๋ฆฌ ์„œ๋กœ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๋„๋ก ํ•ญ์ƒ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์˜์กด๊ด€๊ณ„ ๋˜ํ•œ ๋งบ์–ด์ค€๋‹ค.

๐Ÿ“Œ ํŒ : ํ…Œ์ŠคํŠธ ํ•˜๋ ค๋Š” ํŒŒ์ผ์˜ ํด๋ž˜์Šค๋ช…์—์„œ command + shift + T ๋‹จ์ถ•ํ‚ค๋ฅผ ๋ˆ„๋ฅด๋ฉด ์ž๋™์œผ๋กœ ํ…Œ์ŠคํŠธ ํŒŒ์ผ์„ ์‰ฝ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.



๐Ÿท ์Šคํ”„๋ง ๋นˆ๊ณผ ์˜์กด๊ด€๊ณ„

ํšŒ์› ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ํšŒ์› ์„œ๋น„์Šค์™€ ํšŒ์› ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ์˜์กด๊ด€๊ณ„๋ฅผ ๋งบ์–ด์ค€๋‹ค.

  • DI (Dependency Injection)
    : ์ƒ์„ฑ์ž์— @Autowired ๊ฐ€ ์žˆ์œผ๋ฉด ์Šคํ”„๋ง์ด ์—ฐ๊ด€๋œ ๊ฐ์ฒด๋ฅผ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์—์„œ ์ฐพ์•„์„œ ๋„ฃ์–ด์ค€๋‹ค.
    : ์ด๋ ‡๊ฒŒ ๊ฐ์ฒด ์˜์กด๊ด€๊ณ„๋ฅผ ์™ธ๋ถ€์—์„œ ๋„ฃ์–ด์ฃผ๋Š” ๊ฒƒ์„ DI๋ผ ํ•œ๋‹ค.
    : ์ด์ „ ํ…Œ์ŠคํŠธ์—์„œ๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์ฃผ์ž…ํ–ˆ๊ณ , ์—ฌ๊ธฐ์„œ๋Š” @Autowired์— ์˜ํ•ด ์Šคํ”„๋ง์ด ์ฃผ์ž…ํ•ด์ค€๋‹ค.
    : DI์—๋Š” ํ•„๋“œ ์ฃผ์ž…, setter ์ฃผ์ž…, ์ƒ์„ฑ์ž ์ฃผ์ž… ์ด ์žˆ๋‹ค.
    1) ํ•„๋“œ ์ฃผ์ž… : ์ƒ์„ฑ์ž ์—†์ด ํ•„๋“œ์— @Autowired ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ• (๋ณ„๋กœ ๊ถŒ์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์•„๋‹˜)
    2) setter ์ฃผ์ž… : setter ์— @Autowired ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•
    3) ์ƒ์„ฑ์ž ์ฃผ์ž… : ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ๋ฉค๋ฒ„ ์„œ๋น„์Šค๊ฐ€ ๋ฉค๋ฒ„ ์ปจํŠธ๋กค๋Ÿฌ์— ์ฃผ์ž…์ด ๋˜๋Š” ๋ฐฉ๋ฒ•
    (์˜์กด๊ด€๊ณ„๊ฐ€ ์‹คํ–‰์ค‘์— ๋™์ ์œผ๋กœ ๋ณ€ํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ๊ฑฐ์˜ ์—†์œผ๋ฏ€๋กœ ์ƒ์„ฑ์ž ์ฃผ์ž…์„ ๊ถŒ์žฅํ•จ)

  • ์ปดํฌ๋„ŒํŠธ ์Šค์บ”์œผ๋กœ ์Šคํ”„๋ง ๋นˆ ๋“ฑ๋กํ•˜๊ธฐ
    (์ปดํฌ๋„ŒํŠธ ์Šค์บ” : ์„ค์ •์ •๋ณด ์—†์ด ์ž๋™์œผ๋กœ ์Šคํ”„๋ง ๋นˆ์„ ๋“ฑ๋กํ•ด์ฃผ๋Š” ์–ด๋…ธํ…Œ์ด์…˜)
    : @Component ์• ๋…ธํ…Œ์ด์…˜์ด ์žˆ์œผ๋ฉด ์Šคํ”„๋ง ๋นˆ์œผ๋กœ ์ž๋™ ๋“ฑ๋ก๋œ๋‹ค.
    : @Controller ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์Šคํ”„๋ง ๋นˆ์œผ๋กœ ์ž๋™ ๋“ฑ๋ก๋œ ์ด์œ ๋„ ์ปดํฌ๋„ŒํŠธ ์Šค์บ” ๋•Œ๋ฌธ์ด๋‹ค.
    : @Component ๋ฅผ ํฌํ•จํ•˜๋Š” ์• ๋…ธํ…Œ์ด์…˜(@Controller, @Service, @Repository)๋„ ์Šคํ”„๋ง ๋นˆ์œผ๋กœ ์ž๋™ ๋“ฑ๋ก๋œ๋‹ค.

  • ์ž๋ฐ” ์ฝ”๋“œ๋กœ ์ง์ ‘ ์Šคํ”„๋ง ๋นˆ ๋“ฑ๋กํ•˜๊ธฐ
    : SpringConfig.java ํŒŒ์ผ์„ ์ƒ์„ฑํ•ด์„œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค
    : @Bean - ์Šคํ”„๋ง ๋นˆ์„ ๋“ฑ๋กํ•˜๊ฒ ๋‹ค๋Š” ์˜๋ฏธ
    : @Configuration - ํ•ด๋‹น ํด๋ž˜์Šค์—์„œ 1๊ฐœ ์ด์ƒ Bean์„ ๋“ฑ๋กํ•˜๊ณ  ์žˆ์Œ์„ ๋ช…์‹œํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜



๐Ÿท ์›น MVC ๊ฐœ๋ฐœ

  • ์›ฐ์ปด ํŽ˜์ด์ง€ ๋งŒ๋“ค๊ธฐ
    : main/resources/template/home.html ํŒŒ์ผ ์ƒ์„ฑํ•˜๊ธฐ
    : ์ด์ „์— ๋งŒ๋“ค์—ˆ๋˜ main/resources/static/index.html ํŒŒ์ผ๊ณผ ๋‹ค๋ฅธ์ ์€ ๋ฌด์—‡์ผ๊นŒโ“
    -> ์ด๋“ค์€ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ฐ€์ง€๋Š”๋ฐ, ๋งŒ์•ฝ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— ๊ด€๋ จ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์—†๋‹ค๋ฉด, static์œผ๋กœ ๊ฐ€์„œ ์ฐพ๋Š”๋‹ค!


    ์—ฌ๊ธฐ๊นŒ์ง€๋Š” ์ •๋ณด๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์— ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋ฒ„๋ฅผ ๋„๋ฉด ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹ค ๋‚ ์•„๊ฐ„๋‹ค! ์ด ๋‹ค์Œ์— ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์šด๋‹ค.


๐Ÿท ์Šคํ”„๋ง DB ์ ‘๊ทผ ๊ธฐ์ˆ 

  • H2 ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค์น˜ ํ•„์š”
    : hello-spring/sql/ddl.sql ํŒŒ์ผ์„ ์ƒ์„ฑํ•œ ํ›„ sql ํŒŒ์ผ์„ ๋„ฃ์–ด์„œ ๊ด€๋ฆฌํ•˜๋ฉด ํŽธ๋ฆฌํ•˜๋‹ค

  • ์ˆœ์ˆ˜ JDBC
    : ์•ฝ 20๋…„ ์ „ ๊ณ ๋Œ€ ๊ฐœ๋ฐœ์ž๋“ค์ด ์ง์ ‘ JDBC API๋กœ ์ฝ”๋”ฉํ•œ ๊ฒƒ
    : ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ์„ค์ • ์ถ”๊ฐ€(application.properties) ํŒŒ์ผ ์ž‘์„ฑ ์‹œ, ์Šคํ”„๋ง๋ถ€ํŠธ 2.4๋ถ€ํ„ฐ๋Š” spring.datasource.username=sa๋ฅผ ๊ผญ ์ถ”๊ฐ€ํ•ด์ฃผ์–ด์•ผ ํ•จ(๊ณต๋ฐฑ ๋ชจ๋‘ ์ œ๊ฑฐ)

  • Jdbc
    : ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค sql์„ ๊ฐ€์ง€๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„์™€ DB๋ฅผ ์—ฐ๊ฒฐํ•  ๋•Œ ํ•„์š”ํ•œ ๊ธฐ์ˆ 

  • ์Šคํ”„๋ง JdbcTemplate
    : ์ˆœ์ˆ˜ํ•œ Jdbc๋กœ ๊ฐœ๋ฐœํ•˜๋Š” ๊ฒƒ์ด ๋„ˆ๋ฌด ์–ด๋ ค์›Œ์„œ ์Šคํ”„๋ง์ด ์ค‘๋ณต์„ ์ œ๊ฑฐํ•ด์„œ ์ œ๊ณตํ•˜๋Š” ํ…œํ”Œ๋ฆฟ
    : ์ˆœ์ˆ˜ Jdbc์™€ ๋™์ผํ•œ ํ™˜๊ฒฝ์„ค์ •์„ ํ•„์š”๋กœ ํ•จ.
    : ์Šคํ”„๋ง JdbcTemplate์€ JDBC API์—์„œ์˜ ๋ฐ˜๋ณต ์ฝ”๋“œ๋ฅผ ๋Œ€๋ถ€๋ถ„ ์ œ๊ฑฐํ•ด์ค€๋‹ค.(๋‹จ, SQL์€ ์ง์ ‘ ์ž‘์„ฑํ•ด์•ผ ํ•จ)

  • JPA
    : ๊ธฐ์กด์˜ ๋ฐ˜๋ณต ์ฝ”๋“œ๋Š” ๋ฌผ๋ก ์ด๊ณ , ๊ธฐ๋ณธ์ ์ธ SQL๋„ JPA๊ฐ€ ์ง์ ‘ ๋งŒ๋“ค์–ด์„œ ์‹คํ–‰ํ•ด์ค€๋‹ค. (๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์ž‘์„ฑํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค)
    : ๊ฐ์ฒด๋ฅผ ๋ฐ”๋กœ DB์— ์ฟผ๋ฆฌ ์—†์ด ์ €์žฅ ๋ฐ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Œ(์Šคํ”„๋ง ๋งŒํผ์ด๋‚˜ ์˜ค๋ž˜๋œ ๊ธฐ์ˆ )
    --> ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ์„ ํฌ๊ฒŒ ๋†’์ผ ์ˆ˜ ์žˆ๊ณ , ๊ฐ์ฒด ์ค‘์‹ฌ์˜ ์„ค๊ณ„๋กœ ํŒจ๋Ÿฌ๋‹ค์ž„์„ ์ „ํ™˜ํ•ด์ค€๋‹ค.

๐Ÿ’ก JPA๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” EntityManager๊ฐ€ ๊ผญ ํ•„์š”ํ•˜๋‹ค

๐Ÿ’ก JPA๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” @Transactional(org.springframework.transaction.annotation.Transactional) ์ด ๊ผญ ํ•„์š”ํ•˜๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝํ•  ๋•Œ ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ!

  • ์Šคํ”„๋ง ๋ฐ์ดํ„ฐ JPA
    : JPA๋ฅผ ํŽธ๋ฆฌํ•˜๊ฒŒ ์“ธ ์ˆ˜ ์žˆ๋„๋ก ํ•œ ๋ฒˆ ๊ฐ์‹ผ ๊ธฐ์ˆ 
    : ์ง€๊ธˆ๊นŒ์ง€ JPA๋งŒ ์‚ฌ์šฉํ•ด๋„ ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ๋„ ์ฆ๊ฐ€ํ•˜๊ณ  ํŽธ๋ฆฌํ•œ๋ฐ, ์—ฌ๊ธฐ์— ์Šคํ”„๋ง ๋ฐ์ดํ„ฐ JPA ๋ผ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ๊นŒ์ง€ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ๊ตฌํ˜„ ํด๋ž˜์Šค ์—†์ด ์ธํ„ฐํŽ˜์ด์Šค ๋งŒ์œผ๋กœ ๊ฐœ๋ฐœ์„ ์™„๋ฃŒ ํ•  ์ˆ˜ ์žˆ๋‹ค!
    (JPA๋ฅผ ๋จผ์ € ํ•™์Šตํ•œ ํ›„, ์Šคํ”„๋ง ๋ฐ์ดํ„ฐ JPA๋ฅผ ํ•™์Šตํ•˜๋„๋ก ํ•˜์ž!)
    : ์ธํ„ฐํŽ˜์ด์Šค(์Šคํ”„๋ง ๋ฐ์ดํ„ฐ๊ฐ€ ์ œ๊ณตํ•˜๋Š” JpaRepository๋ฅผ extends ํ•˜์—ฌ(์ด ์˜ˆ์ œ์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Œ)SpringDataJpaMemberRepository๋งŒ ๋งŒ๋“ค์–ด ๋†“์œผ๋ฉด,) ์Šคํ”„๋ง ๋ฐ์ดํ„ฐ JPA๊ฐ€ ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•œ ๊ตฌํ˜„์ฒด๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜๊ณ  ์Šคํ”„๋ง ๋นˆ์— ๋“ฑ๋ก๊นŒ์ง€ ํ•ด์ค€๋‹ค!

๐Ÿ“Œ ํŒ : ํšŒ์› ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ์ฝ”๋“œ ์ž‘์„ฑ ์‹œ, ์ƒ์„ฑ์ž๊ฐ€ ๋”ฑ ํ•œ๊ฐœ๋งŒ ์กด์žฌํ•œ๋‹ค๋ฉด @Autowired๋ฅผ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ๋‹ค.



๐Ÿท AOP

  • AOP๋Š” ๋ฉ”์†Œ๋“œ์˜ ํ˜ธ์ถœ์‹œ๊ฐ„์„ ์ธก์ •ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
    ๊ธฐ์กด์˜ ๋ฐฉ์‹๋Œ€๋กœ๋„ ๋™์ž‘์€ ์ž˜ ์ด๋ฃจ์–ด์ง€๋‚˜, ์ด ์‹œ๊ฐ„ ์ธก์ • ๋กœ์ง๊ณผ ํ•ต์‹ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ์„ž์—ฌ์„œ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์–ด๋ ค์›Œ์ง€๊ณ  ๋ณ€๊ฒฝ๋„ ๊นŒ๋‹ค๋กœ์›Œ์ง„๋‹ค.

  • AOP(Aspect Oriented Programming)๋ž€ ๊ณตํ†ต ๊ด€์‹ฌ ์‚ฌํ•ญ๊ณผ ํ•ต์‹ฌ ๊ด€์‹ฌ ์‚ฌํ•ญ์„ ๋ถ„๋ฆฌํ•œ ๊ฒƒ์œผ๋กœ, ์œ„์˜ ๋ฌธ์ œ์ ์„ ํ•ด๊ฒฐํ•ด์ค€๋‹ค !!
    -> ์ด์ „๊นŒ์ง€๋Š” ์‹œ๊ฐ„ ์ธก์ • ๋กœ์ง์„ ๋งค์†Œ๋“œ๋งˆ๋‹ค ๋ถ™์—ฌ์„œ ๋ฒˆ๊ฑฐ๋กœ์› ๋Š”๋ฐ, ์ด์   ์‹œ๊ฐ„ ์ธก์ • ๋กœ์ง์„ ํ•œ ๊ณณ์— ๋ชจ์•„๋†“๊ณ  ๋‚ด๊ฐ€ ์“ฐ๊ณ ์‹ถ์€ ๊ณณ์—๋งŒ ๋ถ™์—ฌ ์“ฐ๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•œ๋‹ค. ์ด๊ฒƒ์ด ๋ฐ”๋กœ AOP !!

  • @Aspect : AOP๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ํ•„์š”ํ•œ ์–ด๋…ธํ…Œ์ด์…˜

  • @Around : ์ด ๋กœ์ง์„ ์–ด๋””์— ์ ์šฉํ•  ๊ฒƒ ์ธ์ง€ ํƒ€๊ฒŸํŒ… ํ•˜๋Š” ๊ฒƒ

  • AOP ์˜ ์žฅ์  ์ •๋ฆฌ
    : ํ•ต์‹ฌ ๊ด€์‹ฌ ์‚ฌํ•ญ์„ ๊น”๋”ํ•˜๊ฒŒ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.
    : ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•˜๋ฉด ์ด ๋กœ์ง๋งŒ ๋ณ€๊ฒฝํ•˜๋ฉด ๋œ๋‹ค.
    : ์›ํ•˜๋Š” ์ ์šฉ ๋Œ€์ƒ์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋‹ค.(@Around)



๋‚˜๋ฆ„ ์ด๋ ‡๊ฒŒ ์ •๋ฆฌ๋ฅผ ํ•ด๋ณด์•˜๋‹ค!
์Šคํ”„๋ง DB ์ ‘๊ทผ ๊ธฐ์ˆ  ๋ถ€๋ถ„์ด ์ œ์ผ ์–ด๋ ค์› ๋Š”๋ฐ, ์ด ๋ถ€๋ถ„์€ ๋‚˜์ค‘์— ํ•œ๋ฒˆ ๋” ๋ณต์Šตํ•ด๋ด์•ผ๊ฒ ๋‹ค!
์ด์ œ ๋กœ๋“œ๋งต1๋กœ ๊ฐ€๋ด…์‹œ๋‹ค ๐Ÿ˜‰

profile
Backend Developer

0๊ฐœ์˜ ๋Œ“๊ธ€