반응형

요즘 딥러닝과 파이썬만 공부하다 오랜만에 자바 스프링 한 번 해보려고 VSCode를 실행했다.

너무 오래되었는지 오류가 났다.

VSCode는 기존에 세팅 방식에서 변한 건 없고 jdk 버전만 올려주니 잘 되었다.

Spring.io에서 STS를 다운 받아서 실행하는데 오류가 난다.

 

오류메시지

오늘 일자로 STS(이클립스 버전) 받았고 jdk17 버전으로 세팅했다.

Spring Web 프로젝트를 Gradle로 생성했다.

그러자 위 오류가 났다.

오류정보 : 'Import Gettiing Started Content' has encountered a problem. ToolchainDownloadFailedException: No locall installed toolchains match and toolchain download repositories have not been configured.

사실 첨 보는 오류였다.

오류 정보도 친절하지 않네. 어이구야.

같은 조건으로 Maven 프로젝트는 문제 없이 잘 된다.

Gradle에서 jdk 버전 체크를 하는 듯 다.

 

해결방법 

jdk17, jdk19로 했더니 계속 오류가 났다.

오늘자로 받은 Spring STS는 최저 jdk 버전이 21부터 시작한다.

1. jdk21 버전을 다운 받는다. (https://jdk.java.net/archive/)

2. 원하는 위치에 압축을 푼다. (예: C:\jdk-21.0.2)

3. 환경설정에서 JAVA_HOME의 jdk 위치를 수정해서 넣어준다.

4. 명령 프롬프트에서 잘 세팅 되었는지 확인한다.

5. Spring STS를 실행하고 상단 Window>Preferences를 클릭한다.

6. Java>Compiler를 선택하고 JDK를 21로 변경 후 Apply(적용)한다.

7. Java>Installed JREs를 선택한 후 21 버전으로 선택 후 apply(적용)을 클릭한다.

8. Spring STS를 종료한다.

9. 원도우 탐색기를 실행해서 Spring STS가 설치된 위치로 이동한다.

10. SpringToolSuite4.ini 파일에 마우스 우클릭을 해서 메모장에서 편집을 클릭한다.

11. -vm을 찾고 그 아래 있던 정보는 지우고 새로 설치한 jdk위치를 포함한 아래 경로를 넣어주고 저장한다.

12. Spring STS를 다시 실행한다.

13. Spring Web Gradle 프로젝트를 생성한다.

 

이제 잘 실행될 것이다.

 

PS. SpringWeb 프로젝트를 생성했지만 Boot Dashboard의 local에 추가가 안되면 프로젝트 생성에 오류가 발생한 것이다. 

프로젝트가 오류 없이 생성되면 아래와 같이 자동으로 프로젝트가 추가된다.

 

이번 포스팅에서 ToolchainDownloadFailedException: No locall installed toolchains match and toolchain download repositories have not been configured.

오류 해결방법에 대해 알아봤다.

삽질은 이제 그만...

 

 

 

 

 

 

 

반응형
반응형

이제 XML을 불러오는 방법을 알게 되었으니 파싱을 해서 원하는 Node의 엘리멘트, 속성값 그리고 텍스트 값을 추출하는 방법을 알아보도록 하겠습니다.

 

XML 정보를 가져오는 방법은 3가지가 있다고 했습니다.

1. URL 사이트 정보를 이용하는 방법

2. XML 파일을 읽는 방법

3. String으로 만들어 사용하는 방법

 

이전 포스팅을 보면 위 3가지로 파싱하는 방법을 쉽게 알 수 있습니다.

 

2023.10.14 - [Software/Java] - [JAVA] 자바에서 XML 데이터 다루는 방법. 1탄

 

[JAVA] 자바에서 XML 데이터 다루는 방법. 1탄

안녕하세요. 신기한 연구소입니다. 최근 새로운 개발 요청을 받았답니다. 우후~ 기존 통신 방식을 변경해서 재 구축해야 하는데요. 기존 방식은 자바에서 JSON과 XML을 혼합해서 요청과 응답을 하

tiboy.tistory.com

 

이제 파일을 파싱했다면 원하는 값을 추출해서 사용하는 방법을 알아야겠지요?

아래는 샘플 xml입니다. (sample.xml로 저장하기)

1
2
3
4
5
6
7
8
<?xml version="1.0" encoding="UTF-8"?>
<sample id="idSample">
    <people>
        <name>홍돌이</name>
        <age>25</age>
        <address value="korea">한국</address>
    </people>
</sample>
cs

 

1. 가장 상위 element 가져오기.

 

xml의 가장 최 상위 엘리먼트를 가져오는 방법입니다.

가장 상위를 받아야 그다음 단계의 Node를 받을 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    public static void main(String[] args)  throws Exception {
 
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
        DocumentBuilder builder = factory.newDocumentBuilder();        
 
        Document document = builder.parse("./src/sample.xml");
 
       Element element = document.getDocumentElement();  
 
        System.out.println(element.getAttribute("id"));
 
        System.out.println(element.getNodeName());
        
        Node firstNode = element.getFirstChild();
        
        System.out.println("1::" + firstNode.getNodeName());
   }
cs

위 예제를 실행하면 element의 속성 "id"값과 node name을 출력합니다.

idSample
sample
1::#text

마지막 출력값은 #text가 나옵니다.

Element 타입으로 element를 document를 통해 받습니다.

여기서 element는 최 상위 요소인 <sample></sample>을 의미합니다.

element.getNodeName()을 통해 받은 값이 sample임을 알 수 있습니다.

element.getAttribute("id")로 element 내 속성값을 가져올 수 있습니다.위 예제를 보면 "idSample"값을 가져왔습니다.

 

2. 첫 번째 Node 가져오기

 

14라인을 보면 Node 타입을 사용하고 있습니다. element를 시작으로 첫 번째 node를 받습니다. 바로 <people>인데요. getNodeName()를 사용해서 값을 가져왔는데 people 아닌 #text 가 출력됩니다. 그 이유는 xml 태그 사이의 공백 때문입니다. <sample>   <people>... 왼쪽을 보면 두 태그 사이에 공백이 있습니다.

공백을 없애도 되지만 Node 타입을 if문으로 비교해서 필터링할 수도 있습니다.

 

3. NodeList로 xml 정보 가져오기

 

그렇다면 첫 번째 node를 가져오고 리스트를 활용해서 xml 정보를 가져오는 소스를 이어서 보겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
        NodeList nList = firstNode.getNextSibling().getChildNodes();
 
        for(int i = 0; i < nList.getLength(); i++){
            Node item = nList.item(i);
            System.out.println("TYpe>>" + item.getChildNodes().getLength());
            if(item.getNodeType() == Node.ELEMENT_NODE){
                System.out.println(item.getNodeName());
                System.out.println(item.getTextContent());
                if (item.getAttributes().getLength() > 0){
                    System.out.println(item.getAttributes().getNamedItem("value").getNodeValue());
                }
             } 
        }
cs

위 소스를 보면 NodeList 타입을 가져오는데 firstNode에서 ChildNodes를  통해 NodeList 타입을 받아야 하지만 firstNode는 공백(#text)이라서 그 하위의 태그가 없습니다. 그래서 NextSibling을 통해서 다음 태그로 이동한 뒤 NodeList를 가져옵니다. 

4번 라인을 보면 for 문을 통해 nList(NodeList)의 Node 타입의 item(i)를 받습니다.

5번 라인의 의미는 해당 Node 하위에 몇 개의 Node 가 있는지 확인할 때 사용합니다.6번 라인에서 해당 Node 가 공백(#text)인 경우가 있었기에 Node.ELEMENT_NODE를 사용해서 거를 수 있습니다.7번 라인의 if 문 내부는 이제 공백이 아닌 정상적인 element의 정보를 활용할 수 있습니다.item.getNodeName() 은 현재 item의 태그명을 보여줍니다.item.getTextContent()는 현재 item에 싸여있는 <a> b </a> 이렇게 a에 싸여있는 b를 보여줍니다.이 값은 item.getFirstChild().getNodeValue() 로도 가져올 수 있습니다.

 

<address value="korea">

 

여기서 value는 address의 속성(attribute)라고 합니다.9번 라인으로 체크를 한 뒤 10번 라인으로 getNameItem("value")에 속성명을 넣고 getNodeValue()로 address의 value 속성값을 가져올 수 있습니다.

 

4. 마무리

 

이렇게 xml의 최상위 element와 속성값 받기,하위 Node와 NodeList 받아서 그 값들을 활용하는 방법에 대해 알아봤습니다.이 정도면 xml에서 값을 받고 활용하는데 충분해 보입니다.

 

다음 포스팅은 동적으로 xml과 내부 element를 생성하는 방법에 대해 알아보겠습니다.

반응형