들어가며
클라이언트와 서버가 데이터를 주고받을 때 데이터를 특정 형식으로 표현해야 합니다.
가장 많이 사용되는 두 가지 형식이 바로 XML과 JSON입니다.
이 글에서는 두 형식의 특징과 차이점, 실제 사용 예시를 정리해보겠습니다.
XML(eXtensible Markup Language)이란?
XML은 태그(Tag) 를 사용해 데이터를 표현하는 형식입니다.
HTML처럼 열리는 태그와 닫히는 태그 사이에 데이터를 담습니다.
<?xml version="1.0" encoding="UTF-8"?>
<member>
<id>1</id>
<name>홍길동</name>
<age>25</age>
<email>hong@test.com</email>
</member>
태그를 직접 정의할 수 있어 데이터의 구조를 명확하게 표현할 수 있습니다.
JSON(JavaScript Object Notation)이란?
JSON은 키(Key)-값(Value) 쌍으로 데이터를 표현하는 형식입니다.
JavaScript 객체 문법을 기반으로 하며 현재 REST API에서 가장 널리 사용됩니다.
{
"id": 1,
"name": "홍길동",
"age": 25,
"email": "hong@test.com"
}
중괄호 {}로 객체를 표현하고, 대괄호 []로 배열을 표현합니다.
XML vs JSON 구조 비교
같은 데이터를 두 형식으로 표현했을 때 차이를 비교해보겠습니다.
단일 객체
<!-- XML -->
<member>
<id>1</id>
<name>홍길동</name>
<age>25</age>
</member>
// JSON
{
"id": 1,
"name": "홍길동",
"age": 25
}
배열(목록) 데이터
<!-- XML -->
<members>
<member>
<id>1</id>
<name>홍길동</name>
</member>
<member>
<id>2</id>
<name>김철수</name>
</member>
</members>
// JSON
{
"members": [
{ "id": 1, "name": "홍길동" },
{ "id": 2, "name": "김철수" }
]
}
JSON이 XML에 비해 훨씬 간결하다는 것을 확인할 수 있습니다.
XML vs JSON 비교
| 항목 | XML | JSON |
|---|---|---|
| 표현 방식 | 태그 (<key>value</key>) |
키-값 ("key": value) |
| 가독성 | 태그 반복으로 상대적으로 복잡 | 간결하고 읽기 쉬움 |
| 데이터 크기 | 태그가 많아 용량 큼 | 태그 없어 용량 작음 |
| 파싱 속도 | 상대적으로 느림 | 빠름 |
| 주석 지원 | 가능 (<!-- -->) |
불가 |
| 배열 표현 | 태그 반복으로 장황함 | []로 간결하게 표현 |
| 사용 예시 | 레거시 시스템, SOAP, 설정 파일 | REST API, 현대 웹/앱 개발 |
JSON 데이터 타입
JSON은 다양한 데이터 타입을 표현할 수 있습니다.
{
"name": "홍길동", // 문자열 (String)
"age": 25, // 숫자 (Number)
"isActive": true, // 불리언 (Boolean)
"address": null, // null
"scores": [90, 85, 92], // 배열 (Array)
"profile": { // 객체 (Object)
"height": 175,
"weight": 70
}
}
Spring에서의 XML과 JSON 처리
JSON 요청/응답 - @RequestBody, @ResponseBody
Spring Boot는 기본적으로 Jackson 라이브러리를 통해 JSON ↔ Java 객체 변환을 자동으로 처리합니다.
// DTO
public class MemberDto {
private Long id;
private String name;
private int age;
// getter, setter
}
// JSON 요청 받기
@RestController
@RequestMapping("/api/members")
public class MemberController {
// POST 요청 바디 (JSON) → Java 객체 자동 변환
@PostMapping
public ResponseEntity<MemberDto> create(@RequestBody MemberDto memberDto) {
// { "name": "홍길동", "age": 25 } → MemberDto 자동 매핑
System.out.println(memberDto.getName()); // "홍길동"
return ResponseEntity.ok(memberDto); // Java 객체 → JSON 자동 변환
}
}
[JSON ↔ Java 객체 자동 변환]
요청: { "name": "홍길동", "age": 25 }
↓ Jackson 역직렬화
MemberDto { name="홍길동", age=25 }
응답: MemberDto { name="홍길동", age=25 }
↓ Jackson 직렬화
{ "name": "홍길동", "age": 25 }
Content-Type 헤더
요청 시 어떤 형식의 데이터를 보내는지 헤더로 알려줘야 합니다.
// JSON 전송
Content-Type: application/json
// XML 전송
Content-Type: application/xml
// JSON과 XML 모두 처리하는 컨트롤러
@PostMapping(
consumes = { "application/json", "application/xml" }, // 받는 형식
produces = "application/json" // 응답 형식
)
public ResponseEntity<MemberDto> create(@RequestBody MemberDto dto) {
return ResponseEntity.ok(dto);
}
실전 예시 - REST API 요청/응답
Creator-Flex 프로젝트에서 휴가 신청 API를 예시로 보면 아래와 같습니다.
요청 (클라이언트 → 서버)
POST /api/vacation
Content-Type: application/json
{
"type": "ANNUAL",
"startDate": "2025-03-10",
"endDate": "2025-03-12",
"reason": "개인 사유"
}
응답 (서버 → 클라이언트)
{
"id": 15,
"type": "ANNUAL",
"startDate": "2025-03-10",
"endDate": "2025-03-12",
"status": "APPROVE_NEED",
"createdAt": "2025-03-05T09:30:00"
}
언제 XML을 쓰고 언제 JSON을 쓸까?
JSON을 사용하는 경우
- REST API 개발 (현재 표준)
- React, Vue 등 프론트엔드와 데이터 통신
- 모바일 앱 API
XML을 사용하는 경우
- 레거시 시스템과의 연동 (SOAP 방식)
- Maven, Spring의 설정 파일 (
pom.xml,applicationContext.xml) - 복잡한 문서 구조가 필요한 경우
<!-- Spring 설정 파일 - XML 사용 예시 -->
<beans>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mydb"/>
</bean>
</beans>
정리
- XML은 태그(
<key>value</key>) 방식으로 데이터를 표현하며, 레거시 시스템이나 설정 파일에서 많이 사용된다. - JSON은 키-값(
"key": value) 방식으로 데이터를 표현하며, 간결하고 빠르다. - 현대 REST API에서는 JSON이 표준으로 사용된다.
- Spring Boot는 Jackson 라이브러리를 통해 JSON ↔ Java 객체 변환을 자동으로 처리한다.
- 요청 시
Content-Type헤더로 데이터 형식을 명시해야 서버가 올바르게 파싱할 수 있다.