λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
λ°˜μ‘ν˜•

Spring23

Spring @RequestBody ν•„λ“œ 바인딩이 λ˜μ§€ μ•ŠλŠ” 이슈 (feat. Lombok, Jackson의 넀이밍 차이) κ°œμš” Springμ—μ„œ ν΄λΌμ΄μ–ΈνŠΈμ˜ μš”μ²­μ„ JSON ν˜•μ‹μœΌλ‘œ λ°›κ³ , @RequestBodyλ₯Ό μ‚¬μš©ν•˜μ—¬ JSON body의 데이터λ₯Ό Java Object의 ν•„λ“œμ™€ 역직렬화(Deserialize)λ₯Ό 톡해 각 데이터가 μ •μƒμ μœΌλ‘œ 바인딩이 μ΄λ£¨μ–΄μ§€κ²Œ λ©λ‹ˆλ‹€. ν•˜μ§€λ§Œ, ν•„λ“œμ˜ νŠΉμ • 넀이밍 + Lombok의 @Getterλ₯Ό μ‚¬μš©ν•  λ•Œ 바인딩이 μ •μƒμ μœΌλ‘œ λ˜μ§€ μ•ŠλŠ” μ΄μŠˆκ°€ μ‘΄μž¬ν•˜λŠ”λ°μš”, 이와 κ΄€λ ¨ν•˜μ—¬ κ°„λž΅νžˆ μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€. ### Send POST request with json body POST http://localhost:8080/api/v1/test Content-Type: application/json { "pId": "pId", "poId": "poId" } 예λ₯Ό λ“€μ–΄, μœ„μ™€ 같은 μ„œλ²„ μ½”λ“œκ°€ μ‘΄μž¬ν•˜κ³  클라.. 2024. 3. 20.
Spring @ComponentScan λ™μž‘ κ³Όμ • Springμ—μ„œ ν΄λž˜μŠ€μ— @Configuration, @RestController, @Service λ“±μ˜ μ–΄λ…Έν…Œμ΄μ…˜μ„ μ„ μ–Έν•˜λ©΄ μŠ€ν”„λ§μ€ ν•΄λ‹Ή μ–΄λ…Έν…Œμ΄μ…˜λ“€μ„ μŠ€μΊ”ν•΄μ„œ 빈으둜 등둝을 ν•΄μ£ΌλŠ”λ°μš”, μ΄λŸ¬ν•œ 역할을 ν•˜λŠ” 것이 @ComponentScan μ–΄λ…Έν…Œμ΄μ…˜ μž…λ‹ˆλ‹€. @ComponentScan 은 단어 κ·ΈλŒ€λ‘œ @Component μ–΄λ…Έν…Œμ΄μ…˜μ΄ 뢙은 ν΄λž˜μŠ€λ“€μ„ μŠ€μΊ”ν•˜μ—¬ μŠ€ν”„λ§ 빈으둜 λ“±λ‘ν•˜λŠ”λ°, μœ„μ— μ–ΈκΈ‰λœ μ–΄λ…Έν…Œμ΄μ…˜λ“€μ€ λͺ¨λ‘ 내뢀에 @Component μ–΄λ…Έν…Œμ΄μ…˜μ„ κ°€μ§€κ³  μžˆμŠ΅λ‹ˆλ‹€. μœ„μ™€ 같은 μ–΄λ…Έν…Œμ΄μ…˜λ“€μ„ μ„€μ •ν•˜λ©΄ μŠ€ν”„λ§μ—μ„œλŠ” μ–΄λ–»κ²Œ μ»΄ν¬λ„ŒνŠΈλ“€μ„ μŠ€μΊ”ν•˜κ³ , μŠ€ν”„λ§ 빈으둜 λ“±λ‘ν•˜λŠ”μ§€ μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€. @ComponentScan ComponentScan μ–΄λ…Έν…Œμ΄μ…˜μ— μ‘΄μž¬ν•˜λŠ” μ£Όμ„μœΌλ‘œ, λŒ€λž΅μ μΈ μ˜λ―ΈλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.. 2023. 12. 9.
Spring Bean 이 λ“±λ‘λ˜λŠ” κ³Όμ • μŠ€ν”„λ§μ„ μ‚¬μš©ν•˜λ‹€ 보면 @Configuration, @Component, @Bean λ“±μ˜ μ–΄λ…Έν…Œμ΄μ…˜μ„ 톡해 μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆμ— λΉˆμ„ λ“±λ‘ν•˜λŠ”λ°μš”, μ–΄λ– ν•œ 과정을 톡해 Bean 이 λ“±λ‘λ˜λŠ”μ§€ μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€. ν…ŒμŠ€νŠΈλŠ” μœ„μ™€ 같이 @Configuration μ–΄λ…Έν…Œμ΄μ…˜μ„ μ„€μ •ν•œ TestConfiguration ν΄λž˜μŠ€κ°€ μ‘΄μž¬ν•˜κ³ , main λ©”μ„œλ“œλ₯Ό ν¬ν•¨ν•œ Main ν΄λž˜μŠ€μ—μ„œ μ–΄λ…Έν…Œμ΄μ…˜ 기반의 AnnotationConfigApplicationContext 객체λ₯Ό μƒμ„±ν•˜κ³ , 이 μƒμ„±μžμ—λŠ” TestConfiguration 객체λ₯Ό μ£Όμž…ν•©λ‹ˆλ‹€. μœ„ 과정을 톡해 μ–΄λ…Έν…Œμ΄μ…˜ 기반의 Spring Bean 이 λ“±λ‘λ˜λŠ” 과정을 μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€. BeanFactory BeanFactory μΈν„°νŽ˜μ΄μŠ€λŠ” μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬μ—μ„œ μŠ€ν”„λ§ .. 2023. 12. 2.
μŠ€ν”„λ§μ—μ„œ ν΄λΌμ΄μ–ΈνŠΈλ‘œ 데이터 전달 μ‹œ ν•œκΈ€μ΄ κΉ¨μ§€λŠ” 이슈 (ISO-8859-1) μ•ˆλ…•ν•˜μ„Έμš”, 졜근 ν΄λΌμ΄μ–ΈνŠΈ(Vue) 와 μ„œλ²„(Spring Boot) 연동 μ‹œ μ„œλ²„μ—μ„œ ν•œκΈ€ 데이터λ₯Ό μ „λ‹¬ν•˜λ©΄ ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ ν•œκΈ€μ΄ κΉ¨μ§€λŠ” μ΄μŠˆκ°€ λ°œμƒν–ˆμ—ˆλŠ”λ°μš”, 이와 κ΄€λ ¨ν•˜μ—¬ κ°„λž΅νžˆ 정리해 λ³΄μ•˜μŠ΅λ‹ˆλ‹€. 원인 HttpMessageConverter μΈν„°νŽ˜μ΄μŠ€λŠ” Springμ—μ„œ HTTP request, response λ₯Ό λ³€ν™˜ν•΄ μ£ΌλŠ” μΈν„°νŽ˜μ΄μŠ€μΈλ°μš”, ν•΄λ‹Ή ν¬μŠ€νŒ…μ„ μ΄ν•΄ν•˜λŠ”λ° ν•„μš”ν•œ λ‚΄μš©μ΄λΌ κ°„λž΅ν•˜κ²Œλ§Œ μ„€λͺ…ν•˜κ³  λ„˜μ–΄κ°€κ² μŠ΅λ‹ˆλ‹€. μŠ€ν”„λ§μ—μ„œ ν”νžˆ μ‚¬μš©ν•˜λŠ” @RestController μ–΄λ…Έν…Œμ΄μ…˜μ— ν¬ν•¨λ˜μ–΄ μžˆλŠ” @ResponseBody μ–΄λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•  경우, HttpMessageConverter 이 λ™μž‘ν•˜κ³  λ°˜ν™˜ νƒ€μž…μ— 따라 μ μ ˆν•œ κ΅¬ν˜„μ²΄κ°€ μ‚¬μš©μ΄ λ©λ‹ˆλ‹€. λŒ€ν‘œμ μœΌλ‘œλŠ” ByteArrayHttpMessageC.. 2023. 11. 20.
λ§Œλ“€λ©΄μ„œ λ°°μš°λŠ” ν”„λ‘ νŠΈ 컨트둀러(Front Controller) νŒ¨ν„΄ μ•ˆλ…•ν•˜μ„Έμš”, 이번 ν¬μŠ€νŒ…μ—μ„œλŠ” κΈ°μ‘΄ Servlet 기반의 MVC ν”„λ ˆμž„μ›Œν¬λ₯Ό μŠ€ν”„λ§μ˜ ν”„λ‘ νŠΈ 컨트둀러 νŒ¨ν„΄μ„ 직접 λ§Œλ“€μ–΄λ³΄λ©΄μ„œ μ μ§„μ μœΌλ‘œ κ°œμ„ ν•˜λŠ” κ³Όμ • μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€. ν•΄λ‹Ή ν¬μŠ€νŒ…μ€ μ•„λž˜ κ°•μ˜λ₯Ό μ°Έκ³ ν•˜μ—¬ μž‘μ„±ν–ˆμŠ΅λ‹ˆλ‹€! https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/dashboard μŠ€ν”„λ§ MVC 1편 - λ°±μ—”λ“œ μ›Ή 개발 핡심 기술 - μΈν”„λŸ° | κ°•μ˜ μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ κ°œλ°œν•  λ•Œ ν•„μš”ν•œ λͺ¨λ“  μ›Ή κΈ°μˆ μ„ κΈ°μ΄ˆλΆ€ν„° μ΄ν•΄ν•˜κ³ , μ™„μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μŠ€ν”„λ§ MVC의 핡심 원리와 ꡬ쑰λ₯Ό μ΄ν•΄ν•˜κ³ , 더 κΉŠμ΄μžˆλŠ” λ°±μ—”λ“œ 개발자둜 μ„±μž₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€., 원 www.inflearn.com μŠ€ν”„λ§μ—μ„œ ν”„λ‘ νŠΈ 컨트둀러라고 λΆˆλ¦¬λŠ” νŒ¨ν„΄μ€ λͺ¨λ“  HTTP μš”μ²­.. 2023. 8. 16.
μ’‹μ•„μš” κΈ°λŠ₯을 톡해 μ‚΄νŽ΄λ³΄λŠ” λ™μ‹œμ„± 이슈 (synchronized) μ•ˆλ…•ν•˜μ„Έμš”, 이번 ν¬μŠ€νŒ…μ—μ„œλŠ” λ™μ‹œμ„±(Concurrency)에 λŒ€ν•΄ μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€. (예제 μ½”λ“œλŠ” κΉƒν—ˆλΈŒμ—μ„œ ν™•μΈν•˜μ‹€ 수 μžˆμŠ΅λ‹ˆλ‹€.) λ™μ‹œμ„±(Concurrency) κ°œλ… 넀이버 사전에 검색해본 λ™μ‹œμ„±μ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€. μ–΄λ–€ 두 사건이 같은 μ‹œκ°„μ— μΌμ–΄λ‚˜λŠ” 것을 이λ₯΄λŠ” 말 λŒ€λΆ€λΆ„μ˜ μ›Ή μ„œλ²„λŠ” μ—¬λŸ¬ 개의 μš”μ²­(ν΄λΌμ΄μ–ΈνŠΈ)을 λ™μ‹œμ— μˆ˜ν–‰ν•  수 있고, μ΄λŠ” μž‘μ„±ν•œ μ½”λ“œκ°€ λ™μ‹œμ— μˆ˜ν–‰λ  수 μžˆλ‹€λŠ” μ˜λ―Έμ™€ λ™μΌν•œ λ§₯λ½μž…λ‹ˆλ‹€. μ΄λŸ¬ν•œ λ™μ‹œμ„± 문제λ₯Ό μ‚΄νŽ΄λ³΄κΈ° μœ„ν•΄ κ²Œμ‹œκΈ€μ—μ„œ ν΄λΌμ΄μ–ΈνŠΈκ°€ λ™μ‹œμ— μ’‹μ•„μš”λ₯Ό ν–ˆμ„ λ•Œ λ°œμƒν•  수 μžˆλŠ” λ¬Έμ œμ— λŒ€ν•΄ μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€. μœ„ 그림에 λŒ€ν•œ μ„€λͺ…은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€. User Aκ°€ κ²Œμ‹œκΈ€ 1에 μ’‹μ•„μš”λ₯Ό ν΄λ¦­ν–ˆμ„ λ•Œ likeCount 쑰회 (likeCount = 0) User B도 κ²Œμ‹œκΈ€ .. 2023. 2. 26.
Spring DispatcherServlet(λ””μŠ€νŒ¨μ²˜μ„œλΈ”λ¦Ώ) κ°œλ…λΆ€ν„° λ™μž‘ κ³Όμ •κΉŒμ§€ πŸ”— DispatcherServlet μ•ˆλ…•ν•˜μ„Έμš”, 이번 ν¬μŠ€νŒ…μ—μ„œλŠ” Springμ—μ„œ HTTP μš”μ²­ 및 응닡과 κ΄€λ ¨ν•˜μ—¬ κ°€μž₯ 핡심 기술인 DispatcherServlet에 λŒ€ν•΄ μ‚΄νŽ΄λ³΄κ³ μž ν•©λ‹ˆλ‹€. ν‰μ†Œμ— κ°œλ…μ— λŒ€ν•΄μ„œλŠ” μ–΄λŠ 정도 μ•Œκ³  μžˆμ—ˆμ§€λ§Œ μ–΄λ– ν•œ 과정을 톡해 λ””μŠ€νŒ¨μ²˜ μ„œλΈ”λ¦Ώμ΄ ν΄λΌμ΄μ–ΈνŠΈμ˜ μš”μ²­μ„ λ°›κ³ , λ©”μ„œλ“œμ˜ νŒŒλΌλ―Έν„° 정보λ₯Ό μ²˜λ¦¬ν•˜κ³  응닡을 λ°˜ν™˜ν•˜λŠ”μ§€ λ‚΄λΆ€ λ™μž‘μ€ 잘 λͺ°λžμ—ˆλŠ”λ°μš”, 이번 κΈ°νšŒμ— 정리해 λ³΄μ•˜μŠ΅λ‹ˆλ‹€. (ν‹€λ¦° λ‚΄μš©μ΄ μ‘΄μž¬ν•  수 μžˆμœΌλ‹ˆ 말씀해 μ£Όμ‹œλ©΄ κ°μ‚¬ν•˜κ² μŠ΅λ‹ˆλ‹€. πŸ™) | DispatcherServlet κ°œλ… ν”„λ‘ νŠΈ 컨트둀러(Front Controller)라고도 λΆˆλ¦¬λŠ” DispatcherServlet은 HTTP ν”„λ‘œν† μ½œλ‘œ λ“€μ–΄μ˜€λŠ” λͺ¨λ“  μš”μ²­μ„ λ¨Όμ € λ°›μ•„μ„œ μ ν•©ν•œ μ»¨νŠΈλ‘€λŸ¬μ— μœ„μž„(Delega.. 2023. 2. 11.
Spring AOPλ₯Ό μ‚¬μš©ν•˜μ—¬ ν΄λΌμ΄μ–ΈνŠΈμ˜ μš”μ²­ 정보 λ‘œκΉ…ν•˜κΈ° μ„œλΉ„μŠ€μ—μ„œ ν΄λΌμ΄μ–ΈνŠΈμ˜ λͺ¨λ“  ν˜ΈμΆœμ— λŒ€ν•΄ μ €μž₯ν•˜μ—¬ 관리λ₯Ό ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이 λ•Œ, λ‹¨μˆœνžˆ 둜그둜 λ‚¨κΈΈμˆ˜λ„ 있고 ν˜Ήμ€ λ°μ΄ν„°λ² μ΄μŠ€μ— λͺ¨λ“  μš”μ²­ 정보λ₯Ό μ €μž₯ν•˜μ—¬ 관리할 수 μžˆμŠ΅λ‹ˆλ‹€. 이번 ν¬μŠ€νŒ…μ—μ„œλŠ” ν΄λΌμ΄μ–ΈνŠΈμ˜ μš”μ²­ 정보(URI, Http Method, payload λ“±λ“±)듀을 λ‘œκΉ… 및 λ°μ΄ν„°λ² μ΄μŠ€μ— μ €μž₯ν•˜μ—¬ κ΄€λ¦¬ν•˜λŠ” 방법에 λŒ€ν•΄ κ°„λž΅νžˆ μ‚΄νŽ΄λ΄…λ‹ˆλ‹€. 예제 μ½”λ“œλŠ” GitHubμ—μ„œ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€ :) πŸ”— ApiRequestEntity ApiRequestEntity ν΄λž˜μŠ€λŠ” λ°μ΄ν„°λ² μ΄μŠ€μ— μ €μž₯ν•  ν΄λΌμ΄μ–ΈνŠΈμ˜ μš”μ²­ λ°μ΄ν„°μ…‹μœΌλ‘œ 각 ν•„λ“œμ˜ 역할은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€. id : PK methodValue : Http Method apiUri : Request URI payload : Request Body req.. 2023. 1. 14.
Spring + MyBatisμ—μ„œ 쿼리의 결과와 객체가 맀핑이 λ˜λŠ” κ³Όμ • 🧷 Spring + MyBatisμ—μ„œ 쿼리의 결과와 객체가 맀핑이 λ˜λŠ” κ³Όμ • μŠ€ν”„λ§μ—μ„œ λ§ˆμ΄λ°”ν‹°μŠ€λ₯Ό μ‚¬μš©ν•  λ•Œ, Select 쿼리의 결과와 객체(Dto)κ°€ μ–΄λ– ν•œ μž‘μ—…μ„ 톡해 맀핑이 λ˜λŠ”μ§€ μ •ν™•ν•˜κ²Œ νŒŒμ•…ν•˜κ³  κ³΅μœ ν•˜κΈ° μœ„ν•΄ λ§€ν•‘ 과정에 λŒ€ν•΄ 정리해 λ³΄μ•˜μŠ΅λ‹ˆλ‹€. (λ‹Ήμ—°νžˆ ν‹€λ¦° λ‚΄μš©μ΄ μ‘΄μž¬ν•  수 μžˆμœΌλ‹ˆ ν”Όλ“œλ°± μ£Όμ‹œλ©΄ κ°μ‚¬ν•˜κ² μŠ΅λ‹ˆλ‹€. πŸ˜‚) 🌈 κ°œμš” Springκ³Ό MyBatisμ—μ„œ 쿼리 결과와 객체의 맀핑이 μ΄λ£¨μ–΄μ§€λŠ” 과정에 λŒ€ν•΄ μ‚΄νŽ΄λ΄…λ‹ˆλ‹€. 이와 κ΄€λ ¨ν•˜μ—¬ μ–΄λ– ν•œ λ°©μ‹μœΌλ‘œ 맀핑을 μ§„ν–‰ν•˜λŠ”μ§€, 쒋은 방법이 무엇인지 등에 λŒ€ν•΄ μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€. πŸ”– κ²°λ‘  ν¬μŠ€νŒ…μ΄ κ½€λ‚˜ μž₯문이기에,, λ§€ν•‘ 과정에 λŒ€ν•΄ κ²°λ‘ λΆ€ν„° λ§μ”€λ“œλ¦¬λ©΄ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€. κΈ°λ³Έ μƒμ„±μž(NoArgs)만 μ‘΄μž¬ν•  경우, 쿼리 결과와 객체의 맀핑이 μ •μƒμ μœΌλ‘œ μ§„.. 2022. 10. 3.
Spring Thread, Transaction, Connection 관계 πŸ“Ž Spring Thread, Transaction, Connection 관계 μ•ˆλ…•ν•˜μ„Έμš”, 졜근 ν† λΉ„μ˜ μŠ€ν”„λ§ λ„μ„œλ‘œ μŠ€ν„°λ”” 쀑 μ•„λž˜μ™€ λΉ„μŠ·ν•œ 질문이 μžˆμ—ˆμŠ΅λ‹ˆλ‹€. "νŠΈλžœμž­μ…˜μ΄ μƒˆλ‘œ 생성될 λ•Œ μŠ€λ ˆλ“œκ°€ μƒˆλ‘œ μƒμ„±λ κΉŒμš”?" 이와 κ΄€λ ¨ν•˜μ—¬ μ•„λž˜μ˜ 관계듀에 λŒ€ν•΄ κ°„λž΅νžˆ μ •λ¦¬ν•΄λ³΄κ³ μž ν•©λ‹ˆλ‹€. (κ΄€λ ¨ μ½”λ“œλŠ” GitHubμ—μ„œ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€. 🐝 ) Thread per transaction vs One thread for serveral transaction Thread per connection vs One thread for all connections ν‹€λ¦° λ‚΄μš©μ΄ μ‘΄μž¬ν•  수 μžˆμœΌλ‹ˆ μ΄λŸ¬ν•œ λΆ€λΆ„μ—μ„œλŠ” ν”Όλ“œλ°± μ£Όμ‹œλ©΄ κ°μ‚¬ν•˜κ² μŠ΅λ‹ˆλ‹€. πŸ˜‚ (β€» ν•΄λ‹Ή ν¬μŠ€νŒ…μ€ https://truehong.tistory.com/14.. 2022. 9. 3.
λ°˜μ‘ν˜•