티스토리 뷰
회사에서 파일을 변환해야 하는 일이 주어졌다.
사용자들이 첨부한 파일들인데,
간단하게는 파일명을 uuid로 바꾼다거나, 파일 암호화 솔루션으로 '암호화' 한 파일로 바꾸거나.
여기서는 '암호화'로 가정하겠음.
조건
- 암호화 한 파일은 원래 있던 위치, 원래 파일명으로 생성
- 암호화 솔루션 제공 함수는 parameter로 원본파일path, 암호화파일path 이렇게 2개를 받음
ex) fn_암호화(원본파일path, 암호화파일path) - 파일은 파일대로 변환하면서 DB에 파일관련 테이블에 해당 파일에 대해 '암호화여부'컬럼 'Y'로 update
로직
로직은 간단함
1. 변환해야 하는 파일 목록 조회
2. for문을 돌면서,
2-1. 임시폴더 생성
2-2. 원본파일을 임시폴더로 복사
2-3. fn_암호화(복사한파일path, 원본파일path) 호출
진짜 간단함. 단, 모든 파일이 문제없이 돈다면.
이제부터 본론으로, 파트장과 고려한 사항들을 하나씩 살펴본다.
파일 백업
해당 작업 중, 원본 파일이 망가지는 경우가 있을지 모르니,
작업 전에 미리 파일을 백업해두기로 했다.
작업할 파일들을 특징지어야 하는데, 업무 또는 프로젝트 특성에 따라 다를듯하다.
예를 들면, 업로드 일자별 폴더 통째로 백업한다.
그 일자별 폴더엔 내가 작업해야할 파일 외에도 다른 업무에서 사용하는 파일이 있을수도 있다.
어쨌든, 내가 작업해야 할 파일은 모두 포함되도록 특징짓도록 했다.
그래서 예상했던 갯수 또는 용량 보다 많아 질 수 있다.
무지성 복붙 했다가는 서버 용량이 넘칠수도 있기 때문에 미리 파일 크기 체크해야 했다.
돌다가 exception 발생하면?
작업해야 할 파일이 몇만 또는 몇십만개라면
(상황에 따라 다르겠지만) 한 큐(?)에 다 안돌아갈지도 모른다.
(이런 작업을 해본적이 없어서.. 한 번에 잘 돌꺼라는 확신이 없었음)
DB작업도 필요해서 transaction을 고려해야 했다.
transaction
파일 복사, 변환은 100번 돌고 101번째에서 exception이 발생했어도 rollback되지 않음
대신 DB작업은 exception이 발생했다면 이전에 했던 100번의 update가 rollback되기 때문에
1. exception발생시, 100번 작업했던 파일 작업을 억지로(?) 되돌리거나
2. exception발생시, DB작업의 transaction을 반복문 내에서 끊어주어야 했다.
나는 후자를 선택했다.
전자 처럼 다시 되돌리려면 또 반복문을 돌리면서 파일 작업을 해야 했다.. (그 작업중에 또 excpetion 발생한다면...)
로그
exception발생 후, 어떤 파일에서 문제 발생했는지 알아야 하기 때문에, 여기저기에 log를 남김
- 현재 작업중인 파일이 몇 번째 인지
- 어떤 파일 작업 중인지
- 어떤 exception인지
정도 찍어두면 충분하다고 생각했다.
이어서 하기
도중에 exception발생 후, 1. 다시 처음부터 할지, 2. exception발생 파일부터 다시 할지 정해야 했다.
다시 처음부터 하려면 다시 처음 상태로 만들어야 하는데,
처음 상태로 만드려면 추가 조치가 필요했고,
잘 넘어갔던 파일일지라도 다시 돌렸을 때 잘 넘어가리란 보장이 없었다. (퇴근을 못할꺼 같은 냄새가..)
나는 exception발생 파일부터 다시 돌도록 했다.
[잘 넘어갔던 파일] vs [아직 처리 안한 파일] 구분은 DB 테이블에 '암호화여부' 로 판단했다.
- 암호화여부가 N인 파일 목록을 가져와서 for문을 돌리거나,
- 암호화여부가 Y인 파일은 for문을 건너 뛰도록 했다.
위에서 언급했듯이 transaction을 끊는 방식으로 했기 때문에 exception발생에 대한 후속 조치가 자유로워 진거 같다.
분할 작업
메모리? 힙? 초과?
파트장님은 몇만건을 돌면서 메모리? 힙 사이즈?를 고려해야 한다고 했다.
관련 내용은 잘 몰랐고,,
한번에 너무 많이 하면 안 됄수도 있다는 느낌으로만 이해했다.
분할작업 하는 방향을 생각해봤는데,
한번 요청에 100개만 돌게 하기
int cnt = 0;
for (...) {
......
// 암호화 성공!
cnt++;
if (cnt >= 100) break;
}
원하는 조건에서 멈추게 하기
for (...) {
if (조건) break;
.......
// 암호화 성공!
}
'개발' 카테고리의 다른 글
[git flow]feature (0) | 2023.08.08 |
---|---|
[DBeaver]초기 환경설정 (0) | 2023.08.02 |
[firebase]React 프로젝트 github로 배포 (0) | 2023.03.27 |
vscode 프로젝트 세팅 (0) | 2022.11.03 |
"애자일 개발 이해하기" (0) | 2022.10.17 |