드디어 나를 수개월간 괴롭혀 왔던 프로젝트 발표가 끝이났다~ 그리고 6개월간의 이스트시큐리티에소의 현장실습이 종료되었다!!
2주간 진행량 및 2021년 회고
- GETIT 프로젝트
함께 작업하는 클라이언트 개발자분이 당근마켓에 지원하신다고하셔서 부리나케 일단 기능개발에 초점을 맞춰 현재 만들어진 기능을 다듬는 작업을 진행했다.
-검색 기능 개발
최종적으로는 elasticsearch를 사용하여 기능을 개발하려고 했는데 아무래도 처음 다뤄보는 기능이기도 해서 시간이 오래걸릴것 같아 model filtering을 사용하여 간단하게 구현했다.
search = request.GET.get('search')
common_paginator = WholeBoardCommonPageNumberPagination()
recruit_paginator = WholeBoardRecruitmentPageNumberPagination()
free_posts = CommonBoard.objects.filter(Q(title__icontains = search) |
Q(content__icontains = search),category='free')
free_posts = common_paginator.paginate_queryset(free_posts, request)
free_serializer = CommonBoardSerializer(free_posts, many=True)
question_posts = CommonBoard.objects.filter(Q(title__icontains = search) |
Q(content__icontains = search),category='question')
question_posts = common_paginator.paginate_queryset(question_posts, request)
question_serializer = CommonBoardSerializer(question_posts, many=True)
recruit_posts = RecruitmentBoard.objects.filter(Q(title__icontains = search) |
Q(content__icontains = search))
recruit_posts = recruit_paginator.paginate_queryset(recruit_posts, request)
recruit_serializer = RecruitmentBoardSerializer(recruit_posts, many=True)
return JsonResponse({
"freeboard": free_serializer.data,
"questionboard": question_serializer.data,
"recruitboard" : recruit_serializer.data
})
코드가 굉장히 길다. 반드시 리팩토링이 필요한 부분인것이다. 하하...
url로 넘어온 category파라미터는 말그대로 카테고리 구분에 사용되면 ,title, content기능을 django orm filter기능중 __contains라는 걸 사용해 필터링할 문자열이 속한 필드를 모두 가져오는것으로 구현하였다.
-필터 기능 개발
이부분도... 굉장한 리팩토링이 필요해보이는데 일단은 노가다로 구현했다. 백퍼센트 어디 지원해서 면접볼때 까일것 같긴하지만.. 일단 시간투자해서 해결했다는데 의의를 두고...
pm = request.GET.get('pm')
developer = request.GET.get('developer')
designer = request.GET.get('designer')
category = request.GET.get('category')
if category == 'free':
if pm == 'true':
if developer == 'true':
if designer == 'true':
posts = CommonBoard.objects.filter(Q(worker = 1) | Q(worker = 2) | Q(worker = 3), category='free').distinct()
paginator = BoardPageNumberPagination()
result_page = paginator.paginate_queryset(posts, request)
serializer = CommonBoardSerializer(result_page, many=True, context={'request': request})
return paginator.get_paginated_response(serializer.data)
else:
posts = CommonBoard.objects.filter(Q(worker = 1) | Q(worker = 2), category='free').distinct()
paginator = BoardPageNumberPagination()
result_page = paginator.paginate_queryset(posts, request)
serializer = CommonBoardSerializer(result_page, many=True, context={'request': request})
return paginator.get_paginated_response(serializer.data)
else:
if designer == 'true':
posts = CommonBoard.objects.filter(Q(worker = 3) | Q(worker = 2), category='free').distinct()
paginator = BoardPageNumberPagination()
result_page = paginator.paginate_queryset(posts, request)
serializer = CommonBoardSerializer(result_page, many=True, context={'request': request})
return paginator.get_paginated_response(serializer.data)
else:
posts = CommonBoard.objects.filter(worker=2, category='free').distinct()
paginator = BoardPageNumberPagination()
result_page = paginator.paginate_queryset(posts, request)
serializer = CommonBoardSerializer(result_page, many=True, context={'request': request})
return paginator.get_paginated_response(serializer.data)
elif designer == 'true':
if developer == 'true':
posts = CommonBoard.objects.filter(Q(worker = 1) | Q(worker = 3), category='free').distinct()
paginator = BoardPageNumberPagination()
result_page = paginator.paginate_queryset(posts, request)
serializer = CommonBoardSerializer(result_page, many=True, context={'request': request})
return paginator.get_paginated_response(serializer.data)
else:
posts = CommonBoard.objects.filter(worker=3, category='free').distinct()
paginator = BoardPageNumberPagination()
result_page = paginator.paginate_queryset(posts, request)
serializer = CommonBoardSerializer(result_page, many=True, context={'request': request})
return paginator.get_paginated_response(serializer.data)
elif pm == 'false' and designer == 'false' and developer == 'false':
res = {
'count': 0,
'next':None,
'previous':None,
'results': [],
}
return JsonResponse(res)
else:
posts = CommonBoard.objects.filter(worker=1, category='free').distinct()
paginator = BoardPageNumberPagination()
result_page = paginator.paginate_queryset(posts, request)
serializer = CommonBoardSerializer(result_page, many=True, context={'request': request})
return paginator.get_paginated_response(serializer.data)
매 조건 절마다 return한건 테스트용도로 해둔건데 마지막에만 당연히 리턴문 돌려주면되니 알아서 필터링해주세요ㅎㅎ
- member 기능 개발
import json
from django.http import JsonResponse
from django.shortcuts import render
# Create your views here.
from profiles.models import TeamProfile
from requests import Response
from rest_framework.generics import GenericAPIView
from .models import Member, WaitingForMember
from .serializers import WaitingMemberSerializer
class MemberAddView(GenericAPIView):
def post(self, request):
"""
팀원 추가(POST)
---
{
'teamprofile': 2,
'member': 3
}
"""
requestData = json.loads(request.body)
teamprofile_id = requestData['teamprofile']
member_id = requestData['member']
print(requestData)
profile = TeamProfile.objects.get(id=teamprofile_id)
member = Member.objects.create(member=member_id)
wait_member = WaitingForMember.objects.get(teammember__id=teamprofile_id, waitmember=member.member)
wait_member.delete()
profile.members.add(member)
res = {
"message": "success"
}
return JsonResponse(res)
class MemberWaitingView(GenericAPIView):
def get(self, request, teamprofile):
"""
프로젝트 지원 대기 멤버 조회(GET)
---
{
'teamprofile': 2,
'waiting_member': 3
}
"""
teamprofile_id = request.GET.get('teamprofile')
teamprofile = TeamProfile.objects.get(id=teamprofile_id)
wating_member = teamprofile.waitingmember
serializer = WaitingMemberSerializer(wating_member, many=True, context={'request': request})
return Response(serializer.data)
def post(self, request):
"""
프로젝트 지원 대기 멤버 추가(POST)
---
{
'teamprofile': 2,
'waiting_member': 3
}
"""
requestData = json.loads(request.body)
teamprofile_id = requestData['teamprofile']
waiting_member = requestData['waiting_member']
try:
waiting_member = WaitingForMember.objects.get(teammember__id=teamprofile_id, waitmember=waiting_member)
print(waiting_member)
teamprofile = TeamProfile.objects.get(id=teamprofile_id, waiting_members=waiting_member)
print(teamprofile)
if teamprofile is None:
raise Exception
res = {
"message": "fail"
}
except:
teamprofile = TeamProfile.objects.get(id=teamprofile_id)
waiting_members = WaitingForMember.objects.create()
waiting_members.waitmember = waiting_member
waiting_members.save()
teamprofile.waiting_members.add(waiting_members)
res = {
"message": "success",
'teamprofile': teamprofile_id,
'waiting_member': waiting_member
}
return JsonResponse(res)
팀 프로젝트의 멤버 추가기능을 개발하는데에 있어 신청을 했을때 받는 멤버와 팀장이 수락하여 멤버가된 모델을 분리하였고 역참조의 개념을 한번 익히는데 도움이 되었다. 사실 이 역참조라는걸 생각안하고 항상 구현하다보니 코드가 지져분해졌었는데 나중에 다끝나고 리팩토링할때 많이 쓰일것 같은? 기능이다. foreignkey의 related_name을 설정하여 외래키로 참조된 모델에서 역으로 참조한 모델을 참조할때를 역참조라고한다. 시간이 좀많이 걸렸다.
Get IT
getit.best
이젠 어느정도 명함을 내밀수 있게 완성이 되었다. 알림과 채팅만 남았다!!!! 현재 기능으로도 나쁘지 않다고 생각한다~
-KOTLUCK
이제 제대로 시작했다. 한국형 파티문화를 만들겠다! 라는 멋진 포부로 POTLUCK의 이름을따 KOTLUCK으로 지었는데 여러 회의를 거쳐 보라(BORA)라고 결정지었다!!!! 무엇보다 기획자 포지션이 정말 중요한데 너무 좋은분이 오신것같아 나도 함께 열심히 하고 있는중이다. 개발에 있어선 아직 세부기능이 확정이 안되서 일단 FCM을 활용하여 채팅, 알림기능 개발중이다. 이제 시간이 넘쳐나는 백수가 되었으니 졸업전 창업이라는 목표로 열심히 다시 불태워봐야겠다~~
-인턴
할말이 참많다.. 일단 엄청난 스트레스였던 패치랩 시연 및 발표가 끝이났다. 한20여분이 구글미트에 들어오셔서 보셨는데 많이좀 떨었고 개발을하며 ppt만들일은 없을줄알았는데 ppt까지 만들어서 발표하게 되었다. 리드님이랑 사수님이 질문때 많은 지원사격을 해주셨다는 생각이 들었고 두분은 모르시겠지만 사실나는 정말 감사했다ㅎㅎ 그리고 무엇보다 6개월간의 인턴 즉 현장실습이 종료되었다! 맨처음 글을올렸던 올해 6월말에 업무에 있어 조금이라도 도움이 되는 인턴이되자!라고 마음 먹었는데 다른 팀원분들도 그렇게 느끼셨으려나 모르겠다..ㅎ... 자주 실수도 하고 모르는것도 많아서 질문 투성이였는데 화한번 내지않고 모두 친절하게 알려주신 팀원분들께 그저 감사할 따름이다. 지금와서 생각해보면 업무가 정말 많다고 혼자서 불평도 했었고 초반에 엄청난 열정에 비해 조금은 게을러지고 했던것 같기만 하다. 사실 6개월간 많은 일이 있었고 처음으로 자취라는 것도 경험을 해서 후회되진 않는시간이었다. 무엇보다도 6개월전 무급이라도 개발자분들과 일을 함께 해볼수 있는 기회가 있었으면 좋겠다라고 생각도 했었고 불합 통지를 받았지만 추후 면접을 보지 않겠냐고 선뜻 다시 물어봐주신 pms-mpi셀 팀원분들한테 너무 고맙기만 한것같다. 자취라는 꿈과 개발일을하며 돈을 벌 첫기회를 준 기업이다. 사실, 일을 하기전 직급에 따라 불합리한 상황이 벌어지는것이 조금은 당연한거라 생각했는데 이스트시큐리티에서 일을 하며 정말 내가 잘못생각했구나!라는걸 느꼈다. 나에게도 중요한 업무를 할당해주시고 내의견을 조금이라도 무시하는 경향이 전혀없었으며 직급이 높다고 해서 불합리한 상황이란게 전혀없었다. 모든분들이 의견을 낼수 있으며 피드백을 바로바로주시고 정말 자유로운 분위기의 회사였다. 물론 기술스택이나 목표로 잡았던 기업이아니라 당장은 지원하진 않겠지만 회사생활을 해보면 이스트소프트라는 기업 정말 좋은 회사인걸알수 밖에없다. 개발자에서 대표가 되신 대표님부터 시작해서 현장실습생까지 모두가 동등한 위치에서 자신의 능력을 한껏 뽐낼수 있는 회사라고 생각한다. 많이 힘들었기도 했지만 얻은것도 많았던 터라 이제 막 나왔는데 아련한 기분이 든다ㅎㅎ.. 다만 걸리는건 중간에 이슈가 발생해서 업무를 다못끝냈다는거..? 많이 못끝내고나와 아쉽고 죄송하기만 하다....
-2021 회고
앞에 주저리 주저리 썻지만 요약하자면
- 6개월간의 자취생활과 꿈에 그리던 인턴을 해냈다!
- 한번은 제대로 완성해보고 싶었던 getit 프로젝트를 완성해냈다!
-2022 목표
- 창업 : BORA로 창업이 목표다. 당장 어떻게 하는진 모르겠다. 일단 앱개발해서 대회도 나가보고하고싶다.
- 졸업: 졸업이다. 코스모스 졸업인데 일단 정처기따면 졸업일테니 정처기가 목표인가?ㅎ..
- 취업: 학생이지만 내생각엔 취준생이 맞다 좋은회사가서 발전하고 싶다. 좋은회사 갈꺼다
- cs, 알고리즘 공부좀 개학전까지 끝내두기!
- django이외에 다른 무기하나더 장착해두기!
- GETIT 광고달기: 에드센스 달고 싶다. 알림, 채팅기능달면 다른 스터디 모집엔 비교할수 없는 최고라고 자신한다. 광고비 받아서 서버비용이라도 충당하고 싶다ㅎㅎ...
- 여행: 사실 생각보다 돈좀 많이 모은것 같아 1달간 돈다쓰고올꺼다. 제주도가서 앞으론 쉬고싶지 않을정도로 좀 쉬다와야겠다.
필수적인것만 적었는데 다이뤘음 좋겠다!! 2022년도 화이팅!
그리고 2021년은 너무 그냥 고마운 한해였다!!
-끝-
+)사실 WIL컨텐츠는 아무래도 잠시 멈추려한다... 한번에 몰아쓰는 경향이 있는것 같아서 뭔가 제대로 매일 공부할만한 것이 생기면 그때 진행할꺼다ㅎㅎ....... 일단 남은기간동안 연합동아리 지원, 정보처리기사 공부, 프로젝트 진행이 대다수 일듯해서?? 일단 잠시는 멈춘다.. 다음에 시작하면 WIL이 아닌 TIL로 복귀하길...ㅎ
'개발 life > 셀프 부트캠프(WIL)' 카테고리의 다른 글
WIL 17일차-2021.12.15(TIL -> WIL) (0) | 2021.12.15 |
---|---|
셀프 부트캠프(TIL)TIL 16일차-2021.11.12(https, django signal) (0) | 2021.11.13 |
TIL 15일차-2021.11.10(django,gunicorn,nginx,https,코린이의 금의 환향..?) (0) | 2021.11.10 |
TIL 14일차-2021.10.28(코린이 인턴의 흔한 실수..., django channels, socket통신, pyvmomi) (0) | 2021.10.28 |
TIL 13일차-2021.10.23(web socket, vmware esxi,pyVmomi) (0) | 2021.10.23 |