DB Insert에는 3가지 방법이 있다.
이전 프로젝트에서 전처리된 데이터를 mongoDB에 적재하는게 정말 오래 걸렸는데 이번 프로젝트에서는 대용량 데이터의 적재 성능을 고려하여 Insert 전략을 개선하고 배치 기반 처리 또는 파일 기반 대량 삽입을 통해 DB 성능 최적화를 하고 싶다.
INSERT INTO table_name (col1, col2) VALUES ('a', 1);
INSERT INTO table_name (col1, col2) VALUES ('b', 2);
INSERT INTO table_name (col1, col2) VALUES ('c', 3);
일반적인 코드에서 루프를 돌며 insert를 수행하며 하나의 레코드를 한 번에 하나씩 DB에 삽입한다.
구현이 단순하고 직관적이며 예외 발생 시 어떤 row에서 실패했는지 추적하기 쉽다는 장점이 있다.
하지만 트랜잭션이 비용이 크다. insert를 할 때마다 커넥션, 파싱, 실행이 발생하고 그렇기 때문에 대량 데이터 입력 시 매우 느리다. DB에 부하도 크다는 단점이 있다.
따라서 디버깅 목적이나 초기 개발 테스트 용도로 사용한다.
INSERT INTO table_name (col1, col2) VALUES
('a', 1),
('b', 2),
('c', 3);
여러 row를 한 쿼리에서 한 번에 삽입한다. 일반적으로 수십에서 수천 건까지 한 번에 삽입이 가능하다.
따라서 트랜잭션 오버헤드가 감소하고 성능이 향상된다. 코드가 비교적 간단하고 성능도 좋다는 장점이 있다. 일반적으로 대부분의 DB에서 지원된다.
하지만 너무 큰 배치로 묶으면 한 번의 실패로 전체를 rollback해야 할 수 있다. row 수가 많을수록 SQL 길이가 길어져 에러 위험이 증가한다는 단점도 있다.
따라서 중간 크기 배치나 ETL에서 많이 사용한다.
LOAD DATA INFILE '/path/to/file.csv'
INTO TABLE table_name
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
(col1, col2);
CSV
나 TSV
같은 텍스트 파일을 DB에 직접 적재한다. MySQL
등에서 제공하는 고속 데이터 적재 명령이다.
가장 빠른 데이터 적재 방식 중 하나이며 적재 전 파일 포맷 검증이 가능하다는 장점이 있다.
하지만 파일 경로/권한 문제 발생 가능성이 있고 전처리된 CSV 등 파일을 준비해야 한다. 또한 운영 환경에서는 보안상 비활성화된 경우도 있다.
따라서 배치로 대량 적재할 때(로그 적재 등)나 사전 가공된 파일이 있는 경우 많이 사용한다.
서비스 개발을 시작했다. 좋아요 서비스를 맡아서 진행 중이다. 백엔드 팀원분들의 설명과 연휴 동안 학습했던 내용에 힘입어 패키지가 어떤식으로 구현되는지 알 것 같다.
좋아요 서비스를 구현해서 터미널에서 curl로 테스트를 진행하려고 했는데 ureka 관련 에러가 발생했다. 프로젝트가 MVP로 진행되서 ureka 서버를 심어서 서로 다른 서비스가 어디에 있는지 알려주는 역할을 하고 있다고 듣긴했는데 기본 설정 부분이라 백엔드 팀에 상의해봐야 할 것 같다.
그래서 내일은 에러 잡고 테스트 성공해서 서비스 구현하는게 목표다. 화이팅