πŸ˜€
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
  • Mockito 에 λŒ€ν•œ μ§€κΈˆμ˜ 생각(κ²°λ‘ : μ΅œλŒ€ν•œ μ“°μ§€ 말자)
  • Mockito μ†Œκ°œ
  • mock
  • Mockito
  • Mock 객체 λ§Œλ“œλŠ” 방법
  • Mockito.mock() λ©”μ†Œλ“œλ‘œ λ§Œλ“œλŠ” 방법
  • @Mock μ• λ…Έν…Œμ΄μ…˜μœΌλ‘œ λ§Œλ“œλŠ” 방법
  • Mock 객체 μ‘°μž‘ν•˜κΈ°
  • BDD μŠ€νƒ€μΌ Mockito API
  1. κ°•μ˜
  2. 더 μžλ°”, μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ ν…ŒμŠ€νŠΈν•˜λŠ” λ‹€μ–‘ν•œ 방법

CH02 Mockito

PreviousCH01 JUnit 5Next(+) Spy vs Mock

Last updated 1 year ago

Mockito 에 λŒ€ν•œ μ§€κΈˆμ˜ 생각(κ²°λ‘ : μ΅œλŒ€ν•œ μ“°μ§€ 말자)

이 κ°•μ˜ 자체λ₯Ό κ½€ μ˜ˆμ „μ— λ“€μ—ˆλ˜ 것이고, μ•„λž˜ λ…ΈνŠΈλ„ κ·Έ λ•Œ μ •λ¦¬ν–ˆλ˜ 것이닀. λ‹Ήμ‹œμ—λŠ” ν…ŒμŠ€νŠΈλ₯Ό ν•  λ•Œ ν•„μš”ν•œ λΆ€λΆ„μ—μ„œ mock 객체 등을 ν™œμš©ν•΄μ„œ ν…ŒμŠ€νŠΈλ₯Ό 더 μ‰½κ²Œ ν•  수 μžˆμ–΄μ„œ μ’‹λ‹€κ³  μƒκ°ν–ˆλŠ”λ° 사싀 μ§€κΈˆμ€ 생각이 μ’€ λ°”λ€Œμ—ˆλ‹€.

mock 을 μ΄μš©ν•΄μ„œ μ–΄λ– ν•œ 객체의 행동을 μ‘°μž‘ν•œλ‹€λŠ” 것 μžμ²΄κ°€ μ‘°μž‘ λΉ„μš©μ΄ λ„ˆλ¬΄ 큰 일이닀. λ­”κ°€κ°€ λ°”λ€Œλ©΄ 이 μ‘°μž‘κΉŒμ§€ λͺ¨λ‘ λ°”κΏ”μ€˜μ•Όν•˜λŠ”λ°, μ‘°μž‘μ΄ 클 수둝 μˆ˜μ • λΉ„μš©μ΄ 맀우 크닀. λ‚΄κ°€ μ§œλ“ , λ‹€λ₯Έ μ‚¬λžŒμ΄ μ§œλ†“μ€ μ½”λ“œλ“  ν…ŒμŠ€νŠΈ ν•˜κ³ μž ν•˜λŠ” λͺ¨λ“ˆ ν˜Ήμ€ λ©”μ†Œλ“œκ°€ ν”ΌμΉ˜ λͺ»ν•˜κ²Œ κ½€ λ§Žμ€ 일듀을 ν•˜λ„λ‘ μ²˜λ¦¬ν•΄ λ‘” κ²½μš°μ— μ–΄λ–€ μ˜λ„λœ ν…ŒμŠ€νŠΈλ₯Ό μœ„ν•΄μ„œ 쀑간에 μ‘°μž‘μ„ ν•  게 λ„ˆλ¬΄ λ§Žλ‹€.

그런데 λ‚΄κ°€ λ§ν•˜κ³ μž ν•˜λŠ” 것은 λͺ¨ν‚Ή μžμ²΄κ°€ μˆ˜μ •λΉ„μš©μ΄ ν¬λ‹ˆκΉŒ μ•ˆμ’‹λ‹€λŠ” 이야기λ₯Ό ν•˜λ €λŠ” 것이 μ•„λ‹ˆκ³  μ• μ΄ˆμ— λͺ¨ν‚Ήμ„ 많이 ν•΄μ•Όν•  μ •λ„λ‘œ ν…ŒμŠ€νŠΈ λ‹¨μœ„κ°€ μ»€μ„œλŠ” μ•ˆλ˜κ³ , 그러기 μœ„ν•΄μ„œλŠ” μ„€κ³„μ‹œ 객체의 μ±…μž„κ³Ό μ—­ν•  λ²”μœ„κ°€ μ΅œλŒ€ν•œ μž‘μ•„μ•Όν•œλ‹€λŠ” 것이닀.

객체의 ν˜‘λ ₯ ꡬ쑰λ₯Ό μ΅œλŒ€ν•œ μͺΌκ°œμ„œ 섀계λ₯Ό 해두면 λ­”κ°€ νŠΉμ • λ‹¨μœ„μ˜ ν…ŒμŠ€νŠΈλ₯Ό ν•  λ•Œ ν•„μš”ν•œ μ‘°μž‘ ν–‰μœ„κ°€ 맀우 μ μ–΄μ§€κ±°λ‚˜ μ•„μ˜ˆ ν•„μš”κ°€ μ—†μ–΄μ§„λ‹€. 그리고 Mockito λ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šκ³  ν…ŒμŠ€νŠΈ μŠ€μ½”ν”„μ—μ„œ DIP λ₯Ό μ μš©ν•  μˆ˜λ„ μžˆλ‹€. κ·Έλ ‡κ²Œ 섀계λ₯Ό 잘 해두면 λœλ‹€.

μ•žμœΌλ‘œ 마주칠 κΈ°μ‘΄ λ ˆκ±°μ‹œ ν”„λ‘œμ νŠΈ ν˜Ήμ€ λ‚΄κ°€ λ§Œλ“œλŠ” μƒˆλ‘œμš΄ ν”„λ‘œμ νŠΈ λͺ¨λ‘ μ–΄λ–»κ²Œ λ μ§€λŠ” λͺ¨λ₯΄κ² κ³ , λ‚΄ 생각도 μ–΄λ–»κ²Œ λ°”λ€”μ§€ λͺ¨λ₯΄κ² μ§€λ§Œ μ§€κΈˆμœΌλ‘œμ„œλŠ” Mockito 자체λ₯Ό κ·Έλƒ₯ μ“Έ 일이 μ—†κ²Œλ” 섀계뢀터 μ΅œλŒ€ν•œ μ‹ κ²½μ“°μžλŠ” 것이 μ§€κΈˆμ˜ λ‚˜μ˜ 생각이닀.

Mockito μ†Œκ°œ

mock

단어 μžμ²΄κ°€ 'κ°€μ§œμ˜' 와 같은 λœ»μ„ κ°€μ§€κ³  μžˆλ‹€. ν…ŒμŠ€νŠΈμ—μ„œ 'λͺ© 객체' 와 같은 λ‹¨μ–΄λ‘œ 자주 μ‚¬μš©λ˜λŠ” κ°œλ…μ΄λ‹€. ν…ŒμŠ€νŠΈλ₯Ό μœ„ν•œ λ”λ―Έμ˜ κ°œλ…μ΄λ‹€.

곡식 ν™ˆνŽ˜μ΄μ§€ μ†Œκ°œ κ·ΈλŒ€λ‘œλ₯Ό μΈμš©ν•œλ‹€.

Tasty mocking framework for unit tests in Java

Mock 객체 λ§Œλ“œλŠ” 방법

Mockito.mock() λ©”μ†Œλ“œλ‘œ λ§Œλ“œλŠ” 방법

MemberService memberService = mock(MemberService.class);
StudyRepository studyRepository = mock(StudyRepository.class);

@Mock μ• λ…Έν…Œμ΄μ…˜μœΌλ‘œ λ§Œλ“œλŠ” 방법

  • JUnit 5 extension으둜 MockitoExtension을 μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.

  • λ©”μ†Œλ“œ λ§€κ°œλ³€μˆ˜μ—μ„œ μ„ μ–Έν•˜μ—¬λ„ 되고 클래슀의 멀버 ν•„λ“œλ‘œλ„ μ„ μ–Έν•˜μ—¬ μ‚¬μš©μ΄ κ°€λŠ₯ν•˜λ‹€.

@ExtendWith(MockitoExtension.class)
class SocialLoginServiceTest {

    // @Mock SocialLoginService socialLoginService  <- 클래슀의 멀버 ν•„λ“œλ‘œλ„ κ°€λŠ₯

    @DisplayName("μ–΄λ…Έν…Œμ΄μ…˜μ„ μ΄μš©ν•œ mock 객체 생성 ν…ŒμŠ€νŠΈ")
    @Test
    void createSocialLoginWithAnnotation(@Mock SocialLoginService socialLoginService) {
        assertNotNull(socialLoginService);
    }
}

Mock 객체 μ‘°μž‘ν•˜κΈ°

μΈν„°νŽ˜μ΄μŠ€μ™€ 같이 λ‹€ν˜•μ„±μ„ μœ„ν•΄μ„œ μΆ”μƒν™”λœ 클래슀λ₯Ό ν…ŒμŠ€νŠΈμ—μ„œ μ‚¬μš©ν•΄μ•Ό ν•  κ²½μš°κ°€ μžˆλ‹€. 뿐만 μ•„λ‹ˆλΌ μ™ΈλΆ€ api와 연동해야 ν•  경우, μ›ν•˜λŠ” κ²°κ³Όκ°’μ˜ μˆ˜μ‹ μ΄ λ˜μ—ˆλ‹€κ³  κ°€μ •ν•˜κ³  κ·Έ λ‹€μŒμ˜ 행동듀을 ν•˜λ‚˜μ˜ μœ λ‹›μœΌλ‘œ 보고 이λ₯Ό ν…ŒμŠ€νŠΈ ν•  λ•Œ, 값을 μ œλŒ€λ‘œ λ°›μ•˜λ‹€κ³  κ°€μ •ν•΄μ•Ό ν•  ν•„μš”κ°€ μžˆλ‹€. 이럴 λ•Œ, Mock객체λ₯Ό μ‘°μž‘ν•˜λ©΄ μ›ν•˜λŠ” ν…ŒμŠ€νŠΈ μ‹œλ‚˜λ¦¬μ˜€λŒ€λ‘œ μœ λ‹› ν…ŒμŠ€νŠΈλ₯Ό ν•˜κΈ°κ°€ μš©μ΄ν•΄μ§„λ‹€.

    @DisplayName("social login μ‹œ μ™ΈλΆ€ apiν†΅ν•œ 토큰 μˆ˜μ‹ ")
    @Test
    void socialLoginGetToken(@Mock SocialLoginService socialLoginService) {
        String token = "userToken";
        Mockito.when(socialLoginService.getToken()).thenReturn(token);
        assertEquals(token, socialLoginService.getToken());
    }

μ›λ¦¬λŠ” Mockito.when~ μ—μ„œ μ •μ˜ ν•΄λ‘”λŒ€λ‘œ 결과값이 미리 μ„ΈνŒ…μ΄λ˜κ³  μ‹€μ œλ‘œ ν•΄λ‹Ή μ½”λ“œκ°€ 싀행이 λ˜μ§€λ§Œ 결과값은 미리 μ„ΈνŒ…λœ 결과값을 받도둝 ν•˜λŠ” 것이닀. 즉, μ‹€μ œλ‘œ socialLoginService의 getToken()κ°€ 싀행이 되긴 ν•˜λŠ”λ° κ·Έκ²ƒμ˜ κ²°κ³Όκ°’μœΌλ‘œ 미리 μ •μ˜ν•΄λ‘” String token = β€œuserToken”; 값을 return λ°›κ²Œ λ˜λŠ” 것이닀.

이렇듯 미리 μ •μ˜ν•œ μ•½μ†λŒ€λ‘œ λ“€μ–΄μ˜¬ 경우 미리 μ •μ˜ν•œ 값을 return ν•˜λŠ” 방식이기 λ•Œλ¬Έμ—, νŒŒλΌλ―Έν„°κ°€ 사전에 μ •μ˜ν•˜μ§€ μ•Šμ€ λ‹€λ₯Έ 것이 였면 μ‹€μ œλ‘œ λ‘œμ§λŒ€λ‘œ μ²˜λ¦¬ν•œ κ²°κ³Όκ°€ return λœλ‹€. λ§Œμ•½ νŒŒλΌλ―Έν„°μ— κ·€μ†λ˜μ§€ μ•Šκ³  mock 객체λ₯Ό μ‚¬μš©ν•˜κ³  μ‹Άλ‹€λ©΄ μ•„λž˜μ™€ 같이 any()λ₯Ό μ‚¬μš©ν•˜λ©΄ λœλ‹€.

μΆ”κ°€λ‘œ, doThrow()λ₯Ό μ΄μš©ν•˜λ©΄ 미리 μ •μ˜ν•œ 값을 return λ°›λŠ” 것이 μ•„λ‹ˆλΌ 미리 μ •μ˜ν•œ μ—λŸ¬κ°€ λ°œμƒν•˜κ²Œλ” mock 객체λ₯Ό ν™œμš©ν•  μˆ˜λ„ μžˆλ‹€.

doThrow(new RuntimeException()).when(mockedList).clear();
    @DisplayName("social login μ‹œ μ™ΈλΆ€ apiν†΅ν•œ 토큰 μˆ˜μ‹ ")
    @Test
    void socialLoginGetToken(@Mock SocialLoginService socialLoginService) {
        String token = "userToken";
        Mockito.when(socialLoginService.getToken(any())).thenReturn(token);

        Object userInfo = new Object();
        assertEquals(token, socialLoginService.getToken(userInfo));
        assertEquals(token, socialLoginService.getToken("anything"));
    }

BDD μŠ€νƒ€μΌ Mockito API

κ·Έλž˜μ„œ BDD에 μž…κ°ν•˜μ—¬ μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 행동을 κ·œμ •ν•  λ•Œ β€˜μ–΄λ–€ μƒν™©μ—μ„œ, μ–΄λ–€ κ²½μš°μ—, μ΄λ ‡κ²Œ ν–‰λ™ν•΄μ•Όν•œλ‹€β€™ 라고 μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 행동을 κΈ°λŒ€ν•  수 μžˆλ‹€. 그리고 μ΄λŸ¬ν•œ κΈ°λŒ€λ₯Ό Mokitoλ₯Ό μ΄μš©ν•΄μ„œ μ½”λ“œλ‘œ ν‘œν˜„ν•˜μžλ©΄ λŒ€ν‘œμ μΈ BDD 포맷으둜 given, when, then 을 μ‚¬μš©ν•  수 μžˆλ‹€. μ•„λž˜λŠ” κ·Έ μ˜ˆμ‹œμ΄λ‹€.

given(memberService.findById(1L)).willReturn(Optional.of(member));
given(studyRepository.save(study)).willReturn(study);

μ•„λž˜λŠ” κ°•μ˜ μ†ŒμŠ€μ—μ„œ μ‚¬μš©λœ given, when, then μ˜ˆμ‹œμ΄λ‹€.

    @Test
    void createNewStudy() {
        System.out.println("========");
        System.out.println(port);

        // Given
        StudyService studyService = new StudyService(memberService, studyRepository);
        assertNotNull(studyService);

        Member member = new Member();
        member.setId(1L);
        member.setEmail("keesun@email.com");

        Study study = new Study(10, "ν…ŒμŠ€νŠΈ");

        given(memberService.findById(1L)).willReturn(Optional.of(member));

        // When
        studyService.createNewStudy(1L, study);

        // Then
        assertEquals(1L, study.getOwnerId());
        then(memberService).should(times(1)).notify(study);
        then(memberService).shouldHaveNoMoreInteractions();
    }

μ•„λž˜λŠ” mokito의 κ°€ κ°€μ§„ any()λ₯Ό ν†΅ν•΄μ„œ 더 νŽΈν•˜κ²Œ ν…ŒμŠ€νŠΈκ°€ κ°€λŠ₯ν•˜λ‹€.

μŠ€νƒ€μΌλ‘œ Mokitoλ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€. BDD의 κΈ°λ³Έ 철학은 κ°œλ°œμžμ™€ λΉ„κ°œλ°œμžκ°„μ˜ collaboration 을 적극 μ‘μ›ν•œλ‹€λŠ” 것인데 μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ β€˜ν–‰λ™β€™μ„ μ†Œν†΅μ˜ κΈ°μ€€μœΌλ‘œ μ‚ΌλŠ”λ‹€. 즉, β€˜μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μ–΄λ–»κ²Œ 행동해야 ν•œλ‹€β€™ λΌλŠ” μΈ‘λ©΄μ—μ„œ μ—¬λŸ¬κ°€μ§€λ₯Ό κ·œμ •ν•  수 있고 이 β€˜ν–‰λ™β€™μ„ λ°”νƒ•μœΌλ‘œ ν˜„μž¬ ν˜Ήμ€ κ°œλ°œμ€‘μΈ μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μ μ ˆν•˜κ²Œ β€˜ν–‰λ™β€™ν•˜κ³  μžˆλŠ”μ§€λ₯Ό λ…Όμ˜ν•  수 μžˆλŠ” 것이닀.

mock
Mockito
ArgumentMatchers
BDD