Avatar
πŸ˜‰

Organizations

  • Null Safetyλž€ 무엇인가? κ°œλ…λΆ€ν„° μ‹€μ „ μ˜ˆμ‹œκΉŒμ§€

    1. Null Safety의 μ •μ˜

    **Null Safety(널 μ•ˆμ „μ„±)**λž€ ν”„λ‘œκ·Έλž¨μ΄ μ‹€ν–‰λ˜λŠ” 도쀑에 null(ν˜Ήμ€ nil, None λ“± 언어별 λͺ…칭은 λ‹€λ₯΄μ§€λ§Œ “값이 μ—†μŒ"을 μ˜λ―Έν•˜λŠ” 특수 κ°’)을 μ°Έμ‘°ν•¨μœΌλ‘œμ¨ λ°œμƒν•˜λŠ” 였λ₯˜λ₯Ό **컴파일 νƒ€μž„(μ½”λ“œ μž‘μ„± μ‹œμ )**에 미리 λ°©μ§€ν•˜λ„λ‘ μ„€κ³„λœ 언어적 κΈ°λŠ₯ λ˜λŠ” ν”„λ‘œκ·Έλž˜λ° 원칙을 λ§ν•©λ‹ˆλ‹€.

    κ°€μž₯ λŒ€ν‘œμ μΈ λ¬Έμ œκ°€ λ°”λ‘œ NullPointerException(NPE) μž…λ‹ˆλ‹€. μžλ°”μ˜ μ°½μ‹œμž 쀑 ν•œ λͺ…인 ν† λ‹ˆ ν˜Έμ–΄(Tony Hoare)λŠ” 1965λ…„ Null μ°Έμ‘°λ₯Ό 발λͺ…ν•œ 것을 두고 슀슀둜 “10μ–΅ λ‹¬λŸ¬μ§œλ¦¬ μ‹€μˆ˜(Billion Dollar Mistake)” 라고 ν‘œν˜„ν•  μ •λ„λ‘œ, null둜 μΈν•œ λ²„κ·ΈλŠ” μ†Œν”„νŠΈμ›¨μ–΄ 개발 μ—­μ‚¬μ—μ„œ κ°€μž₯ ν”ν•˜κ³  λΉ„μš©μ΄ 큰 였λ₯˜ 쀑 ν•˜λ‚˜μ˜€μŠ΅λ‹ˆλ‹€.

    null-safety kotlin swift typescript java Created Mon, 13 Jul 2026 11:00:00 +0900
  • Spring Boot 4.0이 2025λ…„ 11μ›” 20일 GA(General Availability, 정식 μ•ˆμ • 버전) 둜 μΆœμ‹œλ˜μ—ˆμŠ΅λ‹ˆλ‹€. Spring Boot 3.5.x λŒ€λΉ„ κ½€ 큰 λ³€ν™”κ°€ μžˆμ–΄, μ£Όμš” 차이점을 μš©μ–΄ μ„€λͺ…κ³Ό ν•¨κ»˜ μ •λ¦¬ν–ˆμŠ΅λ‹ˆλ‹€.


    릴리즈 & 지원 μ£ΌκΈ°

    Spring Boot 3.5.x Spring Boot 4.0
    μƒνƒœ μ•ˆμ • 버전 GA (2025.11.20 μΆœμ‹œ)
    OSS 지원 μ’…λ£Œ 2026λ…„ 6μ›” ν˜„μž¬ ν™œμ„± 지원 쀑

    ⚠️ Spring Boot 3.5.xλŠ” 2026λ…„ 6월에 지원이 μ’…λ£Œλ©λ‹ˆλ‹€. ν”„λ‘œλ•μ…˜ μ„œλΉ„μŠ€λΌλ©΄ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ κ³„νšμ„ 미리 μ„Έμ›Œλ‘λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.


    Java & ν”Œλž«νΌ κΈ°μ€€μ„ 

    • Java μ΅œμ†Œ μš”κ΅¬ 버전: 17 (3.5와 동일)
    • Java 25 first-class 지원 μΆ”κ°€ β€” AOT 컴파일 및 GraalVM λ„€μ΄ν‹°λΈŒ 이미지가 Java 25 κΈ°μ€€μœΌλ‘œ ν…ŒμŠ€νŠΈλ¨
    • Jakarta EE 기쀀이 11둜 상ν–₯ β†’ Hibernate 7.x, Bean Validation 3.1, Tomcat 11 ν•„μˆ˜

    ⚠️ javax.* μž„ν¬νŠΈκ°€ 아직 λ‚¨μ•„μžˆλ‹€λ©΄ μ „λΆ€ jakarta.*둜 ꡐ체해야 ν•©λ‹ˆλ‹€.

    Java Spring Boot Spring Backend Created Tue, 16 Jun 2026 20:20:45 +0900
  • 1. Charset vs Collation, 뭐가 λ‹€λ₯ΌκΉŒ?

    Character Set(λ¬Έμžμ…‹) 은 “μ–΄λ–€ λ¬Έμžλ“€μ„ μ €μž₯ν•  수 μžˆλŠ”κ°€"λ₯Ό μ •μ˜ν•©λ‹ˆλ‹€. utf8mb4λŠ” 이λͺ¨μ§€ 포함 λͺ¨λ“  μœ λ‹ˆμ½”λ“œ 문자λ₯Ό μ΅œλŒ€ 4λ°”μ΄νŠΈλ‘œ μ €μž₯ν•©λ‹ˆλ‹€.

    Collation(μ½œλ ˆμ΄μ…˜) 은 “λ¬Έμžλ“€μ„ μ–΄λ–»κ²Œ λΉ„κ΅ν•˜κ³  μ •λ ¬ν•˜λŠ”κ°€"λ₯Ό μ •μ˜ν•©λ‹ˆλ‹€. 'A' = 'a'인지, 'Γ€'κ°€ 'a'와 κ°™κ²Œ μ·¨κΈ‰λ˜λŠ”μ§€, ν•œκΈ€μ΄ 사전 순으둜 μ •λ ¬λ˜λŠ”μ§€λ₯Ό κ²°μ •ν•˜λŠ” κ·œμΉ™ μ§‘ν•©μž…λ‹ˆλ‹€.

    핡심 관계: λͺ¨λ“  Collation은 νŠΉμ • Charset에 μ’…μ†λ©λ‹ˆλ‹€. utf8mb4_unicode_ciλŠ” utf8mb4 charsetμ—μ„œλ§Œ μ‚¬μš© κ°€λŠ₯ν•©λ‹ˆλ‹€.

    -- charsetκ³Ό collation의 관계 확인
    SHOW COLLATION
    WHERE Charset = 'utf8mb4'
      AND Collation LIKE '%general%';
    

    2. Collation 이름은 μ–΄λ–»κ²Œ μ½λ‚˜?

    Collation 이름은 μ΅œλŒ€ 4개 파트둜 κ΅¬μ„±λ©λ‹ˆλ‹€. κ·œμΉ™μ„ μ•Œλ©΄ 처음 λ³΄λŠ” 이름도 λ°”λ‘œ 해석할 수 μžˆμŠ΅λ‹ˆλ‹€.

    MySQL Database Charset Collation Created Wed, 10 Jun 2026 20:20:45 +0900
  • λΆ„μ‚° μ‹œμŠ€ν…œμ—μ„œ μ—¬λŸ¬ λŒ€μ˜ μ„œλ²„κ°€ λ™μΌν•œ μžμ›μ— λ™μ‹œμ— μ ‘κ·Όν•  λ•Œ, λ°μ΄ν„°μ˜ 일관성을 μœ μ§€ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•˜λŠ” 기술이 λ°”λ‘œ **뢄산락(Distributed Lock)**μž…λ‹ˆλ‹€.

    단일 μ„œλ²„ ν™˜κ²½μ—μ„œλŠ” synchronizedλ‚˜ ReentrantLock 같은 μžλ°” ν‘œμ€€ API둜 λ™μ‹œμ„±μ„ μ œμ–΄ν•  수 μžˆμ§€λ§Œ, μ„œλ²„κ°€ μ—¬λŸ¬ λŒ€λΌλ©΄ 각 μ„œλ²„μ˜ 둜컬 락은 μ„œλ‘œλ₯Ό μ•Œμ§€ λͺ»ν•©λ‹ˆλ‹€. μ΄λ•Œ λͺ¨λ“  μ„œλ²„κ°€ κ³΅ν†΅μœΌλ‘œ λ°”λΌλ³΄λŠ” μ™ΈλΆ€ μ €μž₯μ†Œλ₯Ό ν™œμš©ν•΄ “λˆ„κ°€ μžμ›μ„ μ„ μ ν–ˆλŠ”μ§€"λ₯Ό κΈ°λ‘ν•˜λŠ” 것이 ν•΅μ‹¬μž…λ‹ˆλ‹€.


    1. 뢄산락이 ν•„μš”ν•œ 이유

    λ™μΌν•œ DB λ ˆμ½”λ“œμ— λŒ€ν•΄ μ—¬λŸ¬ μΈμŠ€ν„΄μŠ€κ°€ λ™μ‹œμ— μˆ˜μ • μš”μ²­μ„ 보낼 λ•Œ, **레이슀 μ»¨λ””μ…˜(Race Condition)**이 λ°œμƒν•˜μ—¬ 데이터가 꼬일 수 μžˆμŠ΅λ‹ˆλ‹€.

    Created Fri, 13 Feb 2026 11:14:05 +0900
  • Redisλ₯Ό ν™œμš©ν•œ λ©”μ‹œμ§• μ‹œμŠ€ν…œμ˜ 두 κΈ°λŠ₯은 λͺ¨λ‘ “데이터λ₯Ό μ „λ‹¬ν•œλ‹€"λŠ” λͺ©μ μ€ κ°™μ§€λ§Œ, **μ² ν•™(Philosophy)**κ³Ό 데이터 보쑴 λ°©μ‹μ—μ„œ 결정적인 차이가 μžˆμŠ΅λ‹ˆλ‹€.

    ν•œλ§ˆλ””λ‘œ μš”μ•½ν•˜μžλ©΄: **Pub/Sub은 ‘방솑’**이고, **StreamsλŠ” ‘기둝이 λ‚¨λŠ” 둜그’**μž…λ‹ˆλ‹€.


    1. Redis Pub/Sub (Publish/Subscribe)

    κ°€μž₯ 전톡적인 ν˜•νƒœμ˜ λ©”μ‹œμ§• λͺ¨λΈμž…λ‹ˆλ‹€. λ°œμ‹ μžκ°€ λ©”μ‹œμ§€λ₯Ό λ˜μ§€λ©΄, κ·Έ μˆœκ°„ μ—°κ²°λ˜μ–΄ μžˆλŠ” λͺ¨λ“  μˆ˜μ‹ μžμ—κ²Œ μ‹€μ‹œκ°„μœΌλ‘œ μ „λ‹¬λ©λ‹ˆλ‹€.

    • νœ˜λ°œμ„± (Fire and Forget): λ©”μ‹œμ§€λ₯Ό 보낸 ν›„ 어디에도 μ €μž₯ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μˆ˜μ‹ μžκ°€ μ˜€ν”„λΌμΈ μƒνƒœλΌλ©΄ κ·Έ λ©”μ‹œμ§€λŠ” μ˜μ›νžˆ μ‚¬λΌμ§‘λ‹ˆλ‹€.
    • μ‹€μ‹œκ°„μ„±: μ§€μ—° μ‹œκ°„μ΄ 거의 μ—†μ–΄ μ‹€μ‹œκ°„ μ•Œλ¦Όμ΄λ‚˜ μ±„νŒ…μ— μ ν•©ν•©λ‹ˆλ‹€.
    • νŒ¬μ•„μ›ƒ(Fan-out): ν•˜λ‚˜μ˜ λ©”μ‹œμ§€λ₯Ό 수천 λͺ…μ˜ κ΅¬λ…μžμ—κ²Œ λ™μ‹œμ— 뿌릴 λ•Œ 맀우 νš¨μœ¨μ μž…λ‹ˆλ‹€.

    2. Redis Streams

    Kafka와 μœ μ‚¬ν•œ κΈ°λŠ₯을 Redis에 κ΅¬ν˜„ν•œ λͺ¨λΈμž…λ‹ˆλ‹€. λ‹¨μˆœ 전달을 λ„˜μ–΄ λ°μ΄ν„°μ˜ ‘이λ ₯’을 κ΄€λ¦¬ν•©λ‹ˆλ‹€.

    Created Thu, 12 Feb 2026 11:14:05 +0900
  • Spring Boot(λ˜λŠ” Java)μ—μ„œ Future νŒ¨ν„΄μ€ 비동기 ν”„λ‘œκ·Έλž˜λ°μ„ μœ„ν•œ 핡심 λ””μžμΈ νŒ¨ν„΄μž…λ‹ˆλ‹€. μ‰½κ²Œ 말해, **“μ§€κΈˆ λ‹Ήμž₯ κ²°κ³Όλ₯Ό 쀄 μˆ˜λŠ” μ—†μ§€λ§Œ, 미래의 μ–΄λŠ μ‹œμ μ— μž‘μ—…μ΄ μ™„λ£Œλ˜λ©΄ 결과물을 λ„˜κ²¨μ£Όκ² λ‹€”**λŠ” 약속(Promise)κ³Ό κ°™μŠ΅λ‹ˆλ‹€.


    1. Future νŒ¨ν„΄μ˜ 핡심 κ°œλ…

    일반적인 동기(Synchronous) λ°©μ‹μ—μ„œλŠ” μž‘μ—…μ΄ 끝날 λ•ŒκΉŒμ§€ μŠ€λ ˆλ“œκ°€ 아무것도 λͺ» ν•˜κ³  κΈ°λ‹€λ €μ•Ό ν•©λ‹ˆλ‹€(Blocking). 반면, Future νŒ¨ν„΄μ„ μ‚¬μš©ν•˜λ©΄ μž‘μ—…μ„ λ³„λ„μ˜ μŠ€λ ˆλ“œμ— λ§‘κΈ°κ³  메인 μŠ€λ ˆλ“œλŠ” 자기 ν•  일을 계속할 수 μžˆμŠ΅λ‹ˆλ‹€.

    μ£Όμš” νŠΉμ§•

    • 비차단(Non-blocking): κ²°κ³Όκ°€ λ‚˜μ˜¬ λ•ŒκΉŒμ§€ 기닀리지 μ•Šκ³  λ‹€λ₯Έ μž‘μ—…μ„ μˆ˜ν–‰ν•  수 μžˆμ–΄ νš¨μœ¨μ μž…λ‹ˆλ‹€.
    • μ§€μ—° μ‹€ν–‰: κ²°κ³Όκ°€ μ‹€μ œλ‘œ ν•„μš”ν•œ μ‹œμ κΉŒμ§€ 데이터 계산을 λ―Έλ£° 수 μžˆμŠ΅λ‹ˆλ‹€.
    • κ²°ν•©μ„±: μ—¬λŸ¬ 비동기 μž‘μ—…μ˜ κ²°κ³Όλ₯Ό ν•©μΉ˜κ±°λ‚˜, 순차적으둜 μ‹€ν–‰ν•˜λŠ” 흐름을 λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€.

    2. Spring Bootμ—μ„œμ˜ κ΅¬ν˜„ 방식

    Spring Bootμ—μ„œλŠ” 주둜 CompletableFuture와 @Async μ–΄λ…Έν…Œμ΄μ…˜μ„ μ‘°ν•©ν•˜μ—¬ 이 νŒ¨ν„΄μ„ κ΅¬ν˜„ν•©λ‹ˆλ‹€.

    Created Tue, 27 Jan 2026 11:25:18 +0900
Next