GET
: ์กฐํPOST
: ์์ฑPUT
: ์์ DELETE
: ์ญ์ serviceKey
๋ ๋ฐ๋์ ๋์ฝ๋ฉ๋ ํํ๋ก ์ฌ์ฉ์์ ๋์ฝ๋ฉ ํค:
xYZ80mMcU8S57mCCY/q8sRsk7o7G8NtnfnK7mVEuVxdtozrl0skuhvNf34epviHrru/jiRQ41FokE9H4lK0Hhg==
โ ๋์ฝ๋ฉํ์ง ์์ผ๋ฉด ์๋ ์ค๋ฅ ๋ฐ์:
<returnAuthMsg>SERVICE_KEY_IS_NOT_REGISTERED_ERROR</returnAuthMsg>
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'com.fasterxml.jackson.core:jackson-annotations:2.19.0'
}
{
"response": {
"header": { "resultCode": "00", "resultMsg": "NORMAL_SERVICE" },
"body": {
"dataType": "JSON",
"items": {
"item": [
{
"baseDate": "20250509",
"baseTime": "1600",
"category": "PTY",
"nx": 89,
"ny": 90,
"obsrValue": "0"
}
]
},
"pageNo": 1,
"numOfRows": 10,
"totalCount": 8
}
}
}
๊ฒฐ๊ณผ๋ก ์๋์ ๊ฐ์ ํด๋์ค๊ฐ ์๋ ์์ฑ๋จ ๐
@Data
private static class Item {
public String baseDate;
public String baseTime;
public String category;
public int nx;
public int ny;
public String obsrValue;
}
@Data private static class Items { public ArrayList<Item> item; }
@Data private static class Body { public String dataType; public Items items; public int pageNo; public int numOfRows; public int totalCount; }
@Data private static class Header { public String resultCode; public String resultMsg; }
@Data private static class Response { public Header header; public Body body; }
@Data private static class Root { public Response response; }
๐ ์ด ๊ณผ์ ์ ํตํด RestTemplate
์ผ๋ก ๋ฐ์ JSON์ ์๋์ผ๋ก Java ๊ฐ์ฒด๋ก ๋ฐ์ธ๋ฉํ ์ ์์.
String fullUrl = ...; // ์์์ ๋ง๋ URL
RestTemplate rt = new RestTemplate();
ResponseEntity<Root> response = rt.exchange(fullUrl, HttpMethod.GET, null, Root.class);
Root root = response.getBody();
Response rs = root.getResponse();
Body body = rs.getBody();
Items items = body.getItems();
List<Item> list = items.getItem();
list.forEach(item -> log.info(item.toString()));
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>๋๊ตฌ ๋ ์จ</title>
</head>
<body>
<h1>๐ค ๋๊ตฌ ์ค๊ตฌ ๋ ์จ ์ค์๊ฐ ์กฐํ</h1>
<hr/>
<th:block th:each="item : ${list}">
<div>๋ ์ง: <span th:text="${item.baseDate}"></span></div>
<div>์๊ฐ: <span th:text="${item.baseTime}"></span></div>
<div>ํญ๋ชฉ: <span th:text="${item.category}"></span></div>
<div>X์ขํ: <span th:text="${item.nx}"></span></div>
<div>Y์ขํ: <span th:text="${item.ny}"></span></div>
<div>๊ด์ธก๊ฐ: <span th:text="${item.obsrValue}"></span></div>
<br/>
</th:block>
</body>
</html>
@Controller
@Slf4j
@RequestMapping("/openData")
public class OpenData02Controller {
String url = "http://apis.data.go.kr/1360000/VilageFcstInfoService_2.0/getUltraSrtNcst";
String serviceKey = "๋์ฝ๋ฉ๋_ํค_์
๋ ฅ";
@GetMapping("/forcast")
public void forcast(Model model) {
String fullUrl = url
+ "?serviceKey=" + serviceKey
+ "&pageNo=1"
+ "&numOfRows=10"
+ "&&base_date=20250509"
+ "&base_time=1600"
+ "&dataType=JSON"
+ "&nx=89"
+ "&ny=90";
RestTemplate rt = new RestTemplate();
ResponseEntity<Root> response = rt.exchange(fullUrl, HttpMethod.GET, null, Root.class);
List<Item> list = response.getBody().getResponse().getBody().getItems().getItem();
model.addAttribute("list", list);
}
// DTO ํด๋์ค ์๋ต: ์ ์ ์ ์ฐธ๊ณ
}
ํญ๋ชฉ | ์ค๋ช |
---|---|
๐ ์ธ์ฆํค | ๋ฐ๋์ ๋์ฝ๋ฉ๋ ํํ ์ฌ์ฉ |
โ JSON ๊ตฌ์กฐ | ์ฝ์ ํ์ธ ํ jsonschema2pojo๋ก ๋ณํ |
๐ RestTemplate | exchange + DTO ๋งคํ์ผ๋ก ์ฒ๋ฆฌ |
๐งฉ Thymeleaf | ๋ฆฌ์คํธ ๋ฐ์ดํฐ๋ฅผ th:each ๋ก ์ถ๋ ฅ |