[Retrospective]브랜디 기업협업을 마치며.

jake.log·2020년 11월 20일
0

1개월 간의 브랜디 인턴십이 끝났다.

부담이 컸지만, DB 관리와 에러관리, 현업에서 일하는건 어떤지 많이 배울 수 있는 시간이었다. 인턴십에 관련하여 느낀점을 나누고자 한다.

  • 브랜디 인턴십 기간 : 20.10.19~20.11.12
  • 프로젝트 내용 : 브랜디 Admin 사이트 클론
  • 프로젝트에 사용된 기술:
    • 프론트엔드: React, scss
    • 백엔드: Flask, PyMySQL, Bcrypt, PyJWT, CORS, RESTful api, Blueprint, Flask_request_validator
    • 소스관리: git, github
    • 협업툴: Trello

1. 현업은 공기부터 다르다!


  • 1,2차 프로젝트와 달리 기업협업은 브랜디 회사 내에서 진행이 되었다.

  • 첫날부터 위코드에서 진행했던 프로젝트와는 다른 긴장감과 초조함이 흘렀다.아무래도 채용연계형 인턴이었기 때문에 잘하고자 하는 부담감이 있었다.

  • 과제는?
    기업협업의 과제는 Admin 페이지 클론 프로젝트였다.

    • 브랜디의 Admin 클론을 하면서 코드 리뷰를 하고 수정해가며 최종적으로 Admin 페이지를 완성해가는 방식!
  • 시작은 모델링!
    1,2차 프로젝트의 모델링은 정말 아무것도 아니었다는 느낌이었다. 모델링은 생각보다 더 어렵고 복잡하고 어렵고 어려웠다..^^
    그래도 Admin 페이지의 모델링을 하며 새로운 개념들도(예:선분이력) 배우게 되었다. 아래 사진처럼 모델링의 수량이 확연히 늘어났다.(사실 이 모델링도 많이 부족하다.)


  • Aquery를 이용한 Brandi Admin 페이지 모델링

  • 해당 모델링을 하면서 가장 큰 배움이 있었는데, 바로 경험이다. 1,2차 프로젝트를 할때 유저 관리는 회원가입을 위해 단순히 비밀번호 등 개인정보만 관리하면 된다고 생각했다.

  • 그러나 이번 프로젝트에서는 Admin 페이지를 하면서 회원정보의 이력, 수정, 삭제, 삭제된 정보의 기록 유무까지 데이터에 남겨야 했다. 그리고 token을 통해 master(관리자)인지 seller(셀러)인지 확인하는 것 등 회원 관리에도 정말 여러가지 가공해야할 데이터가 많다는 것을 알게 되었다. 그런데 이 모든 것은 직접 내가 경험하지 않고는 확인할 수 없던 것이었다.

  • 경험하지 못했던 것이지만 모델링을 한 후 브랜디 팀장님께서 모델링을 분석하고 리뷰해주셨다. 팀장님께서 알려주신 문제점들을 통해 직접 서비스를 만들어서 경험하지 않았지만 회원 관리를 위해 필요한 모델이 무엇인지, 어떤 부분이 중요하고 부족했는지 확인할 수 있었다.

  • 따라서 이번 브랜디 인턴을 경험하면서 우리가 직접 경험하지 못해 짤 수 없었떤 모델링을 리뷰를 통해 경험해본게 정말 큰 이득이었다.

  • 물론 리뷰를 통해 모델링을 잘 만들었다고 생각했지만, API를 작성하면서 모델링의 문제점은 끊입없이나왔다.

  • NULL 값 처리, DEFAULT 값 설정, 소프트딜리트 설정,새로운 모델 생성 등 모델은 API를 만들며 계속 수정되었다.

  • 그러나 이번 프로젝트는 Flask로 진행되어 DB 테이블의 경우 Schema 폴더로 설정을 해주어 InnoDB 엔진으로 테이블을 손쉽게 변경할 수 있었다. 물론 DROP과 CREATE 를 반복하긴 했지만, schema 폴더를 만들어 테이블 SQL을 관리하면 초기 모델 설정 때 편리한 점이 있었다.

  • 결론적으로 모델링을 하면서 느낀 것은 현업에서는 모델링을 정말 중요하게 생각한다는 것! 그리고 모델링을 대충하면 실수는 바로바로 나와 서비스가 엉망이 될 수 있다는 것! 현업에서는 대충대충 뭔가를 만들어내는게 아닌 집중과 노력으로 무언가를 만들어내고 있다는 것!을 배웠다.


  • 초기 세팅 중 blueprint를 등록한 app.py

2.건강이 최고, 건강한 개발자가 되자!


  • 이번 인턴십을 하며 가정적으로나 개인적으로나 심리적으로 불안정한 상황이 조금 생겼다.

  • 이런 상황에서 엎친데 덮친 격으로 API도 잘 만들어내지 못했다.

  • 회원가입 API를 만드는데 오류가 너무 많이 나고 하나를 하더라도 제대로 해보고 싶어 시간을 너무 많이 투자한 탓이다. 물론 회원 가입 API를 만들며 DB connection과 transaction의 개념, 에러처리 등 많은 것을 배웠다.

  • 짧은 시간에 어느정도 기능 구현을 많이 진행해야했는데 그렇지 못해 심리적으로 부담이 생겼고, 결국 하루는 몸이 안 좋아 회사에 가지 못하는 상황까지 생겼다.

  • 성실함하면 빼놓지 않았던 내가 건강 때문에 회사를 빠지다니 .. 마음이 많이 불편했다.

  • 그리고 이 날 이후로 업무 내적+외적으로 멘탈관리와 체력관리가 정말 중요하다는 말로 실제로 체감했다.

  • 개발자라는 직업이 쉬운 직업은 아닌것 같다. 무언가를 만들어내야 한다는 압박감과 시간 안에 해야한다는 부담이 크다.이러한 상황 속에서 잘 버티기 위해서는 멘탈,체력관리 즉 건강관리가 정말 중요하다!

  • 한번 몸이 아프고 나니 신체적으로 정신적으로 관리를 하기위해 실제적으로 운동도하고 정신적으로 마음도 평안하려고 노력했는데, 이러한 노력때문인지 별 탈 없이 과정을 잘 끝냈다. 건강하지 않으면 내가 좋아하는 개발도 못한다는걸 알게 되었다는 것만으로도 정말 값진 경험이었다.


  • 회원가입 API 중 정규식을 활용한 유효성 검사

3.적극적으로 소통하는 개발자!


  • 1개월의 인턴십을 돌아보면 배운것도 많지만 아쉬움도 많이 남는다.

  • 특히 궁금하고 진행하기 어려웠던 부분들이 많이 있었지만 혼자 해결해보고자 하는 마음 + 틀리면 어쩌지? 라는 마음 때문에 질문을 많이 하지 못했다.

  • 물론 함께 했던 동기들과 같이 이야기하고 구글링을 하면서 문제를 해결했지만, 좀 더 명확하게 문제를 해결하고 답을 줄 수 있는 현업에 계신 팀장님께 많이 질문하지 못했던게 아쉽다.

  • 앞으로 개발자로 성장하기 위해 적극적인 마인드로 소통하며 내가 모르는 걸 정확히 물어보고 확인하여 답을 얻어야겠다.


4.실력은 기본! 함께하고 싶은 개발자!


  • 1,2차 프로젝트를 하면서 파이썬이 무엇인지, 장고를 어떻게 활용하면 되는지 조금 알게되어 자신감이 올랐다면, 이번 브랜디 인턴십은부족한 점이 너무 많이 들어나서 더 열심히 해야겠다는 욕심을 만들어주었다.

  • 프로젝트를 하면서 백엔드에서는 파이썬+플라스크를 썼고, 자바스크립트와 리액트+스타일 컴포넌트를 활용해 프론트 일부 페이지도 만들었는데 현업에서 원하는 기능을 구현하기 위해서는 지속적으로 공부로 부족한 부분을 채워야한다는 것 느꼈다.

  • 물론 처음 경험하는 플라스크를 1달동안 공부하여 API까지 만들어낸 자신을 칭찬하지만, 더 좋은 실력으로 더 많은 API를 만들어냈으면 하는 욕심과 아쉬움이 크다. 팀원들과 더 많은 것을 할 수 있었는데 그렇지 못했던 것 같다.

  • 이번 인턴십을 하면서 가장 크게 느낀건 아무리 내가 좋은 사람이더라도 실력이 뒷받침 되지 않으면 동료들과 함께 일하며 좋은 결과물을 낼 수 없다는 것이었다.

  • 저번 2차 프로젝트 회고록에 이런 글을 썼었다.

- 같이 일하고 싶은 개발자! 
이런 개발자가 되기 위해서는 나에게만 집중하면 안 된다. 
실력 성장은 기본이다. 
성장에만 초점을 맞추지 않고, 주변에 같이 일하는 개발자들과 함께 가기위한 노력을 하자. 
  • 이 글은 여전히 유효하다! 그렇지만, 우선은 내 성장에 초점을 맞춰야겠다.

  • 내 실력이 지속적으로 성장되지 않으면 주변에 도움을 줄수도 없고, 주변 개발자가 나와 함께하고 싶지도 않을 것이다.

  • 기획자가 원하는 기능과 프론트가 받기 원하는 구조로 데이터를 보낼수 있는 개발자가 되자. 이런 실력이 뒷받침 되면 소통이 더 원활해질 것이고, 함께 하고 싶은 개발자가 될 것이다.


  • 리액트를 활용하여 프론트를 경험해본 시간

5.Appenddix) 기억하고 싶은 코드

아래 코드는 회원가입시 전달된 seller_info 데이터를 입력하는 model_dao 내부의 코드이다. 함수를 3개로 만들었다가 transaction에 오류가 생겨서 1개의 함수로 한번에 transaction을 진행하기 위해 lastlowid 를 썼다.
사실 이 코드가 효율적인 코드라고 말할 수는 없겠지만, db 관리를 한번에 진행하여 무결성을 보장한다는 점에서 기억하고 싶은 코드이다.


    def signup_account(self, seller_info, db_connection):
        """회원가입시 전달된 데이터 입력  
        Args: 
            seller_info: controller에서 받은 셀러정보 변수
            db_connection: DB 커넥션 변수
        Returns: 
            identification service로 전달  
        Authors: 홍성은
        History:
            2020-10-26 : 초기 생성
            2020-10-27~28 : 오류, SQL 수정 
            2020-11-04 : insert_sellers,insert_managers 매소드 분리 했을 때 커밋에 문제가 생겨 
                         lastrowid를 사용하여 signup_account 메소드로 합침.
        """
        with db_connection.cursor(pymysql.cursors.DictCursor) as cursor:
            insert_accounts_query = """
            INSERT INTO accounts(
                identification,
                password,
                account_type_id
            )VALUES(
                %(identification)s,
                %(password)s,
                2
            )
            """
            # SQL문 실행 및 기입
            # account 정보 기입
            cursor.execute(insert_accounts_query, seller_info)

            # 새롭게 생성된 id 값을 가져옴
            account_number = cursor.lastrowid
            seller_info['account_id'] = account_number

            insert_sellers_query = """
            INSERT INTO sellers(
                contact,
                account_id,
                attribute_id,
                status_id,
                korean_name,
                english_name,
                cs_contact,
                updater_id
            ) VALUES (
                %(contact)s,
                %(account_id)s,             
                %(attribute_id)s,
                1,
                %(korean_name)s,    
                %(english_name)s,
                %(cs_contact)s,
                (SELECT accounts.id FROM accounts JOIN sellers AS s ON accounts.id = s.account_id WHERE identification=%(identification)s)
            )
            """
            # 셀러 정보 기입
            cursor.execute(insert_sellers_query, seller_info)

            seller_account_no = cursor.lastrowid
            seller_info['seller_id'] = seller_account_no

            # 담당자 정보 생성
            insert_managers_query = """
            INSERT INTO managers(
                contact,
                seller_id,
                ordering,
                updater_id
            ) VALUES (
                %(contact)s,
                %(seller_id)s,
                1,
                (SELECT id FROM accounts WHERE identification=%(identification)s)
            )
            """
            cursor.execute(insert_managers_query, seller_info)

            return jsonify({"message": "SUCCESS"})
profile
꾸준히!

0개의 댓글