본문 바로가기

보유/책

연봉 앞자리를 바꾸는 개발자 기술면접 노트 - 이남희

https://github.com/haru-note/harunote.github

 

서류

1.  이력서, 자기소개서, 경력기술서는 보편적인 양식으로 항상 준비

2. 매년 업데이트

3. 포트폴리오 작성

 

포트폴리오

1. 한 눈에 알아볼 수 있어야 함

2. 스킬셋(SKILL SET), 프로젝트내용, 깃허브(GitHub)저장소 및 블로그 링크

3. 제출시는 PDF

 

회사선정

핏이 맞는가? ( 지원자가 원하는 특성을 회사가 가지고 있는가? 회사도 지원자를 뽑을 가능성이 높은가? )

1. 채용 포지션

    SER : Site Reliability Engineering  사이트 안정성 엔지니어 : 확장, 고가용성, 장애탐지 복구, 재발 방지

    DevOps:  개발, 배포, 운영, 품질관리, 모니터링 전반 대응

 

2. 기술스택일치

    개발 플랫폼, 언어, 프레임워크

    위의 세 가지 기술 스택이 일치하지 않으면 이력서 검토 대상이 아님

 

3. 잘 할 수 있거나 잘 알고 있는 분야

    업무 도메인 유경험자

 

 

경력직

1순위 : 성장 가능성과 문제 해결 능력

   기본기보유로 경험치만 쌓이면 기여가능

 

2순위: 현재 보유 실력

   즉시 전력

   

3순위: 적극적인 자기계발 의지

   꾸준히 학습

 

태도와 커뮤니케이션

 

면접을 하면서 점점 질문의 난이도가 낮아진다면 탈락의 가능성이 매우 높다.

 

 

고민해야 할 채용공고

1. 업무 설명이나 개발 환경, 언어 등의 스킬셋이 자세히 기술되어 있지 않음

2. 폴리글랏, 풀스택 : 무리하게 올라운더로 근무할 가능성이 높음

    메이저 언어 하나 와 활용가능한 부언어 하나로 충분

3. 특정 서드 파티에 종속된 개발

 

 

 

서류전형준비

기본

1. 여러번 퇴고를 거쳐 맞춤법 및 비문 없음

2. 영어용어 주의 : 대소문자, 철자

    정확한 용어와 컨벤션은 프로그래머의 기본

3. 약어는 괄호 안에 설명

4. 간략한 문장

    면접관들이 이력서를 검토하는 시간은 1~10분 내외

    직접했던 업무, 경험 위주로 임팩트 있는 한 줄 씩 승부

5. 이력서, 자기소개, 경력기술서까지 최대 세장 이내로 압축 ( 가능하면 한두 장 )

    기술적인 정리 및 포트폴리오는 링크 활용

6. 제출전 맞춤법 검사

 

 

이력서

1. 개인정보

   가족관계 , 결혼 유무, 증명 사진 등 필수 아닌 것은 제외

   병역, 어학등으로 경력과 학업 사이의 공백은 기간과 내용 명시

 

2. 지원 분야 명확히 기입

 

3. 스킬셋 

    지원 분야의 직무 이해도, 스킬셋에 대한 이해도

    부족한 부분의 극복 노력

 

4. 분야 공통점 강조

     유관 업무 경험

 

 

PYPL ( Popularity of Programming Language )

1. Python   28%

2. Java       15%

3. JavaScript 9%

4. C#          6%

..

 

백엔드

자바, 코틀린, 스프링

 

프런트엔드

자바스크립트, 타입스크립트

뷰, 리액트

모듈 번들러 ( Babel, Webpack )

Node.js를 활용한 백엔드와의 연계, 이해

SSR ( Server-Side Rendering )

SSG ( Static Site Generation )

SPA ( Single Page Application )

MFA ( Micro-Frontend Achitecture )

 

버전관리 테스트 케이스

Gitlab, GitHub Enterprise

TDD ( Test Driven Development ) 

 

데이터베이스

MySQL, PostgreSQL, MongoDB ( Document 기반, NoSQL )

직접 쿼리 호출보다는 ORM ( Obejct-Relational Mapping : Hibernate, SQLAlchemy, Sequelize )

, DSL ( Domain-Specific Language )기반의 개발 ( 생산성 향상 )

 

 

지원서에서 나를 돋보이게 

업무 경력, 도메인을 약식으로 한 눈에 알아볼 수 있게 작성 후 별도의 페이지로 경력기술서 상세하게

가급적이면 첫 페이지에 언어를 포함한 스킬셋 정리

 

1.  한 눈에 보이는 경력 사항

     중요한 내용, 최근 경력부터 시간순으로 작성

     어떤 개발 환경에서 어떤 도메인, 어떤 영역을 맡아서 개발

     근무기간, 유형, 직책 직급

     재직기간, 회사명, 직위명, 간략한 주요업무 키워드 ( 스킬셋 )

 

2. 능력을 드러내는 숙력도와 학업

    이력서에 쓴 기술을 명확히 설명

    왜, 이점, 경험

    

    숙련도 표기는 연차 기준으로 상, 중, 하  혹은 전문가 수준, 고급, 중급, 초급

    

   ex) Java, Spring, JPA (상)

   

   기타 개발 툴 및 개발 환경

   

   학력정보는 연도, 학교, 전공, 졸업여부 정도

 

3. 치열한 준비 증거

    오픈소스

    교육이력

    자격증

 

 

4. 심플, 매력적인 자기소개서

    지원동기

    관심갖고 공부한 분야

    커리어 부각 내용, 기여가능 부분

 

    군더더기를 최대한 지우고, "나는 무엇을 중요하게 바라보는 개발자" 등 한 줄로 표현이 기억에 남을 수 있다.

 

   서비스 운영 중의 문제 해결과 성과

   오픈 소스 활동

   테크 관련 세미나에 연사로 참가이력

   책 집필

   팀 프로젝트 성과

 

 

탈락을 부르는 이력서와 지원 사례

1. 두 번 이상 동일 부서에 지원

    계속 두드리다 보면 이 마음을 알아주겠지?.... 

 

2. 성의와 일관성이 없는 이력서

    기술에 대한 일관성, 다양한 언어를 경험 했지만 깊이와 전문성이 떨어짐

 

3. 눈에 띄는 이력사항이 전혀 없음

    비슷한 규모로의 이직, 현재 채용시장에서 선호하는 스킬셋에 뒤쳐짐, 특정 베더에남 종속

    커리어 관리가 제대로 되어 있지 않음... 지원자 스스로 인식...

 

4. 경력의 부제, 혼돈의 커리어 관리

     내부 업무 위주의 경험, 이미 구축된 시스템의 유지보수, 크지 않은 신규 프로젝트

 

내가 면접관이면 나의 어떤 면을 좋게 평가 할까?

 

 

경력기술서 ( 포트 폴리오 )

1. 최신 이력 순으로

2. 고객에서 설명하듯이 쉽게, 핵심만

3. 본인의 역할을 솔직하게

4. 나에게 유리하게

    면접관의 기술적인 질문들을 예측 가능하도록

 

트러블 슈팅 경험 중심으로 

 원인 -> 과정 -> 행동, 결과 -> 배운점 회고, 기록

 

면접자가 살펴보는 기준

 무엇을 개발해 보았는가

 소스

 

프로젝트 어필

 개발 목표,의도

 주요기능

 시스템 개요

 담영 영역과 기여도

 소스 리포지터리 주소

 

문서로 제출한다면 PDF

 

깃 잔디 관리

커밋한 날, 공부한 영역의 소스를 꾸준히 관리한 증거

TIL ( Today I Learn ) 

Daily Commit

100일 회고, 1년의 성장

 

깃으로 이력서와 포트폴리오 꾸미기

github profile

github resume

markdown-badges

Git Readme Generator

 

스터디진행

 

소프트웨어 관련 입상

 

오픈소스 참여

 

기술 세미나 연사로 참여

 

결국 같이 일할 사람을 뽑는 것이 채용의 본질적인 목적

 

지원 전 체크리스트

저 사람과 함께 일하고 싶다의 관점에서 생각: 그라운드 룰 지키고 협업 가능한 동료인가

업무와 기술 이력 정리 체크 : 꾸준히 관리, 스터디, 오픈소스 참여..

 

 

기술면접

프로그래머의 기본 역량

1. 전공 수준의 서버, 네크워크, 자료구조 등의 기본 지식

2. 주 개발 언어와 관련 프레임워크

3. 개발 플랫폼

4. 데이터베이스

 

꾸준히 공부해야 할 영역

1. 소프트웨어 엔지니어링

2. 기초 수준의 시스템 디자인

3. 데이터베이스와 ER다이어그램을 바탕으로 한 엔티티 디자인

4. 개발 언어와 연관된 주력 프레임워크와 에코 시스템

 

 

코딩테스트 준비

파이썬, 자바스크립트가 무난하나 지원하려는 회사의 메인 언어가 유리

프로그래머스 ( school.programmers.co.kr )

해커랭크 ( www.hackerrank.com  )

리트코드 ( leetcode.com )

코딜리티 ( app.codility.com/programmers )

백준 ( www.acmicpc.net  )

프로젝트 오일러 ( projecteuler.net/about  / euler.synap.co.kr )

 

https://github.com/haru-note/harunote.github

 

기본 ( 빨간색은 꼭 )

문자열 반전  StringBuilder reverse()

문자열이 회문인지 확인

배열에 음수,양수, 0의 갯수와 비율 Array.stream filter

07:05:45 PM 을 24시간 포맷으로 변경

배열의 숫자의 가장 작은 값의 index, value

몇시간 전인지 표기

최단거리 알고리즘 : 다익스트라

페이징 교체 알고리즘:  LRU(가장 적게 사용된 데이터), LFU(가장 최근에 사용되지 않은 데이터) , DFS(깊이 우선탐색), BFS(너비 우선 탐색) 에 쓰이는 자료구조형

우선순위 큐

스택 vs 큐

List vs Set

삽입정렬

선형검색

연결리스트

LinkedHashMap

https://github.com/gliderwiki/java8/tree/master/src/main/java/algorithm

스택 Stack 큐 Queue
LIFO FIFO
push, pop, peek enqueue, dequeue, peek
최상단(top) 요소에만 접근 가능 앞(front), 뒤(rear)에서 모두 접근 가능
프라우저의 뒤로가기 프린터 대기열

 

 

실행 속도와 더 나은 코드 고민

O(1) 일정한 복잡도 (constant complexity)  입력값이 증가해도 수행 시간 증가없음 해시 테이블
O(log n) 로그 복잡도 (logarithmic complexity)  연산실행 데이터 크기는 절반
입력크기에 비례하여 로그의 시간소모
이진검색, 힙 정렬
O(n) 선형 복잡도 (linear complexity) 입력값에 비례하여 복잡도 증가 단일 루프
O(nlogn) 선형 로그 시간 복잡도
(linearithmic complexity)
전체데이터를 원소 하나의 리스트n으로 만들고 리스트를 두개씩 합치는 과정으로 연산 병합정렬, 퀵 정렬, 분할 정복 알고리즘
O(n²) 2차 복잡도 (quadratic complexity) 입력값이 증가함에 따라 n의 제곱만큼 증가 버블정렬, 선택 정렬, 2중 for문
O(2ᴺ) 지수 시간 복잡도 완전 탐색 모든 가능한 조합 실행  

 

테스트 검증

JUnit, Spock

 

 

보안관련

암호화 알고리즘 개념

대칭키 AES, DES

비대칭키 RSA

단방향 암호화 MD5, SHA-1,2, SHA-256

 

 

CS에서 기본으로 배우는 자료구조, 네트워크, 알고리즘

->

주력 개발언어의 레벨업, 프레임워크, 데이터베이스의 인프라 설정

 

->

코딩테스트( 상위 기업이직에 필수)

 

항상 머리를 말랑말랑하게 훈련

 

 

과제물예제

1. 다중 로그인을 시도하면 강제 로그아웃

2. 공공 데이터 포털을 이용한 특정 주제의 API연동

3. 회원 가입 설계, 필수 값의 유효성체크

4. 10만건 게시물 호출, 정렬, 페이징, 필터링을 통한 2차 페이징

5. CSV파일 업로드 파싱을 통한 DB저장

6. 100만건 데이터가 있는 테이블에서 체크 조건을 수행하여 새로운 테이블 구성하는 배치 프로그램

7. 객관식과 주관식으로 이루어진 설문조사 설계화면의 테이블 저장과 조회

 

DFD(Data Flow Diagram) , 시퀀스 다이어그램 훈련

 

 

기술면접

기술 수준이 기대치에 미치는가?

같이 일을 할 수 있는 사람인가?

 

기술 영역에 열정과 호기심이 있는가?

코딩 테스트 리뷰에 고민해본 흔적이 있는가?

CS베이스, 경험적인 지식으로 풀어내는가?

 

기술 면접에서 중요한 것은 대화를 잘 해내는 것

 

자기소개

흥미를 유발

서류의 어느 부분이 긍정적으로 평가 받아서 통과되었는가

고민1. 부각 시키고 싶은 프로젝트나 기술 경험

고민2. 자신의 커리어가 회사의 어떤 영역에 기여할 수 있는가

지원자와 면접관이 기술적 흥미와 관심사에 대해 토론하는 자리

질문하고 재확인

 

Q&A

입사후 업무, 어떤 기술, 어떤 역할

 

 

기술 영역별 공부해야 할 것들

CS, 알고리즘 자료구조

CPU 메모리

데이터베이스 트랜잭션

네트워크 인프라

시스템 디자인, 엔터티 설계

OOP, 대표적인 디자인 패턴

소프트웨어 공학

문제해결

개발언어(파이썬, Go, 장고, 코틀린..)

프레임워크(스프링, 장고, Gin..)

애플리케이션의 장애 트래킹과 문제해결방법, 성능 향샹 튜닝

비동기 아키텍쳐

마이크로서비스 아키텍쳐  MSA

 

자주 나오는 질문들

프로세스와 스레드

동시성과 병렬성

데드락, 트랜잭션 결리레벨, 트렌잭션 락

DROP, TRUNCATE의 차이

JPA 1차, 2차 캐시, OSIV, N+1문제

JPQL과 QueryDSL

브라우저에서 도메인을 호출한 뒤 페이지가 랜딩되기까지의 아키텍쳐와 흐름

Map, Set, List

스택과 큐

트리와 힙

해시 맵, 해시 테이블

HTTP, HTTPS

CORS

기본키, 외래키, 복합키

테이블과 인덱스, 인덱스 활용

Mutable, Immutable

세션과 쿠키, 세션 스토리지

IoC, DI

필터와 인터셉터

프레임워크와 라이브러리

RESTful아키텍쳐

프록시와 리버스 프록시

SQL인젝션과 XSS

OAuth, JWT, Token

마이크로서비스 아키텍쳐

 

블로킹  blocking 호출된 함수가 작업을 모두 마칠 때까지 제어권 소유, 호출한 함수는 대기
논블로킹  non-blocking 호출된 함수가 바로 제어권을 리턴, 콜백할 때까지 호출한 함수는 다른 일 수행
동기   synchronous 함수의 작업 완료여부를 호출한 함수가 체크
비동기  asynchronous 호출하는 함수의 작업완료 여부를 신경쓰지 않음 : 별도의 스레드로 실행, 완료하면 호출 측에 알림

 

자바 진영의 HTTP client모듈

RestTemplete( 멀티 스레드, 블로킹 ) -> WebClient (싱글 스레드, 코어당 한개, 동기/비동기 둘다 지원, 논블로킹)

동시처리에 멀티 스레드의 블로킹의 한계

 

 

동시성 독립적, 짧은 작업시간의 작업을 동시처리
논리적인 개념- 단일 스레드에서도 가능
스레드 풀
웹 서버
병렬성 실제 - 다중 스레드 필요
데이터 병렬: 연산 대량의 처리
작업 병렬: 단일 스레드 단일 작업과 동일
SQL의 처리, 이미지 프로세싱

 

 

데이터가 쌓일 때 고려사항

인덱스

파티셔닝

정규화, 비정규화(역정규화)

쿼리 최적화

캐싱

백업, 복구

데이터 마이그레이션과 테스트

기타 스케일 아웃

 

 

면접은 초반 10분이 결정

서류의 내용이 실제 사실인가의 검증

 

 

웹 환경 트래픽 대응 아키텍처

모놀리식(monolithic : 하나의 애플리케이션,서비스에 여러 모듈을 통으로 적재)의 단점( 배포와 서버 재기동의 오랜시간 )

REST API로 특정 성격단위의 서버로 트래픽 분산

웹 서버 : 리버스 프록시 기능으로 앤드포인트를 통일하고 라우팅

 

 

로드맵

https://roadmap.sh/

체크 표시 항목은 필수 체크

 

 

 

애플리케이션 성능 관리와 대용량 데이터 처리

사용자 응답시간 단축

서버 자원을 최적화

장애 감지를 위한 임계치 설정

 

성능 테스트 툴 ( JMeter , nGrinder)

모니터링 툴 ( 제니퍼, 와탭, 데이터독 , 핀포인트:무료, 스카우터:무료) 

테스트 장비 필요

 

네이버의 nGrinder+핀포인트 조합을 추천

 

 

DB개선

인덱스

단일 칼럼 인덱스 여러 개 < 다중 칼럼으로 좁은 인덱스 구성

인덱스 칼럼은 SELECT시 함수 적용하여 가공 하면 안됨

 

실행계획

select type  
SIMPLE 일반적인  SELECT, 가장 빠름
PRIMARY 복잡한 궈리에서의 최상위 쿼리
SUBQUERY SELECT문 안에서 서브쿼리를 사용
DEPENDENT SUBQUERY 서브쿼리가 외부 쿼리로부터 값을 참조하여 실행
DERIVED FROM절에서 쓰인 서브쿼리
UNION UNION, UNION ALL 사용
DEPENDENT UNION UNION의 서브쿼리가 외부 쿼리로부터 값을 참조하여 실행
UNION RESULT UNION의 결과로 생성된 임시 테이블에 대한 SELECT문을 실행

 

UNION보다는 JOIN사용을 고려

join type  
system 테이블에 단 한개의 행
const 테이블의 Unique Key, Primary Key를 상수로 조회 ( 한 건의 결과 )
eq_ref 다른 테이블과의 조인 시 Primary Key를 이용 ( 한 건 조회 )
ref 다른 테이블과 조인 시 인덱스에 설정된 모든 칼럼을 조회 조건으로 이용 ( 복수의 결과 )
fulltext 풀텍스트 인덱스 사용
ref_or_null ref와 동일하지만 null포함 : MySQL은 NULL에 대해서도 인덱스 활용 가능, 가장 앞쪽에 정렬
index_merge 단일 테이블의 여러 범위의 행을 스캔한 결과를 하나로 병합
unique_subquery IN절의 서브쿼리에 eq_ref적용
index_subquery IN절의 서브쿼리에 PK가 아닌 인덱스 적용
range 인덱스 지정 범위 안의 행을 검색 : BETWEEN, LIKE, IN, <, >, <=, >=,..
index 단일 인덱스의 일부만 충족, 물리적 인덱스 블록을 처음부터 끝까지 탐색
all 테이블 풀스캔, 전체 테이블 중 10~20퍼센트 정도를 조회할 때는 오히려 유리

 

 

extra 항목: 아래로 갈수록 성능 저하

extra  
Using index 인덱스를 사용하여 쿼리
대량의 데이터를 검색하는 경우는 인덱스 조정이 필요할 수 있음
Using index for group-by Group By 나 Distinct 수행시 인덱스 사용
그룹화 작업의 최적화 필요할 수 있음
Using where
Using index
condition
쿼리에서 WHERE절을 처리하는 방식
Using sort_union() 병합작업에서 정렬을 수행
정렬의 최적화가 필요할 수 있음
Using join buffer 조인 수행 중 중간 데이터 결과를 저장하는 조인 버퍼 사용
조인 버퍼 사이즈, 조인 방식 조정이 필요할 수 있음
Using temporary 데이터 중간 결과를 저장하기 위해 임시 테이블을 사용.
Distinct, Group By, Order By 구문등의 영향
Using filesort 정렬 작업을 위해 파일 정렬을 수행
정렬된 인덱스를 사용하도록 조정이 필요

 

 

select_type :  SIMPLE, PRIMARY, DERIVED

type : system, const, eq_ref

extra: Using index

가 아닌 경우는 튜닝 대상 후보

 

커넥션 사이즈 조절

중복된 쿼리 제거

캐싱 : 레디스, Ehcache, 맴캐시드

 

 

대용량 테이블 처리 기법

Write, Read 분리와 복제

파티셔닝 : 테이블을 동일 DB에서 논리적으로 분리

샤딩: 테이블을 다른 물리 DB에 분산하여 저장

 

 

비동기 메시지 처리

선착순 응모 : 비동기로 완료메시지 표시후, 레디스로 처리

AMQP : Advanced Message Queuing Protocal  : 레빗MQ

 

 

부하분산

로드 밸런싱

L4: IP주소와 포트번호

L7: 애플리케이션 레이어

라운드 로빈: 서버를 늘려 각 서버에 차례로 요청을 전송

 

넷플릭스 리본

HAProxy

1. 리버스 프록시 : 클라이언트 요청을 받아 백엔드 서버로 전달

2. 고가용성: 서버들의 상태를 모니터링하여 전달

3. 세션 피너링: 서버간의 세션을 연결

4. SSL 오프로딩: SSL 암호화/복호화 대신처리, 서버 부하 감소

5. ACL ( Access Control List ) : 요청을 필터링하여 규칙에 따라 트래픽 처리

 

Nginx의 upstream, Weighted Round Robin, 리스트 커넥션, IP Hash

 

 

스케일 아웃 , 스케일 업

스케일 아웃 :  수평확장, 서버 수

스케일 업 :  수직확장, 서버 성능

 

 

API설계의 고려

API 디자인에 대한 원칙

1. URL : 계층 표현의 슬래시(/)를 마지막에는 사용하지 않음

2. 언더바(_) 대신 대시(-)를 사용

3. 소문자를 사용

4. 단순하고 간단한 구조

5. URL에 HTTP메서드를 노출하지 않음

6. URI의 depth는 최대 4depth까지만

7. 의미에 맞는 HTTP상태 반환

8. API버전을 명시

    /v1/ordres

9. 리소스에 대한 정렬, 필터, 페이징은 쿼리 파라미터 활용

10. 문서로 자세히 정리

 

 

배포 시스템 구축 시 고려사항

CI : 지속적 통합

    코드 병합 -> 테스트케이스 검증 -> 코드 품질 보고

DI : 지속적 배포

   CI과정을 통해 최종 프로덕트 코드를 서버에 업로드

 

쿠버네티스와 도커

깃허브 액션

 

배포방식

Rolling Update : 서비스 중인 인스턴스를 하나씩 트래픽을 차단하며 교체

Blue/Green: 서비스, 스테이징

Canary : Blue/Green의 서비스에는 일부의 사용자에게만 배포, 문제없으면 전체

 

 

기술면접마무리

직접 아키텍쳐나 엔터티를 그리면서 어떤 일을 했으며, 어떤 특성이 있는지 설명하고

추가 알고리즘 질문이 나오면 대략이라도 코드 핵심 부분을 쓰면서 잘 설명

 

기술면접 탈락사례

이력서에 적은 내용을 증명하지 못함

연차가 높은데 반해 아키텍처 , 인프라 지식이 떨어짐

기술적인 답변이 모호하고 장황, 커뮤니케이션이 어려움

 

 

2차면점 ( 인성 면접 )

회사의 컬쳐 핏과 일치하는 인재 어필

어떤 과정을 거쳐 결과를 도출하는 사람인가?

일이 되는 것을 고민 ( 애자일 방법롤 : 자기 조직화 : 자율적으로 업무를 수행함으로서 팀에 기여)

일정과 기술사이의 트레이드 오프 : 해결방안 과정 도출 방식

매일 지각하는 동료 : 자신의 인식, 해결책 찾아가는 과정의 합리성

-> 구성원들의 협의 하에 그라운드 룰을 정해 해결책 모색

리더십 : 동기부여, 목표 달성

나의 역량은 무엇인가?

약점의 극복 방향은?

품질,유지보수 : 문제의 근본적인 원인을 찾고 개선, 에러 발생의 원인을 원천적으로 차단, 지속적인 개선

좋은 코드란? 컴퓨터가 이해할 수 있는 코드는 멍청이도 작성할 수 있다. 좋은 프로그래머는 사람이 이해할 수 있는 코드를 작성 한다.

기술 부채 해소

1. 코드 커버리지 지표 관리 : 자동화된 테스트 지표

2. 정적 코드 분석 :  소나큐브  잠재적인 버그, 취약점..

3. 장애 알림과 일별 지표 확인

회고와 성장

리더로서 팀의 성장을 도모하기 위해 해야 할 것

5년 뒤의 나의 모습은

 

 

 

반응형

'보유 > ' 카테고리의 다른 글

면접을 위한 CS 전공지식 노트 - 주홍철  (1) 2024.11.29