MINIWIKI
CareerSideProjectBook&Study
  • ⚡README
  • 😃ME
    • Review
      • 2025 OKR & 회고 - 회사 없이도 먹고살 수 있는 상태가 된다
        • 2025년 19주차
        • 2025년 18주차
        • 2025년 17주차
        • 소설쓰기의 쓸모
        • 2025년 15주차
        • 2025년 14주차
        • 요즘 회사생활
        • 첫 페이지 작성!
        • 큰 코 다쳤다
        • 오랜만에 좋았던 하루
        • 악순환과 반복실패
        • 2025년 12주차
        • 2025년 11주차
        • 2025년 3월 6일
        • 2025년 3월 4일
        • 2025년 3월 1일
        • 2025년 2월 회고
        • 2025년 1-2월 책, 영화, 음악
        • 2025년 1-2월 회고 (PM)
        • 2025년 1-2월 회고 (콘제품)
          • (Merged) 2025 비즈니스
        • 2025년 1-2월 회고 (삶/사람)
        • 2025년 1-2월 회고 (기본)
        • (25.02) 고객 피드백 받기
        • 다시 전략 수정
        • 머리 속 복잡한 것들 끄적끄적
        • 변하지 않는 핵심 철학
        • 개별화 능력을 이용하는 방법
        • 파고들기
        • 예술가와 사업가
        • 강점
        • PM으로서의 전문성
        • 부동시
        • 이게 다 무슨 소용인가
        • 내가 가장 잘 전할 수 있는 메시지
        • 연말인사 타이밍
        • Attitude는 옷부터
        • 다시 시작
      • 2024 회고
        • 2024년 12월 4주차 (52/52)
        • 원한다고 생각했던 것들
        • 2024년 12월 3주차 (51/52)
        • 회사 vs. 퇴사
        • 2024년 12월 2주차 (50/52)
        • 2024년 11월 4주차 (47/52)
        • 2024년 11월 3주차 (46/52)
        • 2024년 11월 1주차 (44/52)
        • 혓바늘
        • 2024년 10월 3주차 (42/52)
        • 그냥, 요즘하고 있는 생각들
        • 2024년 10월 1주차 (40/52)
        • 2024년 9월 4주차 (39/52)
        • 2024년 9월 3주차 (38/52)
        • 2024년 9월 2주차 (37/52)
        • 2024년 9월 1주차 (36/52)
        • 2024년 8월 4주차 (35/52)
        • 잃어버린 보물창고
        • 분기별 프로젝트
        • 강점검사
        • 글쓰기
        • 이상적인 하루
        • 나와 아프리카
        • 한 때 나에게 힘이되었던 문장들
      • 2023 회고
        • 2023년 12월 5주차
        • 2023년 12월 4주차
        • 2023년 12월 3주차
        • 2023년 12월 2주차
        • 2023년 12월 3일
        • 2023년 12월 1주차
        • 2023년 11월 29일
        • 2023년 11월 28일
        • 2023년 11월 27일
        • 2023년 11월 18일
        • 2023년 11월 15일
        • 2023년 11월 12일
        • 2023년 11월 11일
        • 2023년 11월 1주차
        • 2023년 10월 3주차
        • 2023년 9월 4주차
        • 2023년 9월 3주차
        • 2023년 9월 2주차
        • 2023년 9월 1주차
        • 2023년 8월 4주차
        • 2023년 8월 2주차
        • 2023년 8월 1주차
        • 2023년 7월 4주차
        • 2023년 7월 3주차
        • 2023년 7월 2주차
        • 2023년 상반기 회고
        • 나태하고 욕심많은 인간은 어떻게 살아야 하나
        • 책 <어떻게 살아야 하는가>
        • 책 <당신은 결국 무엇이든 해내는 사람>
        • 복잡계를 살아가는 단순한 사람
        • 책 <모든것이 되는법>
        • 글로 신뢰를 얻었던 경험들
        • 기획은 나를 찾아가는 과정
        • 나는 왜 살아가는가
        • 장항준 감독으로부터 배우는 "삶을 대하는 자세"
        • 개발자가 말하는 감정에도 분석이 필요한 이유
      • 2022년 회고
        • problem map 작성하기
        • 삶에서 내가 해결하고 싶은 문제 (2)
        • 삶에서 내가 해결하고 싶은 문제 (1)
        • <삶의 문제> 지도 다시 꺼내보기
        • 지도 위의 29살
        • 매번 시간계획을 망치는 MBTI 'P형 인간'을 위한 5단계 인생관리법
        • 당신은 왜 프로그래밍을 공부하는가?
        • 아무 것도 아닌 내가 글을 쓰는 이유
        • 책 <여행의 이유>
        • 책 <붕대감기>
      • 2021년 회고
    • Career
      • [미리캔버스] AI 제품 PM
        • 선택과 집중
        • 어쩌면 내가 틀릴 수도 있다는 생각
        • 뾰족한 사람들과의 협업
        • AI기능 PPT로 온보딩
        • AI 제품에서 가장 중요한 것
      • [미리캔버스] 앱 PM
      • [미리캔버스] 소상공인 제품 PM
      • [미리캔버스] 2.0 PM
      • [홀로스탠딩] 백엔드 개발
      • [청년5.5] 안드로이드 개발
      • [가축대출사업] NGO Project PM
    • Insight
    • Interview
    • Public Writing
  • SIDE PROJECT
    • [Youtube] 메이킹필름
      • [Product] 청춘집 프로젝트
        • (v24.11) 청춘집 JTBD
          • (구) 청춘집 실행계획
          • (구) 플레이리스트 기획
            • 데이식스 전곡 타임라인
            • 챕터 구성
        • (v25.01) 청춘집 JTBD
          • 아이돌 굿즈 시장 조사 (공식)
          • 아이돌 굿즈 시장 조사 (비공식)
        • 제작 준비
          • 레퍼런스 - 오프라인 시집
          • a5 책 만들기
    • [Youtube] 마포구타자기
      • [mptw] JTBD
        • IKIGAI
      • [mptw] 채널 설정
        • 채널 이름 후보군
      • 시리즈 [읽는음악]
        • [읽는음악] 백로그
          • 노래 가사 콘텐츠 레퍼런스
        • ep1. 파노라마 - 이찬혁
          • 이찬혁 <ERROR>
        • ep2. 마지막 인사 (feat. 청하) - 이찬혁
        • ep3. 나의 바다에게 - 도영
        • ep4. Dattom - 백예린
        • ep5. REBEL HEART - IVE
        • ep6. Either way - IVE
        • ep7. 너와의 모든 지금 - 재쓰비(JAESSBEE)
        • ep8. 예뻤어 - DAY6
        • 6주차. 데이식스 시리즈
    • [IT] 공적인사적모임 플랫폼
      • 1. 우리 조직의 얼굴을 만들자
      • 2. 내 생에 첫 기획서 만들기 (feat. QA Driven Development)
    • [Meet] 공적인사적모임
    • [Youtube] 이상한나라의 개발자할무니
    • [Study] Disquiet PM 스터디 쿨피스
    • [IT] 서울 빵 맛집 잘알 테스트
    • [Meet] 얼리버드 모닝클럽
      • 홍보를 곁들인 2주일 운영후기
  • 잡학사전
    • 와인 원데이 클래스
    • 소설쓰기
      • <책> 소설쓰기의 모든 것 1 - 플롯과 구조
      • 유튜브 - 소설 쓰는 법
      • 강의들
      • 작가가 되려면 어떻게 해야해
    • AI
      • 생성형 AI
    • ComfyUI
      • Stable Diffusion
      • ComfyUI 준비, 설치, 설정
      • Module 구조에 대해 이해하기
      • ComfyUI
      • Core Node
    • 작사
      • 작사가 되는 법
    • 유튜브
      • 유튜버 스토리님의 부캐 성장기
      • 주언규 유튜브 초보편 (클래스101)
      • 주언규 유튜브 왕초보 편
    • 경제
      • 연금저축펀드
    • ChatGPT
    • 크롤링
      • Automatio
      • Octoparse
    • 노코드
      • 북마크 & 노코드 서비스 목록
  • PRODUCT&BUSINESS
    • Service Planning/Analysis
      • 브런치시리즈 <개발보단 고객개발>
      • baemin mart
        • 1. 시작
        • 2. 우아한형제들 & 배민상회
        • 3-1. [인터뷰] 포항에서 치킨집을 운영하시는 최사장님
        • 3-2. [인터뷰] 부산에서 족발 프렌차이즈를 운영하시는 이사장님
        • 4. <아프니까 사장이다> 커뮤니티 데이터 분석
        • 5. 문제정의 & 개선 가설
        • 6. 결론 - 역기획서
      • careerly
      • meetme
      • 배달의 민족 역기획 사례
      • 당근마켓 역기획 사례
      • 도그냥 님이 말하는 진짜 역기획
      • 도그냥의 역기획 스터디법
      • 책 <현업 기획자 도그냥의 서비스 기획 스쿨>
      • 기획서 작성하기
    • Business/Growth
      • Unsexy Business 뉴스레터에서 얻는 인사이트
      • 책 <원씽>
      • 책 <아프리카 스타트업>
      • 책 <유난한 도전>
      • 책 <함께자라기>
      • 책 <나는 돈 없어도 사업을 한다>
      • 책 <나는 장사의 신 은현장이다>
      • 책 <왜 사업하는가>
      • 책 <왜 일하는가>
      • 이제는 피칭도 유튜브로
      • 세컨드 브레인이 필요한 이유
      • 책 <타이탄의 도구들>
      • 책 <역행자>
        • <역행자> 역행자의 7단계 모델 복습
        • <역행자> 운명을 거스르는 역행자의 7단계 모델
      • 책 <월급쟁이로 시작한 38살 그녀는 어떻게 30억을 벌어 파이어족이 되었을까?>
      • 책 <파리에서 도시락을 파는 여자>
      • 책 <존리의 금융문맹탈출>
      • 책 <돈의 감각을 길러주는 경제 지식 첫걸음>
        • 금리
        • 환율
        • 주식
        • 채권
        • 부동산
        • 연금
        • 경제정책
        • 규제
        • 경제위기
    • Product-Market Fit
      • 브런치 북 <개발보단 고객 개발>
      • 책 <아이디어 불패의 법칙>
      • 고이장례연구소
      • 글쓰기로 PMF 검증하기
      • 연대 송도 캠퍼스의 40%가 사용한 서비스
      • 어웨이크코퍼레이션의 김민준 님
      • 드로우 마이 브랜드
      • 노코드로 PMF 찾는 방법
    • UI/UX
      • UX Writing Workshop
        • 4. 고객과의 관계형성 - 차별점 강화
        • 3. 비즈니스 임팩트를 만드는 글쓰기
        • 2. 후킹한 문장으로 고객 행동 이끌기
        • 1. 쉽고 정확한 문장으로 문제해결
        • What is UX Writing?
        • Reference
      • UX/UI 관련 유용한 사이트 모음
    • PM/PO
      • 책 <프로덕트 매니지먼트>
      • 책 <인스파이어드>
      • PM Wiki
      • 당신과 팀을 성장시킬 PM 직무가이드
      • PO 미신, 파랑새를 찾아서 - CPO 김용훈
      • 개발자가 생각하는 좋은 PM 나쁜 PM
      • 프로덕트 매니저는 뭐하는 사람인가
      • 토스 리더가 말하는 PO가 꼭 알아야할 개념 (2)
      • 토스 리더가 말하는 PO가 꼭 알아야할 개념 (1)
      • 책 <조직을 성공으로 이끄는 프로덕트 오너>
        • <프로덕트 오너> PO의 시간관리법
        • <프로덕트 오너> PO가 데이터 기반으로 일할 수 밖에 없는 이유
  • DATA
    • Database
      • 이 위키를 만드는데 참고한 자료들
      • 데이터 기반 의사결정
      • 데이터베이스의 종류
      • 트랜잭션과 무결성
      • 트랜잭션, 커밋, 롤백, 트랜잭션 전파
      • ERD, entity relationship diagram
      • 기본 3 - 관계, 키
      • 기본 2 - 필드, 레코드, 타입
      • 기본 1 - 엔티티, 릴레이션, 속성, 도메인
    • SQL
      • Sub Query
      • JOIN
      • 데이터 정렬셋과 유니코드
      • 자료형
      • DDL, DML
      • SELECT
      • SQL
    • MySQL
      • MSQL to MySQL Data Migration
      • MySQL Server 다운로드, 로그인
      • helpful commands
      • 문자열 자르기 SUBSTR(column, startIdx, length)
      • 특정 값을 ORDER BY 특정 값 우선 정렬 하기 (ORDER BY FIELD)
      • 이것이 MySQL이다
    • H2
      • ‼️h2 in-memory-db Table not found (this database is empty) 해결방법
  • Dev-General
    • Webmark
    • Open Source
      • 나의 첫 opensource contribution 경험기
    • Dev-Insight
      • Event
        • YOUTHCON 2022
        • INFCON 2022
      • 책 <누워서 읽는 알고리즘>
      • 책 <나는 LINE 개발자입니다>
      • 서비스에 대해 개발자가 가져야할 생각들
      • AI 시대에서 결국 살아남는 것
      • AI 시대에 개발자가 살아남는 방법
      • 주니어를 넘어서, 성장하는 개발자의 길 (인프런)
      • 아마추어와 프로의 차이
      • 개발자의 개발공부에 대하여
      • 서비스에 대해 개발자가 가져야할 생각들
      • 좋은 개발자와 인맥을 만든 노하우
      • 개발자 취업기/이직기 모음
        • 라인게임즈 백엔드 개발자 경선님
        • OKKY 미니세미나 <비전공 학원출신 SI개발자, 유명스타트업 들어간.ssul> 참석 후기
        • 비전공자에서 2억받는 아마존 엔지니어가 되기까지
        • IT 대기업 100% 합격하는 방법
  • 🏗️computer science
    • Algorithm & Data Structure
      • About this page
      • Test Review
        • Page 1
      • Big-O
        • 빅오표기법의 문제풀이
        • 피보나치 수열의 시간복잡도
      • Bit Operation
        • bit masking
      • Math
        • 합공식 / 누적합
        • 피보나치 수
        • 약수찾기
        • 소수찾기
          • 백준 1978 소수찾기
          • 백준4948 베르트랑 공준
          • 백준 8393 합
          • 백준 1929 소수구하기
        • 최대공약수 / 최소공배수
          • 백준 2824 최대공약수, BigInteger
          • 백준 2609 최대공약수, 최소공배수
        • 순열과 조합
          • 백준 15649 N과 M
        • 그 외 개념 정리
      • Recursion
        • N Queens problem
        • counting cells in a blob
        • recursion 응용 - 미로찾기
        • 순환 알고리즘의 설계
        • 순환적으로 사고하기
        • 백준 17478 재귀함수가 뭔가요
        • 백준 10870 피보나치수 5
      • Sort
        • java 에서의 정렬
        • radix sort
        • sorting in linear time
        • comparison sort 에서 최상의 시간복잡도
        • priority queue
        • heap sort
        • quick sort
        • merge sort
      • Array and List
        • 표준 라이브러리
      • Linked list
      • String
      • Stack
        • 백준 1874 스택수열
        • 백준 10828 스택 구현하기
      • Queue
        • 백준 10845 큐 구현하기
      • Heap
        • 백준 11298 절대값힙
        • 백준11279 최대힙
        • 백준1927 최소힙
      • Deque
      • Tree and Binary tree
        • Tries
        • Red-Black Tree
        • Binary Search Tree
      • Search
        • 완전 탐색
        • 이분탐색
      • Graph
        • 최단경로
        • MST 2 - prim 의 알고리즘
        • MST 1 - Kruskal 의 알고리즘
        • MST, minumum spanning tree
        • DAG, Directed Acyclic Graph
        • DFS, Depth First Search
        • BFS, Breadth First Search
      • Dynamic Programming
        • Knapsack problem
        • LCS, Longest Common Subsequence
        • matrix chain
        • 행렬 경로 문제
        • 백준 1003 피보나치 함수
        • 백준 9461 파도반 수열
        • 백준9251 LCS
      • Greedy
      • Implementation
      • LIS, Longest Increasing Subsequence
      • Two Pointer
      • Line Swipping
      • Fenwick tree
      • Backtracking
    • Computer Structure
      • 이 위키를 만드는데 참고한 자료들
      • 그래서 컴퓨터는 어떻게 동작하나요?
      • 컴퓨터의 구성
      • 컴퓨터의 역사
      • 컴퓨터 구성요소의 기능 및 이해
      • 중앙처리장치 - 마이크로 명령 - 입출력과 인터럽트
      • 중앙처리장치 - 기본 컴퓨터 프로그래밍
      • 중앙처리장치 - 프로그래밍 언어와 실행
      • 파이프라인과 벡터처리 - 데이터의 종속성 - 병렬처리와 파이프라인
      • 파이프라인과 벡터처리 - 파이프라인 구조 - 데이터/구조
      • 파이프라인과 백터처리 - 산술&명령어 파이프라인
      • 파이프라인과 벡터처리 - 파이프라인 CPU의 성능분석
      • 메모리 구조 - 메모리 시스템의 이해
      • 메모리 구조 - 효율적인 메모리 관리 정책
      • 메모리 구조 - 컴퓨터 성능 개선을 위한 메모리 관리
      • 입출력구조 - 시스템 BUS 구성 및 제어
      • 입출력 구조 - 입출력(I/O) 연결과 주소 지정
      • 입출력 구조 - 입출력 수행과 인터럽트
      • 병렬컴퓨터 구조와 성능분석 - 멀티 프로세서
      • 병렬 컴퓨터 구조와 성능 분석 - 시스템 성능 분석과 개선
    • This Is Coding Test 2021
      • 1. 출제 경향 & 파이썬 문법 부수기
      • 2. 그리디 알고리즘 & 구현
      • 3. BFS & DFS
      • 4. 정렬 알고리즘
      • 5. 이진탐색
      • 6. 다이나믹 프로그래밍
      • 7. 최단경로 알고리즘
      • 8. 기타 그래프 이론
      • 9. 코딩테스트에서 자주 출제되는 기타 알고리즘
      • 10. 개발형 코딩테스트
    • Operating System
      • 이 위키를 만드는데 참고한 자료들
      • 운영체제란, Introduction to Operating Systems
      • 컴퓨터 시스템의 구조, Structure of Computer System
      • 프로그램의 실행, Program Execution
      • 프로세스, Process
      • 쓰레드, Thread
      • 프로세스의 생성과 종료, Start and End of Process
      • 프로세스 시스템 콜과 프로세스간의 협력, System call and Interprocess Communication
      • CPU Scheduling
      • CPU Scheduling Algorithm
      • Process Synchronization Problem
      • Initial Attempts to Solve Process Synchronization Problem
      • semaphore 와 monitor 로 synchronization 해결하기
      • 데드락, Deadlock
      • 메모리 관리, Memory Management
      • Memory Allocation
      • Virtual Memory
      • Virtual Memory 2
      • File System
      • File Systems Implementation
      • Disk Management & Scheduling
    • Network
      • 이 위키를 만드는데 참고한 자료들
      • 대규모 트래픽으로 인한 서버 과부하 해결방법
      • 유선 LAN과 무선 LAN
      • 네트워크를 이루는 장치 (L1, L2 .. L7)
      • REST API
      • HTTP 매서드
      • HTTP 상태코드
      • 직렬화와 역직렬화
      • 로그인 구현방식 2. 토큰 기반 인증방식
      • 로그인 구현방식 1. 세션 기반 인증방식
      • 웹 브라우저의 캐시 - 공통점과 차이점
      • 웹 브라우저의 캐시 - 쿠키
      • HTTP header
      • 웹 브라우저의 캐시 - 세션 스토리지
      • 웹 브라우저의 캐시 - 로컬스토리지
      • browser rendering
      • HTTPS 와 TLS - TLS 핸드쉐이크
      • HTTPS 와 TLS - 암호화
      • HTTP History
      • www.naver.com 을 주소창에 입력하고 화면에 나타나기까지의 과정
      • IP 주소 - 공인 IP와 사설 IP
      • IP 주소 - Classless,Subnet Mask, Subnetting
      • IP 주소 - Classful IP Addressing
      • IP 주소 - IPv4, IPv6
      • IP 주소 - 이진수 이해하기
      • IP 주소, MAC 주소, ARP, RARP
      • 라우팅
      • TCP 4way handshake and TIME_WAIT
      • TCP 3way handshake
      • TCP/IP - internet layer
      • TCP/IP - Transport Layer
      • TCP/IP - Application Layer
      • TCP/IP - MTU, MSS, PMTUD
      • TCP/IP 4계층, OSI 7 layer
      • 네트워크의 분류 - LAN, MAN, WAN
      • 네트워크 토폴로지와 병목현상
      • 네트워크의 기초 3
      • 네트워크의 기초 2
      • 네트워크의 기초
    • Linux
      • reference
      • sudo apt-get install / uninstall
      • vim
      • linux basic command
    • Design Pattern
      • 이 위키를 만드는데 참고한 자료들
      • static 을 자주 사용하게 되었을 때의 단점
      • 자바스크립트의 class와 static
      • 프로그래밍 컨텍스트
      • 의존성 주입 vs. 전략패턴
      • flux pattern
      • Spring MVC 패턴 적용 사례
      • MVC, MVP, MVVM pattern
      • 프록시 패턴
      • 옵저버 패턴
      • 전략패턴
      • 의존성 주입과 의존 관계 역전 원칙
      • 이터레이션 패턴
      • 추상 팩토리 매소드 패턴
      • 팩토리 메소드 패턴
      • 싱글톤 패턴
      • 디자인 패턴, 라이브러리와 프레임워크의 차이
    • Programming Basic (Go)
      • 이 위키를 만드는데 참고한 자료들
      • 트랜지스터, Trangister
      • 논리소자, Logic Element
      • 튜링과 폰 노이만, Turing and Von Neumann
      • 컴퓨터의 원리, Computer Principle
      • 프로그래밍 언어, Programming Language
      • 컴파일러와 동적언어, Compiler and dynamic language
      • golang
      • hello, world
      • variable
      • variable 2
    • Base Knowledge
      • 이 위키를 만드는데 참고한 자료들
      • 신기술 도입시 고민해야할 점(feat. react.js vs. vue.js)
      • 정적 타입 시스템의 필요성
      • 도커, 컨테이너
      • 클라우드, Saas, IaaS, PaaS
      • SSO
      • RBAC
      • OAuth2.0
      • REST API 사용을 위한 인증 방법 4가지
      • API
      • Data Format - XML
      • Data Format - JSON
  • ☕Java/Spring
    • Java
      • Java Code Convention
      • Java 버전별 특징 (v1-v19)
      • java.lang.Math
      • List 4가지의 초기화 방법
      • HashMap 4가지의 정렬 방법
      • 어노테이션 프로세서 정리하기
      • Annotation Processor 로 없는 소스코드 생성하기
      • lombok 은 어떻게 동작하는 것일까?
      • 다이내믹 프록시 정리하기
      • 클래스의 프록시
      • 다이내믹 프록시
      • 프록시 패턴은 무엇인가
      • Spring Data JPA 는 어떻게 동작할까?
      • reflection api 정리
      • reflection api 이용하여 spring ioc container 만들기
      • reflection api
      • spring dependency injection 은 어떻게 동작할까
      • 바이트 코드 조작하기
      • java bytecode 를 조작해 테스트 코드 커버리지 확인하기 (feat.jacoco)
      • Class Loader
      • JVM 의 구조
      • java, jvm, jdk and jre
      • synchronized
      • java string.split(".") 오류
    • Java 8
      • 이 위키를 만드는데 참고한 자료들
      • Metaspace
      • Parallel 정렬
      • Annotation
      • CompletableFuture
      • Date and Time
      • Optional
      • Stream
      • interface의 default 메소드와 static 메소드
      • 인터페이스의 변화
      • 함수형 인터페이스
      • java 8 소개
    • Spring Framework
      • Spring 3.0 준비하기
      • 특정 매소드만 transaction 처리하기
      • 스프링 프로젝트 시작하기
      • 스프링이란 무엇인가
      • 스프링 핵심 기술의 응용
      • AOP 2
      • AOP 1
      • 서비스 추상화 2
      • 서비스 추상화 1
      • 예외
      • 템플릿
      • 테스트
      • 오브젝트와 의존관계
      • 스프링이란
    • Spring Boot
      • [Gradle]UncheckedIOException
      • java19 + spring 3.0.5 + gradle 7.4.1 에서 프로젝트 gradle 설정하기
      • [리뷰] Gradle 멀티 프로젝트 관리
      • [리뷰] 멀티모듈 설계 이야기 with Spring, Gradle
    • JPA/QueryDSL
      • querydsl 을 쓰는 이유
      • JPA querydsl에서 json array 로 된 컬럼에 조건 적용하기
      • querydsl 에서 mysql order by field() 사용하기
  • 🏰Infrastructure
    • InfraWorkshop
      • 이 위키를 만드는데 참고한 자료들
      • aws로 안정적인 인프라 만들기 2
      • aws로 안정적인 인프라 만들기 1
      • 어플리케이션 진단하기
      • 서버 진단하기
      • 부하 테스트
      • 웹 성능 개선하기
      • 웹 성능 진단하기
      • <aws로 그럴듯한 인프라 만들기> 회고와 피드백
      • aws로 그럴듯한 인프라 만들기 3 - 배포스크립트
      • aws로 그럴듯한 인프라 만들기 2 - 배포하기
      • aws로 그럴듯한 인프라 만들기 1 - 네트워크 망 구성
      • docker container
      • connection check
      • network segmentation
      • cloud 서비스를 사용한다는 것
    • AWS
      • AWS IAM
      • AWS CodePipeline 으로 배포 자동화하기 (1)
      • AWS CodePipeline 으로 배포 자동화하기 (2)
  • 🪄Test
    • TDD
      • 이 위키를 만드는데 참고한 자료들
      • [2주차] 로또 과제 강의를 듣고나서
      • [1주차] 자동차 경주 과제 강의를 듣고나서
      • TDD, 리팩토링이란?
      • 가장 쉽게 TDD 시작하는 방법
      • 의식적인 연습과 학습 테스트
      • TDD 에 집착해야하는 이유
      • 공부하는 자세
    • AssertJ
      • 이 위키를 만드는데 참고한 자료들
    • JUnit
      • 이 위키를 만드는데 참고한 자료들
      • Junit 기본 개념
  • 😎OTHERS
    • Helpful Command
      • Mac 에서 특정 포트 검색, 종료
      • crontab
    • Llibrary
    • IntelliJ
      • 내가 좋아하는 커스텀 세팅
    • GIT
      • Github ID/Token 한번 입력 후 저장하기
      • Github Actions
      • github organization private repository push 안될 때 (not found issue)
      • commands
      • git commit convention
    • Logging
      • logback + webfilter 로 로그설정
      • ‼️log4j 보안 이슈
    • Postman
      • postman 의 header에서 언더바(_) 변수 인식 안되는 현상
Powered by GitBook
On this page
  • 0. 왜?
  • 1. 시작하기 전에
  • 1-1. AWS IAM 먼저 이해하기
  • 1-2. 파이프라인 큰그림 이해하기
  • 3. 파이프 라인 설정
  • 3-1. 소스 스테이지
  • 3-2. 빌드 스테이지
  • 3-3. 배포 스테이지 건너뛰기
  • 3-4. 검토
  • 3-5. 배포 스테이지 추가하기
  • 4. 정리

Was this helpful?

  1. Infrastructure
  2. AWS

AWS CodePipeline 으로 배포 자동화하기 (1)

Pipeline 설정하기

올해 처음으로 상용 서비스를 무의 상태에서 바닥부터 구축해볼 수 있는 경험을 했다. 그 과정에서 당연히 경험과 실력이 부족하기에 여러가지 어려움도 겪었었고, 아직 눈에 밟히는 개선해야할 점도 수두룩하다. 약 6개월간 서비스를 정신없이 운영해오면서 가장 마음에 걸리고 불편하다고 생각했던 점은 바로 배포 프로세스 자동화이다.

0. 왜?

배포 자동화를 구축하기 전, 운영 서버에 개발 완료된 코드를 배포하는 나의 과정은 다음과 같았다.

  1. 배포를 위해서 프로젝트를 jar file 로 빌드한다. (clean & bootJar build)

  2. filezilla 를 켜서 원격으로 운영 서버에 접속한다.

  3. 현재 running 중인 스프링 프로세스가 있다면 종료시킨 뒤, 해당 jar file 을 이름 변경하여 history 로 보관한다. (대략 3개정도만 보관)

  4. 로컬 컴퓨터에서 빌드된 jar 파일을 원격 서버로 전송한다.

  5. 새로운 버전의 jar 파일을 원격 서버 내에서 deploy script 로 실행한다.

  6. 로그 모니터링 하면서 정상적으로 서버가 배포되었음을 확인한다.

위와 같은 프로세스 상에서는 아래와 같은 문제점이 있었다.

  1. 일단 배포 과정이 매우 귀찮다.

    1. 사실 매우 번거로운 작업이 아닐 수 없다. 그래서 개발기간에는 작업 내역을 쌓아두고 일정 주기를 두고 하루에 한번 혹은 오전과 오후에 각각 한번씩 배포를 하곤 했었다.

    2. 배포를 하기 위해서 intelliJ, terminal, filezilla 등의 3개의 창을 띄워야 하고 여기저기 왔다갔다 개발자가 매우 분주하게 움직여야한다.

  2. 개발 소스 코드 최신화 주기가 길어지게 된다.

    1. 사소한 수정사항들은 그냥 쌓아두고 더 큰 배포건에 포함시키는 등 최신화된 소스코드를 반영시키기는 주기가 길어지게 되었다.

    2. 그러다보니 이미 수정이 완료된 작업임에도 프론트 개발자 분은 최소 반나절 뒤에나 변경 내용을 확인하실 수 있게 된다.

    3. 스타트업의 특성상 개발과 업데이트가 정말 넓은 범위에서 자주 바뀌곤 하는데, 개발 과정에서 빠르고 쉽게 배포하는 것이 필요하다고 느꼈었다.

  3. 실수할 수 있는 확률이 높다.

    1. 이리저리 개발자가 수동으로 해야하는 것들이 많으니 당연히 실수할 수 있는 확률이 높아지게 된다.

    2. 최대한 사람(개발자)가 직접 조작해야하는 내용들은 줄여나가는데 맞다고 생각이 들었다.

  4. 배포 버전 관리가 안됨

    1. 계속해서 jar file 을 쌓아두고 있자니, 어떤 버전이 어떤 개발내용을 담고있고, 문제가 있었던 버전이 무엇이었는지 한눈에 확인하기가 어려웠다.

그래서 여러 방면으로 spring boot project 에 배포 자동화를 적용할 수 있는 방법들을 알아보는데, 대부분 외부의 유료서비스를 이용해야하거나, 아직 개발팀 규모가 작은 우리 조직에 맞지 않게 너무 초기 설계에 리소스가 많이 투여되는 방법들 뿐이었다. (사실은 최초 개발때부터 배포 자동화를 구축하고 싶었지만 못했던 이유도 여기에 있었다.)

1. 시작하기 전에

나는 모든 일에 있어서 전체적인 그림을 먼저 그리고 필요한 요소를 하나씩 채워넣는 방식을 좋아한다. 요소들에 먼저 집중을 하게 되면 내가 이걸 왜하고 있었는지, 이 요소가 전체 그림에서는 어떤 역할을 하는지 종종 까먹을 때가 있기 때문이다. 그래서 동욱님의 글을 읽고 내가 이해한 방식으로 글을 쓰고자 하는데, 1) 파이프라인의 전체 뼈대를 구성하면서 큰 그림을 그리고 2) 각 요소들을 채워넣는 방식으로 진행을 하려고 한다. 이번 포스팅에서는 1) 전체 AWS Pipeline 의 큰 프로세스를 훑어보고 2) 소스, 빌드, 배포의 파이프라인을 설정하는 부분까지 진행해보고, 다음 포스팅을 통해서 세부 추가 설정들 및 파이프라인 테스트를 통해 제대로 동작하는지 검증을 진행해보겠다.

1-1. AWS IAM 먼저 이해하기

1-2. 파이프라인 큰그림 이해하기

우선 우리가 하고 싶은 것은 다음과 같다.

  1. 소스코드에 작업내역을 커밋 한다.

  2. 작업 내역이 적용된 최신 소스코드를 원격 repository 에서 가져온다.

  3. 코드빌드를 한다.

  4. 원격 서버(EC2) 에 배포를 한다.

이 모든 것들이 자동화 되어야 하는데, AWS의 CodePipeline 이 이와 같은 모든 과정을 도와준다.

하나하나 찬찬히 보자면,

  1. 우선 개발자는 소스 리포지토리에 변경사항을 커밋한다.

  2. CodePipeline 은 리포지토리의 변경된 내용을 감지한다. (Source 단계)

  3. 원격 레포지토리로부터 가져온 소스는 S3 버킷에 Artifact 형태로 저장된다.

  4. S3 로부터 소스를 가져와 빌드를 시작한다. 그 과정에서 테스트를 구상하여 문제없이 코드가 합쳐지는지 확인한다. (Build 단계)

  5. 빌드가 완료된 결과물은 다시 S3 버킷에 BuildArtifact 형태로 저장된다.

  6. 저장된 빌드 결과물을 S3로부터 다시 가져와 배포 프로세스를 시작한다.

  7. 배포 과정이 성공적이면, EC2 인스턴스에 정상적으로 배포가 된다. (Deploy 단계)

우리 조직은 아직 규모가 작고 관리포인트를 AWS 하나로 용이하게 하기 위하여 AWS 내부의 서비스를 이용하여 구성하였지만, source, build, staging, production 의 각 단계는 jenkins 등 외부 서비스와 연동해서도 구성할 수 있으며, 사용자가 어떻게 커스텀하느냐에 따라서 단순한 프로세스가 될수도, 복잡해질수도 있다.

그럼, 파이프라인을 생성하면서 그 과정을 이해해보도록 하자.

3. 파이프 라인 설정

새 파이프라인을 생성하면 다음과 같은 화면을 볼 수 있다.

  1. 파이프라인 이름은 추후에 바꿀 수 없으므로 신중하고 명확하게 이름을 입력해야한다.

  2. 서비스는 새로운 역할을 생성하도록 체크한다. 서비스 역할 이름 역시 신중하게 적도록 한다.

  3. 고급설정에서는 소스와 빌드된 코드가 저장되는 아티팩트 저장 위치를 고를 수 있다. 기본위치를 선택할 경우, pipeline 상에서 S3 쪽에 자동으로 버킷을 생성하게 되고, 사용자 지정위치를 선택할 경우에는 미리 본인이 생성해둔 버킷 상에 아티팩트들이 저장된다. 이 경우에는 본인이 S3 버킷을 직접 생성하고나서 연결시켜야한다.

  4. 암호화 키의 경우는 기본설정 그대로 기본 AWS 관리형 키를 선택한다.

3-1. 소스 스테이지

파이프라인이 설정 완료되면, 소스코드를 어디서 가져올지 설정한다. 우리 팀의 경우, Bitbucket 을 사용하고 있으므로 Bitbucket 과 연결하는 과정을 밟을 것이다.

2023.04 업데이트 : Github version 추가

3-1-1. Bitbucket 이용시

  1. 소스 공급자는 Bitbucket 으로,

  2. 연결 > Bitbucket 연결을 클릭하면

    1. 클릭하면 팝업창이 뜬다.

    2. 연결 이름을 적고 연결을 클릭한뒤 > Bitbucket 새 앱 설치를 클릭 > 권한요청팝업에서 권한을 부여한다.

    3. 정상적으로 Bitbucket 내부의 워크스페이스와 연결되면 본래의 CodePipeline 화면으로 돌아온다.

  3. 리포지토리 이름

    1. 연결하고자 하는 repository 이름을 목록에서 선택하고 (정상적으로 연결되었다면 워크스페이스 내 레파지토리 목록이 보인다.)

    2. 연결하고자 하는 브랜치 이름도 선택한다. (역시 정상적이라면 생성된 브랜치 목록도 노출된다.)

    3. 변경감지옵션 : 소스코드 변경 시, 파이프라인이 시작되도록 변경감지옵션을 체크해두고 (기본설정유지)

    4. 출력 아티팩트 형식은 CodePipeline 기본값으로 체크한다. (기본설정유지)

3-1-2. Github 이용시

2023년 4월 업데이트

github 를 소스 공급자로 연결하려면 소스공급자 드롭다운에서 Github(버전2)를 선택한다.

버전1도 있긴 한데, 선택할 경우, 버전2로 진행할 것을 권장하는 메시지를 마주하게 된다.

Github(버전2)를 선택하게 되면, 아래와 같은 화면을 마주한다. "Github 연결" 버튼을 클릭하여 연결을 진행해주면 된다.

작은 팝업이 뜨고, Github 연결 내용이 나온다.

  • 연결 이름에는 적당히 식별할 수 있는 이름을 적고

  • 새 앱설치를 눌러서 Github 계정과 연결해준다.

  • 기존에 연결된 Github 계정이 있다면 아마 목록상에서 뜰 것이므로 목록에서 선택하면 된다.

일단 앱 연결이 완료되면 아래와 같이 레포지토리 이름, 브랜치이름을 선택해준다.

  • 우리는 소스코드가 변경되면 바로 파이프라인이 시작되도록 할 것이므로 체크박스에 체크한다.

  • 출력 아티팩트 형식은 기본값으로 그대로 둔다.

3-1-3. 이슈) Github Organization 계정에서 Private Repository 를 연결하고자 하는 경우

-

3-2. 빌드 스테이지

소스코드를 가져온 뒤에는 가져온 소스로 빌드를 해야한다. 빌드 공급자를 AWS CodeBuild 로 선택하고 리전은 각 상황에 맞게 선택한 뒤, 프로젝트 생성 버튼을 클릭해 빌드 프로젝트를 생성한다.

3-2-1. 프로젝트 구성

  • 프로젝트 이름 : 서버가 많아질수록 헷갈릴 수 있기에, 나는 AWS 내 모든 리소스에 대한 이름을 프로젝트이름-환경-리소스이름-(리전) 규칙으로 하고 있다. 현재 앱은 테스트용이므로, testapp, 개발환경이므로 dev, aws codebuild project 이므로 build 라고 네이밍을 했다. 본인만의 규칙이 있다면 일관되게 적용하여 관리하도록 하면, 추후에 관리할 리소스가 많아져도 헷갈리지 않을 수 있는 것 같다.

  • 기타 다른 사항은 추후 필요하면 적용하도록 한다. 패쓰!

3-2-2. 환경

  • 환경은 위와같이 설정을 한다.

  • 서비스 역할 : 새로운 서비스 역할을 생성해준다.

  • 기타 추가 구성은 별도로 건드리지 않는다.

3-2-3. BuildSpec, 배치구성, 로그

  • buildspec : 코드가 빌드될때 수행될 명령어들을 어떤 방식으로 관리할지를 결정하는 부분인데, 버전관리를 위하여 파일형식으로 관리하는 것이 좋다고 한다.

    • buildspec 파일 사용을 클릭하게 되면 파일명을 입력하도록 되어있는데, 기본적으로는 소스코드의 루트 디렉토리에서 buildspec.yml 파일을 찾으므로 파일명을 그대로 사용한다면 입력할 필요없지만, 만약 파일명을 다르게 사용한다면 파일명을 명시적으로 입력해야한다.

      • 예) 소스 레포지토리 내 루트 디렉토리에 buildspec.yml 이 없는 경우, [rootDir]/buildspec.yml 이라고 명시해주어야 한다.

      • 만약 빌드명령삽입을 클릭한다면 편집기를 통해서 빌드명령을 삽입할 수 있도록 되어있다.

        • 구성항목들

           version: 0.2
          
           #env:
           #variables:
                # key: "value"
                # key: "value"
           #parameter-store:
                # key: "value"
                # key: "value"
           #secrets-manager:
                # key: secret-id:json-key:version-stage:version-id
                # key: secret-id:json-key:version-stage:version-id
           #exported-variables:
                # - variable
                # - variable
           #git-credential-helper: yes
           #batch:
           #fast-fail: true
           #build-list:
           #build-matrix:
           #build-graph:
           phases:
           #install:
               #Ubuntu 표준 이미지 2.0 이상을 사용하는 경우 런타임 버전을 지정해야 합니다.
               #런타임 버전을 지정하는 경우 Ubuntu 표준 이미지 2.0 이외의 이미지를 사용하면 빌드에 실패합니다.
               #runtime-versions:
                 # name: version
                 # name: version
               #commands:
                 # - command
                 # - command
           #pre_build:
               #commands:
                 # - command
                 # - command
           build:
           commands:
           # - command
           # - command
           #post_build:
               #commands:
                 # - command
                 # - command
           #reports:
           #report-name-or-arn:
               #files:
                 # - location
                 # - location
               #base-directory: location
               #discard-paths: yes
               #file-format: JunitXml | CucumberJson
           #artifacts:
           #files:
               # - location
               # - location
           #name: $(date +%Y-%m-%d)
           #discard-paths: yes
           #base-directory: location
           #cache:
           #paths:
               # - paths
  • 배치구성, 로그 등은 추후 필요할때 다시 설정하도록 하고 현재는 기본설정 그대로 둔다.

구성이 완료되면 다음과 같은 화면일 것이다.

검토 후 이상이 없다면, 다음 배포 스테이지로 넘어간다.

3-3. 배포 스테이지 건너뛰기

지금까지 파이프라인 설정을 통해서 원격 레포지토리에서 소스를 가져오고 (소스 스테이지), 가져온 소스를 빌드하는 설정까지 완료했다. (빌드 스테이지). 이제 남은 부분은 빌드된 어플리케이션을 EC2 서버로 배포하는 것이다.

배포 스테이지의 경우 파이프라인 상에서 바로 배포 어플리케이션을 생성할 수 있도록 제공해주지 않고 있다. 따라서 해당 부분은 배포 스테이지 건너뛰기 를 통해 우선 스킵하고 추후에 파이프라인에 다시 넣도록 하자.

건너뛰기?

  • 파이프라인 설정을 할 때에는 총 3개의 스테이지 소스, 빌드, 배포 스테이지를 연결해 설정해주어야 하는데, 이 중 두 개의 스테이지만 설정하면 나머지 1개는 이후에 설정할 수 있도록 건너뛰기 기능을 제공해준다.

  • 당장 준비가 되지 않아도 파이프라인 뼈대만 잡아두고 나중에 끼워넣어도 되는 셈!

3-4. 검토

마지막 검토단계를 통해서 앞서 설정한 내용이 잘 구성되었는지 확인한 뒤, 파이프라인 생성을 클릭한다.

3-5. 배포 스테이지 추가하기

파이프라인이 생성 완료되면 아까 스킵하고 건너뛴 배포 단계를 추가하기 위해 배포 어플리케이션 생성이 필요하다. 이를 위해서 우선 CodeDeploy 용 역할을 생성하는 것이 필요하다. 이 역할을 통해 AWS CodeDeploy 서비스는 배포역할을 가지고 EC2 에 접근하여 배포를 수행할 수 있다.

3-5-1. IAM > CodeDeploy 용 역할 생성하기

IAM 으로 이동하여 역할을 생성한다.

  • CodeDeploy 를 선택하고 다음으로 이동한다.

  • CodeDeploy 역할이 제대로 노출되는지 확인한다.

  • 태그를 추가하고자 하면 추가한다.

  • 역할이름을 추가하고 만들기를 완료한다.

3-5-2. 배포 어플리케이션 생성하기

필요한 역할도 만들었으니 이제 CodeDeploy 어플리케이션을 생성해보자. CodeDeploy > 어플리케이션 생성을 클릭하면 아래와 같이 화면이 뜬다.

  • 어플리케이션 이름과 배포할 컴퓨팅 플랫폼을 선택하고 어플리케이션을 생성한다.

3-5-3. 배포 그룹 생성하기

배포 어플리케이션을 생성한 뒤에는 어디에다가 배포를 할지 타겟을 설정해주어야 하는데, 그것이 바로 배포 그룹이다. 배포 그룹을 생성해보자.

  • 배포 그룹 이름을 입력하고 방금 IAM 에서 생성한 서비스 역할을 입력한다.

  • 배포유형은 현재위치로 설정하고

  • 환경구성에서는 배포할 EC2 서버를 선택해준다.

  • 배포설정에는 기본설정 그대로 진행한다. 고급 선택사항 역시 기본설정 그대로 유지한다.

    • 배포구성 : AllAtOnce

    • 로드밸런서 : 비활성화

    • 트리거 : 없음

    • 경보 : 없음

    • 롤백 : 롤백 비활성화

3-5-4. 파이프라인에 배포 스테이지 추가하기

배포 앱도 생성했으니, 아까 누락했던 배포 스테이지를 추가해보자.

  • 파이프라인 페이지에서 편집을 클릭한다.

위의 과정을 그대로 따라왔다면 현재 Source - Build 까지만 스테이지가 구성되어있을 것이다.

  • 스테이지 추가를 클릭하여 Deploy 스테이지를 추가하고 작업 그룹 추가를 클릭한다.

  • 작업이름 등 정보를 입력한다.

  • 작업 공급자는 AWS CodeDeploy로,

  • 리전은 서울로 선택한다.

  • 입력 아티팩트의 경우, 완료된 빌드 작업 결과물을 가지고 배포를 시작할 것이므로 BuildArtifact 를 선택해준다.

  • 위에서 생성한 배포 어플리케이션, 배포그룹을 선택한 뒤, 완료를 눌러 추가를 마무리 한다.

4. 정리

지금까지 AWS CodePipeline 의 뼈대를 구성해보았다. 큰 그림에서 프로젝트 - 빌드 - 배포의 과정을 훑어보았고 각 단계의 구성도 마쳤다. 다음편에서는 직접 파이프라인을 실행하면서 각 단계별로 제대로 동작하는지 확인해보고 필요한 추가 세부 구성도 마무리를 하도록 하겠다.

PreviousAWS IAMNextAWS CodePipeline 으로 배포 자동화하기 (2)

Last updated 1 year ago

Was this helpful?

그러던 중, 이번에도 이동욱 개발자님의 포스팅에서 해답을 찾을 수 있었다. 늘 많은 도움을 받고 있지만, 이번에도 역시! 을 하나씩 따라하며 마주했던 이슈 및 해결방법들을 덧붙여서 아래에 정리를 하고자 한다.

AWS 서비스를 사용하면서 IAM 에 대해서 따로 공부하지 않고 필요할때만 구글링해서 사용했었는데, 동욱님 포스팅을 보면서 IAM 설정 부분에서 이해가 안되는 부분들이 있었다. 그래서 추가적으로 IAM 에 대해서 공부하고 별도의 포스팅() 에 정리를 했다. 본격적으로 파이프라인 구축을 시작하기 전에 공부해보면 좋을 것 같다.

🏰
동욱님의 AWS로 배포하기 시리즈 포스팅
AWS IAM가 뭔소린지 모르겠다면
출처 : https://docs.aws.amazon.com/ko_kr/codepipeline/latest/userguide/welcome-introducing.html
Untitled
Untitled
Untitled
Untitled
Untitled
Untitled
Untitled
Untitled
Untitled
Untitled
Untitled
Untitled
Untitled
Untitled
Untitled
Untitled
Untitled
Untitled
Untitled
Untitled
Untitled
Untitled