[토비의 스프링 - Vol.1]7장 XML SQL 서비스 실습(리스트7-19)
개발서적/토비 스프링 3.1-Vol.1

[토비의 스프링 - Vol.1]7장 XML SQL 서비스 실습(리스트7-19)

리스트 7-19 생성자 초기호 ㅏ방법을 사용하는 XmlSqlService 클래스

실습을 하는 중 

public class XmlSqlService implements SqlService{
...

public void read(SqlRegistry sqlRegistry) {
        String contextPath = Sqlmap.class.getPackage().getName();
        try {
            JAXBContext context = JAXBContext.newInstance(contextPath);
            Unmarshaller unmarshaller = context.createUnmarshaller();
            InputStream is = UserDao.class.getResourceAsStream("sqlmap.xml");
            Sqlmap sqlmap = (Sqlmap)unmarshaller.unmarshar(is);
 ...

InputStream is = UserDao.class.getResourceAsStream("sqlmap.xml"); 

구문에서 파일을 찾을 수 없다고 나오며, is가 계속 null로 나와서 진행이 안됐다.

 

다른 실습하신 분에 소스를 참조해 보니

 Sqlmap sqlmap = (Sqlmap) unmarshaller.unmarshal(getXmlFile(this.sqlMapFile));
 
 
 private File getXmlFile(String fileName) {
    ClassLoader classLoader = getClass().getClassLoader();
    return new File(classLoader.getResource(fileName).getFile());
}

sqlmap을 받아오는 부분을 getXmlFile이라는 메소드를 만들어서 진행을 하셔서 참조를 했다.

소스 참조: https://gunju-ko.github.io/toby-spring/2019/01/06/%EC%8A%A4%ED%94%84%EB%A7%81%ED%95%B5%EC%8B%AC%EA%B8%B0%EC%88%A0%EC%9D%98%EC%9D%91%EC%9A%A91.html

 

토비의 스프링 - 스프링 핵심기술의 응용 (1)

이 글은 “토비의 스프링” 책 내용을 정리한 글입니다. 만약 저작권 관련 문제가 있다면 “gunjuko92@gmail.com”로 메일을 보내주시면, 바로 삭제하도록 하겠습니다. 스프링 핵심 기술의 응용 (1) 1.

gunju-ko.github.io

 

public void read(SqlRegistry sqlRegistry) {
        String contextPath = Sqlmap.class.getPackage().getName();
        try {
            JAXBContext context = JAXBContext.newInstance(contextPath);
            Unmarshaller unmarshaller = context.createUnmarshaller();
            Sqlmap sqlmap = (Sqlmap) unmarshaller.unmarshal(getXmlFile("sqlmap.xml"));

            for (SqlType sql : sqlmap.getSql()) {
                sqlRegistry.registerSql(sql.getKey(), sql.getValue());
            }
        } catch (JAXBException e) {
            throw new RuntimeException(e);
        }
 }
 
 private File getXmlFile(String fileName) {
        ClassLoader classLoader = getClass().getClassLoader();
        return new File(classLoader.getResource(fileName).getFile());
 }

위와 같이 수정을 했지만, 똑같이 파일을 찾을 수가 없었다.

 

참조: https://okky.kr/article/271934

 

OKKY | getClass().getResourceAsStream() 사용시 경로설정

웹플젝에서 src/main/java/com/test/util에 있는 utilTest.java에서 src/main/resource에 있는 testImage.png를 가져오고 싶어서.. getClass().getResourceAsStream(

okky.kr

에러에 대해 추적하다가 위와 같은 글에 내용을 확인하게 되었다.

그래서 java소스쪽 파일목록(src/java/...)이 아닌 실제로 class파일과 xml파일이 있는 target경로를 열어보니 sqlmap.xml이 없었다.

 

자바 소스상에 resources
target/classes/mapper에 sqlmap.xml이 생성

 

위와 같이 resources경로 밑에 mapper에 sqlmap파일을 성생해 주니 target에 파일이 생성 되었다.

 

그리고 난 후 mapper폴더를 생성 후 그 아래에 sqlmap.xml을 생성 하였으므로,

"sqlmap.xml" -> "mapper/sqlmap.xml"로 수정하니 정상적으로 테스트코드가 통과되었다!

 

책에 스프링 버전과 이클립스 환경에 영향이 있는지는 모르겠지만

지금 내가 테스트하는 환경이 스프링부트에 인텔리제이 버전이라 차이가 있는 것 같다... ㅠ