ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • db insert
    대충 정리 일기 2022. 8. 19. 20:28

     

     

     

    부트캠프 과제를 하는 과정 중에 공공와이파이 정보를 api로 받아와서 DB에 적재해야 했다.

    간단하게 구현할 수 있을 거라 생각했는데..

    거의 3시간 동안 이것만 붙잡은 것 같다.

     

    api 명세에 각 필드가 몇 글자 제한인지 나와 있지 않다보니 

    그냥 타이트하게 하려고 했다가 오류나고

    늘려줬는데도 오류나고

    안늘려줘도 오류나고

    오류나고

    오류나고

    오류나고....

     

    하다가 화나서 그냥 전부 다 varchar(100)으로 해결했다.

    생각지도 못한 데서 글자 수 오류 걸리니까 어이가 없더라..ㅋㅋㅋ

     

     

    그 다음은 insert 실행 하는데 속도가 1초에 50건(...) 

    이것 때문에 별거 다 찾아봤다.

     

     

    > 쿼리 배치 처리

    > INSERT INTO TABLE(col1, col2, col3)
    VALUES(a1, b1, c1), (a2, b2, c2), (a3, b3, c3), ....

    > LOAD DATA INFILE
    (이거는 쓰려다가 안 썼다.)

     

     

     

    insert가 이렇게 느리다고는 도저히 내 머리가 이해할 수가 없어서 

    어떻게든 insert로 하고만다고 오기가 생기더라 ㅋㅋ

     

     

    결론은 트랜잭션.

     

    jdbc Connection 클래스의 메소드 setAutoCommit으로 해결할 수 있었다.

     

    setAutoCommit이 true라면 트랜잭션이 실행되어 속도가 크게 저하하게 된다.

    false라면 만약 오류가 발생할 경우 그냥 rollback 해버린다.

     

     

    지금 내가 하는 게 큰 프로젝트도 아니고, 데이터가 중간에 변경될 일도 없다보니

    트랜잭션을 끄는 게 맘이 편하다.

     

    결과는 true : 306초 가량 => false : 4.8초

     

    ...

     

    너무 차이가 나서 너무 놀랐다.

    그냥 편-안 그 자체

     

    mysql 시스템 변수를 설정해서 트랜잭션을 끄는 방법도 있었는데 지금 당장 필요하지는 않다보니 설정은 안 했다.

    하지만 혹시 필요할 때를 위해 링크.

     

    https://santander.co.kr/151

     

    innodb mysql/mariadb insert 속도 높이기

    innodb 의 경우 instert 속도가 myisam에 비해 느리다. 이경우 여러가지 튜닝을 할 수 있는데 대표적인것만 몇개 수정, 비교 해보려고 한다. 1.innodb_flush_log_at_trx_commit 를 0으로 변경하면 속도를 많이 올.

    santander.co.kr

     

     

     

     

    오늘은 하루종일 DAO만 구현했다.

    그래도 고민한 만큼 결과물이 나쁘지 않은 것 같아서 만족스럽긴 하다.

    insert에 시간만 안 썼어도..

     

        @Override
        public void connect() { // default == saveFromDB(select)
            connectDB();
    
            saveFromDB();
    
            closeDB();
        }
    
        // insert 또는 select만 가능
        @Override
        public void connect(Query query) {
            connectDB();
    
            insertOrSelect(query);
    
            closeDB();
        }

     

     

    별로 구현한 건 없었지만 

    어느 정도 객체지향이 머리에 들어는 있구나 느껴졌다.

     

    DB 연결 메소드와 비즈니스 로직 메소드를 분리하고, 파사드 패턴으로 내부를 추상화했다.

    ※ 파사드 패턴이 아닌 것 같다. 어떤 건지 다시 찾아봐야 할 듯.

     

    중요한 건 내가 어떤 방식을 사용했는지 안다는 것.

    알고 쓰는 것과 모르고 쓰는 것에는 차이가 있다. 

     

    모르고 썼다면 그냥 이렇구나 하고 넘어갔겠지만 

    알고 썼기 때문에 머리에 한번 더 각인시킬 수 있었다.

     

     

     

    다음에 할 건 데이터를 처리해서 jsp로 보내주기!

    '대충 정리 일기' 카테고리의 다른 글

    String 관련 클래스  (0) 2022.09.03
    Annotation  (0) 2022.08.27
    Collection  (0) 2022.08.27

    댓글

Designed by Tistory.