This week I Learned 12

주영택·2020년 3월 23일
1

This Week What I Learned

목록 보기
10/50

쿼리 작성 전 문제를 명확히 구분할 것

담당 업무 중 코스 목록을 제공하는 API 를 개발하고 있는데 기존 스펙은 코스 리스트에서 다양한 코스 정보를 조합해서 제공하고 있었다.

코스와 코스 페이지 정보에 포함된 이미지 에셋들을 조합해서 화면에 카드로 노출하는 건데 최근 상품의 가격 정보가 포함되었다. 즉, 코스와 코스에 해당하는 상품의 데이터도 필요하게 된 것이다.

하지만 코스에 해당하는 상품은 여러 건이 존재하고 가격과 노출 가능한 일자가 다르기 때문에 특정지을 조건이 필요했다. 조건이 정해지고 코스와 상품을 조합하는 쿼리를 작성하는데 생각대로 깔끔하게 풀리지 않아 CTO 님께 조언을 구했다.

묻는 방법도 중요하다.

  • 문제가 무엇인지
  • 어떻게 하려고 하는지
  • 어떻게 진행했는지

등의 순서와 내용을 바탕으로 질문을 시작했다. 우선 작성하던 쿼리 위에 쿼리의 목적을 적었다.

내가 원하는 것은 같은 코스의 상품 중 최고 가격의 상품에 대한 코스 목록을 원하고 있었고 코스를 중심으로 조인 테이블을 사용하고 조인의 대상이 되는 상품은 코스로 그룹을 묶은 서브 쿼리의 대상이 되는 방향으로 작업을 하고 있었다.

아니, 그 문장 순서를 좀 바꿔 봅시다.

결과적으로 필요한 것은 코스의 목록이지만 실제는 상품의 목록이었다. 상품은 고유한 코스ID 를 FK 로 가지고 있기에 그거면 충분했다.

쿼리를 둘로 나누고 애플리케이션 레벨에서 두 데이터를 병합하여 사용하는 것으로 코드는 마무리 되었다.

발상의 전환이라고 까지 할 것도 없이 관점만 다르게 보아도 충분히 파악할 수 있는 문제다.
경험이 더 필요하다.

리퀘스트 포워드

보통 노드 프로젝트 구성에 프록시 서버로만 nginx 를 사용하고 스태틱 파일은 nginx 가 서빙하거나 CDN 에 올려두고 관리한다.

그리고 애플리케이션 서버에 요청이 들어오기 전에 처리할 부분이 있다면 nginx 에서 받아 진행한다.
예를 들면, 예외 URL 처리라던가 maintainance.html 대응 같은 것들이다.

특히, redirect 나 rewrite 를 통해 WAS 로 전달되는 요청을 관리하는데 특화된 기능을 제공하기 때문에 (location 등) 다용도로 필수 dev stack 에 속한다.

이 앞단에는 HA proxy 또는 예전에 소개한 것들을 사용할 수 있다.

  • redirect: url 을 변경함
  • rewrite: url 을 유지함

애플리케이션 레벨에서 rewrite 를 사용하기

nginx 의 문제는 프로그래머블 하기 쉽지 않다는 점이다. 다양한 URL 을 처리하기 위해서는 아무래도 WAS 에서 대응하는 편이 좋다. PHP/워드프레스처럼 사용할 필요가 있을 때 유용하다.

노드JS/Express 에서 Request Forward 를 구현하는 방법을 찾아보면 쉽게 나오지 않는다. expressJs 문서에도 공식적으로 기록되어 있지 않다.

보통 렌더링 되는 페이지는 아래와 같이 사용된다.

function view(req, res) {
  const locals = {
    id: req.param('id'),
    title: 'hello world',
  };
  return res.render('view.html', locals);
}

router.get('/view/:id', view);

라우터에서 정의된 /view/123 URL 대신 /awesome 으로 접속하여도 해당 페이지를 랜더링하려면 rewrite 기법을 사용해야 한다.

function awesomeView(req, res) {
  // 이 곳이 rewrite 대상이 됨;
  req.url = '/page/123'; 
  // res.app 의 handle 메소드를 사용;
  return res.app.handle(req, res);
}

router.get('/awesome', awesomeView);

예외 처리를 위해 next 핸들러도 추가해주면 안정적인 rewrite 핸들러로 사용할 수 있다.

놀랄만할 일을 미리 알려줄 수 있니?

미리 알려줄 수 있는 일이라면 놀랄만 하지 않은거지 ㅋㅋ;

PM 님 내 뒤에서 작업하시는데 내가 뭔가 하나 할 때마다 놀라셔서...

제가 놀랄 일 있으면 미리 말씀 드릴거에요

했더니 CTO님 왈;

진짜 놀랄 일이면 미리 말씀 드릴 수 없을텐데...

뒤로 가기 해도 한 번에 뒤로 못갈 때.

블럭 에디팅 기능을 제공하는 사내 컴포저로 사업부에서 사용하는 html 페이지를 디자인하는데 어떤 페이지에 들어가면 다른 페이지와 다르게 한 번에 뒤로가기를 통해 이전 페이지에 가지 못하는 문제를 겪고 있는데 (아무도 지적하거나 의심하지 않고 있지만) 이게 왜그런지 알아볼 여유가 생겨 우선 CTO 님께 물어보았다.

IFRAME 있는지 보세요. 유투브 같은거.

profile
NodeJS 백엔드 웹 개발자입니다.

0개의 댓글