Search

반응형

'자바'에 해당되는 글 51건

  1. 2023.10.14 [JAVA] 자바에서 XML 데이터 다루는 방법. 1탄
  2. 2021.10.24 [스프링 왕초보]3. Spring boot Test. 스프링 부트와 JUnit5로 웹 테스트(with)JUnit5
반응형

안녕하세요. 신기한 연구소입니다.

최근 새로운 개발 요청을 받았답니다. 우후~

기존 통신 방식을 변경해서 재 구축해야 하는데요. 기존 방식은 자바에서 JSON과 XML을 혼합해서 요청과 응답을 하고 있는 구조더군요.

그런데 응답부분은 기존대로  XML을 사용해서 서비스를 제공해야 한다더군요. 흠...

응답해 줄  XML을 구성하고 JSON으로 통신해서 얻은 값을 활용해서 XML로 다시 구성한 후 응답하는 시스템인데 무슨 말인지 복잡하죠? 

우선  자바(JAVA)에서 XML을 다루는 방법을 익히고 업무에 적용하면 쉽게 진행이 될 듯합니다.

기본적인 자바(JAVA)에서  XML 파싱을 먼저 알아봅니다.

참고로 XML 데이터는 총 3가지로 받을 수 있습니다.

다른 시스템에서 응답으로 받았거나 소스 내부에서 문자열(String)로 생성한 경우,

시스템 내부 xml 파일로 존재해서 불러오는 경우,

외부 사이트에서 제공하는 xml 데이터를 URL로 불러오는 경우가 있습니다.

 

1. String 문자열로 된 XML 파싱 예제 확인하기. - 자바(JAVA) -

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import java.io.ByteArrayInputStream;
import java.io.InputStream;
 
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
 
import org.w3c.dom.Document;
import org.w3c.dom.Element; 
 
public class XMLSam {
    public static void main(String[] args) throws Exception {
        System.out.println("XML Parsing Sample!");
 
        String sampleXML = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><customer id=\"cus\"><online><name>고객1</name><age>28</age><gender></gender></online></customer>";
        InputStream is = new ByteArrayInputStream(sampleXML.getBytes("UTF-8"));
 
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder build = factory.newDocumentBuilder();
        Document doc = build.parse(is);
 
        Element element = doc.getDocumentElement();
 
        System.out.println(element.getAttribute("id"));
 
 
    }
}
cs

위 예제는 문자열로 xml을 활용하는 예제입니다. 문자열로 xml을 만들어 사용할 때는 값에 포함된 "를 반드시 \를 사용해야 합니다. 당연 오류가 나고 실행이 안될 테니까요.

DocumentBuilderFactory  를 사용해서 XML로 구성된 DOM용 파서 생성용 인스턴스인 factory를 만듭니다.

DocumentBuilder  는 XML 문서로부터 DOM 문서용 인스턴스를 얻기 위한 클래스로 factory객체를 통해 생성합니다.  이 인스턴스는 XML로부터 Document 를 얻을 수 있게 해 줍니다. 바로 19번 라인처럼요.

build 객체는 parse 메서드를 가지고 있고 인수로 XML 데이터를 받습니다. 위 예제는 문자열로 만든 XML을 인수로 받는 소스인데 String 문자열을 그대로 받을 수 없고 InputStream 타입으로 ByteArrayInputStream 생성자를 통해 인스턴스를 생성한 뒤 그 인스턴스를 넘기면 됩니다. 혹시 charset의 이슈가 있다면 getBytes("UTF-8") 처럼 원하는 charset을 지정해 주면 오류가 안 납니다.

생성된 문서 doc를 사용해서 XML의 root를 가져온 뒤 해당 root의 "id" 속성을 가져오는 테스트를 진행합니다.

성공적으로 잘 출력이 됩니다.

 

2. XML 파일로 된 XML 파싱 예제 확인하기.  - 자바(JAVA) -

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
 
import org.w3c.dom.Document;
import org.w3c.dom.Element;
 
 
public class NomalizeTest {
    public static void main(String[] args)  throws Exception {
 
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
        DocumentBuilder builder = factory.newDocumentBuilder();        
 
        Document document = builder.parse("./src/sample.xml");
 
        Element root = document.getDocumentElement();  
 
        System.out.println(root.getAttribute("id"));
    
 
    }
    
}
cs

이번 예제는 XML 파일을 불러와서 파싱 하는 소스입니다. 첫 번째 소스와 거의 같습니다. 14번 라인의 parse의 인수로 InputStream이 아닌 파일 경로를 사용했습니다. 이 경우는 sample.xml 파일을 지정된 위치에 만들어야 합니다.

 

3. URL을 통해 XML 파싱 예제 확인하기.  - 자바(JAVA) -

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
 
 
public class Test {
    
 
    public static void main(String[] args) throws Exception {
        System.out.println("START");
 
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
 
        DocumentBuilder builder = factory.newDocumentBuilder();
        
        Document document = builder.parse("http://www.kma.go.kr/weather/forecast/mid-term-rss3.jsp?stnId=108");   
 
        Element root = document.getDocumentElement();
 
        System.out.println(root.getAttribute("version"));  //root 속성값 가져오기
    }
    
}
cs

17라인을 보면 parse의 인수가 url로 되어 있습니다. 기상청 전국 날씨를 XML 형식으로 받을 수 있는 URL입니다. 샘플로 공부하기 좋습니다. 실제 데이터이기에 이 정보를 가지고 사이트 구축 시 활용해도 좋답니다.

컴파일 후 실행하면 정상적으로 결괏값이 나옵니다. version은 "2.0 " 으로 출력됩니다.

지금까지 3가지 방식의  자바(JAVA)에서 XML 데이터를 가져와 파싱 하는 예제를 만들어봤습니다.

자바(JAVA) 에서 XML 데이터의 노드 값, 속성 값, 텍스트 값을 가져오는 방식이 있는데 복잡한 XML 데이터를 잘 분석해서 프로그램으로 만드는 방법을 다음 포스팅에 설명할 예정입니다.

자바(JAVA)의 클래스/인터페이스인 NodeList, Node 를 사용하여 실제 업무에 활용한 소스를 가지고 같이 테스트해 볼 예정이오니 다음 포스팅도 기대해 주세요.궁금하거나 이해가 안 되는 내용은 댓글 주세요.

모두 즐 코딩하세요.

반응형
반응형

이제 개발에 앞서 TDD 환경을 구성해 보고 싶다.

스프링 부트에서 테스트 코드 작성하는 방법을 확인해본다.

TDD에 대한 포스팅은 다음에 공부를 좀 하고 정리해보자.

준비는 최신 스프링 부트(Spring Boot IDE)를 설치하고

JUnit5를 활용해보자.

먼저 Spring Starter Project로 프로젝트를 하나 만들어보자.

이름은 JUnitProject로 한다.

Dependencies는 위 사항으로 체크하고 Spring Web은 꼭 추가하자.

이제 Controller를 생성한다.

생성할 때 구성한 package에서 controller를 추가하고 

JUnitController.java를 생성한다.

마우스 우측 클릭해서 class를 추가하면 된다.

JUnitController가 생성되면 @RestController와 @GetMapping("/")을

클래스명과 메서드명에 추가해 준다.

해당 import도 같이 추가해준다.

@GetMapping의 값은 "/"로 했는데

localhost:8080/ 으로 접근이 가능하게 해 준다.

만약 /뒤에 다른 이름으로 접근하고 싶다면 지정해 준다.

예를 들어 @GetMapping("/abc")라고 지정하면

localhost:8080/abc로 URL을 브라우저(크롬 등)에 입력하면

해당 메서드 hello()가 실행된다.

이제 Boot Dashboard에서 local 하단에 방금 만든 JUnitProject를 선택하고

서버를 구동해 준다. (Re)Start를 클릭하거나 우측 클릭으로 해당 메뉴를 클릭하면 된다.

서버가 구동되었으면 console에 정상 로그가 나타난다.

그리고 브라우저(크롬 등)를 실행한 뒤 localhost:8080을 넣고 연결한다.

이제 기본 스프링 부트 프로젝트가 생성되었다.

이제 테스트 코드를 작성해보자.

src/test/java라는 디렉터리에 com.tiboy가 있고

하위에 JUnitProjectApplicationTests.java가 자동으로 생성되었음을 확인하자.

@SpringBootTest와 @Test 어노테이션도 보인다.

JUnitProjectApplicationTests.java에 우클릭해서 Run As를 선택하면 JUnit Test가 보인다.

클릭하면 테스트가 실행된다.

그럼 이렇게 JUnit탭이 활성화되고 테스트가 진행된다.

특별히 코딩한 부분이 없기에 오류 없이 진행되었다.

이제 @AutoConfigureMockMvc 어노테이션을 사용해서 테스트 코드를 작성해보자.

https://spring.io/guides/gs/testing-web/ 활용

@Autowired를 사용해서 MockMvc 객체를 주입하고

"Wow Hello!"를 출력하는지 비교하는 테스트 코드다.

.andDo(print()) 부분을 추가하면 console에 좀 더 정확한 정보를 확인할 수 있다.

이렇게 잘 나온다.

.andExpect(content().string(containsString("Wow Hello!")) 이 부분은

출력 값을 비교한다.

아래 코드를 보자.

hello()메서드는 return값이 "Wow Hello!"이다.

그럼 테스트 코드에서 값을 바꿔보면 어떻게 될까?

"Wow Hello!!"로 기존 결과값에 !를 하나 더 넣었다.

이제 테스트해보자.

Failures가 1개 발생했다.

바로! 한 개가 더 있다고 값이 다르다면서 에러를 보여준다.

정상적으로 테스트 코드가 잘 작동됨을 확인할 수 있다.

같은 코드 같지만 어노테이션이 바뀌었다.

@SpringBootTest @AutoConfigureMockMvc 이 두 개의 어노테이션이 빠지고

@WebMvcTest로 변경되었다.

첫 번째 구성은 전체 스프링 애플리케이션 컨텍스트가 실행되지만,

두 번째는 테스트 범위를 웹 레이어로만 지정하고

특히 특정 클래스만을 지정해서 테스트할 수도 있다.

@WebMvcTest(JUnitController.class)처럼 말이다.

이제 기본적인 테스트 코드 환경을 만들고 실행도 해봤다.

기존 책들은 JUnit4 기준으로 되어 있기에 JUnit5 기준으로 소스를 구성해 봤다.

참고로 JUnit4는 vintage이고 JUnit5는 jupiter이다.

이번 포스팅은 여기까지~

반응형