[MSSQL] SQL 데이터를 JSON으로 변환하기 : SQL to JSON

JSON 형식은 데이터 객체를 문자열로 나타내는 표준 방법으로 자리 잡았습니다. JSON 형식은 주로 API를 통해 한 응용 프로그램에서 다른 응용 프로그램으로 데이터를 전송하는 데 사용됩니다. 이 글에서는 SQL 데이터를 JSON으로 변환하는 방법을 알아보겠습니다.

소개

이글에서는 MSSQL 에 내장되어 있는 Json 형식변환 방법에 대해서 알아봅니다.
단 SQL Server 2016 이상이 설치되어 있어야 합니다. SQL 2016 미만 버전에서는 지원하지 않는 기능입니다.

SQL에서 JSON으로 쿼리 결과 변환하기

SQL Server에서 SQL 쿼리에 FOR JSON 절을 추가하여 쿼리 결과를 JSON 형식으로 변환할 수 있습니다. FOR JSON은 PATH 및 AUTO와 함께 사용됩니다.

SELECT name, surname
FROM emp
FOR JSON AUTO;

SQL

데이터 베이스 예제로 가장 많이 사용되는 Northwind 로 예제를 들겠습니다.
Northwind 데이터베이스에서 Orders 테이블에서 간단히 10개를 반환하는 쿼리는 다음과 같습니다.

SELECT TOP (10) [OrderID]
      ,[CustomerID]
      ,[EmployeeID]
      ,[OrderDate]
      ,[RequiredDate]
      ,[ShippedDate]
      ,[ShipVia]
      ,[Freight]
      ,[ShipName]
      ,[ShipAddress]
      ,[ShipCity]
      ,[ShipRegion]
      ,[ShipPostalCode]
      ,[ShipCountry]
  FROM [Northwind].[dbo].[Orders]

SSMS에서의 출력은 다음과 같습니다.

[MSSQL] SQL 데이터를 JSON으로 변환하기 : SQL to JSON

이제 SQL 쿼리 끝에 FOR JSON PATH 절을 추가해 봅시다.

SELECT TOP (10) [OrderID]
      ,[CustomerID]
      ,[EmployeeID]
      ,[OrderDate]
      ,[RequiredDate]
      ,[ShippedDate]
      ,[ShipVia]
      ,[Freight]
      ,[ShipName]
      ,[ShipAddress]
      ,[ShipCity]
      ,[ShipRegion]
      ,[ShipPostalCode]
      ,[ShipCountry]
  FROM [Northwind].[dbo].[Orders]
  FOR JSON PATH;

SSMS 에서는 다음처럼 표시됩니다.

[MSSQL] SQL 데이터를 JSON으로 변환하기 : SQL to JSON

이값을 클릭 하여 값을 보겠습니다.
새로운 출력은 다음과 같습니다. 이는 JSON 객체입니다.

[
   {
      "OrderID":10248,
      "CustomerID":"VINET",
      "EmployeeID":5,
      "OrderDate":"1996-07-04T00:00:00",
      "RequiredDate":"1996-08-01T00:00:00",
      "ShippedDate":"1996-07-16T00:00:00",
      "ShipVia":3,
      "Freight":32.3800,
      "ShipName":"Vins et alcools Chevalier",
      "ShipAddress":"59 rue de l'Abbaye",
      "ShipCity":"Reims",
      "ShipPostalCode":"51100",
      "ShipCountry":"France"
   },
   {
      "OrderID":10249,
      "CustomerID":"TOMSP",
      "EmployeeID":6,
      "OrderDate":"1996-07-05T00:00:00",
      "RequiredDate":"1996-08-16T00:00:00",
      "ShippedDate":"1996-07-10T00:00:00",
      "ShipVia":1,
      "Freight":11.6100,
      "ShipName":"Toms Spezialitäten",
      "ShipAddress":"Luisenstr. 48",
      "ShipCity":"Münster",
      "ShipPostalCode":"44087",
      "ShipCountry":"Germany"
   },
   {
      "OrderID":10250,
      "CustomerID":"HANAR",
      "EmployeeID":4,
      "OrderDate":"1996-07-08T00:00:00",
      "RequiredDate":"1996-08-05T00:00:00",
      "ShippedDate":"1996-07-12T00:00:00",
      "ShipVia":2,
      "Freight":65.8300,
      "ShipName":"Hanari Carnes",
      "ShipAddress":"Rua do Paço, 67",
      "ShipCity":"Rio de Janeiro",
      "ShipRegion":"RJ",
      "ShipPostalCode":"05454-876",
      "ShipCountry":"Brazil"
   },
   {
      "OrderID":10251,
      "CustomerID":"VICTE",
      "EmployeeID":3,
      "OrderDate":"1996-07-08T00:00:00",
      "RequiredDate":"1996-08-05T00:00:00",
      "ShippedDate":"1996-07-15T00:00:00",
      "ShipVia":1,
      "Freight":41.3400,
      "ShipName":"Victuailles en stock",
      "ShipAddress":"2, rue du Commerce",
      "ShipCity":"Lyon",
      "ShipPostalCode":"69004",
      "ShipCountry":"France"
   },
   {
      "OrderID":10252,
      "CustomerID":"SUPRD",
      "EmployeeID":4,
      "OrderDate":"1996-07-09T00:00:00",
      "RequiredDate":"1996-08-06T00:00:00",
      "ShippedDate":"1996-07-11T00:00:00",
      "ShipVia":2,
      "Freight":51.3000,
      "ShipName":"Suprêmes délices",
      "ShipAddress":"Boulevard Tirou, 255",
      "ShipCity":"Charleroi",
      "ShipPostalCode":"B-6000",
      "ShipCountry":"Belgium"
   },
   {
      "OrderID":10253,
      "CustomerID":"HANAR",
      "EmployeeID":3,
      "OrderDate":"1996-07-10T00:00:00",
      "RequiredDate":"1996-07-24T00:00:00",
      "ShippedDate":"1996-07-16T00:00:00",
      "ShipVia":2,
      "Freight":58.1700,
      "ShipName":"Hanari Carnes",
      "ShipAddress":"Rua do Paço, 67",
      "ShipCity":"Rio de Janeiro",
      "ShipRegion":"RJ",
      "ShipPostalCode":"05454-876",
      "ShipCountry":"Brazil"
   },
   {
      "OrderID":10254,
      "CustomerID":"CHOPS",
      "EmployeeID":5,
      "OrderDate":"1996-07-11T00:00:00",
      "RequiredDate":"1996-08-08T00:00:00",
      "ShippedDate":"1996-07-23T00:00:00",
      "ShipVia":2,
      "Freight":22.9800,
      "ShipName":"Chop-suey Chinese",
      "ShipAddress":"Hauptstr. 31",
      "ShipCity":"Bern",
      "ShipPostalCode":"3012",
      "ShipCountry":"Switzerland"
   },
   {
      "OrderID":10255,
      "CustomerID":"RICSU",
      "EmployeeID":9,
      "OrderDate":"1996-07-12T00:00:00",
      "RequiredDate":"1996-08-09T00:00:00",
      "ShippedDate":"1996-07-15T00:00:00",
      "ShipVia":3,
      "Freight":148.3300,
      "ShipName":"Richter Supermarkt",
      "ShipAddress":"Starenweg 5",
      "ShipCity":"Genève",
      "ShipPostalCode":"1204",
      "ShipCountry":"Switzerland"
   },
   {
      "OrderID":10256,
      "CustomerID":"WELLI",
      "EmployeeID":3,
      "OrderDate":"1996-07-15T00:00:00",
      "RequiredDate":"1996-08-12T00:00:00",
      "ShippedDate":"1996-07-17T00:00:00",
      "ShipVia":2,
      "Freight":13.9700,
      "ShipName":"Wellington Importadora",
      "ShipAddress":"Rua do Mercado, 12",
      "ShipCity":"Resende",
      "ShipRegion":"SP",
      "ShipPostalCode":"08737-363",
      "ShipCountry":"Brazil"
   },
   {
      "OrderID":10257,
      "CustomerID":"HILAA",
      "EmployeeID":4,
      "OrderDate":"1996-07-16T00:00:00",
      "RequiredDate":"1996-08-13T00:00:00",
      "ShippedDate":"1996-07-22T00:00:00",
      "ShipVia":3,
      "Freight":81.9100,
      "ShipName":"HILARION-Abastos",
      "ShipAddress":"Carrera 22 con Ave. Carlos Soublette #8-35",
      "ShipCity":"San Cristóbal",
      "ShipRegion":"Táchira",
      "ShipPostalCode":"5022",
      "ShipCountry":"Venezuela"
   }
]

동일한 방법을 사용하여 SQL Server 테이블 전체를 JSON으로 변환할 수 있습니다. 다음 SQL 쿼리는 SQL Server 테이블의 모든 행을 JSON 문자열로 변환합니다.

SELECT [OrderID]
      ,[CustomerID]
      ,[EmployeeID]
      ,[OrderDate]
      ,[RequiredDate]
      ,[ShippedDate]
      ,[ShipVia]
      ,[Freight]
      ,[ShipName]
      ,[ShipAddress]
      ,[ShipCity]
      ,[ShipRegion]
      ,[ShipPostalCode]
      ,[ShipCountry]
  FROM [Northwind].[dbo].[Orders]
  FOR JSON PATH;

SQL 쿼리 결과를 애플리케이션에서 활용하기

이제 SQL 쿼리에서 얻은 반환 값을 사용하여 코드에서 JSON 객체를 읽을 수 있습니다.
C# 개발이라던지 다른 Java 어플리케이션에서 DB 데이터를 Json 으로 변환하는 수고를 덜수 있는 아주 막강한 기능입니다.
Database 읽어 Client 로 데이터 전송시 최고의 선택이 아닐 수 없습니다.

요약

이글에서는 SQL 데이터를 JSON 으로 변환하는 아주 간단한 방법을 알아보았습니다.
다음 글에서는 Json 을 다루는 좀더 세밀한 기능에 대해 알아보도록 하겠습니다.

Leave a Comment