TIL의 첫 시작
우연히 유튜브를 보다 인프콘에서 연사 하신 지소라 님의 강의를 듣고 나도 TIL을 기록해 보기로 결심했다.
하루 있었던 이슈나, 경험이나 아니면 사소한 이야기든 기록을 할 예정이고, 꼭 하루 마무리를 TIL 작성으로 끝낼 수 있기를 바란다.
우선 인상 깊게본 지소라 님 인프콘 영상 링크이다.
https://www.youtube.com/watch?v=ifGUz43GjdQ
보면서 정말 대단하다고 생각했다...
나는 본체 소심하고 적극적이지 않아서 자신감 있게 발표하는 모습이 정말 멋있게 느껴졌고
유명한 채널인 개발바닥에서 진행한 이력서 피드백 콘텐츠에서
지적받았었던 내용들까지 공개할 수 있는 용기가 배워야 한다고 생각했다.
그런 모습에 반해서 찾아보니 지소라 님도 유튜브를 하고 계시고 블로그 글도 찾아봤다. 매일은 아니더라도 꾸준히 TIL을 쓰고 되게 열심히 사는 분이라고 느껴졌다.
나도 정말 열심히 노력해서 언젠가 만난다면... 존경하고 덕분에 자극이 잘됐다고 인사할 수 있는 만큼 성자해 있기를!
경험 이슈
오늘은 api 요청 파라미터를 만들기 위해 input요소의 value값을 수정하고 이 요청에 맞는 응답값을 return 해주는 api 코드를 수정하는 업무를 봤는데
이 과정에서 여러 문제를 겪어서 이외에는 다른 업무를 보지 못했다.
문제는 크게 2가지이다.
- 요청 파라미터 수정 시 발생하는 사이드 이펙트
- django filter 쿼리
일단 2번 우리 폴더트리는 django filter.py라는 파일에서 필터가 필요한 쿼리를 작성해 준다. 기존 코드를 참고하여 코드를 작성하고자 했지만 해당 코드에 대한 지식의 부재로 살짝 어려움을 느껴 챗 gpt에게 도움을 청해서 코드를 짜봤다. 다음은 작성한의 일부 코드이다.
def ld_code_filter(self, queryset, name, value):
ld_codes = value.split(",")
conditions = [
(
Q(data__ld_code__value__startswith=ld_code[:-2])
if ld_code.endswith("00")
else Q(data__ld_code__value__startswith=ld_code)
)
for ld_code in ld_codes
]
query = reduce(or_, conditions) if conditions else Q()
return queryset.filter(query)
간력하게 설명하면
- ld_codes를 ',' 기준으로 나는 리스트의 값에서 endswith를 사용해서 끝값을 확인한다.
- true면 "00"으로 끝나는 끝 두 글자를 제외한 값을 data> ld> valu의 처음부터 비교하여 일치하는 값을 쿼리 한다.
- 아니면 ld_code 그대로 비교해서 쿼리 한다.
- Q는 장고 model orm으로 where 절에 or문 또는 and문을 추가하고 싶을 때 사용한다.
- or_은 Python의 operator 모듈에서 제공하는 함수로, 두 조건 Q 객체를 OR 연산으로 결합합니다. 결과적으로, 이 reduce 호출은 conditions 리스트에 있는 모든 조건을 하나의 쿼리로 결합한다. 만약 conditions 리스트가 비어있다면, reduce는 사용되지 않으며 대신 빈 Q() 객체를 사용한다. 아래는 내가 요청에 대한 파라미터를 만들기 위해 만든 params이다.
- 다음은 1번 요청 파리미터에 수정할 때 생긴 문제였다.
이는 자바스크립트의 참조무결성 문제였는데,
var params = ["ld_code=5011010400","sale_type=1","ordering=-created_at"]
위 값에서 ld_code만 ld_name으로 변경한 후 새로 값을 변수를 선언해 줘서 사용하고 싶었다. 그래서 함수를 하나 만들었는데
var params = getSalesParams(tabId)
var ldName = getCheckedLdNames(tabId)
var params_ld_name = modifyLdCodeToLdName(params,ldName);
function modifyLdCodeToLdName(params, ldName) {
// ld_code 파라미터의 인덱스를 찾습니다.
var ldCodeIndex = params.findIndex(function(param) {
return param.startsWith('ld_code=');
});
// ld_code 파라미터가 존재한다면, 이를 ld_name으로 수정합니다.
if (ldCodeIndex !== -1) {
params[ldCodeIndex] = 'ld_name=' + ldName.join(',');
}
return params;
}
이런 식으로 params에서 ld_code를 ld_name으로 변경하고 반환해 줬다. 나의 목적은
- ld_code가 필요한 곳에는 기존 prams를 사용
- ld_name이 필요한곳에는 변경된 params_ld_name을 사용
이였다. modifyLdCodeToLdName() 변환해 주는 함수 이후에 params도 ld_name으로 변경돼서 ld_code가 필요한 요청에 에러들이 발생했다.
여러 삽질을 한 결과 문제의 원인은 자바스크립트 특징 중 하나인 배열의 참조에 의한 전달(Pass by Reference)로 인한 문제였다.
JavaScript에서 배열과 객체는 메모리 주소를 통해 전달되므로, 함수 내에서 이들의 내용을 변경하면 호출 지점에서도 원본에도 변경이 반영되는 것이었다. 배열이나 객체를 함수에 전달할 때 원본을 변경하지 않으려면, 함수 내에서 원본의 복사본을 만들어 작업해야 한다. 예를 들어, params.slice()
를 사용하여 배열의 얕은 복사본을 만들고 이를 수정할 수 있었다.
유데미
오늘 저녁에는 유데미에서 진행한 연사가 있었는데 까먹고 있다가 오늘 안내 메일을 보내줘서 들을 수 있었다.
강사 해주시는 강사님은 전에 멋사 부트캠프에도 강연을 해주셨던 임동준 개발자님과 이번 기회에 처음 강의를 듣게 된 장현석 강사님이었다.
강의 주제는 '개발자의 똑똑한 학습 방법 - ‘메타인지’와 ‘피드백’'이었고 나중에는 이력서 피드백 및 고민에 대한 상담도 진행해 줘서 정말 유익했다.
나만 하던 고민들을 많은 개발자들이 고민하고 있다는 사실에 공감과 이에 대한 이야기를 들을 수 있어서 좋았고, 내가 하는 공부법과 일하는 방식 과연 메타인지를 잘 활용하는 공부법 인가? 에 대해 생각해 보게 되었다.
내 문제점
나는 좀 무식하게 손으로 글을 써가면서 공부를 하는 타입이었다(눈만으로는 잘 안 들어오고 글 쓰는 게 더 잘 외워지는 느낌?) 근데 이런 공부 방식은 오래 하지 못한다. 손도 아프고 지치기 때문에 처음에 열심히 하던 게 끝으로 갈수록 점점.... 대충 하게 되는 경향이 있는 것 같다.
또한 일할 때도 나는 주변피드백도 그렇고 나 자신도 그렇게 느끼는 게 일 처리가 느리다는 피드백을 받았다. 문제의 원인을 생각해서 이를 해결할 수 있는 방법에 대해 고민해 보는 계기가 되었다.
해결방안
- 일단 효율적인 공부와 일처리를 위해 타이머를 재야겠다. 나는 평소 느긋한 성격이기 때문에 공부할 때나 코드를 짤 때도 느긋하게 하는 경향이 있는 것 같다. 제한시간이 오늘이 아닌 시간 단위로 쪼개서 해당 시간 안에 꼭 끝내어야겠다는 목표를 세우기로 했다.
- 또한 해야 할 것은 시작하기 전에 요구사항을 명확하게 하고 작은 단위로 쪼개서 리스트없한다. 내가 해당 리스트를 처리할 수 있는 능력을 판단하고 80% 완성 화려면 얼마나 걸릴지를 생각해 보고 그거에 맞게 제한시간을 정한 후 제 한 시간 안에 끝내 보려고 한다.
- 해당 리스트가 끝날 때마다 정말 짧은 회고를 진행한다. 왜 제한 시간 안에 못 끝냈는지 이를 해결하려면 어떻게 해야 할지 등
위 과정을 반복하다 보면 점점 제한시간안에 내가 할 것을 끝낼 수 있을지 않을까 하는 생각을 한다.
느낀 점/요약
첫 til이라 길게 썼는데 짧아도 매일 쓰도록 노력하자...
오늘 하루 생각보다 유익하게 보낸듯하다.
- 참조무결성 문제 잊지 말기
- 쿼리 공부 좀 더 하기
- 유데미 강의, 인프런 영상 유익했다. 심심하거나 공부하기 싫을 때 찾아서 보면 좋을 것 같다.
'TIL' 카테고리의 다른 글
[2024.05.02] Today I Learned(Serializer, AWS CloudFront, commit message) (1) | 2024.05.02 |
---|