๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป Dev

[Spring] Spring ๊ด€๋ จ ๊ณต๋ถ€ํ•œ ๊ธฐ์ˆ  ๊ฐœ๋… ์š”์•ฝ ์ •๋ฆฌ

jcowwk 2025. 3. 10. 23:07

Spring ๊ด€๋ จ ๊ณต๋ถ€ํ•œ ๊ธฐ์ˆ  ๊ฐœ๋… ์š”์•ฝ ์ •๋ฆฌ


 

  • Spring์—์„œ ๊ณ„์ธตํ˜• ์•„ํ‚คํ…์ฒ˜(Layered Architecture)์˜ ๊ฐ ๋ ˆ์ด์–ด(Controller, Service, Repository)์˜ ์—ญํ• ์„ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • Controller: ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ๋ฐ›์•„์„œ ์ ์ ˆํ•œ ์„œ๋น„์Šค๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์—ญํ• .
    • Service: ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ ˆ์ด์–ด. Controller์—์„œ ์š”์ฒญ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜์—ฌ Repository์™€ ์ƒํ˜ธ์ž‘์šฉ.
    • Repository: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ CRUDํ•˜๋Š” ์—ญํ• .

 

  • JPA์—์„œ 1:1, 1:N, N:M ๋“ฑ์˜ ์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์„ค์ •ํ•˜๊ณ  ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
    • 1:1: ๋‘ ์—”ํ‹ฐํ‹ฐ ๊ฐ„ 1:1 ๊ด€๊ณ„ (์˜ˆ: Person๊ณผ Passport).
    • 1:N: ํ•˜๋‚˜์˜ ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋‹ค๋ฅธ ์—”ํ‹ฐํ‹ฐ์™€ ๊ด€๊ณ„๋ฅผ ๋งบ๋Š” ๊ฒƒ (์˜ˆ: Department์™€ ์—ฌ๋Ÿฌ Employee).
    • N:M: ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์„œ๋กœ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ด€๊ณ„๋ฅผ ๋งบ๋Š” ๊ฒƒ (์˜ˆ: Student์™€ Course).

 

  • ์ปค์Šคํ…€ exception ์„ ๊ตฌํ˜„ํ•˜๊ณ  ์ด๋ฅผ ํ•ธ๋“ค๋ง ํ•˜์—ฌ ์‘๋‹ตํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ํŠน์ • ์˜ˆ์™ธ๋ฅผ ์ปค์Šคํ…€ ์˜ˆ์™ธ ํด๋ž˜์Šค๋กœ ๋งŒ๋“ค๊ณ , ์ด๋ฅผ ํ•ธ๋“ค๋งํ•˜์—ฌ ์ ์ ˆํ•œ ์‘๋‹ต์„ ์ œ๊ณต.

 

  • ์ˆœํ™˜ ์ฐธ์กฐ์— ๋Œ€ํ•œ ๊ฐœ๋…์— ๋Œ€ํ•ด ์•Œ๊ณ  ์žˆ์œผ๋ฉฐ ์ด๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ๋‘ ๊ฐ์ฒด๊ฐ€ ์„œ๋กœ๋ฅผ ์ฐธ์กฐํ•˜๋Š” ์ˆœํ™˜ ์ฐธ์กฐ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด @JsonManagedReference์™€ @JsonBackReference ๋“ฑ์„ ์‚ฌ์šฉํ•ด ํ•ด๊ฒฐ.

 

  • HTTP method์˜ ์ฐจ์ด, RESTFul ์„ค๊ณ„์›์น™์„ ์ดํ•ดํ•˜๊ณ  ์ ์ ˆํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ์„ ํƒํ•˜์—ฌ API๋ฅผ ์„ค๊ณ„ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • GET: ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒ.
    • POST: ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑ.
    • PUT: ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •.
    • DELETE: ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œ.

 

  • ํ˜‘์—…์„ ์œ„ํ•ด ์ผ๊ด€๋œ ์ฝ”๋“œ ์ปจ๋ฒค์…˜์˜ ํ•„์š”์„ฑ์„ ์ดํ•ดํ•˜๊ณ  ์ ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ Git์„ ํ™œ์šฉํ•œ ์ฝ”๋“œ ๋ฆฌ๋ทฐ ๋ฐ ๋ธŒ๋žœ์น˜ ์ „๋žต์— ์ฐธ์—ฌํ•œ ๊ฒฝํ—˜์ด ์žˆ๋‹ค.
    • ์ฝ”๋“œ์˜ ์ผ๊ด€์„ฑ์„ ์œ„ํ•ด ๊ทœ์น™์„ ์ •ํ•˜๊ณ , Git์„ ์ด์šฉํ•ด ํŒ€์› ๊ฐ„ ์ฝ”๋“œ ๋ฆฌ๋ทฐ๋ฅผ ํ†ตํ•ด ํ’ˆ์งˆ์„ ์œ ์ง€.

 

  • JPA์—์„œ ์ฆ‰์‹œ ๋กœ๋”ฉ(Eager)๊ณผ ์ง€์—ฐ ๋กœ๋”ฉ(Lazy)์˜ ์ฐจ์ด๋ฅผ ๊ฐ„๋‹จํžˆ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • Eager: ๊ด€๊ณ„๋œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ฆ‰์‹œ ๋กœ๋“œ.
    • Lazy: ๊ด€๊ณ„๋œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์‹ค์ œ๋กœ ํ•„์š”ํ•  ๋•Œ ๋กœ๋“œ.

 

  • JPA์˜ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ(Persistence Context)๋ฅผ ์ดํ•ดํ•˜๊ณ  ๋ณ€๊ฒฝ ๊ฐ์ง€(Dirty Checking)์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋Š” ์—”ํ‹ฐํ‹ฐ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋ฉฐ, ๋ณ€๊ฒฝ๋œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ž๋™์œผ๋กœ ๊ฐ์ง€ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ฐ˜์˜.

 

  • Spring Data JPA์—์„œ N+1 ๋ฌธ์ œ๋ฅผ ์ดํ•ดํ•˜๊ณ  ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ Fetch ์ „๋žต์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • N+1 ๋ฌธ์ œ๋Š” ๋ฐ์ดํ„ฐ ์กฐํšŒ ์‹œ ๋ถˆํ•„์š”ํ•œ ์ฟผ๋ฆฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๋กœ, @Query, fetch = FetchType.LAZY, @EntityGraph ๋“ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๊ฒฐ.

 

  • Spring Security์—์„œ ์ธ์ฆ(Authentication)๊ณผ ์ธ๊ฐ€(Authorization)์˜ ์ฐจ์ด๋ฅผ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ์ธ์ฆ(Authentication): ์‚ฌ์šฉ์ž์˜ ์‹ ์›์„ ํ™•์ธํ•˜๋Š” ๊ณผ์ •.
    • ์ธ๊ฐ€(Authorization): ์‚ฌ์šฉ์ž๊ฐ€ ์š”์ฒญํ•œ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์ ‘๊ทผ ๊ถŒํ•œ์„ ํ™•์ธํ•˜๋Š” ๊ณผ์ •.

 

  • ๊ฐ์ฒด๋ฅผ ์ถ”์ƒํ™” ํ•จ์œผ๋กœ์จ ํ™•์žฅ์„ฑ์ด ๋†’์•„์ง€๋Š” ์ด์œ ๋ฅผ ์•Œ๊ณ  ์žˆ๋‹ค.
    • ์ถ”์ƒํ™”๋ฅผ ํ†ตํ•ด ๊ตฌํ˜„์˜ ์„ธ๋ถ€์‚ฌํ•ญ์„ ์ˆจ๊ธฐ๊ณ , ์ฝ”๋“œ ๋ณ€๊ฒฝ ์‹œ ์ตœ์†Œํ•œ์˜ ์˜ํ–ฅ๋งŒ ๋ฏธ์น˜๊ฒŒ ๋˜์–ด ํ™•์žฅ์„ฑ๊ณผ ์œ ์—ฐ์„ฑ์ด ๋†’์•„์ง.

 

  • OCP(๊ฐœ๋ฐฉ-ํ์‡„์›์น™)์— ๋Œ€ํ•ด ์ดํ•ดํ•˜๊ณ  ์žˆ๋‹ค.
    • ์†Œ์Šค ์ฝ”๋“œ๋Š” ํ™•์žฅ์—๋Š” ์—ด๋ ค ์žˆ๊ณ , ์ˆ˜์ •์—๋Š” ๋‹ซํ˜€ ์žˆ์–ด์•ผ ํ•œ๋‹ค๋Š” ์›์น™์œผ๋กœ, ๊ธฐ๋Šฅ ์ถ”๊ฐ€ ์‹œ ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ  ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์•ผ ํ•œ๋‹ค.

 

  • DIP(์˜์กด์—ญ์ „์›์น™) ์— ๋Œ€ํ•ด ์ดํ•ดํ•˜๊ณ  ์žˆ๋‹ค.
    • ๊ณ ์ˆ˜์ค€ ๋ชจ๋“ˆ์ด ์ €์ˆ˜์ค€ ๋ชจ๋“ˆ์— ์˜์กดํ•˜์ง€ ์•Š๊ณ , ๋‘ ๋ชจ๋“ˆ ๋ชจ๋‘ ์ถ”์ƒํ™”๋œ ์ธํ„ฐํŽ˜์ด์Šค์— ์˜์กดํ•ด์•ผ ํ•œ๋‹ค๋Š” ์›์น™.

 

  • ๋™๊ธฐ์™€ ๋น„๋™๊ธฐ ์ž‘์—…์˜ ์ฐจ์ด๋ฅผ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ๋™๊ธฐ: ์ž‘์—…์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฐ ํ›„ ๋‹ค์Œ ์ž‘์—…์„ ์ง„ํ–‰.
    • ๋น„๋™๊ธฐ: ์ž‘์—…์ด ์™„๋ฃŒ๋˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ , ๋‹ค๋ฅธ ์ž‘์—…์„ ์ง„ํ–‰.

 

  • ์„œ๋น„์Šค ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ ์†๋„๊ฐ€ ๋‚˜์˜ค์ง€ ์•Š์„ ๊ฒฝ์šฐ ์ ์ ˆํ•œ ์ธ๋ฑ์Šค๋ฅผ ์„ค์ •ํ•˜์—ฌ ๊ฐœ์„ ํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค.
    • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ฟผ๋ฆฌ์˜ ์†๋„๊ฐ€ ๋А๋ฆด ๋•Œ, ์ ์ ˆํ•œ ์ปฌ๋Ÿผ์— ์ธ๋ฑ์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

 

  • ๋‹จ์œ„ ํ…Œ์ŠคํŠธ, ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ๋‹จ์œ„ ํ…Œ์ŠคํŠธ: ๊ฐœ๋ณ„์ ์ธ ๊ธฐ๋Šฅ์ด๋‚˜ ๋ฉ”์†Œ๋“œ์— ๋Œ€ํ•ด ํ…Œ์ŠคํŠธ.
    • ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ: ์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊ฒฐํ•ฉ๋œ ํ›„์˜ ๋™์ž‘์„ ํ…Œ์ŠคํŠธ.

 

  • spring-validation์„ ์ด์šฉํ•ด์„œ ์š”์ฒญ์— ๋Œ€ํ•œ ์œ ํšจ์„ฑ์„ ๊ฒ€์ฆํ•˜๊ณ  ๊ทธ ๊ณผ์ •์—์„œ ๋ฐœ์ƒํ•˜๋Š” MethodNotValidArgumentException์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
    • @Valid ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•ด ์š”์ฒญ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ฆํ•˜๊ณ , ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์˜ˆ์™ธ ์ฒ˜๋ฆฌ.

 

  • ์ฝ”๋“œ์™€ ์„ค์ • ๋ถ„๋ฆฌ์˜ ํ•„์š”์„ฑ์— ๋Œ€ํ•ด ์ดํ•ดํ•˜๊ณ , .env, git submodule, spring cloud config, aws secret manager ๋“ฑ์„ ์ด์šฉํ•ด์„œ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ์„ค์ • ํŒŒ์ผ๊ณผ ์ฝ”๋“œ๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ด€๋ฆฌํ•˜๋ฉด, ์ฝ”๋“œ ๋ณ€๊ฒฝ ์—†์ด ํ™˜๊ฒฝ ์„ค์ •์„ ์‰ฝ๊ฒŒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.

 

  • Proxy ์— ๋Œ€ํ•œ ๊ฐœ๋…์— ๋Œ€ํ•ด ์•Œ๊ณ  ์žˆ๋‹ค.
    • Proxy๋Š” ์‹ค์ œ ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ์ œ์–ดํ•˜๋Š” ์ค‘๊ฐœ์ž ์—ญํ• ์„ ํ•˜๋Š” ํŒจํ„ด์ด๋‹ค.

 

  • ๋™์‹œ์„ฑ ๋ฌธ์ œ ํ•ด๊ฒฐ์„ ์œ„ํ•ด ์ ์ ˆํ•œ lock ์„ ์„ ํƒํ•˜์—ฌ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ๋™์‹œ์„ฑ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด synchronized, ReentrantLock, ReadWriteLock ๋“ฑ์˜ Lock์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

  • Transaction ์ „ํŒŒ, ๊ฒฉ๋ฆฌ์ˆ˜์ค€์„ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ์ „ํŒŒ: ํŠธ๋žœ์žญ์…˜์ด ํ˜ธ์ถœ๋  ๋•Œ ๊ธฐ์กด ํŠธ๋žœ์žญ์…˜์„ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ• ์ง€ ๊ฒฐ์ •.
    • ๊ฒฉ๋ฆฌ์ˆ˜์ค€: ์—ฌ๋Ÿฌ ํŠธ๋žœ์žญ์…˜์ด ๋™์‹œ์— ์‹คํ–‰๋  ๋•Œ์˜ ๊ฒฉ๋ฆฌ ์ •๋„๋ฅผ ์„ค์ •.

 

  • logback์„ ์ด์šฉํ•˜์—ฌ Info์™€ warn ์ด์ƒ์˜ ๋กœ๊ทธ๋ฅผ ๋ถ„๋ฆฌํ•˜๊ณ  ์ ์ ˆํ•œ ๋กœ๊ทธ ์ˆ˜์ง‘ ์ „๋žต์„ ์ˆ˜๋ฆฝํ•  ์ˆ˜ ์žˆ๋‹ค.
    • logback์„ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ๊ทธ ๋ ˆ๋ฒจ๋ณ„๋กœ ๋‹ค๋ฅธ ๋กœ๊น… ์ „๋žต์„ ์„ค์ •ํ•˜๊ณ , ํ•„์š”์— ๋”ฐ๋ผ ๋กœ๊ทธ๋ฅผ ์ˆ˜์ง‘.

 

  • ์ ์ ˆํ•œ ์–ด๋…ธํ…Œ์ด์…˜์„ ์ƒ์„ฑํ•˜์—ฌ AOP ๊ตฌ์„ฑ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • AOP๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ • ๋ฉ”์†Œ๋“œ ์‹คํ–‰ ์ „/ํ›„์— ๊ณตํ†ต ๋กœ์ง์„ ์‹คํ–‰ํ•˜๋„๋ก ์–ด๋…ธํ…Œ์ด์…˜์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฌธ์ œ๊ฐ€ ์žˆ์œผ๋ฉด ๋Œ“๊ธ€ ๋‚จ๊ฒจ์ฃผ์„ธ์š” !

ํ”ผ๋“œ๋ฐฑ์€ ์–ธ์ œ๋‚˜ ํ™˜์˜์ž…๋‹ˆ๋‹ค <3