2019년 1월 7일 월요일

Java로 XML 유효성 검사 수행 중 xml 파일이 해제되지 않는 문제의 해결

XML 파일의 유효성을 검사하는 기능을 구현하던 중 아래와 같은 현상이 발생하였다.

기능)
XML파일을 첨부하면 파일이 업로드 된 후 유효성 검사가 수행된다.
업로드 파일은 삭제 후 재업로드 할 수 있다.

현상)
정상적인 유효성 검사가 완료되었다면 문제가 발생하지 않았다.
유효성에 문제가 발견되면 업로드 한 파일의 삭제나 재업로드가 불가해진다.
어딘가에서 XML 파일의 자원 해제가 되지 않는다.

아래 예제 코드의 "변경 후"라고 주석친 부분과 같이 수정후 문제를 해결할 수 있었다.
/**
 * 유효성 테스트
 */
public String test(String xsdFileFolder, String xmlFileName) {
    ... 생략 ...
    File xsdFile = new File(xsdFileName);
    File xmlFile = new File(xmlFileName);

    InputStream inputStream = null;

    try {
        Schema schema = factory.newSchema(xsdFile);
        Validator validator = schema.newValidator();

        //exception 발생시 자바가 여기서 xml 파일을 물고 있어서 해제되지 않음.
        //파일 삭제 및 재 업로드도 안됨.
        //서버 재구동 해야만 XML 파일이 해제되었음.
        //Source source = new StreamSource(xmlFile); //변경 전
        inputStream = new FileInputStream(xmlFile); //변경 후
        Source source = new StreamSource(inputStream); //변경 후

        try {
            validator.validate(source);
            LOGGER.debug(xmlFileName + " validates.");
        }
        catch (SAXException ex) {
            //유효성 검사에 실패시
            LOGGER.debug(xmlFileName + " fails to validate because: \n");
            LOGGER.debug(ex.getMessage());
        }
        ... 생략 ...
    } catch (SAXException sch) {
    ... 생략 ...
    } finally {
        //변경 후(추가부분)
        if (inputStream != null) {
            try {
                inputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    return message;
}