Kim VamPa

[Spring][쇼핑몰 프로젝트][29] 상품 이미지 수정 - 5(배치 프로그램 적용 2) 본문

스프링 프레임워크/쇼핑몰 프로젝트

[Spring][쇼핑몰 프로젝트][29] 상품 이미지 수정 - 5(배치 프로그램 적용 2)

Kim VamPa 2021. 7. 27. 10:48
728x90
반응형
프로젝트 Github : https://github.com/sjinjin7/Blog_Project
프로젝트 포스팅 색인(index) : https://kimvampa.tistory.com/188

 

목표

DB에 정보가 존재하지 않는 이미지 파일 삭제 작업 구현

 우리가 배치 프로그램을 사용하고자 하는 이유는 서버 내부에서 주기적으로 DB에 이미지 정보가 존재하지 않는 이미지 파일을 삭제하기 위함입니다. 이번 포스팅부터는 어떻게 삭제 대상 이미지를 분류를 하고 삭제할지에 대해서 알아보겠습니다.

 

순서

1. 방향

2. Mapper 메서드

3. 코드 테스트(테스트 준비 작업)

 

 

 

 

1. 방향

 DB에 정보가 없는 이미지 파일을 삭제하기 위한 전체적인 방향은 다음과 같습니. 

 

 첫 번째, DB에 존재하는 이미지 정보 리스트를 가져온다.

 두 번째, 서버에 저장된 이미지 리스트를 가져온다.

 세 번째, 두개의 리스트를 비교하여 DB리스트에 존재하지 않는 서버 이미지 리스트를 분류한다.

 네 번재, 해당 리스트의 이미지 파일을 삭제한다.

 

 전체 적인 방향을 정했으니 체크할 파일의 범위를 정해야 합니다. 왜냐하면 DB에 저장된 모든 파일과 서버에 저장된 모든 파일을 모두 확인할 수는 없기 때문입니다. 현재 서버에 저장된 이미지 파일들은 파일이 저장된 날짜 값을 이름으로 가지는 디렉토리(Directory)에 저장이 되어 있고, DB에 저장된 이미지 정보 또한 저장된 날짜 값을 가지고 있습니다. 따라서 하루 단위의 이미지 파일들을 체크할 대상으로 상정할 것입니다. 

 

 그렇다면 언제 어떠한 날짜의 파일들을 체크할 것인지 정해야 하는데, 우리는 배치 프로그램을 통해서 주기적으로 작업을 수행하도록 만들것이기 때문에 매일 한 번씩 어제 날짜의 등록된 파일들을 체크하도록 만들 것입니다. 

 

 정리를 하면 DB에 저장된 어제자 날짜의 이미지 정보 리스트를 가져오고, 어제자 날짜에 저장된 이미지 파일들의 리스트를 가져옵니다. 두 리스트를 비교하여 DB리스트에 존재 하지 않는 서버 이미지 리스트를 분류하여 해당 리스트의 파일들을 삭제하도록 만들 것입니다.

 

 

2. Mapper 메서드

 본격적으로 본 코드 작성에 앞서서 DB에서 어제자 날짜의 이미지 파일 정보들을 반환해주는 Mapper 메서드를 먼자 작성하겠습니다. 

 

 지정된 날짜(어제자 날짜)에 등록된 행들을 반환받기 위해서 명령문의 WHERE 조건문에 vam_image 테이블의 uploadpath 컬럼(column) 값을 지정된 형식으로("/") 어제 날짜 값을 부여해주어야 합니다. 각 DB사들은 지정한 날짜를 반환해주는 함수를 제공해주고 있는데 Oracle의 경우 "TO_CHAR"을, MySQL의 경우 "DATE_FORMAT" 함수를 제공해주고 있습니다. 이 함수 들을 활용해 쿼리문을 한번 작성해보겠습니다.

 

 먼저 AdminMapper.java 인터페이스에 어제 날짜에 등록된 이미지 파일들을 반환 해주는 메서드 선언부를 작성해줍니다. 반환 방식은 이미지 테이블(vam_image)의 컬럼(column)을 필드 값으로 가지는 AttachImageVO 객체를 요소로 가지는 List가 반환되도록 지정해주었습니다. 

 

	/* 어제자 날짜 이미지 리스트 */
	public List<AttachImageVO> checkFileList();

 

그림 2-1

 

 

 AdminMapper.xml 파일에 인터페이스에 작성해준 메서드 선언부가 실행할 쿼리문을 작성하겠습니다. 작성한 쿼리문은 vam_image 테이블에서 어제 날짜의 uploadpath값을 가지는 행을 출력하는 쿼리문입니다.

 

 앞서 간략히 설명은 하였지만 "TO_CHAR"과 DATE_FORMAT"은 지정 시간을 원하는 형태로 출력시켜주는 함수 입니다.

 

<!-- Oracle -->
	<!-- 어제자 날자 이미지 리스트 -->
	<select id="checkFileList" resultType="com.vam.model.AttachImageVO">
	
		select * from vam_image where uploadpath = to_char(sysdate -1, 'yyyy\mm\dd')	
	
	</select>

<!-- MySQL -->
	<!-- 어제자 날자 이미지 리스트 -->
	<select id="checkFileList" resultType="com.vam.model.AttachImageVO">
	
		select * from vam_image where uploadpath = DATE_FORMAT(DATE_ADD(NOW(), INTERVAL -1 DAY), '%Y\%m\%d')	
	
	</select>

 

그림 2-2 Oracle

 

그림 2-3 MySQL

 

 

 작성한 Mapper 메서드가 의도한 대로 정상 동작하는지를 확인하기 위해서 Junit테스트를 진행하겠습니다. AdminMapperTests.java 클래스에 아래의 코드를 추가하여 Junit 테스트를 진행합니다.

 

	/* 어제자 날짜 이미지 리스트 */
	@Test
	public void checkImageListTest() {
		
		mapper.checkFileList();
		
	}

 

그림 2-4

 

그림 2-5

 

 

 

3. 코드 테스트(DB 이미지 파일 리스트)

 배치 작업할 클래스를 생성하여 바로 코드를 작성을 하지 않고, Junit테스트를 통해서 실행시킬 코드를 먼저 작성해보며 테스트해보도록 하겠습니다. 

 

 src/test/java 패키지에 com.vam.task 패키지를 생성 후 TaskTests.java 클래스를 생성합니다. 생성 후 클래스의 선언부에 Junit테스트를 사용하기 위해 아래의 어노테이션을 추가해줍니다.

 

그림 3-1

 

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")

 

그림 3-2

 

 

 앞서 작성한 어제 날짜의 이미지 파일 리스트를 반환해주는 Mapper 메서드가 필요로 하기 때문에 AdminMapper 클래스를 의존성 주입해줍니다.

 

	@Autowired
	private AdminMapper mapper;

 

그림 3-3

 

 

 테스트를 수행할 메서드 작성하고 메서드의 선언부에 @Test 어노테이션을 추가해줍니다.

 

	@Test
	public void taskTests() {
		
	}

 

그림 3-4

 

 

 

 본격적으로 테스트 코드를 작성하기 전 테스트를 위한 파일 추가해주겠습니다. 작성일 기준 오늘 날짜가 2021-07-26 이기 때문에 DB에 아래의 쿼리문을 실행하여 행을 추가해줍니다.(Oracle의 경우 commit 명령어도 실행해줍니다.)

 

 insert into vam_image values (3141, 'DB파일.png', '2021\07\25', 'test1');
 insert into vam_image values (3141, 'DB파일2.png', '2021\07\25', 'test2');     
 commit;

 

그림 3-5

 

 

 업로드 이미지가 저장이 되는 디렉토리에 2021/07/25 구조를 생성해주고 아래의 그림과 같이 6개의 파일을 추가해주었습니다. 

 

test1_DB파일.png
s_test1_DB파일.png
test2_DB파일2.png
s_test2_DB파일2.png
삭제대상파일.png
삭제대상파일2.png

 

그림 3-6

 

 

 본격적인 코드 작성은 다음 포스팅에서 진행합니다.

 

 

REFERENCE

  • 코드로배우는 스프링 웹 프로젝트(남가람북스)
  •  

 

 

 

DATE

  • 2020.07.27

 

728x90
반응형
Comments