오늘은 잘 가다가 삐끗했다^^
퇴근 직전에 서버 배포를 했는데
에러가 막 난리침
로그보니까 내가 리팩토링한거(....)
원인을 찾았는데 내가 생각했던 것과 일치했고........나는 능이버섯이다
원인은 ORM이였던 것을 쿼리빌더로 바꾸면서 벌어졌다.
그리고 문제는 바로 페이지네이션 옵션에서 발생했다.
아래는 쿼리빌더 페이지네이션의 로직이 적혀있는 코드다.
SelectQueryBuilder.prototype.limit = function (limit) {
this.expressionMap.limit = this.normalizeNumber(limit);
if (this.expressionMap.limit !== undefined && isNaN(this.expressionMap.limit))
throw new error_1.TypeORMError("Provided \"limit\" value is not a number. Please provide a numeric value.");
return this;
};
/**
* Set's OFFSET - selection offset.
* NOTE that it may not work as you expect if you are using joins.
* If you want to implement pagination, and you are having join in your query,
* then use instead skip method instead.
*/
SelectQueryBuilder.prototype.offset = function (offset) {
this.expressionMap.offset = this.normalizeNumber(offset);
if (this.expressionMap.offset !== undefined && isNaN(this.expressionMap.offset))
throw new error_1.TypeORMError("Provided \"offset\" value is not a number. Please provide a numeric value.");
return this;
};
/**
* Sets maximal number of entities to take.
*/
SelectQueryBuilder.prototype.take = function (take) {
this.expressionMap.take = this.normalizeNumber(take);
if (this.expressionMap.take !== undefined && isNaN(this.expressionMap.take))
throw new error_1.TypeORMError("Provided \"take\" value is not a number. Please provide a numeric value.");
return this;
};
/**
* Sets number of entities to skip.
*/
SelectQueryBuilder.prototype.skip = function (skip) {
this.expressionMap.skip = this.normalizeNumber(skip);
if (this.expressionMap.skip !== undefined && isNaN(this.expressionMap.skip))
throw new error_1.TypeORMError("Provided \"skip\" value is not a number. Please provide a numeric value.");
return this;
};
여기서보면 페이지네이션 값이 undefined와 isNaN 조건에 안맞을 경우 바로 에러가 날라간다.
ORM쪽은 추상화가 된 것을 계속 찾아보려고 했는데 나오질 않아서 쿼리로그 켜놓고 계속 눌러봤는데?
take,skip의 값이 undefined나 숫자가 아닐 경우 그냥 해당 부분을 무시하고 진행한다.
......??
아예 그냥 해당 부분을 건너뛴다. 그냥 건너뜀 아예 쿼리가 해당 부분을 그냥 제외시켜놓고 실행한다.
-_- 에러가 안나고 저렇게 피해가는게 더 신기하다 증말(...)
/**
* Checks if given object is really instance of FindManyOptions interface.
*/
FindOptionsUtils.isFindManyOptions = function (obj) {
var possibleOptions = obj;
return possibleOptions && (this.isFindOneOptions(possibleOptions) ||
typeof possibleOptions.skip === "number" ||
typeof possibleOptions.take === "number" ||
typeof possibleOptions.skip === "string" ||
typeof possibleOptions.take === "string");
};
ORM의 skip,take 로직 코드가 이게 맞는 것 같은데 확실하진 않다
아무튼 숫자가 아니면 걍 넘어간다니 진짜... 다음에는 신경 더 잘 써야겠다...
일이 많아...! 폭발한다...!!
할게 너무 많은데, 조금씩 정리가 되는게 정말 신기할 따름이다.
백로그를 만들어서 테스크를 정의하고 하나하나 정리해나가는데, 너무 좀 신기하다!
진행이 되긴 돼!!!
근데 진행할게 너무 많아 🫠
그래서 정말 계속 앞으로 나가면서 뭔가 작업이 이어지고 있다 ㅋㅋ
신입도...일..할 수 있다...! 뭔가 피쳐를 맡아서 할 수 있다...! 난 능히 할 수 있버섯이다!
아 그리고 테스트코드도 작업한 것에 대해서는 다 짰다 ㅎ_ㅎ!
저번주 금요일에 있던 PR에서 있던 일이였다.
이것은 지금 구현하는 로직에서 무조건 없어서는 안되는 테이블인데, 구현 사유를 묻는 코멘트가 달렸다.
그래서 나는 어, 이거 없어도 짤 수 있는건가? 라는 생각을 했는데
그게 아니라, 내가 하고 있는 작업을 다른 사람이 알기 쉽지 않다는 것이였다.
게다가 직급이 높으면 높을수록, 모든 일을 세부적으로 알 수 없다.
그래서 내가 한 행동은 그냥 API 한개마다 구현 로직부터 해당 코드가 왜 존재해야하는지를 모조리 다 정의해놓은 문서를 썼다.
코드를 짤 때, 그것을 보면서 하면 능률도 잘나오고
PR을 올리는 경우 그것을 같이 올려놓으면 이해,설득,설명이라는 커뮤니케이션 과정이 필요한데
이러한 시간을 스킵 할 수 있다, 조금 더 명확하게 알려줄 수도 있고
그렇게 같이 올려놨더니 같은 팀으로 작업하시는 분도 이해하기 너무 좋다고 행복해하셨다(ㅋㅋ)
당연히 작업을 하는 나에게는 그러한 글도 써야만하기에 작업량이 늘어난 것도 사실이지만
나중에 인수인계라던가, 도움이 안될 수 없는 문서를 적어놓았기에 의미가 있다. (문서 한개마다 양이 제법 된다.)
대충 테스크가 20개가 넘고, API를 20개 이상 만들어야하니까 문서도 20개를 작성하게 될 것 같다는 생각이 든다...
자발적으로 야근을 신청했다
야근이 필요하면 공식적으로 요청하고 작업을 하라길래 신청했다. 풀타임 꽉꽉 채울듯
왜 신청했냐면 정말 일정을 위해서 야근이 필요할 것 같다면,
신청을 하고 일한 만큼 야간수당을 받아가라는 공지가 올라왔다.
(회사 대단해..)
그래서 신청했고 10월 중순까지는 조금 오버드라이브(?)모드로 달려볼 것 같다!
일하러가야지
하하