본문 바로가기
💬 Smalltalk

주간회고 (2023-02-27)

by iirin 2023. 3. 5.

  • 2023-02-20 ~ 2023-02-26
  • 이번주... 나름 열심히 했을 지도??
  • 주간 회고를 올리는 것을 깜빡했다.. 이번주 주간회고 쓸 때 같이 올리는 양아치..

DB랑 어색한 사이...

코쿼의 CS16 과정이 끝이 보인다. CS14, 15의 주제는 Database였다.

 사실 작년 파이널 프로젝트 이후 쿼리에 `SELECT`도 건들이지 않았는데...🥹 아주 훌륭한 재회다. 스키마, 테이블, 조회, 입력 업데이트까지 하나하나 다시 문법을 안찾아볼 것이 없었다. 특히 이번 미션에서는 Docker로 띄워져있는 Mysql 컨테이너에 데이터를 넣어주어야 했는데, 역시.. 뭐하나 쉽게 지나가는 것이 없다.

아..안녕?? ㅎㅎ..

 

프로시저, 함수와 씨름한 후기

 가장 곤혹이었던 것은 100만개의 랜덤 데이터를 일정 비지니스 모델에 따라 생성하고 넣는 것이었다. 초반 작업은 거의 논의하지 않고 개념 공부를 하며 어떻게 이것을 할 수 있을까 고민하고 선택했다.

 보통 `csv`로 파일을 만들고 MySQL에서 로드하는 방식을 취한다고 하는데, 그 사실을 잘 몰랐던 나는 거대한 삽질을 했다. 프로시저와 함수로 어떻게든 만들어보고 싶어서 새벽 1시 정도까지 IDE와 chatGPT의 힘을 빌려 쿼리를 완성했다.

 

DELIMITER  $$
    CREATE PROCEDURE `INSERT_USR` ()
    BEGIN
        DECLARE NEW_NICKNAME VARCHAR(50) default '';
        DECLARE TEMP VARCHAR(30);
        DECLARE TEMPNUM VARCHAR(11);
        DECLARE NEW_MONEY INT;
        DECLARE NEW_VISIT_DATE datetime;
        DECLARE i INT DEFAULT 1;
        WHILE i <= 1000000 DO

            SELECT GET_NICKNAME() INTO NEW_NICKNAME;
            SELECT GET_STRING() INTO TEMP;
            SELECT GET_NUMBER() INTO TEMPNUM;
            SELECT GET_MONEY() INTO NEW_MONEY;
            SELECT GET_DATE() INTO NEW_VISIT_DATE;

            INSERT ignore INTO user_log (nickname, money, last_visit)
                VALUE (CONCAT(NEW_NICKNAME, CONCAT(TEMP, TEMPNUM)), NEW_MONEY, NEW_VISIT_DATE);
            SET i = i+1;
        END WHILE;
    end$$
DELIMITER ;

함수 5개와 프로시저를 이용해서 구현해서 1000개를 테스트했을 때까지만해도 고무적이었는데. 결국 이 쿼리는 100만개의 데이터를 만들기 위해서 1시간 10분이라는 시간이 걸렸다 🙈 중간에 기다리다 못해 잤는데, 아침에 일어나보니 1시간 10분이 찍혀있더라...

  • 문제사항
    • `INSERT ignore INTO` 로 짜다보니 정확하게 100만개가 입력되지 않는다.
    • auto commit을 비활성화 한 상태에서 1시간이 넘게 걸려서 994,363개가 입력되었다.
    • 마스터 클래스를 듣고나서, 트랜젝션 처리를 하지 못해 로컬 환경이 아니면 매우 불안정함을 알게되었다.
    • 혹시나 함수가 너무 많은가 싶어 함수를 모두 풀고 직접 알고리즘을 넣어보았는데 10분에 10만개(....) 정도 입력되었다.
  • 해결 방향 참고링크
    • `BULK INSERT` 방식을 사용해본다. 👈 이걸 써본 팀원의 말로는 10분 이내로 줄일 수 있다고 한다.
    • `LOAD DATA` 를 해본다. (csv 혹은 txt) 👈 이걸로 채택해서 해봤다. 역시 빠르다..

 

여하간 이렇게 제대로 다른 방향으로 삽질한 것은 오랜만에 있는 경험이라 새로웠다.

미션에 할애된 시간 중 반을 다른 방식으로 구현하느라 날렸지만 내가 전혀 모르던 영역을 배워 가설을 세우고 시도해 본 과정은 묘한 쾌감을 주었다.

얼마 전까지는 누군가 "개발 배우는 거 어때?" 라고 물었을 때 "어렵지만 할만 해" 라고 대답했었다.

하지만 이제는 "괴롭지만 재밌어" 정도는 대답할 수 있을 것 같다.

 

도움 되는 사람이 되고 싶다

 지난 주 미션을 하면서 금요일은 카페에 나가 동료와 함께 공부했다. 구현 과정에 대해 얘기를 하다가 그 동료가 이런 얘기를 했다.

 "나도 언젠가 다른 사람의 배움에 도움을 주는 개발자가 되고 싶어"

깊은 문제를 해결하고 홀가분하게 이렇게 말하는 동료의 한마디가 마음에 많이 와닿았다. 

 

 함께 하나의 미션을 가지고 공부를 하다보면 어떠한 문제에 막혀 도움을 청하는 것은 일상이다.

 그 때마다 문제의 구분 없이 이럴 수가 있나 싶게 많은 분들이 문제를 같이 해결해보려고 함께 몰입힌다. 그 과정이 마치 팀 퀘스트를 하는 것 같이 즐겁다.

 

 종종 이럴수가 싶나 싶게 본인이 도움을 주는 데 더 적극적인 사람들이 있는데, 그들은 본인들도 그 과정에서 많이 배웠다고 하지만 나로서는 정말 신기하다.

 나도 나의 배움으로 끝나는 것이 아니라 누군가의 배움을 도우며 나도 함께 성장하는 그런 개발자로 점차 성장하고 싶다.

 

 

그래서 한 주동안 한 것

 

다음 주 계획

  • CS 스터디 마지막까지 잘 마무리하기
  • 미니 프로젝트로 Spring 익숙해지기
  • 자바 웹 프로그래밍 Next Step 학습하기