1122 - 1128


# 1122 - 1128

# 1122 - toString์„ ํ•ญ์ƒ ์žฌ์ •์˜ํ•˜๋ผ

# toString()

Object์˜ ๊ธฐ๋ณธ toString๋ฉ”์„œ๋“œ๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ž‘์„ฑํ•œ ํด๋ž˜์Šค์— ์ ํ•ฉํ•œ ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ๊ฑฐ์˜ ์—†๋‹ค. ์ด ๋ฉ”์„œ๋“œ๋Š” ํด๋ž˜์Šค_์ด๋ฆ„@16์ง„์ˆ˜๋กœ_ํ‘œํ˜„ํ•œ_ํ•ด์‹œ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

# toString()์„ ์žฌ์ •์˜ ํ•ด์•ผ ํ•˜๋Š” ์ด์œ 

equals์™€ hashCode ๊ทœ์•ฝ ๋งŒํผ ๋Œ€๋‹จํžˆ ์ค‘์š”ํ•˜์ง„ ์•Š์ง€๋งŒ, toString์„ ์ž˜ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค๋Š” ์‚ฌ์šฉํ•˜๊ธฐ์— ํ›จ์”ฌ ์ฆ๊ฒ๊ณ , ๊ทธ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•œ ์‹œ์Šคํ…œ์€ ๋””๋ฒ„๊น…ํ•˜๊ธฐ ์‰ฝ๋‹ค. toString ๋ฉ”์„œ๋“œ๋Š” ๊ฐ์ฒด๋ฅผ println, printf, ๋ฌธ์ž์—ด ์—ฐ๊ฒฐ ์—ฐ์‚ฐ์ž(+), assert ๊ตฌ๋ฌธ์— ๋„˜๊ธธ ๋•Œ, ํ˜น์€ ๋””๋ฒ„๊ฑฐ๊ฐ€ ๊ฐ์ฒด๋ฅผ ์ถœ๋ ฅํ•  ๋•Œ ์ž๋™์œผ๋กœ ๋ถˆ๋ฆฐ๋‹ค. ์—ฌ๋Ÿฌ๋ถ„์ด ์ง์ ‘ ํ˜ธ์ถœํ•˜์ง€ ์•Š๋”๋ผ๋„ ๋‹ค๋ฅธ ์–ด๋”˜๊ฐ€์—์„œ ์“ฐ์ธ๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์˜ค๋ฅ˜ ํŽ˜์ด์ง€๋ฅผ ๋กœ๋”ฉํ•  ๋•Œ ์ž๋™์œผ๋กœ ํ˜ธ์ถœ ๋  ์ˆ˜ ์žˆ๋‹ค. ์ด๋•Œ toString์„ ์ œ๋Œ€๋กœ ์žฌ์ •์˜ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ์“ธ๋ชจ์—†๋Š” ๋ฉ”์‹œ์ง€๋งŒ ๋กœ๊ทธ์— ๋‚จ๋Š”๋‹ค.

# toString ์žฌ์ •์˜์‹œ ์ฃผ์˜ ์‚ฌํ•ญ

  • ์‹ค์ „์—์„œ toString์€ ๊ทธ ๊ฐ์ฒด๊ฐ€ ๊ฐ€์ง„ ์ฃผ์š” ์ •๋ณด๋ฅผ ๋ชจ๋‘ ๋ฐ˜ํ™˜ํ•˜๋Š”๊ฒŒ ์ข‹๋‹ค.
    • ํ•˜์ง€๋งŒ ๊ฐ์ฒด๊ฐ€ ๊ฑฐ๋Œ€ํ•˜๊ฑฐ๋‚˜ ๊ฐ์ฒด์˜ ์ƒํƒœ์˜ ๋ฌธ์ž์—ด๋กœ ํ‘œํ˜„ํ•˜๊ธฐ ์–ด๋ ต๋‹ค๋ฉด, ์š”์•ฝ ์ •๋ณด๋ฅผ ๋‹ด์•„์•ผํ•œ๋‹ค.
  • toString์„ ๊ตฌํ˜„ํ•  ๋•Œ๋ฉด ๋ฐ˜ํ™˜๊ฐ’์˜ ํฌ๋งท์„ ๋ฌธ์„œํ™”ํ• ์ง€ ์ •ํ•ด์•ผ ํ•œ๋‹ค.
    • ํฌ๋งท์„ ๋ช…์‹œํ•˜๋ฉด ๊ทธ ๊ฐ์ฒด๋Š” ํ‘œ์ค€์ ์ด๊ณ , ๋ช…ํ™•ํ•˜๊ณ , ์‚ฌ๋žŒ์ด ์ฝ์„ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.
    • ๋‹ค๋งŒ, ํฌ๋งท์„ ํ•œ๋ฒˆ ๋ช…์‹œํ•˜๋ฉด ์–ฝ๋งค์ด๊ฒŒ ๋œ๋‹ค.
  • ํฌ๋งท์„ ๋ช…์‹œํ•˜๋“  ์•„๋‹ˆ๋“  ์˜๋„๋Š” ๋ช…ํ™•ํžˆ ๋ฐํ˜€์•ผ ํ•œ๋‹ค.
/** * ์ด ์•ฝ๋ฌผ์— ๊ด€ํ•œ ๋Œ€๋žต์ ์ธ ์„ค๋ช…์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. * ๋‹ค์Œ์€ ์ด ์„ค๋ช…์˜ ์ผ๋ฐ˜์ ์ธ ํ˜•ํƒœ์ด๋‚˜, * ์ƒ์„ธ ํ˜•์‹์€ ์ •ํ•ด์ง€์ง€ ์•Š์•˜์œผ๋ฉฐ ํ–ฅํ›„ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ๋‹ค. * * "[์•ฝ๋ฌผ #9: ์œ ํ˜•=์‚ฌ๋ž‘, ๋ƒ„์ƒˆ=ํ…Œ๋ ˆ๋นˆ์œ , ๊ฒ‰๋ชจ์Šต=๋จน๋ฌผ]" */ @Override public String toString() { ... }
  • ์ •์  ์œ ํ‹ธ๋ฆฌํ‹ฐ ํด๋ž˜์Šค๋Š” toString์„ ์ œ๊ณตํ•  ์ด์œ ๊ฐ€ ์—†๊ณ , ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฐ๊ฑฐ ํƒ€์ž…๋„ ์ž๋ฐ”๊ฐ€ ์ด๋ฏธ ์™„๋ฒฝํ•œ toString์„ ์ œ๊ณตํ•˜๋‹ˆ ๋”ฐ๋กœ ์žฌ์ •์˜ํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.
    • ํ•˜์ง€๋งŒ, ํ•˜์œ„ ํด๋ž˜์Šค๋“ค์ด ๊ณต์œ ํ•ด์•ผ ํ•  ๋ฌธ์ž์—ด ํ‘œํ˜„์ด ์žˆ๋Š” ์ถ”์ƒ ํด๋ž˜์Šค๋ผ๋ฉด toString์„ ์žฌ์ •์˜ ํ•ด์ค˜์•ผ ํ•˜๋ฉฐ, ๋Œ€๋‹ค์ˆ˜ ์ปฌ๋ ‰์…˜ ๊ตฌํ˜„์ฒด๋Š” ์ถ”์ƒ ์ปฌ๋ ‰์…˜ ํด๋ž˜์Šค๋“ค์˜ toStirng๋ฉ”์„œ๋“œ๋ฅผ ์ƒ์†ํ•ด์„œ ์‚ฌ์šฉํ•œ๋‹ค.

# 1123 - CrudRepository vs JpaRepository

image ์œ„ ์ƒ์†๊ด€๊ณ„๋ฅผ ์‚ดํŽด๋ณด๋ฉด, ์ตœ์ƒ์œ„ ๋ถ€๋ชจ์ธ Repository๋ฅผ CrudRepository๊ฐ€ ์ƒ์†๋ฐ›์•„ ํ™•์žฅ์‹œํ‚ค๊ณ , ์ด๋ฅผ PagingAndSortingRepository๊ฐ€, ๊ทธ๋ฆฌ๊ณ  ์ด๋ฅผ ๋˜ JpaRepository๊ฐ€ ์ƒ์†๋ฐ›์•„ ํ™•์žฅ์‹œํ‚จ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๊ฐ๊ฐ ์†Œ์Šค์ฝ”๋“œ๋ฅผ IDE๋ฅผ ํ†ตํ•ด ์ƒ์„ธํžˆ ์‚ดํŽด๋ณผ ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ตฌ์กฐ์ƒ์œผ๋กœ JpaRepository์˜ ๊ตฌํ˜„์ฒด๋“ค์ด ๋‹น์—ฐํžˆ ๋” ๋งŽ๋‹ค. ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•˜๋Š” ๋„๋ฉ”์ธ์ด ์–ด๋Š ์ •๋„์˜ ์ˆ˜์ค€๊นŒ์ง€ ํ•„์š”ํ•œ๊ฐ€์— ๋”ฐ๋ผ ์‚ฌ์šฉ.

  • CrudRepository : CRUD ๊ด€๋ จ ๊ธฐ๋Šฅ์„ ์ œ๊ณต. (๊ฐ„๋‹จํ•œ CRUD๋งŒ ํ•„์š”ํ•œ ๊ฒฝ์šฐ)
  • PagingAndSortingRepository : ํŽ˜์ด์ง•๊ณผ ์†”ํŒ…์„ ์ถ”๊ฐ€๋กœ ์ œ๊ณต.
  • JpaRepository : ์œ„ ๊ธฐ๋Šฅ์€ ๋ฌผ๋ก  JPA ๊ด€๋ จ ํŠนํ™”๋œ ๊ธฐ๋Šฅ(์ง€์†์„ฑ ์ปจํ…์ŠคํŠธ ํ”Œ๋Ÿฌ์‹œ ๋ฐ ๋ฐฐ์น˜์—์„œ ๋ ˆ์ฝ”๋“œ ์‚ญ์ œ)๋“ค์„ ์ œ๊ณต.

# 1124 - Maven ๋‹ค์ค‘๋ชจ๋“ˆ, ์˜์กด์„ฑ

# Mavenํ™˜๊ฒฝ ๋‹ค์ค‘ ๋ชจ๋“ˆ ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ

  1. parent ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ
    • Maven Project๋กœ ์ƒ์„ฑ
    • packaging : pom
  2. 'Parent'์˜ pom์„ ์ƒ์†๋ฐ›๋Š” ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ
    • Maven Module๋กœ ์ƒ์„ฑ
    • Parent ๋ฅผ 1์—์„œ ์ •์˜ํ•œ ํ”„๋กœ์ ํŠธ๋กœ ์„ค์ •

=> ํ•˜์œ„ ํ”„๋กœ์ ํŠธ๋Š” parent์—์„œ ์ •์˜ํ•œ pom.xml(dependency, repository ๋“ฑ๋“ฑ..) ์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

# ๋‹ค์ค‘ ๋ชจ๋“ˆ๊ฐ„ ํด๋ž˜์Šค ์‚ฌ์šฉ

  • ๋ณ„๋‹ค๋ฅธ ์„ค์ • ํ•„์š” ์—†์ด, ๋‘˜๋‹ค Maven ํ”„๋กœ์ ํŠธ์ด๋ฉฐ ๊ฐ™์€ Workspace์•ˆ์— ์žˆ์„ ๊ฒฝ์šฐ Dependency๋กœ ์ถ”๊ฐ€
<dependency> 
    <groupId>com.mypjt</groupId> 
    <artifactId>myProjectA</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
</dependency>

# 1125 - Spring Bean LifeCycle(์Šคํ”„๋ง ๋นˆ ์ƒ๋ช…์ฃผ๊ธฐ)

# ๋นˆ ์ƒ๋ช…์ฃผ๊ธฐ ์ฝœ๋ฐฑ

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ปค๋„ฅ์…˜ ํ’€์ด๋‚˜, ๋„คํŠธ์›Œํฌ ์†Œ์ผ“์ฒ˜๋Ÿผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹œ์ž‘ ์‹œ์ ์— ํ•„์š”ํ•œ ์—ฐ๊ฒฐ์„ ๋ฏธ๋ฆฌ ํ•ด๋‘๊ณ , ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ข…๋ฃŒ ์‹œ์ ์— ์—ฐ๊ฒฐ์„ ๋ชจ๋‘ ์ข…๋ฃŒํ•˜๋Š” ์ž‘์—…์„ ์ง„ํ–‰ํ•˜๋ ค๋ฉด, ๊ฐ์ฒด์˜ ์ดˆ๊ธฐํ™”์™€ ์ข…๋ฃŒ ์ž‘์—…์ด ํ•„์š”ํ•˜๋‹ค.

์Šคํ”„๋ง ๋นˆ๋„ ์œ„์™€ ๊ฐ™์€ ์›๋ฆฌ๋กœ ์ดˆ๊ธฐํ™” ์ž‘์—…๊ณผ ์ข…๋ฃŒ ์ž‘์—…์ด ๋‚˜๋ˆ ์„œ ์ง„ํ–‰๋œ๋‹ค.
๊ฐ„๋‹จํ•˜๊ฒŒ ๋งํ•˜๋ฉด ๊ฐ์ฒด ์ƒ์„ฑ -> ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…์ด๋ผ๋Š” ๋ผ์ดํ”„์‚ฌ์ดํด์„ ๊ฐ€์ง„๋‹ค.

์ฆ‰, ์Šคํ”„๋ง ๋นˆ์€ ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…์ด ๋‹ค ๋๋‚œ ๋‹ค์Œ์—์•ผ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ค€๋น„๊ฐ€ ์™„๋ฃŒ๋œ๋‹ค.

# Spring ์˜์กด๊ด€๊ณ„ ์ฃผ์ž… ๊ณผ์ •

  • ๊ฐ€์žฅ ์ฒ˜์Œ์—๋Š” Spring IoC ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋จผ์ € ๋งŒ๋“ค์–ด์ง€๋Š” ๊ณผ์ •์ด ์ผ์–ด๋‚œ๋‹ค.
    • Component-Scan์œผ๋กœ Bean์„ ๋“ฑ๋กํ•œ๋‹ค.
    • @Configuration, @Controller, @Service ๋“ฑ๋“ฑ Bean์œผ๋กœ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ๋Š” ์–ด๋…ธํ…Œ์ด์…˜๋“ค๊ณผ ์„ค์ •ํŒŒ์ผ๋“ค์„ ์ฝ์–ด IoC ์ปจํ…Œ์ด๋„ˆ ์•ˆ์— Bean์œผ๋กœ ๋“ฑ๋กํ•œ๋‹ค.
  • ์˜์กด ๊ด€๊ณ„๋ฅผ ์ฃผ์ž…ํ•˜๊ธฐ ์ „์˜ ์ค€๋น„ ๋‹จ๊ณ„๊นŒ ์กด์žฌํ•˜๋Š”๋ฐ, ์ด ๋‹จ๊ณ„์—์„œ ๊ฐ์ฒด์˜ ์ƒ์„ฑ์ด ์ผ์–ด๋‚œ๋‹ค.
    • ์ƒ์„ฑ์ž ์ฃผ์ž…: ๊ฐ์ฒด์˜ ์ƒ์„ฑ๊ณผ ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…์ด ๋™์‹œ์— ์ผ์–ด๋‚œ๋‹ค.
    • setter, Field ์ฃผ์ž…: ๊ฐ์ฒด์˜ ์ƒ์„ฑ -> ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…์œผ๋กœ ๋ผ์ดํ”„ ์‚ฌ์ดํด์ด ๋‚˜๋ˆ„์–ด์ง„๋‹ค.

# ์Šคํ”„๋ง ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…์ด ์™„๋ฃŒ๋œ ์‹œ์ ์„ ์–ด๋–ป๊ฒŒ ์•Œ ์ˆ˜ ์žˆ์„๊นŒ?

Bean์œผ๋กœ ๋“ฑ๋ก๋œ ๊ฐ์ฒด๋“ค์€ ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…์ด ์™„๋ฃŒ๋œ ํ›„์— ์ดˆ๊ธฐํ™” ์ž‘์—…์„ ์ง„ํ–‰ํ•ด์•ผ ํ•œ๋‹ค.

  • ์Šคํ”„๋ง์˜ Bean LifeCycle
์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ -> ์Šคํ”„๋ง ๋นˆ ์ƒ์„ฑ -> ์˜์กด๊ด€๊ณ„ ์ฃผ์ž… -> ์ดˆ๊ธฐํ™” ์ฝœ๋ฐฑ -> ์‚ฌ์šฉ -> ์†Œ๋ฉธ ์ „ ์ฝœ๋ฐฑ -> ์Šคํ”„๋ง ์ข…๋ฃŒ

์Šคํ”„๋ง์€ ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…์ด ์™„๋ฃŒ๋˜๋ฉด ์Šคํ”„๋ง ๋นˆ์—๊ฒŒ ์ฝœ๋ฐฑ ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด์„œ ์ดˆ๊ธฐํ™” ์‹œ์ ์„ ์•Œ๋ ค์ฃผ๋Š” ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค. ๋˜ํ•œ ์Šคํ”„๋ง์€ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ข…๋ฃŒ๋˜๊ธฐ ์ง์ „์— ์†Œ๋ฉธ ์ฝœ๋ฐฑ์„ ์ œ๊ณตํ•œ๋‹ค.

  • ์ดˆ๊ธฐํ™” ์ฝœ๋ฐฑ : ๋นˆ์ด ์ƒ์„ฑ๋˜๊ณ , ๋นˆ์˜ ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…์ด ์™„๋ฃŒ๋œ ํ›„ ํ˜ธ์ถœ
  • ์†Œ๋ฉธ์ „ ์ฝœ๋ฐฑ : ๋นˆ์ด ์†Œ๋ฉธ๋˜๊ธฐ ์ง์ „์— ํ˜ธ์ถœ

๊ฐ์ฒด์˜ ์ƒ์„ฑ๊ณผ ์ดˆ๊ธฐํ™”๋ฅผ ๋ถ„๋ฆฌํ•˜์ž
์ƒ์„ฑ์ž๋Š” ํ•„์ˆ˜ ์ •๋ณด๋ฅผ ๋ฐ›๊ณ , ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•ด์„œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ฑ…์ž„์„ ๊ฐ€์ง„๋‹ค. ๋ฐ˜๋ฉด์— ์ดˆ๊ธฐํ™”๋Š” ์ด๋ ‡๊ฒŒ ์ƒ์„ฑ๋œ ๊ฐ’๋“ค์„ ํ™œ์šฉํ•ด์„œ ์™ธ๋ถ€ ์ปค๋„ฅ์…˜์„ ์—ฐ๊ฒฐํ•˜๋Š” ๋“ฑ ๋ฌด๊ฑฐ์šด ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.
๋”ฐ๋ผ์„œ ์ƒ์„ฑ์ž ์•ˆ์—์„œ ๋ฌด๊ฑฐ์šด ์ดˆ๊ธฐํ™” ์ž‘์—…์„ ํ•จ๊ป˜ ํ•˜๋Š” ๊ฒƒ ๋ณด๋‹ค๋Š” ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ถ€๋ถ„๊ณผ ์ดˆ๊ธฐํ™” ํ•˜๋Š” ๋ถ€๋ถ„์„ ๋ช…ํ™•ํ•˜๊ฒŒ ๋‚˜๋ˆ„๋Š” ๊ฒƒ์ด ์œ ์ง€๋ณด์ˆ˜ ๊ด€์ ์—์„œ ์ข‹๋‹ค.

# ๋นˆ ์ƒ๋ช…์ฃผ๊ธฐ ์ฝœ๋ฐฑ ์ง€์› ๋ฐฉ๋ฒ•

  • ์ธํ„ฐํŽ˜์ด์Šค(InitializaingBean, DisposableBean)
  • ์„ค์ • ์ •๋ณด์— ์ดˆ๊ธฐํ™” ๋ฉ”์†Œ๋“œ, ์ข…๋ฃŒ ๋ฉ”์†Œ๋“œ ์ง€์ •
  • @PostConstruct, @PreDestroy ์–ด๋…ธํ…Œ์ด์…˜ ์ง€์›

# 1. ์ธํ„ฐํŽ˜์ด์Šค(InitializaingBean, DisposableBean)

  • ์ƒ์†์„ ํ†ตํ•œ ์ƒ๋ช…์ฃผ๊ธฐ ์ฝœ๋ฐฑ ์ง€์›
  • InitializaingBean -> afterPropertiesSet ๋ฉ”์†Œ๋“œ๋กœ ์ดˆ๊ธฐํ™” ์ง€์›
  • DisposableBean -> destroy ๋ฉ”์†Œ๋“œ๋กœ ์†Œ๋ฉธ์„ ์ง€์›
  • ์ดˆ๊ธฐํ™”, ์†Œ๋ฉธ๋ฉ”์„œ๋“œ์˜ ์ด๋ฆ„์„ ๋ณ€๊ฒฝ ํ•  ์ˆ˜ ์—†๋‹ค.
  • ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์ ์šฉ ํ•  ์ˆ˜ ์—†๋‹ค.
  • ํ˜„์žฌ ๊ฑฐ์˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

# 2. @PostConstruct, @PreDestory ์–ด๋…ธํ…Œ์ด์…˜

  • ์ตœ์‹  ์Šคํ”„๋ง์—์„œ ๊ฐ€์žฅ ๊ถŒ์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•.
  • ์ปดํฌ๋„ŒํŠธ ์Šค์บ”๊ณผ ์ž˜์–ด์šธ๋ฆผ.
  • javax.annotation.PostConstruct ํŒจํ‚ค์ง€๋กœ, ์Šคํ”„๋ง ์ข…์† X, ์ž๋ฐ” ํ‘œ์ค€

# 3. ๋นˆ ๋“ฑ๋ก ์ดˆ๊ธฐํ™”, ์†Œ๋ฉธ ๋ฉ”์†Œ๋“œ ์ง€์ •

  • ์„ค์ • ์ •๋ณด์— @Bean(initMethod="init", destroyMethod="close")์ฒ˜๋Ÿผ ์ดˆ๊ธฐํ™”, ์†Œ๋ฉธ ๋ฉ”์†Œ๋“œ๋ฅผ ์ง€์ •

# 1127 - Filter, Interceptor, AOP ์ฐจ์ด

  • ๊ณตํ†ต ํ”„๋กœ์„ธ์Šค์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ
    • ๋กœ๊ทธ์ธ ๊ด€๋ จ(์„ธ์…˜์ฒดํฌ)์ฒ˜๋ฆฌ, ๊ถŒํ•œ์ฒดํฌ, XSS๋ฐฉ์–ด, pc์™€ ๋ชจ๋ฐ”์ผ์›น์˜ ๋ถ„๊ธฐ์ฒ˜๋ฆฌ, ๋กœ๊ทธ, ํŽ˜์ด์ง€ ์ธ์ฝ”๋”ฉ ๋ณ€ํ™˜ ๋“ฑ
  • ์Šคํ”„๋ง์—์„œ ์‚ฌ์šฉ๋˜๋Š” Filter, Interceptor, AOP ์„ธ ๊ฐ€์ง€ ๊ธฐ๋Šฅ์€ ๋ชจ๋‘ ๋ฌด์Šจ ํ–‰๋™์„ ํ•˜๊ธฐ์ „์— ๋จผ์ € ์‹คํ–‰ํ•˜๊ฑฐ๋‚˜, ์‹คํ–‰ํ•œ ํ›„์— ์ถ”๊ฐ€์ ์ธ ํ–‰๋™์„ ํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ๋ŠฅHandler๋“ค์ด๋‹ค.
  • ์ˆœ์„œ
Filter -> Interceptor -> AOP -> Interceptor -> Filter

1. ์„œ๋ฒ„๋ฅผ ์‹คํ–‰์‹œ์ผœ ์„œ๋ธ”๋ฆฟ์ด ์˜ฌ๋ผ์˜ค๋Š” ๋™์•ˆ์— init์ด ์‹คํ–‰๋˜๊ณ , ๊ทธ ํ›„ doFilter๊ฐ€ ์‹คํ–‰๋œ๋‹ค.
2. ์ปจํŠธ๋กค๋Ÿฌ์— ๋“ค์–ด๊ฐ€๊ธฐ ์ „ preHandler๊ฐ€ ์‹คํ–‰๋œ๋‹ค.
3. ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ๋‚˜์™€ postHandler, after Completion, doFilter ์ˆœ์œผ๋กœ ์ง„ํ–‰์ด ๋œ๋‹ค.
4. ์„œ๋ธ”๋ฆฟ ์ข…๋ฃŒ ์‹œ destroy๊ฐ€ ์‹คํ–‰๋œ๋‹ค.
  • Filter์™€ Interceptor๋Š” Servlet ๋‹จ์œ„์—์„œ ์ด๋ฃจ์–ด์ง„๋‹ค. ๋ฐ˜๋ฉด AOP๋Š” ๋ฉ”์†Œ๋“œ ์•ž์— ProxyํŒจํ„ด์˜ ํ˜•ํƒœ๋กœ ์‹คํ–‰๋œ๋‹ค.
  • ์‹คํ–‰์ˆœ์„œ๋ฅผ ๋ณด๋ฉด Filter๊ฐ€ ๊ฐ€์žฅ ๋ฐ–์— ์žˆ๊ณ  ๊ทธ์•ˆ์— Interceptor, ๊ทธ์•ˆ์— AOP๊ฐ€ ์žˆ๋Š” ํ˜•ํƒœ์ด๋‹ค.

# 1. Filter(ํ•„ํ„ฐ)

๋ง ๊ทธ๋Œ€๋กœ ์š”์ฒญ๊ณผ ์‘๋‹ต์„ ๊ฑฐ๋ฅธ๋’ค ์ •์ œํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.
์„œ๋ธ”๋ฆฟ ํ•„ํ„ฐ๋Š” DispatcherServlet ์ด์ „์— ์‹คํ–‰์ด ๋˜๋Š”๋ฐ ํ•„ํ„ฐ๊ฐ€ ๋™์ž‘ํ•˜๋„๋ก ์ง€์ •๋œ ์ž์›์˜ ์•ž๋‹จ์—์„œ ์š”์ฒญ๋‚ด์šฉ์„ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜, ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ฒดํฌ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.
๋˜ํ•œ ์ž์›์˜ ์ฒ˜๋ฆฌ๊ฐ€ ๋๋‚œ ํ›„ ์‘๋‹ต๋‚ด์šฉ์— ๋Œ€ํ•ด์„œ๋„ ๋ณ€๊ฒฝํ•˜๋Š” ์ฒ˜๋ฆฌ๋ฅผ ํ•  ์ˆ˜๊ฐ€ ์žˆ๋‹ค.

# ์‹คํ–‰ ๋ฉ”์„œ๋“œ

  • init() - ํ•„ํ„ฐ ์ธ์Šคํ„ด์Šค ์ดˆ๊ธฐํ™”
  • doFilter() - ์ „/ํ›„ ์ฒ˜๋ฆฌ
  • destroy() - ํ•„ํ„ฐ ์ธ์Šคํ„ด์Šค ์ข…๋ฃŒ

# 2. Interceptor(์ธํ„ฐ์…‰ํ„ฐ)

์š”์ฒญ์— ๋Œ€ํ•œ ์ž‘์—… ์ „/ํ›„๋กœ ๊ฐ€๋กœ์ฑˆ๋‹ค.
ํ•„ํ„ฐ๋Š” ์Šคํ”„๋ง ์ปจํ…์ŠคํŠธ ์™ธ๋ถ€์— ์กด์žฌํ•˜์—ฌ ์Šคํ”„๋ง๊ณผ ๋ฌด๊ด€ํ•œ ์ž์›์— ๋Œ€ํ•ด ๋™์ž‘ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ์ธํ„ฐ์…‰ํ„ฐ๋Š” ์Šคํ”„๋ง์˜ DispatcherServlet์ด ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์ „, ํ›„๋กœ ๋ผ์–ด๋“ค๊ธฐ ๋•Œ๋ฌธ์— ์Šคํ”„๋ง ์ปจํ…์ŠคํŠธ(Context, ์˜์—ญ) ๋‚ด๋ถ€์—์„œ Controller(Handler)์— ๊ด€ํ•œ ์š”์ฒญ๊ณผ ์‘๋‹ต์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋ฅผํ•œ๋‹ค.
์Šคํ”„๋ง์˜ ๋ชจ๋“  ๋นˆ ๊ฐ์ฒด์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.
์ธํ„ฐ์…‰ํ„ฐ๋Š” ์—ฌ๋Ÿฌ ๊ฐœ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ  ๋กœ๊ทธ์ธ ์ฒดํฌ, ๊ถŒํ•œ์ฒดํฌ, ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰์‹œ๊ฐ„ ๊ณ„์‚ฐ์ž‘์—… ๋กœ๊ทธํ™•์ธ ๋“ฑ์˜ ์—…๋ฌด์ฒ˜๋ฆฌ

# ์‹คํ–‰ ๋ฉ”์„œ๋“œ

  • preHandler() - ์ปจํŠธ๋กค๋Ÿฌ ๋ฉ”์„œ๋“œ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „
  • postHandler() - ์ปจํŠธ๋กค๋Ÿฌ ๋ฉ”์„œ๋“œ ์‹คํ–‰์ง ํ›„ viewํŽ˜์ด์ง€ ๋ Œ๋”๋ง ๋˜๊ธฐ ์ „
  • afterCompletion() - viewํŽ˜์ด์ง€๊ฐ€ ๋ Œ๋”๋ง ๋˜๊ณ  ๋‚œ ํ›„

# 3. AOP

OOP๋ฅผ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด ๋‚˜์˜จ ๊ฐœ๋…
๊ฐ์ฒด์ง€ํ–ฅ์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ–ˆ์„ ๋•Œ ์ค‘๋ณต์„ ์ค„์ผ ์ˆ˜ ์—†๋Š” ๋ถ€๋ถ„์„ ์ค„์ด๊ธฐ ์œ„ํ•ด ์ข…๋‹จ๋ฉด(๊ด€์ )์—์„œ ๋ฐ”๋ผ๋ณด๊ณ  ์ฒ˜๋ฆฌํ•œ๋‹ค.
์ฃผ๋กœ ๋กœ๊น…, ํŠธ๋žœ์žญ์…˜, ์—๋Ÿฌ์ฒ˜๋ฆฌ ๋“ฑ ๋น„์ง€๋‹ˆ์Šค๋‹จ์˜ ๋ฉ”์„œ๋“œ์—์„œ ์กฐ๊ธˆ ๋” ์„ธ๋ฐ€ํ•˜๊ฒŒ ์กฐ์ •ํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

Interceptor๋‚˜ Filter์™€ ๋‹ฌ๋ฆฌ ๋ฉ”์†Œ๋“œ ์ „ํ›„์˜ ์ง€์ ์— ์ž์œ ๋กญ๊ฒŒ ์„ค์ •์ด ๊ฐ€๋Šฅํ•˜๋‹ค. Interceptor์™€ Filter๋Š” ์ฃผ์†Œ๋กœ ๋Œ€์ƒ์„ ๊ตฌ๋ถ„ํ•ด์„œ ๊ฑธ๋Ÿฌ๋‚ด์•ผํ•˜๋Š” ๋ฐ˜๋ฉด, AOP๋Š” ์ฃผ์†Œ, ํŒŒ๋ผ๋ฏธํ„ฐ, ์–ด๋…ธํ…Œ์ด์…˜ ๋“ฑ ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ๋Œ€์ƒ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

AOP์˜ Advice์™€ HandlerInterceptor์˜ ๊ฐ€์žฅ ํฐ ์ฐจ์ด๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ์ฐจ์ด๋‹ค. Advice์˜ ๊ฒฝ์šฐ JoinPoint๋‚˜ ProceedingJoinPoint ๋“ฑ์„ ํ™œ์šฉํ•ด์„œ ํ˜ธ์ถœํ•œ๋‹ค. ๋ฐ˜๋ฉด HandlerInterceptor๋Š” Filter์™€ ์œ ์‚ฌํ•˜๊ฐ€ HttpServletRequest, HttpServletResponse๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

# AOP์˜ ํฌ์ธํŠธ์ปท

  • @Before: ๋Œ€์ƒ ๋ฉ”์„œ๋“œ์˜ ์ˆ˜ํ–‰ ์ „
  • @After: ๋Œ€์ƒ ๋ฉ”์„œ๋“œ์˜ ์ˆ˜ํ–‰ ํ›„
  • @Atter-returning: ๋Œ€์ƒ ๋ฉ”์„œ๋“œ์˜ ์ •์ƒ์ ์ธ ์ˆ˜ํ–‰ ํ›„
  • @After-throwing: ์˜ˆ์™ธ๋ฐœ์ƒ ํ›„
  • @Around: ๋Œ€์ƒ ๋ฉ”์„œ๋“œ์˜ ์ˆ˜ํ–‰ ์ „/ํ›„
Last update: September 13, 2022 21:44
Contributors: ahnjs