항해99 1주차 종료!

정말 정신 없는 일주일이었다. 사실 이번주는 내가 뭘 하면서 어떻게 보냈는지 기억이 또렷한 기억이 없다.

7월 11일 월요일에 항해99가 출항하며 조별 프로젝트 발제가 되었고 첫날부터 조원들과 회의를 시작하여 목요일까지는 프로젝트 진행을 했다.

프로젝트명 "빨리바바".
중고물품 경매사이트인데 중국의 쇼핑몰 "알리바바"에서 아이디어를 얻었다. 큰 관련은 없지만!

이번 프로젝트는 나의 인생 첫 백엔드 참여 프로젝트였다.
나는 너무도 무지했고 형편 없었다.
(나란 사람은 나 자신에게 굉장히 냉철하고 엄격한 편이다. 자신감 없이 주눅이 들어 있다는 것은 아니다. 난 실패를 겪거나 망신을 당하면 더 오기가 생겨서 파고 드는 타입이다.)

TIL에서도 수차례 언급했지만 이전 퍼블리셔로 활동했던 탓인지 마크업, 스타일링이 정돈 되지 않은 걸 볼 수가 없었다. 처음 페이지 하나를 대표로 가이드로 잡아뒀지만 팀원들이 퍼블리싱에서 많이 당황하는 듯 했다. 퍼블리싱 영역에서부터 막혀 버리면 기능 개발 일정에 차질이 생길 것 같아서 내가 우선 퍼블리싱 작업을 했다. 그래도 첫날은 회의 구상 및 설계하느라 흘러갔고, 둘째날은 작업을 시작했으나 Git 때문에 충돌 해결하느라 거의 다 흘러가 버렸고 사실상 우리에게 남은 건 이틀 뿐이었다. 최선을 다해 팀원들 하루 평균 3~4시간씩 수면하며 최선을 다했지만 결국 제출일 까지도 로그인을 구현 해내지 못했다..

내가 조장을 맡은 건 아니었지만 지나고 보니 내가 조장 노릇을 했던 것 같다. 물론 어떤 부분이든 회의를 통해 의견의 취합하여 진행했다. 그러나 지나고 보니 내가 아쉬웠던 부분은 로그인 구현에 조금 더 초반에 시간을 쏟아 힘을 싣지 않았던 것이다.

처음 역할 분배를 할 때 페이지 또는 기능별로 역할을 나눴다. 각자 맡아 보고 싶어 하는 역할을 맡아 진행했다. 우리 모두 처음인지라 로그인이 얼마나 난이도가 있는지 몰랐기 때문에 강의 보고 따라 하면 가능한 부분이라 쉽게 생각하고 안일했던 것이다. 각자 맡은 임무도 벅차서 서로에게 물리적인 도움을 줄 수 있는 여력도 없었던 것 같다.

로그인을 구현하지 못한 이유는 냉정하게 보았을 때, 로그인을 맡았던 팀원이 강의를 조금 보고 바로 프로젝트에 작업하기 시작했고 하다가 막히면 또 강의 다시 조금 보다가 작업하고, 이것이 반복 되다 보니 완전하게 이해를 하지 못하고 계속 들었던 강의 부분도 다시 들어야 하는 상황이 반복 되었던 것이다. 로그인 부분에서는 맡은 임무를 수행하지 못하였기 때문에 그 요인에 대해 알아 내야 할 필요가 있다. 강의 보며 실습을 완전하게 끝까지 끝낸 다음 그 소스를 그대로 가져와서 적용 시켰다면 충분히 잘 작동 되었을 것이다. 내가 뭐라서 지금 누군가를 탓 하고자 하는 것이 절대 아니다. 그 팀원이 로그인 부분 관련 강의를 진득하니 끝까지 볼 수 있도록 더 배려하고 상황을 만들어 줬어야 한다는 것이다. 그렇게 강의를 쭉 다 보고 시작했다면 오히려 덜 촉박했을지도 모른다.

그 팀원도 정말 압박감에 많이 속앓이 했을거라 생각한다. 조급했기에 강의를 내려놓고 끝까지 볼 수도 없었을 것이고.

다음 프로젝트에는 꼭 로그인 부터 잡고 다음 스텝을 넘어가야겠다. 로그인이 처리가 되지 않으면 대부분의 구현한 기능이 붕 뜨게 된다. 나는 로그인 근처 구경도 해보지 못했다... 나도 조금만 여유가 생긴다면 꼭 그 강의 보면서 구현 해보고 싶다!

이번 "빨리바바" 프로젝트에서 내가 맡았던 작업 중 문제점이나 어려웠던 점은

  1. DB 구조 설계
  2. 입/낙찰 기능

이 두가지인데, 1번과 2번이 어느 정도 연관은 있다.
우선 DB 구조 설계는 내가 최소 하루는 고민을 했던 문제인데 그래도 내가 생각하기에는 꽤나 정돈 되고 만족스러운 DB구조라 생각을 했다.

입찰을 하는 과정에서 입찰자의 데이터가 해당 게시물에 쌓여야 했는데 게시물 DB(객체)안에 또 배열의 형태로 객체가 쌓이게끔 처리를 했다.

  • "bid_list:Array" 참고

그로 인해 낙찰이 되면, "bid_list" 아이템에서 낙찰 된 리스트의 choice의 상태를 1로 업데이트를 해주어야 했는데 쿼리로 접근 하는 부분에서 너무 어려워진 것이다.

db.product.update_one({'_id': ObjectId(_id_receive)}, {'$set': {'bid_list': 해당 아이템}})

이런 식으로 접근을 하고 싶었으나 왠 종일 검색하고 이 방법 외에 여러 시도를 해봤지만 접근 조차 할 수가 없었다.

결국 막바지에 매니저님께 조언을 구했을 때, 하신 말씀은 SQL이 아닌 NoSQL 형식의 DB에서는 이렇게 설계를 하지 않고 보통 이런 방식은 SQL형식의 DB에서 이렇게 설계를 한다고 하셨다.

매니저님에게 힌트를 얻어 해냈다. 데이터 내부 배열의 객체에 직접 접근 하기보다 DB에서 찾는 해당 "_id"의 값을 가진 데이터를 우선 가져와서 소스에서 데이터를 가공 하고 그 객체를 통째로 업데이트를 하는 방식으로 다시 접근 했다. 그러자 해결이 됐다.

@app.route('/products/bidlist/choice', methods=["POST"])
def choice_bid():
    _id_receive = request.form['_id_give']

    product_list = db.products.find_one({'_id': ObjectId(_id_receive)})
    bid_list = list(product_list['bid_list'])

    max_price = 0
    max_user = ''
    for bid in bid_list:
        bid_price = int(bid['bid_price'].replace(',', ''))
        if max_price < bid_price:
            max_price = bid_price
            max_user = bid['user_id']
    for bid in bid_list:
        bid_price = int(bid['bid_price'].replace(',', ''))
        if bid_price == max_price:
            bid['choice'] = 1

    product_list['bid_list'] = bid_list
    db.products.update_one({'_id': ObjectId(_id_receive)}, {'$set': product_list})

    db.products.update_one({'_id': ObjectId(_id_receive)}, {'$set': {'is_open': 0}})
    return jsonify({'msg': f'{max_user}님이 낙찰 확정 되었습니다.'})

가장 높은 가격으로 입찰한 아이템을 찾아 choice(낙찰) 상태를 1로 바꿔주었다.

그런데 매니저님께서 처음일텐데 이렇게 DB를 짤 생각을 했다는게 너무 대단하다고 칭찬을 해주셨다. 실생활에서는 정리정돈도 잘 안 하는데 이 일을 할 때는 정돈이 잘 되어 있는 상태를 추구한다.

아무튼 제출은 했지만 완성되지 못한 기능이 많아 시작부터 너무 아쉬움이 많이 남는 주였다. 하지만 아직은 부족해도 나태하지 않고 서로에게 따듯한 격려를 주며 최선을 다한 팀원들을 만나 너무 영광이었고 기술적인 부분도 많이 배웠지만 인적인 면도 많이 배웠다.

다음 기항지를 향하여.

아직 첫주가 지나지 않은 7월 15일 금요일, 2주차 미션이 발제가 되었다.
"프로그래밍 기초 주차". 본격적인 주특기 과정에 앞서 기본적인 언어에 대한 훈련이 시작 되었다. 나는 Java/Spring을 선택했기에 Java로 참여한다. "프로그래머스"의 코딩 테스트 기출 문제를 풀며 해당 언어에 대한 친밀도도 쌓고 앞으로 계속해서 사용할 뇌를 웜업 하고자 이런 미션을 내린 것 같다.

이번에 조가 변경이 되었다. 현재 조원은 4명, "7월 21일" 까지 완료할 미션 총 40개의 알고리즘 문제와 java Class를 사용한 과제까지. 역시나 이번주도 죽음이다!

발제가 된 금요일 당일 8문제 중 7문제를 풀고 한 문제는 너무 어려워 결국 해결하지 못 했다. 해시 기법을 사용해 풀어야 할 문제 였는데 난 해시에 대한 지식이 조금도 없었고 해당 문제를 읽고 이 문제는 해시기법을 사용 해야겠다는걸 조금도 눈치챌 수 없었다.

그 다음날 토요일 오전에는 조원들과 전날 풀었던 8문제를 가지고 각자 풀이법에 대한 설명을 하고 소통을 하며 시간을 보냈고 오후부터 2일차 8문제 풀이를 시작했다. 전 날 잠을 3시간 밖에 못 잔터라 첫 문제 부터 막혔는데 아무리 붙잡고 있어도 멍하고 머리가 돌아가질 않았다. 이게 진짜 피곤해서 머리가 안 돌아가는건지 그냥 내가 머리가 나쁜건지 알 수는 없었지만 새벽까지 붙잡고 있었지만 해결 못 하고 잠에 들었다.

토요일 해결 하지 못한 문제가 쌓여 있어 일요일인 오늘 오후까지 자고 일어나 다시 노트북을 열어 문제를 풀기 시작했다. 역시나 내 머리가 나쁜게 맞았다. 자고 일어나도 똑 같았다. 결국 풀이를 보고 풀었다. 정말 자존심 상한다... 그래. 다음 문제는 내가 어떻게든 푼다. 라는 생각으로 다음 문제로 넘어갔다. 첫 문제부터 너무 어려웠던 거다. 또 다음 문제부터 술술 풀리기 시작했다.

풀리는 문제는 진짜 이렇게 호로록 풀어지는데 막히는 문제는 정말 하루종일 붙잡고 있어도 안된다. 참나.

이전 나는 javascript를 공부하고 실무에서 활용을 해서 가끔 javascript로 알고리즘 문제를 풀어본 적이 있다.

확실히 인터프리터 언어인 javascript와 다르게 java는 타입 지정부터 배열 길이 지정 등 너무 엄격해 어떻게 문제에 접근해야 할지 그림은 대충 그려져도 표현을 하는 것 자체가 너무 어려웠다. 그런 엄격함이 있기에 더 안정적이고 에러 핸들링이 더 좋다는 것은 확실히 알겠다.

나는 타고난 성격이 내가 하는 일에 대충이란 없고 일단 넘어가는게 어렵다. 그래서인지 항상 속도가 남들보다 더디다. 알고리즘 문제를 풀 때 지금은 알고리즘이 주가 아닌 언어가 익숙해지기 위함이라 내장함수 사용해도 된다. 라고 분명 매니저님들, 튜터님들께서 말씀을 해주셨지만 아니. 나는 내장함수를 사용한 방법, 그리고 사용 않고 원초적인 알고리즘적인 방식으로도 해결하지 못하면 꼭 해결하고 이해하고 넘어가고 싶다. 나는 천재가 아니라 그게 쉽진 않을 것이다. 나처럼 머리가 좋지가 않다면 끊임 없이 여러 유형을 접하고 반복 숙달하며 여러 데이터를 쌓아가는 수 밖에 없다. 유연함은 떨어지겠지만 내가 완벽하게 습득한 지식으로는 해결 할 수 있을테니 그저 끊임없이 노력하는 수 밖에 없다.

오늘 WIL 제출 시간이 늦은 건 제출 시간 공지를 자정이 지나고서야 확인했다. (제출 늦은 것은 제가 위에 말한 성격과 무관합니다. 죄송합니다...)

제출 시간이 늦었음에도 이렇게 길게 쓰고 자빠져 있는 내가 참 미련스럽기도 하다. 항해99에서 과제든 회고록이든 제출 기간을 정해준다. 이건 실무에서 마감 기한과도 같다. 제출 기한을 꼭 맞춰야 한다. 반성해야한다.

이제 다시 월요일이다. 월요일에 상쾌하게 시작을 해야할텐데 오늘도 자기는 글렀다.. 2일차 할당 된 알고리즘 문제 다 풀고 잘거다. 밤을 새더라도!

2주차도 이겨낸다!

  • 오늘의 알고리즘 문제풀이
  1. 정수 제곱근 판별
  2. 제일 작은 수 제거하기
  3. 콜라츠 추측
  4. 하샤드 수
  5. 3진법 뒤집기
  6. 최소직사각형
  7. 같은 숫자는 싫어
  8. 두 개 뽑아서 더하기

0개의 댓글