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

Spring45

Spring μŠ€μΌ€μ₯΄λŸ¬ 둜직이 λ©€ν‹° μ„œλ²„ 쀑 ν•œ μ„œλ²„μ—μ„œλ§Œ μ‹€ν–‰λ˜λ„λ‘ μ„€μ •ν•˜κΈ° μ„œλΉ„μŠ€λ₯Ό μš΄μ˜ν•˜λ©΄ μ΅œμ†Œν•œ 2λŒ€ μ΄μƒμ˜ λ©€ν‹° μ„œλ²„λ₯Ό μ‚¬μš©ν•˜μ—¬ μš΄μ˜μ„ ν•©λ‹ˆλ‹€. μ„œλΉ„μŠ€μ—μ„œ νŠΉμ • μ‹œκ°„μ—λ§Œ μˆ˜ν–‰λ˜λŠ” λ°°μΉ˜μ„± 둜직이 μ‘΄μž¬ν•œλ‹€λ©΄, 배치 μ„œλ²„λ₯Ό λ³„λ„λ‘œ 두기도 ν•˜μ§€λ§Œ ν•˜λ‚˜μ˜ ν”„λ‘œμ νŠΈμ—μ„œ μŠ€μΌ€μ₯΄λŸ¬λ₯Ό μ„€μ •ν•˜κΈ°λ„ ν•©λ‹ˆλ‹€. μ΄λ•Œ μŠ€μΌ€μ₯΄λŸ¬λ₯Ό μ μš©ν•˜λ©΄ μ‹€μ œ 운영 ν™˜κ²½μ—μ„œ A, B μ„œλ²„ λͺ¨λ‘ μŠ€μΌ€μ₯΄μ΄ λŒλ©΄μ„œ 둜직이 2번 싀행될 수 μžˆλŠ”λ°μš”, 이와 κ΄€λ ¨ν•˜μ—¬ 쑰금 μ°Ύμ•„λ³΄λ‹ˆ λŒ€λΆ€λΆ„μ˜ ν¬μŠ€νŒ…μ—μ„œ ShedLock? 을 μ‚¬μš©ν•˜μ—¬ ν•΄κ²°ν•˜λŠ” λ“―ν•œλ°, Spring Profile 을 μ‚¬μš©ν•˜λ©΄ 더 κ°„λ‹¨ν•˜κ²Œ ν•΄κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μœ„μ™€ 같이 μŠ€μΌ€μ€„λŸ¬κ°€ μ‘΄μž¬ν•˜λŠ” μ»΄ν¬λ„ŒνŠΈμ— @Profile 을 μ„€μ •ν•˜κ³ , μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‹€ν–‰ν•  λ•Œ ν™˜κ²½λ³€μˆ˜μ— μ„€μ •ν•˜λ©΄ λ©λ‹ˆλ‹€. IntelliJ Run/Debug Configurations Application.. 2023. 12. 30.
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.
Bean Validation (Hibernate Validation) Bean Validation은 ν•„λ“œμ˜ κ°’, λ²”μœ„ 등을 κ²€μ¦ν•˜κ³ μž ν•  λ•Œ μœ μš©ν•˜κ²Œ μ‚¬μš©ν•  수 μžˆλŠ” μ–΄λ…Έν…Œμ΄μ…˜ 및 μΈν„°νŽ˜μ΄μŠ€μ˜ λͺ¨μŒ 이 기술의 κ΅¬ν˜„μ²΄ 쀑 일반적으둜 μ‚¬μš©ν•˜λŠ” κ΅¬ν˜„μ²΄κ°€ Hibernate Validator https://docs.jboss.org/hibernate/validator/6.2/reference/en-US/html_single/#validator-defineconstraints-spec Hibernate Validator 6.2.5.Final - Jakarta Bean Validation Reference Implementation: Reference Guide Validating data is a common task that occurs throughout all applicati.. 2023. 9. 30.
λ§Œλ“€λ©΄μ„œ λ°°μš°λŠ” ν”„λ‘ νŠΈ 컨트둀러(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.
Spring Batch (12) Retry πŸ”— Spring Batch Retry (Tasklet 기반) 예제 μ½”λ“œλŠ” κΉƒν—ˆλΈŒμ—μ„œ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€ :) μ„œλΉ„μŠ€μ—μ„œ μž¬μ‹œλ„κ°€ ν•„μš”ν•œ κ²½μš°λŠ” μ–Έμ œμΌκΉŒμš”? λΉ„μ¦ˆλ‹ˆμŠ€ 둜직 였λ₯˜μ™€ 같은 λ‚΄κ°€ μž‘μ„±ν•œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ— μ˜ν•΄ λ°œμƒν•œ μ—λŸ¬λŠ” μž¬μ‹œλ„λ₯Ό ν•˜λ”λΌλ„ λ™μΌν•˜κ²Œ μ‹€νŒ¨ν•  κ²½μš°κ°€ ν½λ‹ˆλ‹€. ν•˜μ§€λ§Œ λ„€νŠΈμ›Œν¬μ™€ 같은 μΌμ‹œμ μœΌλ‘œ λ°œμƒν•  수 μžˆλŠ” μž₯μ•  μƒν™©μ—μ„œλŠ” μœ μš©ν•˜κ²Œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λŒ€ν‘œμ μœΌλ‘œλŠ” λ°μ΄ν„°λ² μ΄μŠ€ I/Oμ™€μ˜ νƒ€μž„μ•„μ›ƒ, API 호좜 μ‹œ λ°œμƒν•˜λŠ” νƒ€μž„μ•„μ›ƒ 등이 μžˆκ² λ„€μš”. 졜근 μ‚¬λ‚΄μ—μ„œ μ™ΈλΆ€ APIλ₯Ό ν˜ΈμΆœν•˜λŠ” κ³Όμ •μ—μ„œ κ°„ν—μ μœΌλ‘œ μ•„λž˜μ™€ 같은 μ˜ˆμ™Έκ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€. reactor.core.Exceptions$ReactiveException: io.netty.channel.unix.Errors$NativeIoExc.. 2023. 3. 4.
μ’‹μ•„μš” κΈ°λŠ₯을 톡해 μ‚΄νŽ΄λ³΄λŠ” λ™μ‹œμ„± 이슈 (synchronized) μ•ˆλ…•ν•˜μ„Έμš”, 이번 ν¬μŠ€νŒ…μ—μ„œλŠ” λ™μ‹œμ„±(Concurrency)에 λŒ€ν•΄ μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€. (예제 μ½”λ“œλŠ” κΉƒν—ˆλΈŒμ—μ„œ ν™•μΈν•˜μ‹€ 수 μžˆμŠ΅λ‹ˆλ‹€.) λ™μ‹œμ„±(Concurrency) κ°œλ… 넀이버 사전에 검색해본 λ™μ‹œμ„±μ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€. μ–΄λ–€ 두 사건이 같은 μ‹œκ°„μ— μΌμ–΄λ‚˜λŠ” 것을 이λ₯΄λŠ” 말 λŒ€λΆ€λΆ„μ˜ μ›Ή μ„œλ²„λŠ” μ—¬λŸ¬ 개의 μš”μ²­(ν΄λΌμ΄μ–ΈνŠΈ)을 λ™μ‹œμ— μˆ˜ν–‰ν•  수 있고, μ΄λŠ” μž‘μ„±ν•œ μ½”λ“œκ°€ λ™μ‹œμ— μˆ˜ν–‰λ  수 μžˆλ‹€λŠ” μ˜λ―Έμ™€ λ™μΌν•œ λ§₯λ½μž…λ‹ˆλ‹€. μ΄λŸ¬ν•œ λ™μ‹œμ„± 문제λ₯Ό μ‚΄νŽ΄λ³΄κΈ° μœ„ν•΄ κ²Œμ‹œκΈ€μ—μ„œ ν΄λΌμ΄μ–ΈνŠΈκ°€ λ™μ‹œμ— μ’‹μ•„μš”λ₯Ό ν–ˆμ„ λ•Œ λ°œμƒν•  수 μžˆλŠ” λ¬Έμ œμ— λŒ€ν•΄ μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€. μœ„ 그림에 λŒ€ν•œ μ„€λͺ…은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€. User Aκ°€ κ²Œμ‹œκΈ€ 1에 μ’‹μ•„μš”λ₯Ό ν΄λ¦­ν–ˆμ„ λ•Œ likeCount 쑰회 (likeCount = 0) User B도 κ²Œμ‹œκΈ€ .. 2023. 2. 26.
Spring λΆ„μ‚° ν™˜κ²½μ—μ„œ μ„Έμ…˜ κ΄€λ¦¬ν•˜κΈ° (Redis Session Clustering) πŸ”— Spring λΆ„μ‚° ν™˜κ²½μ—μ„œ μ„Έμ…˜ κ΄€λ¦¬ν•˜κΈ°(μ„Έμ…˜ ν΄λŸ¬μŠ€ν„°λ§) μ•ˆλ…•ν•˜μ„Έμš”, 이번 ν¬μŠ€νŒ…μ—μ„œλŠ” μ—¬λŸ¬ μ„œλ²„ ν™˜κ²½μ—μ„œ μ„Έμ…˜μ„ κ΄€λ¦¬ν•˜λŠ” 방법에 λŒ€ν•΄ μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€. (μ½”λ“œλŠ” κΉƒν—ˆλΈŒμ—μ„œ ν™•μΈν•˜μ‹€ 수 μžˆμŠ΅λ‹ˆλ‹€.) 단일 μ„œλ²„μ—μ„œ μ„Έμ…˜μ„ κ΄€λ¦¬ν•œλ‹€λ©΄ μ•„λ¬΄λŸ° λ¬Έμ œκ°€ μ—†κ² μ§€λ§Œ, 보톡 μŠ€μΌ€μΌ 아웃 등을 톡해 λΆ„μ‚°λœ μ„œλ²„ ν™˜κ²½μ—μ„œ μ„Έμ…˜μ„ 관리할 λ•Œ(둜그인 μœ μ €μ˜ μ„Έμ…˜ 정보) μ„Έμ…˜ 뢈일치 λ¬Έμ œκ°€ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ˜ˆμ‹œλ‘œ μ‚΄νŽ΄λ³ΌκΉŒμš”? μ‚¬μš©μž Aκ°€ localhost:8080포트둜 login 호좜 μ‹œ μ„Έμ…˜μ΄ μƒμ„±λ˜κ³  JSESSIONID에 μž„μ˜μ˜ 값을 μ„€μ •ν•©λ‹ˆλ‹€. JSESSIONID? - μ„Έμ…˜μ„ μœ μ§€ν•˜κΈ° μœ„ν•΄ Tomcat Containerμ—μ„œ λ°œκΈ‰ν•˜λŠ” Key이고 Valueλ₯Ό 톡해 μ„Έμ…˜μ„ μœ μ§€ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ™μž‘ 방식? 1. 브라우.. 2023. 2. 12.
Spring DispatcherServlet(λ””μŠ€νŒ¨μ²˜μ„œλΈ”λ¦Ώ) κ°œλ…λΆ€ν„° λ™μž‘ κ³Όμ •κΉŒμ§€ πŸ”— DispatcherServlet μ•ˆλ…•ν•˜μ„Έμš”, 이번 ν¬μŠ€νŒ…μ—μ„œλŠ” Springμ—μ„œ HTTP μš”μ²­ 및 응닡과 κ΄€λ ¨ν•˜μ—¬ κ°€μž₯ 핡심 기술인 DispatcherServlet에 λŒ€ν•΄ μ‚΄νŽ΄λ³΄κ³ μž ν•©λ‹ˆλ‹€. ν‰μ†Œμ— κ°œλ…μ— λŒ€ν•΄μ„œλŠ” μ–΄λŠ 정도 μ•Œκ³  μžˆμ—ˆμ§€λ§Œ μ–΄λ– ν•œ 과정을 톡해 λ””μŠ€νŒ¨μ²˜ μ„œλΈ”λ¦Ώμ΄ ν΄λΌμ΄μ–ΈνŠΈμ˜ μš”μ²­μ„ λ°›κ³ , λ©”μ„œλ“œμ˜ νŒŒλΌλ―Έν„° 정보λ₯Ό μ²˜λ¦¬ν•˜κ³  응닡을 λ°˜ν™˜ν•˜λŠ”μ§€ λ‚΄λΆ€ λ™μž‘μ€ 잘 λͺ°λžμ—ˆλŠ”λ°μš”, 이번 κΈ°νšŒμ— 정리해 λ³΄μ•˜μŠ΅λ‹ˆλ‹€. (ν‹€λ¦° λ‚΄μš©μ΄ μ‘΄μž¬ν•  수 μžˆμœΌλ‹ˆ 말씀해 μ£Όμ‹œλ©΄ κ°μ‚¬ν•˜κ² μŠ΅λ‹ˆλ‹€. πŸ™) | DispatcherServlet κ°œλ… ν”„λ‘ νŠΈ 컨트둀러(Front Controller)라고도 λΆˆλ¦¬λŠ” DispatcherServlet은 HTTP ν”„λ‘œν† μ½œλ‘œ λ“€μ–΄μ˜€λŠ” λͺ¨λ“  μš”μ²­μ„ λ¨Όμ € λ°›μ•„μ„œ μ ν•©ν•œ μ»¨νŠΈλ‘€λŸ¬μ— μœ„μž„(Delega.. 2023. 2. 11.
λ°˜μ‘ν˜•