Framework
Spring
Bean Scope
Beanμ μ¬μ© λ²μλ₯Ό λ§νλ Bean Scopeμ μ’
λ₯μ λν΄ μμ보μ
Beanμ μ€νλ§μμ μ¬μ©νλ POJO κΈ°λ° κ°μ²΄λ€.
μν©κ³Ό νμμ λ°λΌ Beanμ μ¬μ©ν λ νλλ§ λ§λ€μ΄μΌ ν μλ μκ³ , μ¬λ¬κ°κ° νμν λλ μκ³ , μ΄λ€ ν μμ μμλ§ μ¬μ©ν΄μΌν λκ° μμ μ μλ€.
μ΄λ₯Ό μν΄ Scopeλ₯Ό μ€μ ν΄μ Beanμ μ¬μ© λ²μλ₯Ό κ°λ°μκ° μ€μ ν μ μλ€.
μ°μ λ°λ‘ μ€μ μ ν΄μ£Όμ§ μμΌλ©΄, Springμμ Beanμ Singleton
μΌλ‘ μμ±λλ€. μ±κΈν€ ν¨ν΄μ²λΌ νΉμ νμ
μ Beanμ λ± νλλ§ λ§λ€κ³ λͺ¨λ 곡μ ν΄μ μ¬μ©νκΈ° μν¨μ΄λ€. 보ν΅μ Beanμ μ΄λ κ² νλλ§ λ§λ€μ΄ μ¬μ©νλ κ²½μ°κ° λλΆλΆμ΄μ§λ§, μꡬμ¬νμ΄λ ꡬνμ λ°λΌ μλ μλ μμ κ²μ΄λ€.
λ°λΌμ Bean Scopeλ μ±κΈν€ λ§κ³ λ μ¬λ¬κ°μ§λ₯Ό μ§μν΄μ€λ€.
β¨ Scope μ’
λ₯
singleton
ν΄λΉ Beanμ λν΄ IoC 컨ν μ΄λμμ λ¨ νλμ κ°μ²΄λ‘λ§ μ‘΄μ¬νλ€.
prototype
ν΄λΉ Beanμ λν΄ λ€μμ κ°μ²΄κ° μ‘΄μ¬ν μ μλ€.
request
ν΄λΉ Beanμ λν΄ νλμ HTTP Requestμ λΌμ΄νμ¬μ΄ν΄μμ λ¨ νλμ κ°μ²΄λ‘λ§ μ‘΄μ¬νλ€.
session
ν΄λΉ Beanμ λν΄ νλμ HTTP Sessionμ λΌμ΄νμ¬μ΄ν΄μμ λ¨ νλμ κ°μ²΄λ‘λ§ μ‘΄μ¬νλ€.
global session
ν΄λΉ Beanμ λν΄ νλμ Global HTTP Sessionμ λΌμ΄νμ¬μ΄ν΄μμ λ¨ νλμ κ°μ²΄λ‘λ§ μ‘΄μ¬νλ€.
request, session, global sessionμ MVC μΉ μ΄ν리μΌμ΄μ μμλ§ μ¬μ©ν¨
Scopeλ€μ BeanμΌλ‘ λ±λ‘νλ ν΄λμ€μ μ΄λ Έν μ΄μ μΌλ‘ μ€μ ν΄μ€ μ μλ€.
MVC Framework
μ€νλ§ MVC νλ μμν¬κ° λμνλ μ리λ₯Ό μ΄ν΄νκ³ μμ΄μΌ νλ€
ν΄λΌμ΄μΈνΈκ° μλ²μκ² urlμ ν΅ν΄ μμ²ν λ μΌμ΄λλ μ€νλ§ νλ μμν¬μ λμμ κ·Έλ¦ΌμΌλ‘ ννν κ²μ΄λ€.
MVC μ§ν κ³Όμ
ν΄λΌμ΄μΈνΈκ° urlμ μμ²νλ©΄, μΉ λΈλΌμ°μ μμ μ€νλ§μΌλ‘ requestκ° λ³΄λ΄μ§λ€.
Dispatcher Servlet
μ΄ requestλ₯Ό λ°μΌλ©΄,Handler Mapping
μ ν΅ν΄ ν΄λΉ urlμ λ΄λΉνλ Controllerλ₯Ό νμ ν μ°ΎμλΈλ€.μ°ΎμλΈ
Controller
λ‘ requestλ₯Ό 보λ΄μ£Όκ³ , 보λ΄μ£ΌκΈ° μν΄ νμν Modelμ ꡬμ±νλ€.Model
μμλ νμ΄μ§ μ²λ¦¬μ νμν μ 보λ€μ Databaseμ μ κ·Όνμ¬ μΏΌλ¦¬λ¬Έμ ν΅ν΄ κ°μ Έμ¨λ€.λ°μ΄ν°λ₯Ό ν΅ν΄ μ»μ Model μ 보λ₯Ό Controllerμκ² response ν΄μ£Όλ©΄, Controllerλ μ΄λ₯Ό λ°μ Modelμ μμ±μμΌ Dispatcher Servletμκ² μ λ¬ν΄μ€λ€.
Dispatcher Servletμ
View Resolver
λ₯Ό ν΅ν΄ requestμ ν΄λΉνλ view νμΌμ νμ ν λ°μλΈλ€.λ°μλΈ View νμ΄μ§ νμΌμ Modelμ λ³΄λΈ ν ν΄λΌμ΄μΈνΈμκ² λ³΄λΌ νμ΄μ§λ₯Ό μμ±μμΌ λ°μλΈλ€.
μμ±λ View νμΌμ ν΄λΌμ΄μΈνΈμ responseνμ¬ νλ©΄μ μΆλ ₯νλ€.
κ΅¬μ± μμ
β¨ Dispatcher Servlet
λͺ¨λ requestλ₯Ό μ²λ¦¬νλ μ€μ¬ 컨νΈλ‘€λ¬λΌκ³ μκ°νλ©΄ λλ€. μλΈλ¦Ώ 컨ν μ΄λμμ http νλ‘ν μ½μ ν΅ν΄ λ€μ΄μ€λ λͺ¨λ requestμ λν΄ μ μΌ μλ¨μμ μ€μμ§μ€μμΌλ‘ μ²λ¦¬ν΄μ£Όλ ν΅μ¬μ μΈ μν μ νλ€.
κΈ°μ‘΄μλ web.xmlμ λͺ¨λ λ±λ‘ν΄μ€μΌ νμ§λ§, λμ€ν¨μ² μλΈλ¦Ώμ΄ λͺ¨λ requestλ₯Ό νΈλ€λ§νλ©΄μ μμ μ νΈλ¦¬νκ² ν μ μλ€.
β¨ Handler Mapping
ν΄λΌμ΄μΈνΈμ request urlμ μ΄λ€ 컨νΈλ‘€λ¬κ° μ²λ¦¬ν΄μΌ ν μ§ μ°Ύμμ Dispatcher Servletμκ² μ λ¬ν΄μ£Όλ μν μ λ΄λΉνλ€.
컨νΈλ‘€λ¬ μμμ urlμ 맀νμν€κΈ° μν΄ @RequestMappingμ μ¬μ©νλλ°, νΈλ€λ¬κ° μ΄λ₯Ό μ°Ύμμ£Όλ μν μ νλ€.
β¨ Controller
μ€μ§μ μΈ μμ²μ μ²λ¦¬νλ κ³³μ΄λ€. Dispatcher Servletμ΄ νλ‘ νΈ μ»¨νΈλ‘€λ¬λΌλ©΄, μ΄ κ³³μ λ°±μλ 컨νΈλ‘€λ¬λΌκ³ λ³Ό μ μλ€.
λͺ¨λΈμ μ²λ¦¬ κ²°κ³Όλ₯Ό λ΄μ Dispatcher Servletμκ² λ°νν΄μ€λ€.
β¨ View Resolver
컨νΈλ‘€λ¬μ μ²λ¦¬ κ²°κ³Όλ₯Ό λ§λ€ viewλ₯Ό κ²°μ ν΄μ£Όλ μν μ λ΄λΉνλ€. λ€μν μ’ λ₯κ° μκΈ° λλ¬Έμ μν©μ λ§κ² νμ©νλ©΄ λλ€.
SpringApplication
μ€νλ§ λΆνΈλ‘ νλ‘μ νΈλ₯Ό μ€νν λ Application ν΄λμ€λ₯Ό λ§λ λ€.
ν΄λμ€λͺ μ κ°λ°μκ° νλ‘μ νΈμ λ§κ² μ€μ ν μ μμ§λ§, ν° νμ μλμ κ°λ€.
@SpringBootApplication
μ΄λ
Έν
μ΄μ
μ ν΅ν΄ μ€νλ§ Beanμ μ½μ΄μ μλμΌλ‘ μμ±ν΄μ€λ€.
μ΄ μ΄λ Έν μ΄μ μ΄ μλ νμΌ μμΉλΆν° μ€μ λ€μ μ½μ΄κ°λ―λ‘, λ°λμ νλ‘μ νΈμ μ΅μλ¨μ λ§λ€μ΄μΌ νλ€.
SpringApplication.run()
μΌλ‘ ν΄λΉ ν΄λμ€λ₯Ό runνλ©΄, λ΄μ₯ WASλ₯Ό μ€ννλ€. λ΄μ₯ WASμ μ₯μ μΌλ‘λ κ°λ°μκ° λ°λ‘ ν°μΊ£κ³Ό κ°μ μΈλΆ WASλ₯Ό μ€μΉ ν μ€μ ν΄λμ§ μμλ μ ν리μΌμ΄μ
μ μ€νν μ μλ€.
λν, μΈμ₯ WASλ₯Ό μ¬μ©ν μ μ΄ νλ‘μ νΈλ₯Ό μ€νμν€κΈ° μν μλ²μμ λͺ¨λ μΈμ₯ WASμ μ’ λ₯μ λ²μ , μ€μ μ μΌμΉμμΌμΌλ§ νλ€. λ°λΌμ λ΄μ₯ WASλ₯Ό μ¬μ©νλ©΄ μ΄λ° μ κ²½μ μ°μ§ μμλ λκΈ° λλ¬Έμ λ§€μ° νΈλ¦¬νλ€.
μ€μ λ‘ λ§μ νμ¬λ€μ΄ μ΄λ° μ₯μ μ μ΄λ € λ΄μ₯ WASλ₯Ό μ¬μ©νκ³ μκ³ , μ ννκ³ μλ€.
Test Code
β¨ ν
μ€νΈ μ½λλ₯Ό μμ±ν΄μΌ νλ μ΄μ
κ°λ°λ¨κ³ μ΄κΈ°μ λ¬Έμ λ₯Ό λ°κ²¬ν μ μμ
λμ€μ μ½λλ₯Ό 리ν©ν λ§νκ±°λ λΌμ΄λΈλ¬λ¦¬ μ κ·Έλ μ΄λ μ κΈ°μ‘΄ κΈ°λ₯μ΄ μ μλνλ μ§ νμΈ κ°λ₯ν¨
κΈ°λ₯μ λν λΆνμ€μ± κ°μ
κ°λ° μ½λ μ΄μΈμ ν μ€νΈ μ½λλ₯Ό μμ±νλ μΌμ κ°λ° μκ°μ΄ λμ΄λ κ²μ΄λΌκ³ μκ°ν μ μλ€. νμ§λ§ λ΄ μ½λμ μ€λ₯κ° μλ μ§ κ²μ¦ν λ, ν μ€νΈ μ½λλ₯Ό μμ±νμ§ μκ³ μ§ννλ€λ©΄ λ μκ° μλͺ¨κ° ν΄ κ²μ΄λ€.
1. μ½λλ₯Ό μμ±ν λ€ νλ‘κ·Έλ¨μ μ€ννμ¬ μλ²λ₯Ό ν¨λ€. 2. API νλ‘κ·Έλ¨(ex. Postman)μΌλ‘ HTTP μμ² ν κ²°κ³Όλ₯Ό Printλ‘ μ°μ΄μ νμΈνλ€. 3. κ²°κ³Όκ° μμκ³Ό λ€λ₯΄λ©΄, λ€μ νλ‘κ·Έλ¨μ μ’
λ£ν λ€ μ½λλ₯Ό μμ νκ³ λ°λ³΅νλ€.
μμ κ°μ λ°©μμ΄ μΌλ§λ λ°λ³΅λ μ§ λͺ¨λ₯Έλ€. κ·Έλ¦¬κ³ νλμ κΈ°λ₯λ§λ€ μ λ κ² ν μ€νΈλ₯Ό νλ©΄ μλ²λ₯Ό ν€κ³ λλ μμ λν λ무 λΉν¨μ¨μ μ΄λ€.
μ΄ λ°μλ Printλ‘ λμΌλ‘ κ²μ¦νλ κ²λ μ΄λμ λ μ μμ νκ³κ° μλ€. ν μ€νΈ μ½λλ μλμΌλ‘ κ²μ¦μ ν΄μ£ΌκΈ° λλ¬Έμ μ±κ³΅νλ€λ©΄ μλμΌλ‘ κ²μ¦ν νμ μμ²΄κ° μμ΄μ§λ€.
μλ‘μ΄ κΈ°λ₯μ΄ μΆκ°λμμ λλ ν μ€νΈ μ½λλ₯Ό ν΅ν΄ λ§μ½ κΈ°μ‘΄μ μ½λμ μν₯μ΄ κ°λ€λ©΄ μ΄λ€ λΆλΆμ μμ ν΄μΌ νλ μ§ μ μ μλ μ₯μ λ μ‘΄μ¬νλ€.
λ°λΌμ ν μ€νΈ μ½λλ κ°λ°νλ λ° μμ΄μ νμμ μΈ λΆλΆμ΄λ©° λ°λμ νμ©ν΄μΌ νλ€.
β¨ ν
μ€νΈ μ½λ μμ
@RunWith(SpringRunner.class)
ν μ€νΈλ₯Ό μ§νν λ JUnitμ λ΄μ₯λ μ€νμ μΈμ λ€λ₯Έ μ€νμλ₯Ό μ€νμν¨λ€.
μ€νλ§ λΆνΈ ν μ€νΈμ JUnit μ¬μ΄μ μ°κ²°μ μν μ νλ€κ³ μκ°νλ©΄ λλ€.
@WebMvcTest
컨νΈλ‘€λ¬λ§ μ¬μ©ν λ μ μΈμ΄ κ°λ₯νλ©°, Spring MVCμ μ§μ€ν μ μλ μ΄λ Έν μ΄μ μ΄λ€.
@Autowired
μ€νλ§μ΄ κ΄λ¦¬νλ Beanμ μ£Όμ μμΌμ€λ€.
MockMvc
μΉ APIλ₯Ό ν μ€νΈν λ μ¬μ©νλ©°, μ΄λ₯Ό ν΅ν΄ HTTP GET, POST, DELETE λ±μ λν API ν μ€νΈκ° κ°λ₯νλ€.
mvc.perform(get("/home"))
/home
μ£Όμλ‘ HTTP GET μμ²μ ν μν©μ΄λ€.
.andExpect(status().isOk())
κ²°κ³Όλ₯Ό κ²μ¦νλ andExpect
λ‘, μ¬λ¬κ°λ₯Ό λΆμ¬μ μ¬μ©μ΄ κ°λ₯νλ€. status()
λ HTTP Headerλ₯Ό κ²μ¦νλ κ²μΌλ‘ κ²°κ³Όμ λν HTTP Status μνλ₯Ό νμΈν μ μλ€. νμ¬ isOK()
λ 200 μ½λκ° λ§λμ§ νμΈνκ³ μλ€.
νλ‘μ νΈλ₯Ό λ§λ€λ©΄μ λ€μν κΈ°λ₯λ€μ ꡬννκ² λλλ°, μ΄μ²λΌ ν μ€νΈ μ½λλ‘ κ²¬κ³ ν νλ‘μ νΈλ₯Ό λ§λ€κΈ° μν κΈ°λ₯λ³ λ¨μ ν μ€νΈλ₯Ό μ§ννλ μ΅κ΄μ κΈΈλ¬μΌ νλ€.
JPA
Java Persistence API
κ°λ°μκ° μ§μ SQLμ μμ±νμ§ μκ³ , JPA APIλ₯Ό νμ©ν΄ DBλ₯Ό μ μ₯νκ³ κ΄λ¦¬ν μ μλ€.
JPAλ μ€λλ μ€νλ§μμ λ§μ΄ νμ©λκ³ μμ§λ§, μ€νλ§μ΄ μ 곡νλ APIκ° μλ μλ°κ° μ 곡νλ APIλ€.
μλ° ORM κΈ°μ μ λν νμ€ λͺ μΈλ‘, μλ° μ΄ν리μΌμ΄μ μμ κ΄κ³ν λ°μ΄ν°λ² μ΄μ€λ₯Ό μ¬μ©νλ λ°©μμ μ μν μΈν°νμ΄μ€λ€.
β¨ ORM(Object Relational Mapping)
ORM νλ μμν¬λ μλ° κ°μ²΄μ κ΄κ³ν DBλ₯Ό 맀ννλ€. μ¦, κ°μ²΄κ° DB ν μ΄λΈμ΄ λλλ‘ λ§λ€μ΄μ£Όλ κ²μ΄λ€. ORMμ μ¬μ©νλ©΄, SQLμ μμ±νμ§ μμλ μ§κ΄μ μΈ λ©μλλ‘ λ°μ΄ν°λ₯Ό μ‘°μν μ μλ€λ μ₯μ μ΄ μλ€. ( κ°λ°μμκ² μμ°μ±μ ν₯μμμΌμ€ μ μμ )
μ’ λ₯λ‘λ Hibernate, EclipseLink, DataNucleus λ±μ΄ μλ€.
μ€νλ§ λΆνΈμμλ spring-boot-starter-data-jpa
λ‘ ν¨ν€μ§λ₯Ό κ°μ Έμ μ¬μ©νλ©°, μ΄λ Hibernate νλ μμν¬λ₯Ό νμ©νλ€.
JPAλ μ ν리μΌμ΄μ κ³Ό JDBC μ¬μ΄μμ λμνλ©°, κ°λ°μκ° JPAλ₯Ό νμ©νμ λ JDBC APIλ₯Ό ν΅ν΄ SQLμ νΈμΆνμ¬ λ°μ΄ν°λ² μ΄μ€μ νΈμΆνλ μ κ°κ° μ΄λ£¨μ΄μ§λ€.
μ¦, κ°λ°μλ JPAμ νμ©λ²λ§ μ΅νλ©΄ DB 쿼리 ꡬνμμ΄ λ°μ΄ν°λ² μ΄μ€λ₯Ό κ΄λ¦¬ν μ μλ€.
β¨ JPA νΉμ§
κ°μ²΄ μ€μ¬ κ°λ° κ°λ₯
SQL μ€μ¬ κ°λ°μ΄ μ΄λ£¨μ΄μ§λ€λ©΄, CRUD μμ μ΄ λ°λ³΅ν΄μ μ΄λ£¨μ΄μ ΈμΌνλ€.
νλμ ν μ΄λΈμ μμ±ν΄μΌν λ μ΄μ ν΄λΉνλ CRUDλ₯Ό μ λΆ λ§λ€μ΄μΌ νλ©°, μΆνμ 컬λΌμ΄ μμ±λλ©΄ κ΄λ ¨ SQLμ λͺ¨λ μμ ν΄μΌ νλ λ²κ±°λ‘μμ΄ μλ€. λν κ°λ° κ³Όμ μμ μ€μν κ°λ₯μ±λ λμμ§λ€.
μμ°μ± μ¦κ°
SQL 쿼리λ₯Ό μ§μ μμ±νμ§ μκ³ , λ§λ€μ΄μ§ κ°μ²΄μ JPA λ©μλλ₯Ό νμ©ν΄ λ°μ΄ν°λ² μ΄μ€λ₯Ό λ€λ£¨κΈ° λλ¬Έμ κ°λ°μμκ² λ§€μ° νΈλ¦¬μ±μ μ 곡ν΄μ€λ€.
μ μ§λ³΄μ μ©μ΄
쿼리 μμ μ΄ νμν λ, μ΄λ₯Ό λ΄μμΌ ν DTO νλλ λͺ¨λ λ³κ²½ν΄μΌ νλ μμ μ΄ νμνμ§λ§ JPAμμλ μν°ν° ν΄λμ€ μ λ³΄λ§ λ³κ²½νλ©΄ λλ―λ‘ μ μ§λ³΄μμ μ©μ΄νλ€.
μ±λ₯ μ¦κ°
μ¬λμ΄ μ§μ SQLμ μ§λ κ²κ³Ό λΉκ΅ν΄μ JPAλ λμΌν 쿼리μ λν μΊμ κΈ°λ₯μ μ§μν΄μ£ΌκΈ° λλ¬Έμ λΉκ΅μ λμ μ±λ₯ ν¨μ¨μ κ²½νν μ μλ€.
β¨ μ μ½μ¬ν
JPAλ 볡μ‘ν 쿼리보λ€λ μ€μκ° μΏΌλ¦¬μ μ΅μ νλμ΄μλ€. μλ₯Ό λ€μ΄ ν΅κ³ μ²λ¦¬μ κ°μ 볡μ‘ν μμ μ΄ νμν κ²½μ°μλ κΈ°μ‘΄μ Mybatisμ κ°μ Mapper λ°©μμ΄ λ ν¨μ¨μ μΌ μ μλ€.
Springμμλ JPAμ Mybatisλ₯Ό κ°μ΄ μ¬μ©ν μ μκΈ° λλ¬Έμ, μν©μ λ§λ λ°©μμ ννμ¬ κ°λ°νλ©΄ λλ€.
[Spring data JPA] λν° μ²΄νΉ(Dirty Checking)
νΈλμμ
μμμ Entityμ λ³κ²½μ΄ μΌμ΄λ¬μ λ λ³κ²½ν λ΄μ©μ μλμΌλ‘ DBμ λ°μνλ κ²
ORM ꡬν체 κ°λ° μ λν° μ²΄νΉμ΄λΌλ λ§μ μμ£Ό λ³Ό μ μλ€.
λν° μ²΄νΉμ΄ μ΄λ€ κ²μ λ»νλ μ§ κ°λ¨ν μ΄ν΄λ³΄μ.
JPAλ‘ κ°λ°νλ κ²½μ° κ΅¬νν ν κ°μ§ κΈ°λ₯μ μλ‘ λ€μ΄λ³΄μ
β¨ ex) μ£Όλ¬Έ μ·¨μ κΈ°λ₯
orderId
λ₯Ό ν΅ν΄ μ£Όλ¬Έμ μ·¨μνλ λ©μλλ€. λ°μ΄ν°λ² μ΄μ€μ λ°μνκΈ° μν΄μ , update
μ κ°μ μΏΌλ¦¬κ° μμ΄μΌν κ² κ°μλ° μ‘΄μ¬νμ§ μλλ€.
νμ§λ§, μ€μ λ‘ μ΄ λ©μλλ₯Ό μ€ννλ©΄ λ°μ΄ν°λ² μ΄μ€μ updateκ° μ μ΄λ£¨μ΄μ§λ€.
νΈλμμ μμ
orderId
λ‘ μ£Όλ¬Έ Entity μ‘°νν΄λΉ Entity μ£Όλ¬Έ μ·¨μ μνλ‘ Update
νΈλμμ 컀λ°
μ΄λ₯Ό κ°λ₯νκ² νλ κ²μ΄ λ°λ‘ 'λν° μ²΄νΉ(Dirty Checking)'μ΄λΌκ³ 보면 λλ€.
κ·Έλ₯ λν° μ²΄νΉμ λ¨μ΄λ§ κ°λ¨ν ν΄μνλ©΄ λ³κ²½ κ°μ§
λ‘ λ³Ό μ μλ€. μ’ λ μμΈν λ§νλ©΄, Entityμμ λ³κ²½μ΄ μΌμ΄λ κ±Έ κ°μ§ν λ€, λ°μ΄ν°λ² μ΄μ€μ λ°μμμΌμ€λ€λ μλ―Έλ€. (λ³κ²½μ μ΅μ΄ μ‘°ν μνκ° κΈ°μ€μ΄λ€)
Dirty : μνμ λ³νκ° μκΉ
Checking : κ²μ¬
JPAμμλ νΈλμμ μ΄ λλλ μμ μ λ³νκ° μλ λͺ¨λ μν°ν°μ κ°μ²΄λ₯Ό λ°μ΄ν°λ² μ΄μ€λ‘ μμμ λ°μμ μμΌμ€λ€. μ¦, νΈλμμ μ λ§μ§λ§ μμ μμ λ€λ₯Έ μ μ λ°κ²¬νμ λ λ°μ΄ν°λ² μ΄μ€λ‘ update 쿼리λ₯Ό λ λ €μ£Όλ κ²μ΄λ€.
JPAμμ Entityλ₯Ό μ‘°ν
μ‘°νλ μνμ Entityμ λν μ€λ μ· μμ±
νΈλμμ μ»€λ° ν ν΄λΉ μ€λ μ·κ³Ό νμ¬ Entity μνμ λ€λ₯Έ μ μ 체ν¬
λ€λ₯Έ μ λ€μ update μΏΌλ¦¬λ‘ λ°μ΄ν°λ² μ΄μ€μ μ λ¬
μ΄λ λν° μ²΄νΉμ κ²μ¬νλ λμμ μμμ± μ»¨ν
μ€νΈ
κ° κ΄λ¦¬νλ Entityλ‘λ§ λμμΌλ‘ νλ€.
μ€μμ, λΉμμ Entityλ κ°μ λ³κ²½ν μ§λΌλ λ°μ΄ν°λ² μ΄μ€μ λ°μμν€μ§ μλλ€.
κΈ°λ³Έμ μΌλ‘ λν° μ²΄νΉμ μ€ννλ©΄, SQLμμλ λ³κ²½λ μν°ν°μ λͺ¨λ λ΄μ©μ update μΏΌλ¦¬λ‘ λ§λ€μ΄ μ λ¬νλλ°, μ΄λ νλκ° λ§μμ§λ©΄ μ 체 νλλ₯Ό updateνλκ² λΉν¨μ¨μ μΌ μλ μλ€.
μ΄λλ @DynamicUpdate
λ₯Ό ν΄λΉ Entityμ μ μΈνμ¬ λ³κ²½ νλλ§ λ°μμν€λλ‘ λ§λ€μ΄μ€ μ μλ€.
Spring Security - μΈμ¦ λ° κΆν λΆμ¬
APIμ κΆν κΈ°λ₯μ΄ μμΌλ©΄, μ무λ νμ μ 보λ₯Ό μ‘°ννκ³ μμ νκ³ μμ ν μ μλ€. λ°λΌμ μ΄λ₯Ό λ§κΈ° μν΄ μΈμ¦λ μ μ λ§ APIλ₯Ό μ¬μ©ν μ μλλ‘ ν΄μΌνλλ°, μ΄λ μ¬μ©ν μ μλ ν΄κ²° μ±
μ€ νλκ° Spring Securityλ€.
μ€νλ§ νλ μμν¬μμλ μΈμ¦ λ° κΆν λΆμ¬λ‘ 리μμ€ μ¬μ©μ 컨νΈλ‘€ ν μ μλ Spring Security
λ₯Ό μ 곡νλ€. μ΄ νλ μμν¬λ₯Ό μ¬μ©νλ©΄, 보μ μ²λ¦¬λ₯Ό μ체μ μΌλ‘ ꡬννμ§ μμλ μ½κ² νμν κΈ°λ₯μ ꡬνν μ μλ€.
Spring Securityλ μ€νλ§μ DispatcherServlet
μλ¨μ Filter ννλ‘ μμΉνλ€. Dispatcherλ‘ λμ΄κ°κΈ° μ μ μ΄ Filterκ° μμ²μ κ°λ‘μ±μ, ν΄λΌμ΄μΈνΈμ 리μμ€ μ κ·Ό κΆνμ νμΈνκ³ , μλ κ²½μ°μλ μΈμ¦ μμ² νλ©΄μΌλ‘ μλ 리λ€μ΄λ νΈνλ€.
β¨ Spring Security Filter
Filterμ μ’
λ₯λ μλΉν λ§λ€. μμμ μμλ‘ λ ν΄λΌμ΄μΈνΈκ° 리μμ€μ λν μ κ·Ό κΆνμ΄ μμ λ μ²λ¦¬λ₯Ό λ΄λΉνλ νν°λ UsernamePasswordAuthenticationFilter
λ€.
μΈμ¦ κΆνμ΄ μμ λ μ€λ₯λ₯Ό JSONμΌλ‘ λ΄λ €μ£ΌκΈ° μν΄ ν΄λΉ νν°κ° μ€νλκΈ° μ μ²λ¦¬κ° νμν κ²μ΄λ€.
API μΈμ¦ λ° κΆν λΆμ¬λ₯Ό μν μμ μμλ μλμ κ°μ΄ ꡬμ±ν μ μλ€.
νμ κ°μ , λ‘κ·ΈμΈ API ꡬν
리μμ€ μ κ·Ό κ°λ₯ν ROLE_USER κΆνμ κ°μ νμμκ² λΆμ¬
Spring Security μ€μ μμ ROLE_USER κΆνμ κ°μ§λ©΄ μ κ·Ό κ°λ₯νλλ‘ μΈν
κΆνμ΄ μλ νμμ΄ λ‘κ·ΈμΈ μ±κ³΅νλ©΄ 리μμ€ μ κ·Ό κ°λ₯ν JWT ν ν° λ°κΈ
ν΄λΉ νμμ κΆνμ΄ νμν API μ κ·Ό μ JWT 보μ ν ν°μ μ¬μ©
μ΄μ²λΌ μ κ·Ό μ νμ΄ νμν APIμλ 보μ ν ν°μ ν΅ν΄μ μ΄ μ μ κ° κΆνμ΄ μλμ§ μ¬λΆλ₯Ό Spring Securityλ₯Ό ν΅ν΄ 체ν¬νκ³ λ¦¬μμ€λ₯Ό μμ²ν μ μλλ‘ κ΅¬μ±ν μ μλ€.
β¨ Spring Security Configuration
μλ²μ 보μμ μ€μ νκΈ° μν΄ Configurationμ λ§λ λ€. κΈ°μ‘΄ μμμ²λΌ, USERμ λν κΆνμ μ€μ νκΈ° μν μμ λ μ¬κΈ°μ μ§νλλ€.
Last updated