본문 바로가기

웹 개발/Spring

[Web_Spring] 23

실습

- [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