λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
  • μž₯원읡 κΈ°μˆ λΈ”λ‘œκ·Έ

πŸ’Š Java & Kotlin & Spring53

Spring μ—μ„œ @Async λ₯Ό μ‚¬μš©ν•  λ•ŒλŠ” ThreadPoolTaskExecutor λ₯Ό λ“±λ‘ν•΄μ£Όμž TL;DR 이번 κΈ€μ˜ 핡심을 μš”μ•½ν•˜λ©΄ λ‹€μŒκ³Ό κ°™λ‹€ @Async 은? Spring μ—μ„œ 비동기 μž‘μ—…μ„ μ‰½κ²Œ μ‹€ν–‰ν•  수 μžˆλ„λ‘ λ„μ™€μ£ΌλŠ” κΈ°λŠ₯ μ™œ ThreadPoolTaskExecutor λ₯Ό 등둝해야 ν• κΉŒ? Spring 의 κΈ°λ³Έ 비동기 처리 Executor λŠ” 맀번 μƒˆλ‘œμš΄ thread λ₯Ό 생성 ThreadPool 을 μ΄μš©ν•  ν•„μš”κ°€ 있음 사전지식 Executor 와 ThreadPoolExecutor Spring 의 TaskExecutor ThreadPoolExecutor μ΄ν•΄ν•˜κΈ° μ •ν™•νžˆλŠ” ThreadPoolExecutor μ•ˆμ—μ„œ μ–΄λ–€ λ‘œμ§μ— μ˜ν•΄ μƒˆλ‘œμš΄ thread λ₯Ό λ§Œλ“œλŠ”μ§€ μ•Œμ•„μ•Ό 함 섀정에 따라 single thread 처럼 λ™μž‘ν•  수 있음 μ μ ˆν•œ ThreadPoolTaskExecutor 의 μ„€μ • κ°’ μ°ΎκΈ°.. 2024. 4. 17.
[Spring] ApplicationEventPublisher λ₯Ό μ΄μš©ν•΄μ„œ Event λ₯Ό λ°œν–‰ν•˜λ©΄ μ–΄λ–€ 일이 μΌμ–΄λ‚ κΉŒ ν•΄λ‹Ή κΈ€μ˜ 전체 μ†ŒμŠ€μ½”λ“œλŠ” github μ—μ„œ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€. README λ₯Ό μ°Έμ‘°ν•˜μ„Έμš” λͺ©μ°¨ 동기 There is No Magic in spring 동기 μ΅œκ·Όμ— DDD λ₯Ό ν•™μŠ΅ν•˜λ©΄μ„œ 도메인 μ΄λ²€νŠΈλΌλŠ” 것을 μ•Œκ²Œ λ˜μ—ˆλ‹€. κ·ΈλŸ¬λ©΄μ„œ Spring μ—μ„œ ν•œ VM μ•ˆμ—μ„œ 이벀트λ₯Ό λ°œν–‰ν•˜κ³  ν•΄λ‹Ή 이벀트λ₯Ό handling ν•˜λŠ” μ½”λ“œλ₯Ό μ ‘ν–ˆκ³ , 그와 κ΄€λ ¨ν•΄μ„œ μ—¬λŸ¬ μ‹€μŠ΅μ„ ν•΄λ³΄λ˜ 쀑 Spring μ—μ„œ 무언가 Magic 이 μΌμ–΄λ‚˜κ³  μžˆλŠ”κ²ƒ 같은 λŠλ‚Œμ„ λ°›μ•˜λ‹€. κΈ΄ 말 ν•„μš” 없이 μ•„λž˜μ˜ μ½”λ“œλ₯Ό ν™•μΈν•΄λ³΄μž. @Entity(name = "orders") public class Order { public static Order create() { return new Order(); } @Id private Long id; .. 2022. 8. 15.
[Distributed Tracing] Messaging ν™˜κ²½μ—μ„œμ˜ λΆ„μ‚° 좔적 μ‹€μŠ΅ λ³Έ 글은 λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€μ˜ λΆ„μ‚° 좔적 μ‹œλ¦¬μ¦ˆλ‘œ 이둠과 μ‹€μŠ΅μ΄ ν•¨κ»˜ ν¬ν•¨λœ μ‹œλ¦¬μ¦ˆμž…λ‹ˆλ‹€. μ•„λž˜ λͺ©μ°¨μ— ν‘œμ‹œλœ 글을 λͺ¨λ‘ μ°Έκ³ ν•˜λ©΄ μ’‹μŠ΅λ‹ˆλ‹€. λͺ©μ°¨ Distributed Tracing, λΆ„μ‚° μΆ”μ μ΄λž€? Spring Cloud Sleuth 와 Zipkin Sleuth 둜 Http ν™˜κ²½μ˜ λΆ„μ‚° 좔적 μ‹€μŠ΅ Sleuth 둜 Messaging ν™˜κ²½μ˜ λΆ„μ‚° 좔적 μ‹€μŠ΅ μ‹€μŠ΅μ— λŒ€ν•œ μ†ŒμŠ€μ½”λ“œλ₯Ό ν™•μΈν•˜μ‹œκ³  μ‹Άλ‹€λ©΄ μ‹€μŠ΅ githubμ—μ„œ ν™•μΈν•˜μ‹€ 수 μžˆμŠ΅λ‹ˆλ‹€. Messaging ν™˜κ²½ μ—μ„œμ˜ λΆ„μ‚° 좔적 μ‹€μŠ΅ μ§€λ‚œ μ‹œκ°„ μš°λ¦¬λŠ” HTTP ν™˜κ²½μ—μ„œμ˜ λΆ„μ‚° 좔적 에 λŒ€ν•΄μ„œ μ•Œμ•„λ³΄μ•˜λ‹€. λ‹€μ‹œ ν•œλ²ˆ 개랡적인 μ•„ν‚€ν…μ²˜μ— λŒ€ν•΄μ„œ ν™•μΈν•΄λ³΄μž μœ„ μ•„ν‚€ν…μ²˜λ₯Ό κ΅¬λΆ„ν•˜μžλ©΄ 2개의 λΆ€λΆ„μœΌλ‘œ λ‚˜λˆŒ 수 μžˆλ‹€. HTTP API Messaging μ΄λ²ˆμ—λŠ” HTTP.. 2022. 5. 1.
[Distributed Tracing] HTTP ν™˜κ²½μ—μ„œμ˜ λΆ„μ‚° 좔적 μ‹€μŠ΅ν•˜κΈ° λ³Έ 글은 λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€μ˜ λΆ„μ‚° 좔적 μ‹œλ¦¬μ¦ˆλ‘œ 이둠과 μ‹€μŠ΅μ΄ ν•¨κ»˜ ν¬ν•¨λœ μ‹œλ¦¬μ¦ˆμž…λ‹ˆλ‹€. μ•„λž˜ λͺ©μ°¨μ— ν‘œμ‹œλœ 글을 λͺ¨λ‘ μ°Έκ³ ν•˜λ©΄ μ’‹μŠ΅λ‹ˆλ‹€. λͺ©μ°¨ Distributed Tracing, λΆ„μ‚° μΆ”μ μ΄λž€? Spring Cloud Sleuth 와 Zipkin Sleuth 둜 Http ν™˜κ²½μ˜ λΆ„μ‚° 좔적 μ‹€μŠ΅ Sleuth 둜 Messaging ν™˜κ²½μ˜ λΆ„μ‚° 좔적 μ‹€μŠ΅ μ‹€μŠ΅μ— λŒ€ν•œ μ†ŒμŠ€μ½”λ“œλ₯Ό ν™•μΈν•˜μ‹œκ³  μ‹Άλ‹€λ©΄ μ‹€μŠ΅ githubμ—μ„œ ν™•μΈν•˜μ‹€ 수 μžˆμŠ΅λ‹ˆλ‹€. Spring Cloud Sleuth λ₯Ό μ΄μš©ν•œ HTTP ν™˜κ²½μ˜ λΆ„μ‚° 좔적 μ΄λ²ˆμ€ μ§€λ‚œ μ‹œκ°„μ— μ•Œμ•„λ³΄μ•˜λ˜ λΆ„μ‚° 좔적에 λŒ€ν•œ μ‹€μŠ΅μ„ 진행해보렀 ν•œλ‹€. μš°μ„  개랡적인 μ•„ν‚€ν…μ²˜λŠ” λ‹€μŒκ³Ό κ°™λ‹€ μœ„ μ•„ν‚€ν…μ²˜λ₯Ό κ΅¬λΆ„ν•˜μžλ©΄ 2개의 λΆ€λΆ„μœΌλ‘œ λ‚˜λˆŒ 수 μžˆλ‹€. HTTP API Messaging.. 2022. 5. 1.
λ‹€ν˜•μ„±μ„ μœ„ν•œ instanceof λ₯Ό Generic 으둜 μ œκ±°ν•˜λŠ” 방법 λͺ©μ°¨ μ„œλ‘  instanceof λž€? μ½”λ“œμ—μ„œ instanceof λ₯Ό 느껴보자 Generic 을 μ΄μš©ν•˜μ—¬ μš°μ•„ν•˜κ²Œ μ œκ±°ν•˜κΈ° κ·ΈλŸΌμ—λ„ μ‘΄μž¬ν•˜λŠ” 문제점 ν•˜μ§€λ§Œ? μ„œλ‘  μžλ°”μ—μ„œ λ‹€ν˜•μ„±μ„ μ΄μš©ν•œ 객체지ν–₯적 ν”„λ‘œκ·Έλž˜λ°μ„ ν•˜λ‹€λ³΄λ©΄ μ’…μ’… νŠΉμ • 객체가 μ§€μ •λœ μœ ν˜•μ˜ μΈμŠ€ν„΄μŠ€μΈμ§€ 확인해야 ν•˜λŠ” κ²½μš°κ°€ μžˆλ‹€. κ·Έ 경우 μš°λ¦¬λŠ” μ—¬λŸ¬κ°€μ§€ 선택지가 μžˆμ§€λ§Œ, μ˜€λŠ˜μ€ instanceof 에 λŒ€ν•΄ μ§‘μ€‘ν•˜κ³  이야기해보렀 ν•œλ‹€. λ‹€ν˜•μ„±μ„ μ΄μš©ν•œ ν”„λ‘œκ·Έλž˜λ°μ„ ν•˜λ‹€ 보면 νŠΉμ • ν˜•μœΌλ‘œ λ³€ν™˜ν•˜κΈ° μœ„ν•΄ λͺ‡κ°€μ§€ μž‘μ—…μ„ ν•΄μ•Ό ν•˜λŠ”λ°, 그쀑 λŒ€ν‘œμ μΈ 것이 λ°”λ‘œ instanceof μ—°μ‚°μžμ΄λ‹€. instanceof λž€? μ•žμ„œ λ§ν–ˆλ“― Java μ—μ„œλŠ” μ–΄λ–€ 객체의 νŠΉμ • type 에 λŒ€ν•΄μ„œ λ™μΌν•œ type 인지 확인할 수 μžˆλŠ” 연산을 instanceof μ—°μ‚°μž.. 2022. 4. 3.
[쑰금 더 κΉŠμ€ Java] JVM의 Runtime Data Area, Execution Engine, Garbage Collection 에 λŒ€ν•΄μ„œ μžλ°”λ₯Ό κ³΅λΆ€ν•΄λ³΄μ•˜λ‹€λ©΄ 읡히 λ“€μ—ˆμ„ JVM, Java Virtual Machine 에 λŒ€ν•΄μ„œ 이야기해보렀 ν•œλ‹€. λ§‰μ—°ν•˜κ²Œ JVM 이 λ™μž‘ν•˜κ³  JVM이 있기 λ•Œλ¬Έμ— ν”Œλž«νΌμ— 독립적이며 Garbage Collection 으둜 μž₯점을 얻을 수 μžˆλ‹€κ³  μƒκ°ν•˜λŠ” μ‚¬λžŒλ“€μ΄ λ§Žμ„ 것이닀. μ˜€λŠ˜μ€ JRE의 κ΅¬μ„±μš”μ†ŒμΈ JVM이 μ–΄λ–»κ²Œ κ΅¬μ„±λ˜κ³  Garbage Collection 이 μ–΄λ–€ λ°©μ‹μœΌλ‘œ λ™μž‘ν•˜λŠ”μ§€ μ•Œμ•„λ³Ό 것이닀. JVM μ΄λž€? μ§€λ‚œ 2번의 μ‹œκ°„μ— 거쳐 μš°λ¦¬λŠ” Java Bytecode와 Java ClassLoader 에 λŒ€ν•΄μ„œ μ•Œμ•„λ³΄μ•˜λ‹€. μ§€λ‚œ μ‹œκ°„μ—λŠ” μ–΄λ–»κ²Œ μžλ°” 파일이 μ»΄νŒŒμΌλ˜μ–΄ 클래슀 파일둜 λ³€ν™˜μ΄ 되고, μ–΄λ–»κ²Œ ν΄λž˜μŠ€λ‘œλ”μ— μ˜ν•΄μ„œ 동적 적재되며 verification 을 μˆ˜ν–‰ν•˜λŠ”μ§€ μ•Œμ•„λ³΄μ•˜λ‹€. μ˜€λŠ˜μ€ κ·Έ 이후.. 2021. 12. 5.