위대한 백엔드 개발자가 되기위한 저의 여정을 기록합니다.
하루하루 끊임없이 배움을 찾아 포기하지 않고 정진합니다.
마크다운으로 작성합니다. 단순 복붙이 아닌 내용을 전부 이해합니다.
- 인증(Authentication), 인가(Authorization)
- Back-End 효율적인 API 명세서 설계방법
- Java Back-End 웹 기술 역사
- Clean Architecture
- OAuth 2.0 개념과 권한 부여 방식 알아보기
- 2023 제 3회 당근마켓 SRE 밋업 후기
- IntelliJ 테스트 커버리지 확인하기
- SOLID 원칙과 각 원칙의 장단점
- Kotlin, JPA가 서로 지향하는 방향의 차이
- Netty
- Reactive Programming 이것만큼은 알고가자
- 우아한테크세미나 - 우아한스프링배치 by 이동욱
- Cache - Eviction, Expiration, Passivation
- Protocol Buffers
- Redis 분산락 + WebFlux 프로젝트
- Kafka
- State Machine Pattern
- 다중 환경에서 세션은 어떻게 공유하고 관리할까?
- 분산 환경 합의 알고리즘 Paxos
- Kernel
- Linux
- 분산 시스템에서 시간 동기화 문제와 해결 알고리즘
- 분산 시스템 논리적 시계(렘포트 시계, 벡터 시계)
- IDC 이중화 구성으로 DR하기 + Kafka 이중화 예시
- Data Partitioning
- DevOps Engineer
- 도커와 쿠버네티스
- IaaS, PaaS, SaaS 차이
- CI/CD 파이프라인과 구현과정
- 가상머신(Virtual Machine) vs 컨테이너(Container)
- 배포 전략의 종류(롤링/블루 그린/카나리)
- 도커(Docker)
- 쿠버네티스
- Desired State
- 쿠버네티스 구성요소
- 쿠버네티스 API 리소스
- 쿠버네티스의 동작 흐름
- 쿠버네티스 대시보드 토큰 발행 및 접속
- Kubernetes Cluster
- Control Plane
- Node Components
- Pod
- Pod LifeCycle(Phase, Condition)
- Pod의 생명주기, 재시작 정책
- 멀티 컨테이너 파드 디자인 패턴
- Qos Classes
- Node Scheduling
- Probe
- Service - ClusterIP, NodePort, LoadBalancer
- Service - Headless, Endpoint, ExternalName
- ReplicaSet
- Deployment
- DaemonSet, Job, CronJob
- Volume
- ConfigMap, Secret
- Namespace, ResourceQuota, LimitRange
- Cluster Autoscaler, Karpenter
- 애자일(Agile) 방법론
- 클라우드 아키텍처 Cloud Architecture
- 하이브리드 클라우드 Hybird Cloud
- 테스트의 종류 알아보기
- 워크스루와 인스펙션
- TDD란 (테스트 주도 개발)
- 깃허브 액션 GitHub Actions
- AWS(Amazon Web Service)
- EC2(Elastic Compute Cloud)
- EC2의 가격 정책과 타입 종류
- IAM(Identity and Access Management)
- EBS, Instance Store, AMI
- AWS 보안 그룹 Security Group
- AWS ELB (Elastic Load Balancer), Sticky Session
- 오토 스케일링 (Auto Scaling) 구성과 순서도
- VPC(Virtual Private Cloud)와 구성요소
- NAT, NAPT 그리고 AWS NAT Gateway
- AWS 라우팅 테이블 개념과 구성
- 고가용성과 장애내구성, 재해 복구, 확장성과 탄력성
- AWS RDS(Relation Database Service)
- Elastic IP, ENI(Elastic Network Interface)
- System Manager Session Manager
- Amazon Aurora, Aurora Architecture
- CloudWatch vs CloudTrail
- AWS SES(Simple Email Service)
- AWS SNS(Simple Notification Service)
- AWS SQS(Simple Queue Service), SNS와의 차이점
- AWS 클라우드 프론트 CloudFront
- AWS ECR(Elastic Container Registry)
- AWS ELK(Elastic Search Logstash Kibana)
- Bastion 서버로 Private EC2에 접속하는 방법 + Hi-v2 트러블 슈팅
- EKS
- 모놀리식 아키텍처 (Monolithic Architecture)
- APM(Application Performance Management)
- gRPC, RPC, 작동원리, HTTP API 비교
- RabbitMQ
- Blue/Green Deployment, Architecture
- Nginx
- ELK와 로깅 구성
- Prometheus, Grafana
- Exporter - 모니터링 에이전트
- 블루/그린 배포
- 서버 이중화 구조
- GitOps
- HCL
- Java란
- 객체지향 프로그래밍
- JVM 메모리 구조 알아보기
- JMM(Java Memory Model)
- JVM 메모리 모델
- JVM Garbage Collection 구조와 동작
- GC의 종류와 각각의 차이점
- 종류별 Garbage Collector 동작 방식
- G1GC - Garbage First Garbage Collector
- Java String Pool
- 객체지향의 4가지 특징
- 객체지향 설계의 5원칙(SOLID)
- 클래스와 인스턴스 개념과 차이
- 생성자, new 객체 생성
- 오버라이딩과 오버로딩
- 추상메서드와 추상클래스
- 다형성 (Polymorphism)
- Date, SimpleDateFormat 현재 날짜, 시간 출력
- 자바 Object 클래스의 메서드
- 컬렉션 프레임워크 종류와 사용법
- 예외 처리 (Exception)
- RuntimeException & Exception
- HashMap 메소드 및 사용법
- 옵셔널(Optional) 클래스 알아보기
- Web 서블릿(Servlet) 이란?
- StringBuilder 사용법과 주요 메서드
- 래퍼 클래스(Wrapper Class), 박싱 언박싱
- Java Generic
- SocketAdress 클래스 & NetworkInterface 클래스
- Java String, StringBuilder, StringBuffer 차이 알아보기
- POJO (Plain Old Java Object)
- 자바 리플랙션 Reflection 개념과 사용방법
- 자바 익스큐터 java Executors
- java Callable, Future
- 자바에서 finalize() 메서드의 역할은 무엇일까요?
- 자바 Cleaner, PhantomReference Class
- 객체의 생명주기(생성, 사용, 소멸)
- OutOfMemoryError가 발생했을 때 해결하는 방법
- 자바의 네 가지 참조 유형(Strong, Weak, Soft, Phantom)
- Java 8 Functional Interface
- Java에서 제공하는 기본적인 Functional Interface
- Reactive Streams API, back-pressure
- Cold Publisher & Hot Publisher
- Java AIO
- JDK Proxy, CGLib Proxy
- Hotspot VM, JIT Compiler 그리고 한계
- GraalVM
- Native Image
- 네이티브 이미지의 메모리 최적화
- Reactive Stream, Backpressure, API Components
- Java의 예외 생성 비용, 비용 절감 방법
- JVM Warm Up - 배포 직후 Latancy 성능 저하 원인
- JVM Warm Up 적용하기
- ReentrantLock, Condition
- 코틀린이란 무엇이며 왜 필요한가?
- Kotlin DSL, gradle.kts
- mapOf(), to로 Pair 인스턴스 생성하기
- 코틀린에서의 객체지향 프로그래밍
- 코틀린 함수형 프로그래밍
- 코틀린 컬렉션즈 프레임워크
- 대리자 delegate, by, lazy
- 고차 함수 (High-order-function)
- 스코프 함수 (Scope Function)
- Kotlin 시퀀스와 지연 계산 (Sequences and Lazy Evaluation)
- Kotlin 함수형 인터페이스와 SAM 생성자
- kapt와 annotation processor
- 코틀린에서는 왜 Lombok 라이브러리를 사용할 수 없을까?
- Kotlin으로 Spring Framework 사용하기
- data 클래스로 persistence 구현하기
- @JvmField, @JvmStatic 어노테이션
- kotest를 사용해서 테스트 코드 작성하기
- Kotlin 코루틴 (Coroutine)과 동시성 프로그래밍
- 내가 제일 좋아하는 Kotlin의 companion object ❤️
- Kotlin Generics 공변성, 반공변성, 무변성
- Kotlin Generics 스타 프로젝션, reified 자료형
- sortedWith, Comparator 정렬 람다식 예제
- Kotlin runCatching과 Result 타입
- Kotlin에서 Unit과 Nothing의 차이점
- Kotlin에서 싱글톤 클래스를 어떻게 생성할까요?
- companion object와 object의 차이점은 무엇일까요?
- 클래스 외부의 함수(A package-level/ Top-level 함수)
- Kotlin Class, Field vs Property
- Kotlin Delegation으로 결합도 낮추기
- lateinit과 Delegates.notNull<>()로 적절한 null 처리하기
- .close()가 필요한 클래스를 사용할 때, use로 효율적으로 사용하기
- infix, inline function
- Kotlin Sealed Class
- inline fun 함수를 사용해 고차 함수 최적화
- Coroutine
- Go Handle, Handler, HandleFunc 이해
- Golang에서의 포인터와 역참조
- Go 데이터베이스 Sqlite3 사용하기
- gorilla/mux를 사용한 REST API 서버
- MVC 패턴과 사용하는 이유
- Controller, Service, Repository 역할
- IoC 컨테이너 (Inversion of Controll)
- 스프링 빈(Bean)과 빈 등록 방법
- Spring AOP (Aspect Oriented Programming) 개념
- Sprint AOP 라이브러리 AspectJ
- Spring의 대표적인 @Annotation과 역할
- Spring JDBC와 DataSorce 알아보기
- 스프링 패키지 구조(Spring Package Structure) - 계층형 vs 도메인형
- Lombok 반드시 알고 써야하는 @Annotation 모음
- Spring boot @Builder에 대하여
- (스프링/Spring URL) Mapping 알아보기
- Spring Security Access Token & Refresh Token
- 개발자라면 꼭 해야하는 Log 관리, Slf4j Logger
- Jwt (Json Web Token) 알아보기
- Spring Validation을 이용한 유효성 검증
- Spring boot @ExceptionHandler를 통한 예외처리
- (Spring boot + Security) SecurityConfig 설정하기
- Swagger를 활용한 API 문서 자동화
- IoC, DI, Spring Container, Bean 완벽하게 알아보자
- AOP(Aspect Oriented Programming) 대체 뭘까?
- 디스패처 서블릿 Dispatcher-Servlet의 개념과 동작 과정 알아보기
- Servlet Filter, Spring Intercepter 특징과 차이 이해하기
- [Kotlin, Spring boot] copy() 깊은복사, 얕은복사 성능상의 이점
- [Kotlin, Spring boot] 검색 api에서 find Query vs Internal Function 데이터 처리 효율
- Spring boot Actuator 스프링 부트 액추에이터 API + Spring Cloud를 사용한 예제
- Spring WebFlux, Reactive Stream, R2DBC, Mono, Flux 정복하기
- Springboot에서 데이터베이스 인덱싱 하는 방법
- Spring Test시에 Spring Security인증을 할 수 있는 어노테이션
- Spring 에서의 Connection Pool, HikariCP
- 스프링 부트 배치 Spring boot Batch
- ControllerAdvice는 AOP로 구현되어 있을까? 동작 과정 살펴보기
- ObjectMapper의 동작 방식과 Spring boot가 제공하는 추가 기능들
- 코틀린 테스트 프레임워크 mockk 사용법
- Spring Data Binding, Converter, Formatter
- Spring Resource Interface, Resource 추상화와 구현체
- ResourceLoader, ResourcePatternResolver, ApplicationContext and Resources Paths
- SecurityContextHolderStrategy (ThreadLocal, InheritableThreadLocal, Global)
- Spring Security의 여러가지 Filter
- Mock 테스트와 Stub 테스트의 차이
- Koltin에서 Spring을 실행하기 위한 plugin, dependencies
- Spring boot 내장 웹 서버 톰캣 설정, 다른 내장 웹 서버 설정하는 방법
- Spring ArgumentResolver를 이용한 유연성 있는 파라미터 처리
- Spring Scheduler를 사용해 일정 주기로 동작 수행
- Spring boot 프로젝트 profile 설정하기
- Bean Scope, DL(Dependency Lookup), Provider
- JDBC, DriverManager
- Spring AOP와 다이나믹 프록시를 사용해 트랜잭션 분리하기
- 애플리케이션 로직, 인프라 빈, 컨테이너 인프라 빈
- 빈 스코프와 발생할 수 있는 여러 문제들과 해결 방법
- Spring WebFlux vs MVC, 내부 작동 방식
- Spring Batch 기술적 트레이드 오프
- Spring Batch 데이터 일관성 관리
- Spring Data JPA와 @Transactional
- Spring Data JPA 동작 원리
- Spring AOP Advice 순서 제어 방법
- Spring Data JPA @Modifiying
- High Performance Hibernate, @NaturalId
- JPA Entity equals(), hashcode() overriding
- 영속성 컨텍스트
- 플러시 (flush)
- 객체와 테이블 매핑
- 데이터베이스 스키마 자동 생성
- Team.MSG GAuth-BackEnd 동적 검색 API QueryDSL 적용 사례
- Hibernate 하이버 네이트, Spring Data JPA
- 임베디드 타입, @Embedded, @Embeddable, @AttributeOverride
- @Query 어노테이션에서 FK로 객체를 찾는 방법
- JPA N + 1 문제 해결 방법 및 실무 적용
- 일반 조인(Join)과 패치 조인(Fetch Join)의 차이
- 일반 조인 Join은 언제 사용될까?
- JPA Propagation 트랜잭션 전파 단계
- 프록시(Proxy)와 지연 로딩
- OSIV(Open Session In View)
- 벌크 수정, 삭제 연산과 영속성 컨텍스트
- DDD(Domain Driven Design) 도메인 주도 설계 알아보기
- [Domain-Driven-Design] 바운디드 컨텍스트 (Bounded-Context)
- 도메인 주도 설계 애그리거트(Aggregate) 알아보기
- 응용 서비스와 표현 영역 (presentation, application)
- 여러 애그리거트가 필요한 기능과 도메인 서비스(응용 서비스와의 차이)
- 애그리거트 트랜잭션 관리 (선점,비선점,오프라인 잠금)
- 도메인 모델과 바운디드 컨텍스트
- 시스템 간 강결합(high coupling) 문제
- 이벤트 (Event), 핸들러 (Handler), 디스패처 (Dispatcher)
- 동기 이벤트 처리 문제, 비동기 이벤트 처리
- CQRS (Command Query Responsibility Segregation)
- 데이터베이스
- What is DataBase?
- DataBase Mangement System
- MySQL Query문 정리
- DDL(데이터 정의어)
- 키(Key)의 개념 및 종류
- ORM의 개념과 종류, 활용 방안
- 트랜잭션과 ACID
- 데이터베이스 정규화(Normalization)
- 데이터베이스 성능을 위한 Index와 동작원리
- 리플리케이션(Replication) vs 클러스터링(Clustering)
- DataBase Sharding (분산처리)
- 데이터베이스 CAP 이론
- 데이터 모델링과 데이터 성질에 따른 DB 종류
- 데이터베이스의 커넥션 풀 (Connection Pool CP)
- 데이터베이스 옵티마이저 Optimizer
- 옵티마이저의 최적화와 목표 그리고 한계
- 데이터베이스에서의 클러스터 (Cluster)
- Clustering (Active Clustering, Standby Clustering)
- SQLD
- 엔터티(Entity), 속성(Attribute), 관계(Relation)
- 식별자 Identifier 종류와 분류체계
- 데이터베이스 정규화 Normalization
- 데이터베이스 반정규화 Denormalization
- DDL(CREATE, ALTER, DROP, TRUNCATE)
- DML(INSERT, UPDATE, DELETE, SELECT), TCL(COMMIT, ROLLBACK)
- DCL(GRANT, REVOKE) 실습, 사용자 생성
- WHERE 조건절 지정 실습
- ORDER BY로 데이터 정렬하기 실습
- GROUP BY, 집계함수로 데이터 그룹별 집계
- Join 연산 (INNER JOIN, OUTER JOIN)
- INNER JOIN & OUTER JOIN SQL
- 날짜(DATE) 함수를 사용한 실습 + DUAL 테이블
- REPLACE() 함수로 데이터 수정하기 실습
- SUBSTR() 함수를 사용한 문자 데이터 자르기
- UPPER(), LOWER() 함수를 사용한 대소문자 구분
- 숫자함수 ROUND(), TRUNC(), CEIL()
- SQL 윈도우 함수 (WINDOW FUNCTION)
- 계층형 쿼리(START WITH, CONNECT BY PRIOR, SIBLINGS BY)
- SQL NULL 관련 함수 - NVL, NVL2, NULLIF, COALESCE
- 프로시저와 트리거의 차이점
- NoSQL vs SQL
- MongoDB
- Redis
- 데이터베이스 부하분산(파티셔닝, 샤딩, 레플리케이션) 개념
- 데이터베이스 파티셔닝
- 파티셔닝 종류와 분할 기준
- VARCHAR vs TEXT
- Transaction Serializability
- Transaction Recoverability
- 전문 검색 인덱스
- 커버링 인덱스
- MMR, BKA
- MySQL 8.0 InnoDB Locking
- Pessmistic Lock, Optimistic Lock
- LSM Tree
- B+Tree
- LIKE 쿼리 검색 성능 개선, Full-Text Search
- 분석 함수를 활용해 쿼리 성능 높히기
- 마이크로서비스 아키텍쳐 (MicroService Architecture)
- 확장 큐브로 보는 마이크로서비스
- MA, MSA, SOA(Service Oriented Architecture), ESB, SOAP
- 서비스 디스커버리를 DNS, 로드 밸런서 방식을 사용하지 않는 이유
- 마이크로서비스 클라이언트 회복성 패턴
- MSA 핵심 디자인 패턴
- 마이크로서비스 아키텍처 IPC
- 서비스 메시 Service Mesh
- 마이크로서비스에서 분산 트랜잭션 관리하기
- 인터넷 네트워크
- URI와 웹 브라우저 요청 흐름
- HTTP 기본
- HTTP 메서드, 활용
- HTTP 상태코드
- HTTP 헤더 - 일반 헤더
- HTTP 헤더 - 캐시와 조건부 요청
- 네트워크의 기초 알아보기
- 네트워크 프로토콜 정리
- 인터넷 작동 원리
- HTTP에 대해 알아보기
- DNS와 작동 원리
- 도메인 네임이란?
- 브라우저 동작 원리
- 호스팅이란 무엇일까?
- HTTP 메서드 알아보기
- RESTful API 의미와 설계규칙
- 네트워크 계층별 프로토콜
- 아파치 톰캣 (Apache Tomcat)
- 네트워크 웹 통신의 흐름
- 웹 캐시(프록시 서버)
- CDN (Content Delivery Networks)
- P2P(peer-to-peer network)
- 스위치와 라우터, 스위칭과 라우팅
- 인바운드(Inbound)와 아웃바운드(Outbound)
- 회선교환 방식과 패킷교환 방식
- IP/IP Packet, 패킷 전달, 한계
- OSI 7계층과 TCP/IP 4계층
- TCP/IP Packet, TCP vs UDP
- 웹 캐시 Web Cache
- 캐시 검증 헤더(Last-Modified, If-Modified-Since)
- 캐시 검증 헤더(ETag, If-None-Match)
- L2, L3, L4 & L7 스위치
- 웹소켓(WebSocket), HTTP와의 차이
- SSL(Security Socket Layer), TLS(Transfer Layer Security)
- 메시지 큐(Message Queue, MQ) 개념
- 서브넷팅 & 슈퍼넷팅 개념 및 쉬운 계산 방법
- 3-way / 4-way Handshake
- VLAN 이해하기 - VLAN, Trunk/AccessPort
- SSL Handshake
- 라우터 Router
- DHCP(Dynamic Host Configuration Protocol)
- TCP Header
- TCP 세션 유지 Keepalive
- TCP Flag, ECN
- QoS 3가지 수행 모델 (Best Effort, IntServ, DiffServ)
- 꼭 알아야 할 기본 CS 지식
- OS(운영체제) 구조와 원리
- 스레드와 동시성
- 멀티 스레드와 멀티 프로세스
- CPU 스케줄링이란
- Synchronize(동기화)와 Deadlock
- 런타임과 컴파일타임
- OS의 스와핑 Swapping
- 가상 메모리 Virtual Memory System
- 뮤텍스(Mutex)와 세마포어(Semaphore)
- 데몬(daemon) 프로세스의 정의
- 컴퓨팅 시스템 Computing System
- 페이지 교체 알고리즘 FIFO, LRU, LFU, MFU, NUR
- 메모리 단편화 Fragmentation
- 하이퍼바이저 Hypervisor
- 스핀락, 뮤텍스, 세마포어 + 뮤텍스 vs 이진 세마포어
- 컴파일러 최적화
- IPC(Inter Process Comunication)
- Process Memory Structure
- 캐시 메모리 구조와 작동 방식
- Memory - Address, Contiguous allocation, MMU
- Paging, Fragmentation, TLB
- UDS, 0000.sock
- 선형 구조
- 비선형 구조
- 함수와 함수의 종류
- 객체 Object
- 프로토타입이란?
- 가비지 컬렉션이란?
- 객체 메소드 정리
- 클래스란 무엇일까?
- String Method
- Math 메서드 정리
- 배열 메소드 정리
- 배열 메소드 정리 2
- 데이터 불변성
- 구조 분해 할당
- export 사용법 정리
- import 사용법 정리
- Lodash란 무엇일까?
- JSON 알아보기
- Storage LocalStorage
- 정규표현식 문법 정리
- DOM 이란 무엇일까?
- DOM API와 종류
- Promise 알아보기
- ajax 알아보기
- fetch API 알아보기
- TypeScript
- Basic_Types 정리
- Basic_Function 정리
- 작성자와 사용자의 관점으로 코드 바라보기
- Structural Type System vs Nominal Type System
- 타입 호환성 Type Compatibility
- 타입 별칭 Type Alias
- TypeScript_Compiler
- constructor, Access Modifier, Getter & Setter
- 인터페이스 (interface)
- 인터페이스2 (interface2)
- 클래스 (class)
- Generic 알아보기
- Git
- Git 버전확인하기
- git 기초 문법 정리
- branch와 리퍼지토리 관리
- 다른 사람의 Repository 가져오기
- commit과 버전 관리
- 원격저장소 동기화하기
- pull request 알아보기
- git log와 사용법
- 충돌 방지하기
- GitHub 갖가지 용어정리
- git/github Issue란?