728x90

드디어 나를 수개월간 괴롭혀 왔던 프로젝트 발표가 끝이났다~ 그리고 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로 복귀하길...ㅎ

728x90
728x90

1. 기회

으앗!! 너무나 갑자기 좋은소식이 전해졌다...

이번 방학때는 없을 기회라 생각했던 인턴의 기회가 갑자기 나에게 다시찾아왔다!!

서류에서 떨어졌다는 소식에 의기소침해져 있던 나였지만... 오늘 채용담당자님께서 전화로 추가합격후 면접 가능시간을 말해달라는 말씀에 기회를 잡아야 겠다는 생각만 하고 "1시간 30분후인 17시에 면접을 보겠습니다!"하고 전화를 끊었는데 정말 실감이 나지 않았다...

메일로 오고 나서야 실감이 났고 순간 준비도 안된 상태에서 무엇을 준비해야하지?라는 생각뿐이었다. 

 

2. 면접 준비

평소 파이썬 장고 공부를 할때 질문드리는 오픈톡방에 급하게 면접예상 질문에 관해 여쭤봤고 화상면접을 볼 장소인 카페까지 가면서 devops에 관해 여러가지 찾아보며 지하철에 달달 외우고 갔던것 같다. 

-devops란?

-Docker, K8S은 무엇이고 각각 장점은 무엇인가? 그리고 컨테이너는 무엇인가?

-CI/CD 파이프라인이란?

-TCP/UDP는 무엇이고 차이점은 무엇인가?

-1분 자기소개

이렇게 총5가지를 집중적으로급하게 유튜브와 구글링을 통해 알아봤었다.

 

3. 면접

면접은 생각보다 위에서 공부했던 기술적인 부분보다는 아무래도 인턴이다보니 그동안 공부하고 진행했던 프로젝트에 관한 내용을 집중적으로 질문해주셨다.

 

-자기소개(뭐라고 한지 기억나지않는다...)

-파이썬과 C언어를 주로 공부했다고 했는데 두가지 언어로 서버를 만들경우의 차이점과 파이썬만의 장점은?

-프로젝트를 진행하며 겪었던 어려움과 그원인, 그리고 해결방법은?

-인턴간 진행할 devops업무와 자신의 성격을 생각했을때 잘맞다고 생각하나요?

-장고 프레임워크만 사용하다보니 파이썬 자체의 언어 활용법에 대해 잊지는 않았나요?

 

생각보다 긴장을 많이 한탓에 위의 질문정도 밖에 생각이 나지 않고 면접은 한4~50분 진행했다.

지난번 면접경험이후 떨지 않을것이라 생각했는데 오늘 갑자기 잡히기도 했고 스스로 기초가 많이 부족하다는걸 알기때문에 대답 못할 질문이 나올까봐 덜덜 떨며 면접을 봤다...

 

4. 후기및 다짐

올해 목표로 잡았던인턴이 갑자기 빠르게 할수있는 큰 기회가 온것같아 너무 행복하다ㅠㅠ 원래는 연합동아리에 지원을 해서 활동하는것이 이번방학의 목표였는데 이번 방학부터 인턴을 하게 연말까지 인턴을 진행하게 됐으니 전에 다짐했던 회사에 실질적으로 도움이 될수 있는 그런 인턴이 되자!! 라는걸 이뤄낼것이다. 장고 공부는 꾸준히 하겠지만 지금보다는 비중을 조금 줄이는 대신 회사업무에 도움이 될수 있도록 devops에 카테고리를만들어 그에관한 지식을 학습할 것이고 무엇보다 python으로 업무가 진행될것 같으니 기존에 부트캠프의 일정에 맞춰 진행하려했던 TIL을 python에 대한 문법학습, 크롤링등 python언어 자체에 대한것으로 채울 것이다. 물론 cs지식 스터디 같은경우는 원래부터 온라인으로 진행 하고자 했으므로 종강후 꾸준히 학습을 병행할것이다. 아무튼 이런 좋은 기회 너무너무 감사합니다! 화이팅:)

728x90

+ Recent posts