어떻게, 무엇을 그리고 왜 구현해야 하는지 알기
이 글은 DHH의 인터뷰를 인상 깊게 듣고, Rails 8 기반으로 창업을 준비하는 과정입니다.
아래 글을 읽으시면 맥락 이해에 도움이 됩니다.
https://brunch.co.kr/@princox/304
https://brunch.co.kr/@princox/308
재미도 있고 깊게 봐야할 부분이 많지만 다음에도 이런 경험을 할 수도 있으니
"풀스택 프레임워크를 배운다는 것"은 어떤 것을 살펴봐야할지
미래의 나를 위해 리스트를 만들어봤다.
1. 특정 URL로의 요청 혹은 메인페이지로 요청이 왔을 때 어떻게 처리하는가
- 만약 잘못된 요청인 경우에는 어떻게 처리할 것인가
- 원하지 않는 IP나 클라이언트(이상한 기기)에서 요청이 오면 어떻게 처리하는가
- 동적 라우팅은 어떻게 하는가 (예: /user/:id 같은 패턴)
- 정규표현식으로 URL 패턴을 매칭하는 방법은?
2. 위의 요청에 대해서 처리한 이후에는 어떻게 응답 값을 조립해서 줄 수 있는가
- Response의 HTTP header나 body를 바꿀 수 있는지?
- 원하지 않은 IP 대역이 오면 아예 무시해버리는 응답은?
- 어떻게 HTML파일을 주고, 어떻게 API의 응답값을 줄 수 있을까?
- 스트리밍으로 큰 파일을 응답하는 방법은?
- Content-Type에 따라 다른 응답을 주는 방법은? (Content Negotiation)
3. 페이지 라우팅
- 하나의 웹 페이지에서 다른 웹 페이지로 어떻게 라우팅하는가
- 서버 측 라우팅, 클라이언트 측 라우팅을 어떻게 구현하는가
- 라우트 그룹을 만들고 prefix를 붙이는 방법은?
- 네임스페이스로 라우트를 관리하는 방법은?
4. 미들웨어라는 개념
- 요청이 들어오고 나가는 중간에 뭔가를 처리하는 방법은?
- 미들웨어를 체이닝하는 방법은?
- 특정 라우트에만 미들웨어를 적용하는 방법은?
- 전역 미들웨어는 어떻게 만드는가?
1. 데이터베이스와 connect 하는 방법
- 어떻게 새로운 테이블을 생성하는가 (마이그레이션)
- 어떻게 새로운 컬럼이나 튜플을 가져올 수 있는가
- 어떻게 특정한 id 값을 기준으로 값을 가져올 수 있는가
- 빈 값이 있을 때, 빈 테이블이 있을 때는 어떻게 처리할 수 있는가
- ORM이나 쿼리빌더는 어떻게 사용하는가
- N+1 문제는 뭐고 어떻게 해결하는가
- 트랜잭션은 어떻게 처리하는가
2. 많은 요청이 올 때는 어떻게 처리해야하는가
- 커넥션 풀은 어떻게 설정하는가
- Rate Limiting은 어떻게 구현하는가
- 큐 시스템을 어떻게 활용하는가
3. 외부의 제3의 서버에서 데이터를 가져와서 조립하는 방법은
- HTTP 클라이언트는 어떻게 사용하는가
- 타임아웃은 어떻게 설정하는가
- 재시도 로직은 어떻게 구현하는가
- 웹훅은 어떻게 처리하는가
4. 요청 중에 처리해야할 것을 동기적으로, 비동기적으로 조립해서 응답하는 방법은?
- Promise나 async/await는 어떻게 활용하는가
- 백그라운드 작업은 어떻게 처리하는가
- 이벤트 드리븐으로 처리하는 방법은?
5. 메모리에서의 캐싱을 어떻게 처리할 수 있을까?
- Redis나 Memcached는 어떻게 연동하는가
- 캐시 무효화는 언제 어떻게 하는가
- 캐시 키는 어떻게 설계하는가
6. 수 많은 사용자와 요청에 대한 로그를 어떻게 남기고 관리할 수 있는가
+ 검색하는 관리자 페이지를 제작할 수 있는가
- 구조화된 로깅은 어떻게 하는가
- 로그 레벨은 어떻게 관리하는가
- 중앙화된 로그 수집은 어떻게 하는가 (ELK Stack 같은 것)
- 에러 추적 도구는 어떻게 연동하는가 (Sentry 같은 것)
1. 기본적인 XSS, CSRF, SQL Injection 방지
- 입력값 검증은 어떻게 하는가
- 출력값 이스케이핑은 어떻게 하는가
- Prepared Statement는 어떻게 사용하는가
(SQL을 미리 컴파일해두고 값만 나중에 바인딩하는 방식)
2. 허가받지 않은 사용자가 특정한 페이지로 들어오려고 하는 것을 방지
- 권한 시스템은 어떻게 설계하는가
- 미들웨어로 권한 체크하는 방법은?
- 정책 기반 인가는 어떻게 구현하는가
3. 로그인은 어떻게 생성하는가?
- 토큰 기반 (JWT는 어떻게 구현하고 리프레시 토큰은?)
- 쿠키와 세션 기반인가? (세션 스토어는 뭘 쓸건가)
- 제 3의 방법: 이메일이나 문자메시지 (매직링크, OTP)
- 특정 링크를 보내는 방법
- 위의 방법에 대한 각각의 단점이나 취약점은 무엇인가
- OAuth나 SSO는 어떻게 구현하는가
- 다중 인증(MFA)은 어떻게 만드는가
4. 추가적인 보안 고려사항들
- HTTPS는 어떻게 강제하는가
- 보안 헤더들은 어떻게 설정하는가 (CSP, HSTS, X-Frame-Options 등)
- CORS는 어떻게 설정하는가
- 비밀번호는 어떻게 해싱하는가 (bcrypt? argon2?)
- 환경변수와 시크릿은 어떻게 관리하는가
1. 개발환경과 프로덕션 환경 분리
- 환경별 설정은 어떻게 관리하는가
- .env 파일은 어떻게 활용하는가
- 환경별 데이터베이스는 어떻게 분리하는가
2. 배포 전략들
- 무중단 배포는 어떻게 하는가 (블루-그린? 롤링?)
- 롤백은 어떻게 하는가
- Feature Flag는 어떻게 활용하는가
3. 컨테이너와 오케스트레이션
- Docker 이미지는 어떻게 만드는가
- Docker Compose는 어떻게 활용하는가
- Kubernetes에는 어떻게 배포하는가
4. CI/CD 파이프라인
- 자동 테스트는 어떻게 돌리는가
- 자동 배포는 어떻게 설정하는가
- Git 브랜치 전략은 어떻게 가져가는가
1. 파일 업로드
- 멀티파트 폼은 어떻게 처리하는가
- 파일 크기와 타입은 어떻게 검증하는가
- 청크(chunk) 업로드는 어떻게 구현하는가
- 진행률은 어떻게 보여주는가
2. 파일 저장과 서빙
- 로컬에 저장할건가 클라우드(S3 같은)에 저장할건가
- 이미지 리사이징은 어떻게 하는가
- CDN은 어떻게 연동하는가
- 임시 파일은 어떻게 정리하는가
1. 테스트 종류들
- 유닛 테스트는 어떻게 작성하는가
- 통합 테스트는 어떻게 작성하는가
- E2E 테스트는 어떻게 하는가
- 테스트 커버리지는 어떻게 측정하는가
2. 테스트 환경 구성
- 테스트 DB는 어떻게 관리하는가
- Mock, Stub, Spy는 어떻게 활용하는가
- CI에서 테스트는 어떻게 돌리는가
1. API 설계 원칙
- RESTful하게 설계하는 방법은?
- GraphQL은 어떻게 구현하는가?
- API 버저닝은 어떻게 하는가?
- 페이지네이션은 어떻게 구현하는가?
2. API 문서화
- Swagger/OpenAPI는 어떻게 활용하는가?
- 문서 자동 생성은 어떻게 하는가?
- Postman 컬렉션은 어떻게 만드는가?
1. 실시간 통신
- WebSocket은 어떻게 구현하는가?
- Server-Sent Events는 언제 쓰는가?
- Long Polling은 뭐고 언제 쓰는가?
2. 실시간 기능 구현
- 채팅은 어떻게 만드는가?
- 실시간 알림은 어떻게 구현하는가?
- 실시간 협업 기능은 어떻게 만드는가?
1. 프론트엔드 최적화
- 번들 사이즈는 어떻게 줄이는가?
- 코드 스플리팅은 어떻게 하는가?
- Lazy Loading은 어떻게 구현하는가?
2. 백엔드 최적화
- 데이터베이스 쿼리는 어떻게 최적화하는가?
- 인덱스는 언제 어떻게 걸어야하는가?
- 메모리 누수는 어떻게 찾고 해결하는가?
1. 모니터링
- APM 도구는 어떻게 연동하는가?
- 메트릭은 어떻게 수집하는가? (Prometheus 같은거)
- 대시보드는 어떻게 만드는가? (Grafana 같은거)
2. 디버깅
- 프로덕션에서 문제가 생기면 어떻게 디버깅하는가?
- 분산 추적은 어떻게 하는가?
- 프로파일링은 어떻게 하는가?
- 다국어 지원은 어떻게 구현하는가?
- 날짜/시간 형식은 어떻게 처리하는가?
- 타임존은 어떻게 다루는가?
- 통화 변환은 어떻게 하는가?
- 서비스는 어떻게 나누는가?
- 서비스 간 통신은 어떻게 하는가? (gRPC? Message Queue?)
- 서비스 디스커버리는 어떻게 하는가?
- 분산 트랜잭션은 어떻게 처리하는가?
이제는 ChatGPT, Perplexity, Claude, Gemini, Grok의 시대이다.
키워드를 알아야 검색도 할 수 있고, 내용을 찾아보면서 개발을 할 수 있다.
이렇게 정리해보니 풀스택 프레임워크를 제대로 배운다는 건 정말 살펴봐야 할 게 많다.
하나씩 차근차근 경험해보면서 배워나가면 될 것 같다.
각 프레임워크마다 구현 방식은 다르겠지만,
이런 개념들을 알고 있으면 어떤 프레임워크든 빠르게 적응할 수 있을 것 같다.