실습
- [Web_Spring] 22 이어서
1. pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.0</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>board</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>board</name>
<description>MyBatis Practice</description>
<properties>
<java.version>11</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web-services</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc8</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.bgee.log4jdbc-log4j2</groupId>
<artifactId>log4jdbc-log4j2-jdbc4</artifactId>
<version>1.16</version>
</dependency>
<!-- JSON -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.2</version>
</dependency>
<dependency>
<groupId>net.coobird</groupId>
<artifactId>thumbnailator</artifactId>
<version>0.4.8</version>
</dependency>
<!-- Quartz -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz-jobs</artifactId>
<version>2.3.0</version>
</dependency>
</dependencies>
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
<include>**/*.setting</include>
</includes>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
2. src/main/resource/mapper/AttachMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.board.mapper.AttachMapper">
<insert id="insert">
INSERT INTO TBL_ATTACH
(FILE_NAME, ORIGINAL_FILE_NAME, UPLOAD_DIRECTORY, IMAGE, BOARD_NUMBER)
VALUES(#{fileName}, #{originalFileName}, #{uploadDirectory}, #{image}, #{boardVO.boardNumber})
</insert>
<select id="select" resultType="attachVO">
SELECT FILE_NAME, ORIGINAL_FILE_NAME, UPLOAD_DIRECTORY, IMAGE
FROM TBL_ATTACH
WHERE BOARD_NUMBER = #{boardNumber}
</select>
<delete id="delete">
DELETE FROM TBL_ATTACH
WHERE BOARD_NUMBER = #{boardNumber}
</delete>
<select id="getOldFiles" resultType="attachVO">
SELECT FILE_NAME, ORIGINAL_FILE_NAME, UPLOAD_DIRECTORY, IMAGE
FROM TBL_ATTACH WHERE UPLOAD_DIRECTORY = TO_CHAR(SYSDATE-1, 'YYYY/MM/DD')
</select>
</mapper>
3. src/main/java/com.example.board/domain/dao/AttachADAO.java
package com.example.board.domain.dao;
import com.example.board.domain.vo.AttachFileVO;
import com.example.board.mapper.AttachMapper;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
@RequiredArgsConstructor
public class AttachDAO {
private final AttachMapper attachMapper;
public void save(AttachFileVO attachFileVO){
attachMapper.insert(attachFileVO);
}
public List<AttachFileVO> findByBoardNumber(Long boardNumber){
return attachMapper.select(boardNumber);
}
public void remove(Long boardNumber){
attachMapper.delete(boardNumber);
}
public List<AttachFileVO> getOldFiles(){
return attachMapper.getOldFiles();
}
}
4. src/main/java/com.example.board/mapper/AttachAMapper.java
package com.example.board.mapper;
import com.example.board.domain.vo.AttachFileVO;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper
public interface AttachMapper {
public void insert(AttachFileVO attachFileVO);
public List<AttachFileVO> select(Long boardNumber);
public void delete(Long boardNumber);
public List<AttachFileVO> getOldFiles();
}
5. src/main/java/com.example.board/task/FileCheckTask.java
package com.example.board.task;
import com.example.board.domain.dao.AttachDAO;
import com.example.board.domain.vo.AttachFileVO;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.io.File;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
@Component
@Slf4j
@RequiredArgsConstructor
public class FileCheckTask {
private final AttachDAO attachDAO;
/*
* 0 * * * * * : 매 분 0초마다
* 0/1 * * * * : 매 1초 간격
* 0 0/1 * * * : 매 1분 간격
* 0 0/5 * ? : 매 5분 간격
* 0 0 0/1 * * : 매 1시간 간격
* 0 0 0 * * ? : 매일 0시 마다
* 0 0 0 1 * ? : 매월 1일 마다
* * 10-13 * * * * : 매 10, 11, 12, 13분에 동작한다.
* */
// 매 분 0초 마다
@Scheduled(cron = "0 * * * * *")
public void checkFiles() throws Exception{
log.warn("File Check Task run...............");
log.warn("===========================================");
List<AttachFileVO> fileList = attachDAO.getOldFiles(); // DB에서 어제 날짜의 첨부파일 전체 목록
// DB에 저장된 경로를 따로 저장
List<Path> fileListPaths = fileList.stream().map(file -> Paths.get("C:/upload", file.getUploadDirectory(), file.getFileName()))
.collect(Collectors.toList());
// 이미지인지 아닌지 검사
// 이미지라면, 썸네일 파일의 이름까지도 fileListPaths에 담아준다.
fileList.stream().filter(file -> file.isImage()).map(file -> Paths.get("C:/upload", file.getUploadDirectory(), "t_" + file.getFileName()))
.forEach(p -> fileListPaths.add(p));
File targeDirecotry = Paths.get("C:/upload", getDateDirectory()).toFile();
//File객체 필드 중 listFiles()를 사용하면, 해당 경로에 있는 모든 파일들을 List로 리턴한다.
File[] removeFiles = targeDirecotry.listFiles(file -> !fileListPaths.contains(file.toPath()));
for(File file : removeFiles){
file.delete();
}
}
private String getDateDirectory(){
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.DATE, -1);
String directory = sdf.format(calendar.getTime());
return directory;
}
}
'웹 개발 > Spring' 카테고리의 다른 글
[Web_Spring] 21 (0) | 2022.07.03 |
---|---|
[Web_Spring] 20 (0) | 2022.07.02 |
[Web_Spring] 19 (0) | 2022.07.01 |
[Web_Spring] 18 (0) | 2022.06.30 |
[Web_Spring] 17 (0) | 2022.06.29 |