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

전체 κΈ€418

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.
TDD, 클린 μ½”λ“œ with Java (λ―Έμ…˜ 3, 4 - FP, OOP, λ¦¬νŒ©ν„°λ§) μ„Έ 번째 λ―Έμ…˜μΈ 사닀리 νƒ€κΈ°λŠ” μžλ°” 8의 슀트림, λžŒλ‹€λ₯Ό μ‚¬μš©ν•΄ ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ„ ν™œμš©ν•˜λŠ” 것이 주된 λͺ©ν‘œμž…λ‹ˆλ‹€. λ„€ 번째 λ―Έμ…˜μΈ μˆ˜κ°•μ‹ μ²­μ€ λ ˆκ±°μ‹œ μ½”λ“œλ₯Ό λ¦¬νŒ©ν„°λ§ ν•˜λŠ” 것이 주된 λͺ©ν‘œμž…λ‹ˆλ‹€. μ„Έ 번째 λ―Έμ…˜μΈ 사닀리 νƒ€κΈ°μ—μ„œ κ²½ν—˜ν•΄μ•Ό ν•  λͺ©ν‘œλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€. μžλ°” 8의 슀트림, λžŒλ‹€λ₯Ό ν™œμš©ν•œ ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ° In -> Out, Out -> In λ°©μ‹μœΌλ‘œ 도메인 객체λ₯Ό μ„€κ³„ν•˜λŠ” κ²½ν—˜ μ±…μž„ 주도 섀계 기반 μΈν„°νŽ˜μ΄μŠ€λ₯Ό ν™œμš©ν•œ ν”„λ‘œκ·Έλž˜λ° λ„€ 번째 λ―Έμ…˜μΈ μˆ˜κ°•μ‹ μ²­μ—μ„œ κ²½ν—˜ν•΄μ•Ό ν•  λͺ©ν‘œλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€. λ ˆκ±°μ‹œ μ½”λ“œλ₯Ό λ¦¬νŒ©ν„°λ§ ν•  λ•Œ ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό 톡해 λ³΄ν˜Έν•˜λŠ” κ²½ν—˜ Q&A μ„œλΉ„μŠ€μ˜ 질문 μ‚­μ œν•˜κΈ° κΈ°λŠ₯의 λ ˆκ±°μ‹œ μ½”λ“œλ₯Ό λ¦¬νŒ©ν„°λ§ν•˜λŠ” κ²½ν—˜ DB ν…Œμ΄λΈ”λ³΄λ‹€ 도메인 λͺ¨λΈμ„ TDD 기반으둜 λ¨Όμ € κ°œλ°œν•΄ λ³΄λŠ” κ²½ν—˜.. 2023. 8. 7.
TDD, 클린 μ½”λ“œ with Java (λ―Έμ…˜ 2. 둜또 - TDD) μ§€λ‚œλ²ˆ λ―Έμ…˜ 1. μžλ™μ°¨ κ²½μ£Ό - λ‹¨μœ„ ν…ŒμŠ€νŠΈλ₯Ό μ§„ν–‰ν•˜κ³ , μ΄μ–΄μ„œ λ―Έμ…˜ 2. 둜또λ₯Ό μ§„ν–‰ν–ˆμŠ΅λ‹ˆλ‹€. λ―Έμ…˜ 1λ³΄λ‹€λŠ” λΉ λ₯΄κ²Œ μ§„ν–‰ν–ˆμ§€λ§Œ, λͺ¨λ“  λ―Έμ…˜μ„ 끝내기 μœ„ν•΄μ„œλŠ” 쑰금 더 속도λ₯Ό λ‚΄μ•Όκ² λ„€μš”... 😭 1단계 - λ¬Έμžμ—΄ μ‹€μŠ΅ 1λ‹¨κ³„λŠ” κ°„λ‹¨ν•œ λ¬Έμžμ—΄ 사칙 μ—°μ‚° 계산기λ₯Ό κ΅¬ν˜„ν•˜λŠ” λ―Έμ…˜μž…λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ 2 + 3 * 4 / 2와 같은 λ¬Έμžμ—΄μ„ μž…λ ₯ν•  경우 2 + 3 * 4 / 2 μ‹€ν–‰ 결과인 10을 좜λ ₯ν•΄μ•Ό ν•©λ‹ˆλ‹€. 파일 λμ—λŠ” κ°œν–‰μ„ μΆ”κ°€ν•˜μž μ•„λž˜ 링크λ₯Ό μ°Έκ³ ν•΄ 보면 κ°œν–‰μ€ ν•˜λ‚˜μ˜ 행을 μ •μ˜ν•˜λŠ” ν‘œμ€€μœΌλ‘œ κ°œν–‰μ΄ μ—†λ‹€λ©΄ λλ‚˜μ§€ μ•Šμ€ ν–‰μœΌλ‘œ κ°„μ£Όν•˜κΈ° λ•Œλ¬Έμ— 파일의 λμ—λŠ” κ°œν–‰μ„ μΆ”κ°€ν•˜λŠ” 것이 μ’‹λ‹€κ³  ν•©λ‹ˆλ‹€. https://velog.io/@doondoony/posix-eol κ·Έλ™μ•ˆ 파일 끝에 κ°œν–‰μ„ μΆ”κ°€ν•˜λŠ” 것.. 2023. 5. 13.
TDD, 클린 μ½”λ“œ with Java (λ―Έμ…˜ 1. μžλ™μ°¨ κ²½μ£Ό - λ‹¨μœ„ ν…ŒμŠ€νŠΈ) 4μ›” μ΄ˆλΆ€ν„° NEXTSTEPμ—μ„œ μ§„ν–‰ν•˜λŠ” TDD, 클린 μ½”λ“œ with Java 과정을 λ“£κ³  μžˆμŠ΅λ‹ˆλ‹€. μž‘λ…„λΆ€ν„° 계속 λ“€μ–΄μ•Όκ² λ‹€κ³  μƒκ°ν•˜λ‹€κ°€ μ˜¬ν•΄ λ“£κ²Œ λ˜μ—ˆλŠ”λ°, 마침 λΉ„μŠ·ν•œ μ‹œκΈ°μ— λ²ˆμ•„μ›ƒμ΄ μ™€λ²„λ €μ„œ.. 😭 첫 번째 λ―Έμ…˜λ„ ꡉμž₯히 였래 κ±Έλ Έλ„€μš”. 😭😭 κ΅μœ‘μ—μ„œ μ§„ν–‰ν•œ λ―Έμ…˜λ“€μ„ ν† λŒ€λ‘œ 배운 λ‚΄μš© 및 ν”Όλ“œλ°±μ— λŒ€ν•΄ 정리해 보고자 ν•©λ‹ˆλ‹€. (ν˜Ήμ‹œ λ‹€λ₯΄κ²Œ μƒκ°ν•˜μ‹œλŠ” ν¬μΈνŠΈκ°€ μ‘΄μž¬ν•œλ‹€λ©΄, 말씀해 μ£Όμ‹œλ©΄ κ°μ‚¬ν•˜κ² μŠ΅λ‹ˆλ‹€ πŸ™) 첫 번째 λ―Έμ…˜μΈ μžλ™μ°¨ κ²½μ£Ό - λ‹¨μœ„ ν…ŒμŠ€νŠΈμ—λŠ” 총 5개의 λ―Έμ…˜μ΄ μ‘΄μž¬ν•˜κ³ , 각 λ―Έμ…˜λ§ˆλ‹€ μ½”λ“œλ₯Ό μž‘μ„±ν•˜μ—¬ PR을 보내면 리뷰어가 μ½”λ“œ 리뷰λ₯Ό ν•΄μ£ΌλŠ” μ‹μœΌλ‘œ 진행이 λ˜λŠ”λ°μš”, μžλ™μ°¨ κ²½μ£Ό λ―Έμ…˜μ„ μˆ˜ν–‰ν•˜λ©° λ°›μ•˜λ˜ 리뷰 및 μƒˆλ‘œ μ•Œκ²Œ 된 λ‚΄μš©λ“€μ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€. 1단계 - ν•™μŠ΅ ν…ŒμŠ€νŠΈ μ‹€μŠ΅ 1단계 λ―Έ.. 2023. 4. 25.
Java Map - compute(), computeIfAbsent(), computeIfPresent() Map μΈν„°νŽ˜μ΄μŠ€μ—μ„œ Java 8 버전에 μΆ”κ°€λœ 일뢀 API에 λŒ€ν•΄ μ‚΄νŽ΄λ΄…λ‹ˆλ‹€. putIfAbsent() compute() computeIfPresent() computeIfAbsent() getOrDefault() ν•΄λ‹Ή μ½”λ“œλŠ” Map μΈν„°νŽ˜μ΄μŠ€μ˜ κ΅¬ν˜„μ²΄μΈ HashMap을 κΈ°μ€€μœΌλ‘œ μ •λ¦¬ν•˜μ˜€μŠ΅λ‹ˆλ‹€. 1. putIfAbsent(K key, V value) putIfAbsent() λ©”μ„œλ“œλŠ” λ„€μ΄λ°μ—μ„œ μœ μΆ”ν•  수 μžˆλ“―μ΄, λ‹€μŒκ³Ό 같이 λ™μž‘ν•©λ‹ˆλ‹€. Keyκ°€ μ‘΄μž¬ν•  경우: Value λ³€κ²½ 없이 기쑴에 μ‘΄μž¬ν•˜λŠ” Key의 Valueλ₯Ό λ¦¬ν„΄ν•©λ‹ˆλ‹€. Keyκ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” 경우: Key에 ν•΄λ‹Ήν•˜λŠ” Valueλ₯Ό μ €μž₯ν•œ ν›„ null을 λ¦¬ν„΄ν•©λ‹ˆλ‹€. Map의 κ΅¬ν˜„μ²΄μΈ HashMap을 보면 putVal() λ©”μ„œλ“œλ₯Ό 톡해 μ§„ν–‰λ˜κ³ ,.. 2023. 3. 13.
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.
λ°˜μ‘ν˜•