πŸ˜€
fistkim TECH BLOG
  • Intro
  • κ°•μ˜
    • Reactive Programming in Modern Java using Project Reactor
      • Reactor execution model 1
      • Reactor execution model 2
      • Reactor execution model 3 - parallelism
      • Reactor execution model 4 - overview
      • Transform
      • Combine
      • Side Effect Methods
      • Exception/Error handling
      • retry, retryWhen, repeat
      • BackPressure
      • Cold & Hot Streams
    • NEXTSTEP ν΄λ¦°μ½”λ“œ with java 9κΈ°
      • μ •λ¦¬λ…ΈνŠΈ
    • NEXTSTEP DDD μ„Έλ ˆλ‚˜λ° 2κΈ°
      • CH01 도메인 주도 섀계 이해
      • CH02 크게 μ†Œλ¦¬ λ‚΄μ–΄ λͺ¨λΈλ§ ν•˜κΈ°
      • CH03 도메인 주도 섀계 κΈ°λ³Έ μš”μ†Œ
      • CH04 도메인 주도 섀계 μ•„ν‚€ν…μ²˜
      • CH05 도메인 이벀트
    • NEXTSTEP 인프라 곡방 1κΈ°
      • 망 λΆ„λ¦¬ν•˜κΈ°
      • 톡신 ν™•μΈν•˜κΈ°
      • 도컀 μ»¨ν…Œμ΄λ„ˆ μ΄ν•΄ν•˜κΈ°
      • [λ―Έμ…˜ 1] μ„œλΉ„μŠ€ κ΅¬μ„±ν•˜κΈ° μ‹€μŠ΅
      • [λ―Έμ…˜ 2] μ„œλΉ„μŠ€ λ°°ν¬ν•˜κΈ° μ‹€μŠ΅
      • μ„œλ²„ μ§„λ‹¨ν•˜κΈ°
      • μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜ μ§„λ‹¨ν•˜κΈ°
      • [λ―Έμ…˜ 3] μ„œλΉ„μŠ€ μš΄μ˜ν•˜κΈ°
      • μ›Ή μ„±λŠ₯ μ§„λ‹¨ν•˜κΈ°
      • λΆ€ν•˜ ν…ŒμŠ€νŠΈ
      • k6
      • [λ―Έμ…˜ 4] μ„±λŠ₯ ν…ŒμŠ€νŠΈ
      • λ¦¬λ²„μŠ€ ν”„λ‘μ‹œ κ°œμ„ ν•˜κΈ°
      • 캐싱 ν™œμš©ν•˜κΈ°
      • [λ―Έμ…˜ 5] ν™”λ©΄ 응닡 κ°œμ„ ν•˜κΈ°
      • Redis Annotation 및 μ„€μ •
      • 인덱슀 μ΄ν•΄ν•˜κΈ° & DB νŠœλ‹
      • [λ―Έμ…˜ 6-1] 쑰회 μ„±λŠ₯ κ°œμ„ ν•˜κΈ°
      • [λ―Έμ…˜ 6-2] DB 이쀑화 적용
    • NEXTSTEP λ§Œλ“€λ©΄μ„œ λ°°μš°λŠ” Spring 3κΈ°
      • CH01 μ˜¬λ°”λ₯Έ λ°©ν–₯ 바라보기
      • CH02 HTTP 이해 - μ›Ή μ„œλ²„ κ΅¬ν˜„
        • HTTP νŒŒμ‹±
        • HTTP μ›Ή μ„œλ²„ κ΅¬ν˜„
      • CH03 MVC - @MVC ν”„λ ˆμž„μ›Œν¬ κ΅¬ν˜„
        • Servlet λ‹€μ‹œ 짚기
        • Cookie, Session λ‹€μ‹œ 짚기
        • MVC ν”„λ ˆμž„μ›Œν¬ κ΅¬ν˜„
      • CH04 λ‚˜λ§Œμ˜ 라이브러리 κ΅¬ν˜„
      • CH05 DI - DI ν”„λ ˆμž„μ›Œν¬ κ΅¬ν˜„
      • CH06 Aspect OP
    • μŠ€ν”„λ§ μ‹œνλ¦¬ν‹°
      • μŠ€ν”„λ§ μ‹œνλ¦¬ν‹° μ•„ν‚€ν…μ²˜
      • WebAsyncManagerIntegrationFilter
      • SecurityContextPersistenceFilter
      • HeaderWriterFilter
      • CsrfFilter
      • (+) μŠ€ν”„λ§ μ‹œνλ¦¬ν‹° + JWT
      • (+) 마치며
    • 더 μžλ°”, μ½”λ“œλ₯Ό μ‘°μž‘ν•˜λŠ” λ‹€μ–‘ν•œ 방법
      • CH01 JVM μ΄ν•΄ν•˜κΈ°
      • (+) 클래슀 λ‘œλ” μ΄ν•΄ν•˜κΈ°
      • CH02 λ°”μ΄νŠΈ μ½”λ“œ 뢄석 및 μ‘°μž‘
      • (+) jacoco
      • CH03 λ¦¬ν”Œλ ‰μ…˜
      • CH04 λ‹€μ΄λ‚˜λ―Ή ν”„λ‘μ‹œ
      • CH05 μ• λ…Έν…Œμ΄μ…˜ ν”„λ‘œμ„Έμ„œ
    • 더 μžλ°”, μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ ν…ŒμŠ€νŠΈν•˜λŠ” λ‹€μ–‘ν•œ 방법
      • CH01 JUnit 5
      • CH02 Mockito
      • (+) Spy vs Mock
      • CH03 도컀와 ν…ŒμŠ€νŠΈ
      • CH04 μ„±λŠ₯ ν…ŒμŠ€νŠΈ
      • (+) VisualVM
      • (+) ν…ŒμŠ€νŠΈ μžλ™ν™”
      • CH05 운영 이슈 ν…ŒμŠ€νŠΈ
      • CH06 μ•„ν‚€ν…μ²˜ ν…ŒμŠ€νŠΈ
    • λͺ¨λ“  개발자λ₯Ό μœ„ν•œ HTTP μ›Ή κΈ°λ³Έ 지식
      • CH01 인터넷 λ„€νŠΈμ›Œν¬
      • CH02 HTTP κΈ°λ³Έ
      • CH03 HTTP λ©”μ„œλ“œ 속성
      • CH04 HTTP λ©”μ„œλ“œ ν™œμš©
      • CH05 HTTP μƒνƒœμ½”λ“œ
      • CH06 HTTP 헀더1 - 일반 헀더
      • CH07 HTTP 헀더2 - μΊμ‹œμ™€ 쑰건뢀 μš”μ²­
      • (+) HTTPS 원리
    • μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬ 핡심 기술
      • CH01 IOC μ»¨ν…Œμ΄λ„ˆ
      • CH02 AOP
      • (+) μŠ€ν”„λ§ μ˜μ‘΄μ„± 관리
      • (+) μƒμ„±μž μ£Όμž… μž₯점
    • μ½”λ”©μœΌλ‘œ ν•™μŠ΅ν•˜λŠ” GoF의 λ””μžμΈ νŒ¨ν„΄
      • 객체 생성
        • 싱글톀 νŒ¨ν„΄
        • νŒ©ν† λ¦¬ λ©”μ†Œλ“œ νŒ¨ν„΄
        • 좔상 νŒ©ν† λ¦¬ νŒ¨ν„΄
        • λΉŒλ” νŒ¨ν„΄
        • ν”„λ‘œν† νƒ€μž… νŒ¨ν„΄
      • ꡬ쑰
        • μ–΄λŒ‘ν„° νŒ¨ν„΄
        • λΈŒλ¦Ώμ§€ νŒ¨ν„΄
        • 컴포짓 νŒ¨ν„΄
      • 행동
        • (μž‘μ„±μ€‘)
    • μ‹€μ „ Querydsl
      • CH01 ν”„λ‘œμ νŠΈ ν™˜κ²½κ΅¬μ„±
      • CH02 예제 도메인 λͺ¨λΈ
      • CH03 기본문법
      • CH04 쀑급 문법
      • CH05 μ‹€λ¬΄ν™œμš© (μŠ€ν”„λ§ 데이터 JPA와 Querydsl)
      • CH06 μŠ€ν”„λ§λ°μ΄ν„°JPA κ°€ μ œκ³΅ν•˜λŠ” Querydsl κΈ°λŠ₯
      • (+) 별칭(alias)
      • (+) Slice 쿼리
    • μŠ€ν”„λ§ 데이터 JPA
      • CH01 ν•΅μ‹¬κ°œλ…μ΄ν•΄ 1
      • CH02 ν•΅μ‹¬κ°œλ…μ΄ν•΄ 2
      • CH03 ν•΅μ‹¬κ°œλ…μ΄ν•΄ 3
      • CH04 Spring Data Common
      • CH05 Spring Data JPA
    • μ‹€μ „! μŠ€ν”„λ§ λΆ€νŠΈμ™€ JPA ν™œμš©2 - API 개발과 μ„±λŠ₯ μ΅œμ ν™”
      • CH01 μ§€μ—° λ‘œλ”©κ³Ό 쑰회 μ„±λŠ₯ μ΅œμ ν™”
      • CH02 μ»¬λ ‰μ…˜ 쑰회 μ΅œμ ν™”
      • CH03 전체 정리
    • 초보λ₯Ό μœ„ν•œ μΏ λ²„λ„€ν‹°μŠ€ μ•ˆλ‚΄μ„œ
      • CH01 μΏ λ²„λ„€ν‹°μŠ€ μ‹œμž‘ν•˜κΈ°
      • CH02 μΏ λ²„λ„€ν‹°μŠ€ μ•Œμ•„λ³΄κΈ°
      • CH03 μΏ λ²„λ„€ν‹°μŠ€ μ‹€μŠ΅ μ€€λΉ„
      • CH04 μΏ λ²„λ„€ν‹°μŠ€ κΈ°λ³Έ μ‹€μŠ΅
    • Flutter Provider Essential
      • CH01 Introduction
      • CH02 Provider Overview
      • CH03 TODO App
      • CH04 Weather App
      • CH05 Firebase Authentication App
    • Flutter Bloc Essential
      • CH01 Introduction
      • CH02 Bloc Overview
      • CH03 TODO App
      • CH04 Weather App
      • CH05 Firebase Authentication App
    • Flutter Advanced Course - Clean Architecture With MVVM
      • CH01 Introduction
      • CH02 Clean Architecture 4 Layer
      • CH03 MVVM
      • CH04 Data Layer
      • (+) Data Layer - response to model
      • (+) Data Layer - Network
      • CH05 Domain Layer
      • CH06 Presentation Layer
      • CH07 Application Layer
      • (+) Application Layer - l10n
      • (+) Application Layer - DI
      • (+) Application Layer - environment
    • μžλ°” μ•Œκ³ λ¦¬μ¦˜ μž…λ¬Έ
      • CH01 λ¬Έμžμ—΄
      • CH02 Array(1, 2 차원 λ°°μ—΄)
      • CH03 Two pointers, Sliding window[νš¨μœ¨μ„±: O(n^2)-->O(n)]
      • CH04 HashMap, TreeSet (해쉬, 정렬지원 Set)
      • CH05 Stack, Queue(자료ꡬ쑰)
      • CH06 Sorting and Searching(μ •λ ¬, 이뢄검색과 κ²°μ •μ•Œκ³ λ¦¬μ¦˜)
      • CH07 Recursive, Tree, Graph(DFS, BFS 기초)
      • CH08 DFS, BFS ν™œμš©
      • CH09 Greedy Algorithm
      • CH10 dynamic programming(λ™μ κ³„νšλ²•)
  • λ„μ„œ
    • λ§Œλ“€λ©΄μ„œ λ°°μš°λŠ” 클린 μ•„ν‚€ν…μ²˜
      • ν•™μŠ΅λͺ©ν‘œ
      • CH01 κ³„μΈ΅ν˜• μ•„ν‚€ν…μ²˜μ˜ λ¬Έμ œλŠ” λ¬΄μ—‡μΌκΉŒ?
      • CH02 μ˜μ‘΄μ„± μ—­μ „ν•˜κΈ°
      • CH03 μ½”λ“œ κ΅¬μ„±ν•˜κΈ°
      • CH04 μœ μŠ€μΌ€μ΄μŠ€ κ΅¬ν˜„ν•˜κΈ°
      • CH05 μ›Ή μ–΄λŒ‘ν„° κ΅¬ν˜„ν•˜κΈ°
      • CH06 μ˜μ†μ„± μ–΄λŒ‘ν„° κ΅¬ν˜„ν•˜κΈ°
      • CH07 μ•„ν‚€ν…μ²˜ μš”μ†Œ ν…ŒμŠ€νŠΈν•˜κΈ°
      • CH08 경계 κ°„ λ§€ν•‘ν•˜κΈ°
      • CH09 μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜ μ‘°λ¦½ν•˜κΈ°
      • CH10 μ•„ν‚€ν…μ²˜ 경계 κ°•μ œν•˜κΈ°
      • CH11 μ˜μ‹μ μœΌλ‘œ 지름길 μ‚¬μš©ν•˜κΈ°
      • CH12 μ•„ν‚€ν…μ²˜ μŠ€νƒ€μΌ κ²°μ •ν•˜κΈ°
    • 클린 μ•„ν‚€ν…μ²˜
      • λ“€μ–΄κ°€λ©°
      • 1λΆ€ μ†Œκ°œ
        • 1μž₯ 섀계와 μ•„ν‚€ν…μ²˜λž€?
        • 2μž₯ 두 κ°€μ§€ κ°€μΉ˜μ— λŒ€ν•œ 이야기
      • 2λΆ€ λ²½λŒλΆ€ν„° μ‹œμž‘ν•˜κΈ°: ν”„λ‘œκ·Έλž˜λ° νŒ¨λŸ¬λ‹€μž„
        • 3μž₯ νŒ¨λŸ¬λ‹€μž„ κ°œμš”
        • 4μž₯ ꡬ쑰적 ν”„λ‘œκ·Έλž˜λ°
        • 5μž₯ 객체 μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ°
        • 6μž₯ ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°
      • 3λΆ€ 섀계 원칙
        • 7μž₯ SRP: 단일 μ±…μž„ 원칙
        • 8μž₯ OCP: 개방-폐쇄 원칙
        • 9μž₯ LSP: λ¦¬μŠ€μ½”ν”„ μΉ˜ν™˜ 원칙
        • 10μž₯ ISP: μΈν„°νŽ˜μ΄μŠ€ 뢄리 원칙
        • 11μž₯ DIP: μ˜μ‘΄μ„± μ—­μ „ 원칙
      • 4λΆ€ μ»΄ν¬λ„ŒνŠΈ 원칙
        • 12μž₯ μ»΄ν¬λ„ŒνŠΈ
        • 13μž₯ μ»΄ν¬λ„ŒνŠΈ 응집도
        • 14μž₯ μ»΄ν¬λ„ŒνŠΈ κ²°ν•©
      • 5λΆ€
        • 15μž₯ μ•„ν‚€ν…μ²˜λž€?
    • μŠ€ν”„λ§ μž…λ¬Έμ„ μœ„ν•œ μžλ°” 객체 μ§€ν–₯의 원리와 이해
      • CH01 μ‚¬λžŒμ„ μ‚¬λž‘ν•œ 기술
      • CH02 μžλ°”μ™€ 절차적/ꡬ쑰적 ν”„λ‘œκ·Έλž˜λ°
      • CH03 μžλ°”μ™€ 객체 μ§€ν–₯
      • (+) μžλ°” μ½”λ“œ 싀행에 λ”°λ₯Έ λ©”λͺ¨λ¦¬ μ μž¬κ³Όμ •
      • CH04 μžλ°”κ°€ ν™•μž₯ν•œ 객체 μ§€ν–₯
      • CH05 객체 μ§€ν–₯ 섀계 5 원칙 - SOLID
      • CH06 μŠ€ν”„λ§μ΄ μ‚¬λž‘ν•œ λ””μžμΈ νŒ¨ν„΄
      • CH07 μŠ€ν”„λ§ μ‚Όκ°ν˜•κ³Ό μ„€μ • 정보
      • (뢀둝) λžŒλ‹€(lambda)
    • 객체지ν–₯의 사싀과 μ˜€ν•΄
      • CH01 ν˜‘λ ₯ν•˜λŠ” κ°μ²΄λ“€μ˜ 곡동체
      • CH02 μ΄μƒν•œ λ‚˜λΌμ˜ 객체
      • CH03 νƒ€μž…κ³Ό 좔상화
      • CH04 μ—­ν• , μ±…μž„, ν˜‘λ ₯
      • CH05 μ±…μž„κ³Ό λ©”μ‹œμ§€
      • CH06 객체 지도
      • CH07 ν•¨κ»˜ λͺ¨μœΌκΈ°
      • (+) μΈν„°νŽ˜μ΄μŠ€ κ°œλ… λ°”λ‘œμž‘κΈ°
    • 도메인 주도 개발 μ‹œμž‘ν•˜κΈ°
      • CH01 도메인 λͺ¨λΈ μ‹œμž‘ν•˜κΈ°
      • CH02 μ•„ν‚€ν…μ²˜ κ°œμš”
      • CH03 μ• κ·Έλ¦¬κ±°νŠΈ
      • CH04 리포지터리와 λͺ¨λΈ κ΅¬ν˜„
      • CH05 μŠ€ν”„λ§ 데이터 JPAλ₯Ό μ΄μš©ν•œ 쑰회 κΈ°λŠ₯
      • CH06 μ‘μš© μ„œλΉ„μŠ€μ™€ ν‘œν˜„ μ˜μ—­
      • CH07 도메인 μ„œλΉ„μŠ€
      • CH08 μ• κ·Έλ¦¬κ±°νŠΈ νŠΈλžœμž­μ…˜ 관리
      • CH09 도메인 λͺ¨λΈκ³Ό λ°”μš΄λ””λ“œ μ»¨ν…μŠ€νŠΈ
      • CH10 이벀트
      • CH11 CQRS
    • μžλ°” ORM ν‘œμ€€ JPA ν”„λ‘œκ·Έλž˜λ°
      • CH01 JPA μ†Œκ°œ
      • CH02 JPA μ‹œμž‘
      • CH03 μ˜μ†μ„± 관리
      • CH04 μ—”ν‹°ν‹° λ§€ν•‘
      • CH05 연관관계 λ§€ν•‘ 기초
      • CH06 λ‹€μ–‘ν•œ 연관관계 λ§€ν•‘
      • CH07 κ³ κΈ‰ λ§€ν•‘
      • CH08 ν”„λ‘μ‹œμ™€ 연관관계 관리
      • CH09 κ°’ νƒ€μž…
      • CH10 객체지ν–₯ 쿼리 μ–Έμ–΄
      • CH11 μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ œμž‘
      • CH12 μŠ€ν”„λ§ 데이터 JPA
      • CH13 μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜κ³Ό μ˜μ†μ„± 관리
      • CH14 μ»¬λ ‰μ…˜κ³Ό λΆ€κ°€ κΈ°λŠ₯
      • CH15 κ³ κΈ‰ μ£Όμ œμ™€ μ„±λŠ₯ μ΅œμ ν™”
      • CH16 νŠΈλžœμž­μ…˜κ³Ό 락, 2μ°¨ μΊμ‹œ
    • μ†Œν”„νŠΈμ›¨μ–΄ 세상을 μ—¬λŠ” 컴퓨터과학
      • CH01 컴퓨터 κ³Όν•™ μ†Œκ°œ
      • CH02 데이터 ν‘œν˜„κ³Ό λ””μ§€ν„Έ 논리
    • μ΄νŽ™ν‹°λΈŒ μžλ°”
      • 1 μž₯ λ“€μ–΄κ°€κΈ°
      • 2μž₯ 객체 생성과 파괴
        • [01] μƒμ„±μž λŒ€μ‹  정적 νŒ©ν„°λ¦¬ λ©”μ„œλ“œλ₯Ό κ³ λ €ν•˜λΌ
        • [02] μƒμ„±μžμ— λ§€κ°œλ³€μˆ˜κ°€ λ§Žλ‹€λ©΄ λΉŒλ”λ₯Ό κ³ λ €ν•˜λΌ
        • [03] private μƒμ„±μžλ‚˜ μ—΄κ±° νƒ€μž…μœΌλ‘œ μ‹±κΈ€ν„΄μž„μ„ λ³΄μ¦ν•˜λΌ
        • [04] μΈμŠ€ν„΄μŠ€ν™”λ₯Ό λ§‰μœΌλ €κ±°λ“  private μƒμ„±μžλ₯Ό μ‚¬μš©ν•˜λΌ
        • [05] μžμ›μ„ 직접 λͺ…μ‹œν•˜μ§€ 말고 의쑴 객체 μ£Όμž…μ„ μ‚¬μš©ν•˜λΌ
        • [06] λΆˆν•„μš”ν•œ 객체 생성을 ν”Όν•˜λΌ
        • [07] λ‹€ μ“΄ 객체 μ°Έμ‘°λ₯Ό ν•΄μ œν•˜λΌ
        • [08] finalizer 와 cleaner μ‚¬μš©μ„ ν”Όν•˜λΌ
        • [09] try-finally λ³΄λ‹€λŠ” try-with-resources λ₯Ό μ‚¬μš©ν•˜λΌ
      • 3μž₯ λͺ¨λ“  객체의 곡톡 λ©”μ„œλ“œ
        • [10] equalsλŠ” 일반 κ·œμ•½μ„ μ§€μΌœ μž¬μ •μ˜ν•˜λΌ
        • [11] equals λ₯Ό μž¬μ •μ˜ν•˜λ €κ±°λ“  hashCode도 μž¬μ •μ˜ν•˜λΌ
        • [12] toString 을 항상 μž¬μ •μ˜ν•˜λΌ
        • [13] clone μž¬μ •μ˜λŠ” μ£Όμ˜ν•΄μ„œ μ§„ν–‰ν•˜λΌ
        • [14] Comparable 을 κ΅¬ν˜„ν• μ§€ κ³ λ €ν•˜λΌ
      • 4μž₯ ν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€
        • [15] ν΄λž˜μŠ€μ™€ λ©€λ²„μ˜ μ ‘κ·Ό κΆŒν•œμ„ μ΅œμ†Œν™”ν•˜λΌ
  • ν† ν”½
    • μ„œλ²„ λͺ¨λ‹ˆν„°λ§
      • CPU μ‚¬μš©λŸ‰
      • λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰
      • μŠ€λ ˆλ“œ ν’€
    • Spring Boot Monitoring
      • Spring actuator
      • Spring eureka
      • Prometheus
      • grafana
      • Spring actuator + Prometheus + grafana
    • JAVA 데일리 ν† ν”½
      • λ©”λͺ¨λ¦¬ λˆ„μˆ˜(memory leak)
      • 객체 참쑰의 μœ ν˜•
      • μ»€μŠ€ν…€ μŠ€λ ˆλ“œ ν’€
      • Mark And Compact
      • serialVersionUID μ΄ν•΄ν•˜κΈ°
      • ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€
      • λ©”μ†Œλ“œ μ°Έμ‘°
      • equals()와 hashCode()κ°€ 무엇이고 역할이 무엇인지
      • StringBuffer vs StringBuilder
      • String vs StringBuilder, StringBuffer
      • String interning
    • JAVA GC
    • ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ 문제 ν’€κΈ°
      • ν•΄μ‹œ
      • μŠ€νƒ/큐
      • νž™(Heap)
      • μ •λ ¬
      • 완전탐색
      • DFS/BFS
    • λ°μ΄ν„°λ² μ΄μŠ€ ꡬ성 및 μž‘λ™ 흐름
    • λ°μ΄ν„°λ² μ΄μŠ€ JOIN 원리
    • 객체지ν–₯μƒν™œμ²΄μ‘° 원칙
    • μƒνƒœ(state), 상속(inheritance), ν•©μ„±(composition) 의 상관관계
    • java enum은 λ©”λͺ¨λ¦¬μ— μ–Έμ œ, μ–΄λ–»κ²Œ ν• λ‹Ήλ˜λŠ”κ°€
    • Checked Exception vs UnChecked Exception
    • Reactive Streams 원리탐ꡬ - κ°„λ‹¨ν•œ 예제 직접 μž‘μ„±ν•΄λ³΄κΈ°
    • Flutter Basic
    • Flutter StatefulWidget 생λͺ…μ£ΌκΈ°
    • Flutter κ°€ μœ„μ ―μ„ κ·Έλ¦¬λŠ” 원리
    • Flutter 클린 μ•„ν‚€ν…μ²˜
      • application layer
        • νŒ¨ν‚€μ§€ ꡬ쑰 및 λ ˆμ΄μ–΄ μ„€λͺ…
        • environment
        • dependency injection
        • go_router
        • foreground & background
        • λ‹€κ΅­μ–΄μ²˜λ¦¬ (l10n, i18n)
        • Global 처리(μ‹œμŠ€ν…œ 점검, fore->back λ“±)
        • connection_manager
        • permission_manager
        • push_notification_manager
        • firebase 연동
      • data layer
        • νŒ¨ν‚€μ§€ ꡬ쑰 및 λ ˆμ΄μ–΄ μ„€λͺ…
        • network
        • repository
      • domain layer
        • νŒ¨ν‚€μ§€ ꡬ쑰 및 λ ˆμ΄μ–΄ μ„€λͺ…
      • presentation layer
        • νŒ¨ν‚€μ§€ ꡬ쑰 및 λ ˆμ΄μ–΄ μ„€λͺ…
        • resources
    • 기술 κ΄€λ ¨ ν¬μŠ€νŒ… 읽기
  • 기타
    • μž‘μ—…μΌμ§€
      • 2023. 10
      • 2023. 09
      • 2023. 08
      • 2023. 07
      • 2023. 06
      • 2023. 05
      • 2023. 04
      • 2023. 03
      • 2023. 02
      • 2023. 01
      • 2022. 12
    • Business Model
      • 아이디어 뢈패의 법칙
      • λ¦° λͺ¨λ°”일 μ•± 개발
      • λ¦° μŠ€νƒ€νŠΈμ—…
      • μ œλ‘œνˆ¬μ›
      • MIT μŠ€νƒ€νŠΈμ—… 바이블
      • λ¦°μΉ˜ν•€
    • 백둜그 μ’…ν•©
Powered by GitBook
On this page
  • ν”ŒλŸ¬ν„°κ°€ Dart λ₯Ό μ‚¬μš©ν•˜λŠ” 이유
  • ν”ŒλŸ¬ν„°μ˜ μž₯점(= λ¦¬μ•‘νŠΈ λ„€μ΄ν‹°λΈŒμ™€ λΉ„κ΅ν•˜μ—¬)
  • λͺ¨λ“  것이 μœ„μ ―
  • StatelessWidget vs StatefulWidget
  • StatelessWidget
  • StatefulWidget
  • StatefulWidget μœ„μ ― 생λͺ… μ£ΌκΈ°
  • ν”ŒλŸ¬ν„° λ Œλ”λ§ λ™μž‘ 원리
  • μœ„μ ― 트리 μ™„μ„±
  • λ ˆμ΄μ•„μ›ƒ 처리(μœ„μ—μ„œ μ•„λž˜λ‘œ β€˜μ œμ•½β€™ μ „νŒŒ -> μ•„λž˜μ—μ„œ μœ„λ‘œ β€˜ν¬κΈ°β€™ μ„€μ •)
  • 쑰립
  • Rasterization
  1. ν† ν”½

Flutter Basic

PreviousReactive Streams 원리탐ꡬ - κ°„λ‹¨ν•œ 예제 직접 μž‘μ„±ν•΄λ³΄κΈ°NextFlutter StatefulWidget 생λͺ…μ£ΌκΈ°

Last updated 1 year ago

ν”ŒλŸ¬ν„°κ°€ Dart λ₯Ό μ‚¬μš©ν•˜λŠ” 이유

에 λŒ€ν•΄μ„œ 잘 μ •λ¦¬λœ 글에도 λ‚˜μ™€μžˆκ³  책에도 λ‚˜μ™€μžˆλ“―μ΄ λ‹€νŠΈκ°€ , λͺ¨λ‘λ₯Ό μ§€μ›ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.

ν”ŒλŸ¬ν„°μ˜ μž₯점(= λ¦¬μ•‘νŠΈ λ„€μ΄ν‹°λΈŒμ™€ λΉ„κ΅ν•˜μ—¬)

μ±…μ—μ„œλŠ” β€˜μžμ²΄ λ Œλ”λ§ 엔진을 νƒ‘μž¬ν•˜κ³  있고, λ°”λ‘œ ARM μ½”λ“œλ‘œ 컴파일 ν•œλ‹€.β€™λŠ” μž₯점 덕뢄에 β€˜μ•±μ΄ λ„€μ΄ν‹°λΈŒλ‘œ κ΅¬λ™β€™λ˜λ©° λ¦¬μ•‘νŠΈ λ„€μ΄ν‹°λΈŒμ²˜λŸΌ μžλ°” 슀크립트 λΈŒλ¦Ώμ§€μ™€ 같은 쀑간 계측이 ν•„μš”κ°€ μ—†λ‹€κ³  ν•˜κ³  μžˆλ‹€.

μ—μ„œ 이와 κ΄€λ ¨λœ μ—¬λŸ¬ λ‚΄μš©λ“€μ„ 확인할 수 μžˆλŠ”λ° λͺ‡λͺ‡ ν‘œν˜„λ§Œ 봐도 같은 λ§₯λ½μ—μ„œ μ„€λͺ…ν•˜κ³  μžˆλ‹€.

Flutter is a cross-platform UI toolkit that is designed to allow code reuse across operating systems such as iOS and Android, while also allowing applications to interface directly with underlying platform services.

During development, Flutter apps run in a VM that offers stateful hot reload of changes without needing a full recompile. For release, Flutter apps are compiled directly to machine code, whether Intel x64 or ARM instructions, or to JavaScript if targeting the web.

To the underlying operating system, Flutter applications are packaged in the same way as any other native application. A platform-specific embedder provides an entrypoint; coordinates with the underlying operating system for access to services like rendering surfaces, accessibility, and input; and manages the message event loop.

μ „μ²΄μ μœΌλ‘œ ν•œ λ§ˆλ””λ‘œ μš”μ•½ν•˜μžλ©΄ ν”ŒλŸ¬ν„°λŠ” μ–΄λŠ ν”Œλž«νΌμ΄λ“  ν•΄λ‹Ή ν”Œλž«νΌμ—μ„œ λ™μž‘ν•˜λŠ” native application 처럼 νŒ¨ν‚€μ§•λ˜κ³  ν•΄λ‹Ή ν”Œλž«νΌμ˜ μ„œλΉ„μŠ€λ“€κ³Ό μ§μ ‘μ μœΌλ‘œ λ§žλ‹Ώμ•„ λ™μž‘ν•˜λ„λ‘ μ„€κ³„λ˜μ—ˆλ‹€λŠ” 것이닀.

λ°˜λŒ€λ‘œ λ¦¬μ•‘νŠΈ λ„€μ΄ν‹°λΈŒμ˜ 경우 Javascript bridge λ₯Ό κ°€μš΄λ°μ— 두고 ν”Œλž«νΌ μ„œλΉ„μŠ€λ“€κ³Ό ν˜‘λ ₯ν•΄μ•Όν•΄μ„œ κ³„μ†λ˜λŠ” 이벀트 λ“±μ—μ„œ λΉ„μš©μ΄ 크닀. μ΄λŸ¬ν•œ 듀은 μ •λ¦¬λœ λΈ”λ‘œκ·Έκ°€ λ§Žμ•„μ„œ 링크만 남긴닀.

λͺ¨λ“  것이 μœ„μ ―

ν”ŒλŸ¬ν„°λŠ” λͺ¨λ“  것이 μœ„μ ―μ΄λ©° μœ„μ ―μ˜ μ‘°ν•©μœΌλ‘œ UIλ₯Ό κ΅¬μ„±ν•œλ‹€. ν”ŒλŸ¬ν„°μ— λ‹€λ₯Έ 객체가 μ—†λ‹€λŠ” 뜻이 μ•„λ‹ˆκ³ , 앱을 κ΅¬μ„±ν•˜λŠ” λͺ¨λ“  ꡬ성듀이 μœ„μ ― ν˜Ήμ€ μœ„μ ―μœΌλ‘œ μ‘°ν•©λœ μœ„μ ―μ΄λΌλŠ” λœ»μ—μ„œ β€˜λͺ¨λ“  것이 μœ„μ ―β€™μ΄λΌλŠ” λœ»μ΄λ‹€.

μ—¬κΈ°μ„œ β€˜μ‘°ν•©β€™μ„ 잘 κΈ°μ–΅ν•΄μ•Όν•˜λŠ” 것이, ν”ŒλŸ¬ν„°μ—μ„œλŠ” 기본적으둜 β€˜μƒμ†β€™μ΄ μ•„λ‹Œ β€˜μ‘°ν•©β€™μ„ ν†΅ν•΄μ„œ μœ„μ ―μ„ κ΅¬μ„±ν•œλ‹€. 예λ₯Ό λ“€μ–΄ Button μœΌλ‘œμ„œ 곡톡 κΈ°λŠ₯, μ»€μŠ€ν…€ κΈ°λŠ₯이 λ‘˜ λ‹€ ν•„μš”ν•œ κ²½μš°μ— 일반적으둜 객체 μ§€ν–₯ λ°©μ‹μœΌλ‘œ κ³΅ν†΅λ˜λŠ” λΆ€λͺ¨ Button 을 λ§Œλ“€κ³  이λ₯Ό μƒμ†λ°›μ•„μ„œ μ»€μŠ€ν…€ Button 을 λ§Œλ“œλŠ”κ²Œ μ•„λ‹ˆλΌ μ»€μŠ€ν…€ Button 에 곡톡 Button 을 β€˜μ‘°ν•©β€™ν•΄μ„œ κ΅¬ν˜„ν•΄μ•Ό ν•œλ‹€.

StatelessWidget vs StatefulWidget

StatelessWidget

StatelessWidget 은 ν”„λ ˆμž„μ›Œν¬μ— κ·Έ μ–΄λ–€ 것도 μ•Œλ¦¬μ§€ μ•ŠλŠ”λ‹€. ν”„λ ˆμž„μ›Œν¬μ—μ„œ μœ„μ ―μ— μ–Έμ œ λ¦¬λΉŒλ“œ ν•΄μ•Όν•˜λŠ”μ§€ μ•Œλ €μ€€λ‹€. μ² μ €ν•˜κ²Œ μ™ΈλΆ€(=ν”„λ ˆμž„μ›Œν¬)에 μ˜ν•΄μ„œ 생λͺ…이 κ²°μ •(β€˜μƒλͺ…이 결정’ λœλ‹€λŠ” 말은 μœ„μ ―μ˜ 생λͺ…μ£ΌκΈ°κ°€ μˆ˜λ™μ μœΌλ‘œ λ°œμƒν•œλ‹€λŠ” μ˜λ―Έμ΄λ‹€.)λœλ‹€.

μˆ˜λ™μ μœΌλ‘œ μ² μ €νžˆ μ •μ˜λœ κΈ°λŠ₯을 μˆ˜ν–‰ν•œλ‹€. 즉, μƒνƒœκ°€ μ—†λŠ” μœ„μ ―μœΌλ‘œμ„œ μƒˆλ‘œμš΄ 정보에 λ°˜μ‘(react)ν•œλ‹€.

StatefulWidget

StatefulWidget 은 항상 State 객체λ₯Ό κ°–λŠ”λ‹€. State κ°μ²΄λŠ” setState()λž€λŠ” λ©”μ„œλ“œλ₯Ό κ°–κ³  μžˆλŠ”λ°, μœ„μ ―μ„ λ‹€μ‹œ 그렀야함을 ν”ŒλŸ¬ν„°μ— μ•Œλ¦¬λŠ” κΈ°λŠ₯을 μˆ˜ν–‰ν•œλ‹€. 이 ν¬μΈνŠΈμ—μ„œ StatelessWidget 와 크게 κ΅¬λ³„λœλ‹€. StatelessWidget λŠ” ν”„λ ˆμž„μ›Œν¬μ— μ˜μ‚¬ν‘œν˜„μ„ ν•  수 μ—†λŠ”λ° λ°˜ν•΄, StatefulWidget λŠ” μ–Έμ œ μœ„μ ―μ„ λ‹€μ‹œ κ·Έλ €μ•Όν•˜λŠ”μ§€μ— λŒ€ν•΄μ„œ ν”„λ ˆμž„μ›Œν¬μ— μœ„μ ―μ΄ λ°œμ–ΈκΆŒμ„ κ°€μ§€κ³  μžˆλŠ” 것이닀.

setState() 이 λ°œμƒν•  경우 ν•΄λ‹Ή μœ„μ ― 뿐만 μ•„λ‹ˆλΌ ν•΄λ‹Ή μœ„μ ―μ— μ˜μ‘΄ν•˜λŠ” λͺ¨λ“  μœ„μ ―μ„ λ‹€μ‹œ κ·Έλ €μ•Όν•œλ‹€κ³  ν”„λ ˆμž„μ›Œν¬μ— μ§€μ‹œν•œλ‹€.

StatefulWidget μœ„μ ― 생λͺ… μ£ΌκΈ°

좜처: https://betterprogramming.pub/stateful-widget-lifecycle-a01c44dc89b0

didUpdateWidget() Gets called if the parent widget changes its configuration and has to rebuild the widget. The framework gives you the old widget as an argument that you can use to compare it with the new widget. Flutter will call the build() method after it. Tip: Use this method if you need to compare the new widget to the old one.

@override
void didUpdateWidget(covariant MyHomePage oldWidget) {
  super.didUpdateWidget(oldWidget);
  // TODO: implement didUpdateWidget
}

setState() This method is often called from the Flutter framework itself and from the developer. The setState() method notifies the framework that the internal state of the current object is β€œdirty”, which means that it has been changed in a way that might impact the UI. After this notification, the framework will call the build() method to update and rebuild a widget. Tip: Whenever you change the internal state of a State object, make that change in the setState() method.

setState(() {
        // implement setState
        });

ν”ŒλŸ¬ν„° λ Œλ”λ§ λ™μž‘ 원리

ν”ŒλŸ¬ν„°κ°€ μœ„μ ―μ„ 화면에 λ Œλ”λ§ ν•˜κΈ°κΉŒμ§€ λ§Žμ€ 과정을 κ±°μΉœλ‹€. 이λ₯Ό μžμ„Ένžˆ μ•Œμ•„λ³΄λŠ” μ±•ν„°μ˜€λ‹€. λ Œλ”λ§ ν•˜κΈ°κΉŒμ§€μ˜ 과정은 μ•„λž˜μ™€ κ°™λ‹€.

μœ„μ ― 트리 μ™„μ„± -> λ ˆμ΄μ•„μ›ƒ 처리(μœ„μ—μ„œ μ•„λž˜λ‘œ β€˜μ œμ•½β€™ μ „νŒŒ -> μ•„λž˜μ—μ„œ μœ„λ‘œ β€˜ν¬κΈ°β€™ μ„€μ •) -> 쑰립 -> Rasterization

좜처 : Flutter In Action

  • μ œμ•½ : μžμ‹ λ…Έλ“œμ•Ό. λ„ˆλŠ” μ΅œλŒ€ 50px λ„ˆλΉ„λ₯Ό κ°€μ§ˆ 수 있고 ν™”λ©΄ ν•˜λ‹¨μ˜ μ ˆλ°˜μ„ μ°¨μ§€ν•  수 μžˆμ–΄.

  • 크기 : λΆ€λͺ¨ λ…Έλ“œλ‹˜. μ €λŠ” 25 x 25 px 을 μ°¨μ§€ν•˜κΈ°λ‘œ κ²°μ •ν–ˆκ³ , μ™Όμͺ½ μœ„ μ‹œμ μ μ€ (200, 30) μ΄μ—μš”.

μœ„μ ― 트리 μ™„μ„±

화면을 κ΅¬μ„±ν•˜λŠ” μœ„μ ―λ“€ 자체의 정보와 μœ„μ ―κ°„μ˜ 정보가 λ‹΄κΈ΄ μœ„μ ― 트리λ₯Ό λ§Œλ“ λ‹€.

λ ˆμ΄μ•„μ›ƒ 처리(μœ„μ—μ„œ μ•„λž˜λ‘œ β€˜μ œμ•½β€™ μ „νŒŒ -> μ•„λž˜μ—μ„œ μœ„λ‘œ β€˜ν¬κΈ°β€™ μ„€μ •)

μœ„μ ― νŠΈλ¦¬κ°€ μ™„μ„±λ˜λ©΄ μœ„μ—μ„œ μ•„λž˜λ‘œ(λΆ€λͺ¨μ—μ„œ μžμ‹ λ°©ν–₯으둜) β€˜μ œμ•½β€™μ΄ μ „νŒŒλœλ‹€. β€˜μ œμ•½β€™μ΄ λͺ¨λ‘ μ „νŒŒλ˜κ³  μ•„λž˜μ—μ„œ μœ„λ‘œ(μžμ‹μ—μ„œ λΆ€λͺ¨ λ°©ν–₯으둜) β€˜ν¬κΈ°β€™κ°€ μ „νŒŒλœλ‹€.

쑰립

μœ„μ ― 트리 μ™„μ„± 및 λ ˆμ΄μ•„μ›ƒ μ²˜λ¦¬κ°€ λͺ¨λ‘ λλ‚˜κ³  λ°”λ‘œ λž˜μŠ€ν„°λΌμ΄μ§•ν•˜μ§€ μ•Šκ³ , β€˜μ‘°λ¦½β€™μ˜ 과정을 κ±°μΉœλ‹€. 이 κ³Όμ •μ—μ„œ μœ„μ ―μ€ μ‹€μ œ μžμ‹ μ΄ μ²˜λ¦¬ν•  ν”½μ…€μ˜ 수λ₯Ό μ•Œκ²Œ λœλ‹€. 그리고 이 κ³Όμ •μ—μ„œ 기쑴의 μ»΄ν¬λ„ŒνŠΈλ₯Ό μž¬μ‚¬μš©μ²˜λ¦¬ ν•˜κ²Œ λœλ‹€.

Rasterization

에 μ•„μ£Ό μžμ„Ένžˆ 각 생λͺ…μ£ΌκΈ° λ©”μ„œλ“œμ— λŒ€ν•΄ 정리가 λ˜μ–΄ μžˆλ‹€. 이 쀑 didUpdateWidget(), setState() 이 같은 계측에 μžˆμ–΄ 쑰금 더 ν™•μ‹€ν•˜κ²Œ ꡬ뢄 해두면 쒋을 것 κ°™μ•„μ„œ λ”°λ‘œ μ•„λž˜μ— 적어둔닀.

단어 μžμ²΄κ°€ μ˜λ―Έν•˜λŠ” κ·ΈλŒ€λ‘œμ˜ ν–‰μœ„μ΄λ‹€. ν”ŒλŸ¬ν„° 자체 λ Œλ”λ§ 엔진을 ν†΅ν•΄μ„œ 픽셀을 μ±„μš°λŠ” 과정이닀.

ν”ŒλŸ¬ν„°κ°€ Dart λ₯Ό μ‚¬μš©ν•˜λŠ” 이유
JIT 컴파일
AOT 컴파일
κ³΅μ‹λ¬Έμ„œμ—μ„œ μ„€λͺ…ν•˜κ³  μžˆλŠ” μ•„ν‚€ν…μ²˜
λ¦¬μ•‘νŠΈ λ„€μ΄ν‹°λΈŒ ꡬ동방식 및 단점
StatefulWidget μœ„μ ― 생λͺ… μ£ΌκΈ° 이미지 μΆœμ²˜μ΄κΈ°λ„ ν•œ ν¬μŠ€νŒ…
Rasterization