본문 바로가기

아카이브/항해99 취업 리부트 코스 학습일지

[항해99 취업 리부트 코스 학습일지] 두 번째 출항 ⚓️

728x90

이번 주 목표

면접 잘 보기

오늘 목표

이력서 검토 : TS 관련 면접 예상 질문 추리기

 

오늘 한 것

PubArt : ERD, zstandard 압축

오늘 스케줄

6:00 기상 산책

7:00 식사 샤워

8:00 항해 준비

9:00 항해 99 취업코스

 

12시 - 1시 점심식사

6시 - 7시 저녁식사 

 

9:00 항해 99 취업코스 종료

9:00  면접 준비

12:00 취침

 

0. 항해 99

- 항해99 취업 리부트 코스에 참여하는 마음가짐은 어떠한가요?

리부트 코스 사전과정에서 좋은 분들을 많이 만나 뵈었습니다. 그 분들을 동료로 둘 수 있는 개발자가 되고 싶다고 생각하였고, 사전 과정에서 노력이 부족하여 미처 따라가지 못한 부분들도 더 많은 시간들로 채워나가고 싶다고 생각하였습니다. 오롯이 개발에 집중하는 시간을 갖고 싶습니다. 

- 항해99 취업 리부트 코스를 수료한 이후, 어떤 모습으로 성장하고 싶은가요?

MSA 프로젝트를 자신있게 소개하고 발표할 수 있는 개발자로 성장하고 싶습니다.
서류에서 탈락하지 않는 개발자로 성장하고 싶습니다. 
동료를 소중히 여기는 개발자로 성장하고 싶습니다. 

 

1. 이력서 바로잡기

WHW

1. 브레인스토밍

1) G:Then (최종 프로젝트)

  • 간단한 구현이나, 기능을 수정했던 경험이 있다면 적어주세요.
    • User Service
    • nodemailer
    • Kakao Oauth
    • MSA
  • 트러블슈팅이나, 어떤 기능 또는 성능을 개선했던 경험이 있다면 적어주세요.
    • MSA에서의 통신 방법 : Data Connection Method
    • 가독성 X : 비즈니스 로직과 서버실행 모듈 분리
    • Refresh Token 만료 시 verify 통과 X : Refresh token 이 만료되면 redis의 값과 일치하는 경우에 Refresh Token과 Access Token 재발행
    • 테스트 코드가 라이브 코드에 삽입 : 모킹서버를 띄우고 data connection method를 이용해 모킹서버의 포트번호에 접속, 개별적 실행. 실행코드에 삽입된 테스트를 위한 코드들 삭제
    • Codedeploy 권한이 있는 IAM 을 EC2에 적용하기 전에 Codedeploy Agent를 실행하여 권한 오류 : 이전 AWS credentials 정보가 담겨 있는 파일을 삭제
    • 비동기 처리를 하지 않아 전체를 받아올 때까지 기다리게 되어 약 20000ms 소요 : Promise와 async await을 사용하여 비동기 처리하여 222ms로 98.89% 속도 개선
    • 1차 배포 후 약 2일 뒤 서버 속도가 랜딩페이지 기준 1650ms로 느려짐 : AWS 서버 중지 후 재시작을 통해 VM이 있는 물리 서버 이동 후 207ms로 87.45% 개선됨
    • 이미지를 전부 원본 파일로 받아와 렌더링에 많은 리소스가 사용됨. : sharp를 통해 format을 webp로 변환시켜 저장
    • 서버 사이드 렌더링을 압축 없이 진행하여 렌더 용량이 커져 속도가 다소 늦음. : webpack을 이용해 압축하고 frontconnection 함수 내에 응답 header 변경 WEBP 변환과 압축을 통해 현재 136ms로 1차 배포 이후 35% 개선 됨
    • 로그가 로컬 디렉토리 안의 파일로 쌓이게 되어 서버 비용 증가 : Elastic Search와 Kibana도입

2) Danmi (그 외 프로젝트)

  • 간단한 구현이나, 기능을 수정했던 경험이 있다면 적어주세요.
    • Active Record Pattern : 가독성보다 서비스 단에서 발생하는 불필요한 로직을 제거하는 것이 우선이라고 생각, 엔티티 모델에서 BaseEntity를 상속 받아 모델 클래스 내부에서 쿼리를 작성.
    • express-session : Danmi의 이용자는 세션으로 인한 서버 과부하를 일으킬 정도로 많지 않고 접속 시간이 길지 않음. 세션에 정보를 저장, 1시간 마다 파기. session Key는 무한 for문을 돌아 유일한 UUID를 갖게 함.

2. 이력서 개요

 

1) Danmi (그 외 프로젝트)

  • 프로젝트 소개 : 필라테스 학원 관리 서비스
  • 사용 스킬 : Nest.js PostgreSQL
  • 소제목 입력하는 곳
    • Active Record Pattern
    • express-session

2)  G:Then (최종 프로젝트)

  • 프로젝트 소개 : MSA로 구현한 추억 공유 커뮤니티
  • 사용 스킬 : Node.js MySQL Redis AWS React
  • 소제목 입력하는 곳
    • MSA
    • User Service
    • CI/CD
    • 서비스 속도 향상
    • Log

 

이력서 5원칙

3. 자기소개

거꾸로 생각하는 개발자, 이다영입니다.

문제가 발생하면 원인으로 문제를 되돌립니다.

서버 속도가 느리면 서버가 VM이 어떻게 실행되는지 살펴봅니다. 그 결과 속도를 87.45% 개선하였습니다.

API의 속도가 더디면 API의 정보를 받아올 때까지의 과정을 살핍니다. 비동기 처리 후 속도를 98.89% 개선하였습니다.

구글 스프레드 시트의 앱 스크립트와 슬랙 봇을 이용해

스파르타 코딩클럽 매니저 업무 중 초대장 발송 작업을 자동화하였습니다.

 

4. 인텔리픽 제출

2. PubArt ERD

 

- 최근 Access Log 의 ip와 다른 ip에서 비밀번호 불일치 등 의심스러운 접근이 발생하는 경우
TokenBlacklist에 기재하고 해당 토큰의 사용을 막습니다.


- 회차 별 혹은 작품 별로 쿠폰을 발급하고 포인트를 이용하여 구입할 수 있게 하였습니다.

3. zstandard 압축

Facebook에서 개발한 고속 데이터 압축 알고리즘, 오픈소스.

 

친구가 PubArt를 새로만들면서 zstd 압축을 지원하고 싶다고 하여 zstd 압축을 구현해 보았다.

최신 기술을 항상 나를 설레게 한다.

 

default에서 9.4kb

압축 레벨을 19로 변경 > 8.7kb

압축된 용량이 gzip보다 작고 brotli보다 큼

 

brotli -> zstd -> deflate -> gzip 순서로 배치



4. 면접 준비, 이전 면접 코칭 리마인드

 

인덱스가 무엇인지? 

테이블의 동작 속도를 높여주는 자료구조를 말합니다. 

 

인덱스의 원리

MySQL은 B tree 자료구조를 이용하며 문자열을 쪼개어 탐색하는 방식으로 이루어집니다. 탐색 속도는 O(log N)입니다.

 

SOLID와 특징에 대해서 Nest.js의 DI/IoC 등의 개념과 엮어서 설명해 주세요.

 

SOLID는 객체지향 프로그래밍의 다섯가지 기본 원칙입니다.

단일 책임 원칙, 개방 폐쇄 원칙, 리스코프 치환 원칙, 인터페이스 분리 원칙, 의존 관계 역전 원칙이 있습니다. 

 

SOLID 의 D인 의존관계 역전 원칙에 의하면 프로그래머는 추상화에 의존해야합니다.

DI Dependency Injection 즉 의존성 주입을 통해 하나의 객체가 다른 객체의 의존성을 제공하여 추상화를 이루는 것이 

이상적인 객체지향 프로그래밍이라고 할 수 있습니다.

 

Getter와 Setter로 가져올 수 있다면 캡슐화가 되지 않은 것이 아닌가요?

클래스 외부에서는 공개된 인터페이스만 사용할 수 있으며

내부 구현에 대한 세부 사항은 감춰지므로 캡슐화가 이루어졌다고 할 수 있습니다.

 

CI/CD 파이프라인 

master 브랜치에 push를 하게 되면 Github Actions를 통해 자동으로 빌드를 하게 되고 빌드된 파일을 압축하여 S3 버킷에 올리게 됩니다. 이때 CodeDeploy를 이용하여 사용하는 EC2에서 S3버킷에 올라온 파일을 가져오고 압축을 해제 하여 배포하고 PM2를 통해 올라온 파일을 자동으로 다시 띄웁니다. 

 

자기소개에서 거꾸로 생각한다는 정확한 의미

원점으로 돌아가 처음부터 문제를 거슬러 올라감으로서 보다 구체적으로 문제 해결을 할 수 있다는 점을 강조하고 싶었습니다.

 

5.  SOLID

객체 지향 설계의 다섯가지 기본 원칙으로

시간이 지나도 유지보수와 확장이 쉬운 시스템을 만들고자 할 때 적용합니다. 

 

Single Responsiblity Principle 단일 책임 원칙

한 클래스는 하나의 책임만 가져야 한다.

 

Open / Closed Principle 개방-폐쇄 원칙

소프트웨어 요소는 확장에는 열려있고 변경에는 닫혀 있어야 한다. 

 

Liskov Substitution Principle 리스코프 치환 원칙

프로그램의 객체는 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다. 

 

Interface Segregation Principle 인터페이스 분리 원칙

특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다.

 

Dependency Inversion Principle 의존관계 역전 원칙

프로그래머는 추상화에 의존해야지 구체화에 의존하면 안 된다.

 

6. 객체 지향 프로그래밍이란? 

필요한 데이터를 추상화 시켜 객체로 만들고,

객체들간의 상호작용을 통해 로직을 구성하는 프로그래밍 방법입니다.

 

특징으로는 첫번째 추상화, 객체의 공통적인 속성과 기능을 추출하여 정의하는 것,

두 번째 상속, 상위클래스의 기능을 하위 클래스에서 사용하거나 오버라이딩을 통해 재정의하는 것.

세 번째 다형성, 상위 클래스의 참조변수로 하위 클래스의 객체를 참조할 수 있게 하는 것

네 번째 캡슐화, 서로 연관 있는 속성과 기능들을 하나의 캡슐로 만들어 데이터를 외부로부터 보호하는 것이 있습니다.

 

7. 면접 회사 조사 - 풀링 포레스트 공고


정리 

 

이력서 경험 골든 서클

WHY HOW WHAT

 

최근 Access Log 의 ip와 다른 ip에서 비밀번호 불일치 등 의심스러운 접근이 발생하는 경우
TokenBlacklist에 기재하고 해당 토큰의 사용을 막습니다.

 

압축 용량
brotli -> zstd -> deflate -> gzip 

 

인덱스가 무엇인지? 

테이블의 동작 속도를 높여주는 자료구조를 말합니다. 

 

인덱스의 원리

MySQL은 B tree 자료구조를 이용하며 문자열을 쪼개어 탐색하는 방식으로 이루어집니다. 탐색 속도는 O(log N)입니다.

 

SOLID와 특징에 대해서 Nest.js의 DI/IoC 등의 개념과 엮어서 설명해 주세요.

 

SOLID는 객체지향 프로그래밍의 다섯가지 기본 원칙입니다.

단일 책임 원칙, 개방 폐쇄 원칙, 리스코프 치환 원칙, 인터페이스 분리 원칙, 의존 관계 역전 원칙이 있습니다. 

 

SOLID 의 D인 의존관계 역전 원칙에 의하면 프로그래머는 추상화에 의존해야합니다.

DI Dependency Injection 즉 의존성 주입을 통해 하나의 객체가 다른 객체의 의존성을 제공하여 추상화를 이루는 것이 

이상적인 객체지향 프로그래밍이라고 할 수 있습니다.

 

Getter와 Setter로 가져올 수 있다면 캡슐화가 되지 않은 것이 아닌가요?

클래스 외부에서는 공개된 인터페이스만 사용할 수 있으며

내부 구현에 대한 세부 사항은 감춰지므로 캡슐화가 이루어졌다고 할 수 있습니다.

 

CI/CD 파이프라인 

master 브랜치에 push를 하게 되면 Github Actions를 통해 자동으로 빌드를 하게 되고 빌드된 파일을 압축하여 S3 버킷에 올리게 됩니다. 이때 CodeDeploy를 이용하여 사용하는 EC2에서 S3버킷에 올라온 파일을 가져오고 압축을 해제 하여 배포하고 PM2를 통해 올라온 파일을 자동으로 다시 띄웁니다. 

 

자기소개에서 거꾸로 생각한다는 정확한 의미

원점으로 돌아가 처음부터 문제를 거슬러 올라감으로서 보다 구체적으로 문제 해결을 할 수 있다는 점을 강조하고 싶었습니다.

 

 

SOLID

객체 지향 설계의 다섯가지 기본 원칙으로

시간이 지나도 유지보수와 확장이 쉬운 시스템을 만들고자 할 때 적용합니다. 

 

Single Responsiblity Principle 단일 책임 원칙

한 클래스는 하나의 책임만 가져야 한다.

 

Open / Closed Principle 개방-폐쇄 원칙

소프트웨어 요소는 확장에는 열려있고 변경에는 닫혀 있어야 한다. 

 

Liskov Substitution Principle 리스코프 치환 원칙

프로그램의 객체는 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다. 

 

Interface Segregation Principle 인터페이스 분리 원칙

특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다.

 

Dependency Inversion Principle 의존관계 역전 원칙

프로그래머는 추상화에 의존해야지 구체화에 의존하면 안 된다.

 

객체 지향 프로그래밍이란? 

필요한 데이터를 추상화 시켜 객체로 만들고,

객체들간의 상호작용을 통해 로직을 구성하는 프로그래밍 방법입니다.

 

특징으로는 첫번째 추상화, 객체의 공통적인 속성과 기능을 추출하여 정의하는 것,

두 번째 상속, 상위클래스의 기능을 하위 클래스에서 사용하거나 오버라이딩을 통해 재정의하는 것.

세 번째 다형성, 상위 클래스의 참조변수로 하위 클래스의 객체를 참조할 수 있게 하는 것

네 번째 캡슐화, 서로 연관 있는 속성과 기능들을 하나의 캡슐로 만들어 데이터를 외부로부터 보호하는 것이 있습니다.

 

KPT

Keep

열심히 나아가는 것

Problem

집중력이 흐린 것

Try

집중 더 열심히 하기

소감

오늘을 열심히 살았다. 

내일 더 열심히 보내야지.

 

 

 

항해99 취업 리부트 코스를 수강하고 작성한 콘텐츠 입니다.

 

IT 커리어 성장 코스 항해99, 개발자 취업부터 현직자 코스까지

항해99는 실무에 집중합니다. 최단기간에 개발자로 취업하고, 현직자 코스로 폭발 성장을 이어가세요. 실전 프로젝트, 포트폴리오 멘토링, 모의 면접까지.

hanghae99.spartacodingclub.kr