오늘도 하루 종일 프로젝트를 진행해야해서 바쁜 하루였다. 어제 CRUD는 거의 완성해둔 상태였고, 오늘은 디테일한 부분을 채워넣고 테스트를 진행하면서 오류가 있는 부분을 수정하는 시간을 가졌다. 기본 기능은 구현해둔 상태라 내일부터는 다음 스텝으로 잘 넘어갈 수 있을 것 같다.
여기에는 앞으로 있을 성능테스트에 필요한 대량의 데이터를 미리 적재하두기 위해 더미 데이터를 DB에 넣어두는 방법에 대해 찾아보고 정리해보았다.
1. PostgreSQL 더미 데이터 생성하기
실시간 인기 검색어 기능을 구현하고 대량의 데이터가 들어왔을 때 성능을 테스트하는 것이 필요하기 때문에 수많은 데이터들을 미리 적재해 두고 테스트 해봐야할 상황이 생겼다.
그래서 더미 데이터를 생성해서 집어넣는 법에 대해 찾아보게 되었다. PostgreSQL을 사용하고 있었기 때문에 여기에 맞는 명령어를 잘 찾아보았다.
아래는 데이터를 적재할 때 사용한 코드이다. 코드를 직접 보면서 설명하는게 더 이해가 쉽다.
DO $$
DECLARE
i INTEGER;
keyword TEXT;
created_at TIMESTAMP;
BEGIN
FOR i IN 1..100 LOOP
keyword := '검색어';
created_at := NOW() AT TIME ZONE 'Asia/Seoul' - INTERVAL '4 hour';
INSERT INTO keyword (search_word, created_at) VALUES (keyword, created_at);
END LOOP;
END $$;
DO $$로 시작해서 $$로 끝나는 블록은 PostgreSQL 코드를 포함하고 한 번 실행하는데 사용되는 블록이다. 이 블록 안에서는 변수를 선언하는 것도 가능하고 절차적 코드를 작성할 수 있다.
DECLARE 절에서는 블록 안에서 사용할 변수를 선언할 수 있다. 변수를 여기서 직접 초기화 시켜줄 수도 있다. 위의 코드에서는 INTEGER 형식의 i와 TEXT 형식의 keyword, TIMESTAMP 형식의 created_at을 선언하였다.
BEGIN으로 시작해서 END로 끝나는 절에는 실제 수행할 절차적 코드를 집어넣을 수 있다.
FOR 루프 문은 아주 익숙한 그 FOR 문이다. 반복적으로 작업이 수행된다. i값에 따라서 변수들의 값을 달리 넣어줄 수도 있다.
created_at의 경우 NOW()를 이용해 바로 현재 시간을 넣어주었더니 시간대가 적용되어 있지 않아 현재 로컬 시간과 맞지 않는 문제가 발생했다. 위와 같이 타임존을 'Asia/Seoul'로 설정해서 현재 시간을 잘 넣어줄 수 있었다.(실시간 현재 검색어를 조회해야했기 때문에 시간이 몇 시간 차이나는게 문제가 되었었다.) INVERVAL을 이용해서 현재 시간에서 더하기 빼기도 가능하다. i의 값이 1~100으로 변하니 이것을 이용해서 검색어는 동일하게 시간대는 다양하게 집어넣는 것도 가능했다.
마지막으로 FOR 문 안에서는 변수에 값을 할당해준 뒤 INSERT를 이용해 값을 집어넣는 작업을 수행한다.
위와 같이 여러 검색어에 대해서 DB에 값을 쉽게 수천, 수만 건을 집어넣을 수 있게 되었다.
세팅 작업은 끝났고 실제 성능테스트를 해야하는 난관이 아직 남아있다. 잘 할 수 있도록 노력해봐야겠다.
2. 오늘 배운 것
- 기존 과제 때 어렵게 수행했던 것들이 이제는 어느정도 익숙해져서 어렵지 않게 할 수 있게된 것 같다. 그렇지만 여전히 QueryDSL 쿼리 짜는 것과 같이 시간도 오래 걸리고, 까다로운 작업들에는 덜 익숙하다는 느낌이 있어서 더 연습을 해보아야겠다.
'오늘 배운 것' 카테고리의 다른 글
24-07-08 @CacheEvict 이용해보기 (0) | 2024.07.08 |
---|---|
24-07-07 알고리즘 문제 풀이 (0) | 2024.07.08 |
24-07-03 Redis (0) | 2024.07.03 |
24-07-02 프로젝트 첫 날 (0) | 2024.07.02 |
24-07-01 NAPT (0) | 2024.07.01 |