brunch

[솔로프리너] 풀스택 프레임워크를 배운다는 것은

어떻게, 무엇을 그리고 왜 구현해야 하는지 알기

by 개미

이 글은 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에서 테스트는 어떻게 돌리는가


API 설계와 문서화

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. 디버깅

- 프로덕션에서 문제가 생기면 어떻게 디버깅하는가?

- 분산 추적은 어떻게 하는가?

- 프로파일링은 어떻게 하는가?


국제화 (i18n)

- 다국어 지원은 어떻게 구현하는가?

- 날짜/시간 형식은 어떻게 처리하는가?

- 타임존은 어떻게 다루는가?

- 통화 변환은 어떻게 하는가?


마이크로서비스 (나중에 필요하면)

- 서비스는 어떻게 나누는가?

- 서비스 간 통신은 어떻게 하는가? (gRPC? Message Queue?)

- 서비스 디스커버리는 어떻게 하는가?

- 분산 트랜잭션은 어떻게 처리하는가?







LLM 시대, 이제는 "키워드"를 알아야 한다.


이제는 ChatGPT, Perplexity, Claude, Gemini, Grok의 시대이다.

키워드를 알아야 검색도 할 수 있고, 내용을 찾아보면서 개발을 할 수 있다.


이렇게 정리해보니 풀스택 프레임워크를 제대로 배운다는 건 정말 살펴봐야 할 게 많다.

하나씩 차근차근 경험해보면서 배워나가면 될 것 같다.

각 프레임워크마다 구현 방식은 다르겠지만,

이런 개념들을 알고 있으면 어떤 프레임워크든 빠르게 적응할 수 있을 것 같다.

keyword
매거진의 이전글[솔로프리너] 이상한 나라의 Rails