๋ฌธ์ ์ ์ก์ ์ํด ์ฌ์ฉํ ์น์ฌ์ดํธ๋ ์๋ฆฌ๊ณ ์ด๋ค.
๊ทผ๋ฐ ์ด ์๋น์ค์ ๋ฌธ์ ๋ ์ธ์ฝ๋ฉ ๋ฐฉ์์ด UTF-8์ด ์๋ EUC-KR๋ผ๋ ๊ฒ์ด๋ค.
์์ spec์์ "ํต์ ์ฌ์ ์น ๋ฌธ์ ๋ฐ์ก ์์คํ ์ ๊ธฐ๋ณธ์ ์ผ๋ก EUC-KR์ธ์ฝ๋ฉ ๋ฐฉ์์ ๋ฐ๋ฅด๊ณ ์์ต๋๋ค"๋ผ๊ณ ๋ชป์ ๋ฐ์๋ค.
์ด๋ฒ์ด ์ฒ์์ผ๋ก API ํต์ ๋ก์ง์ ์ง๋๊ฑฐ๋ผ ์ ๋๋ก ๋ ์ค๋ช ์ ํฌ์คํ ์ด ํ์ํ๋๋ฐ ์์ด์...ใ
๋์์ ๋ฐ์ ์ฝ๋๋ฅผ ์์ฑํ๊ณ ๊ธฐ๋ฅ์ด ์ฑ๊ณต์ ์ผ๋ก ์คํ๋๋ ๊ฒ๊น์ง ํ์ธํ ์ ์์๋ค.
๊ทธ๋ฌ๋ ์๋ฐ๋ก url์ ๋ง๋ค๊ณ api๋ฅผ ํธ์ถํ๋ ๊ฒ์ ์ฒ์์ด๋ผ... ์ด์จ๋ ๋ฌด์จ ์๋ฏธ์ธ์ง ๊ณต๋ถ๋ ํด์ผ ํ๋ค.
API ๊ธฐ๋ณธ ํธ์ถ ์์
- URL ์ค์
- ํค๋(Header)์ค์
- ๋ฐ๋(Body)์ค์
- ์์ฒญ ๋ณด๋ด๊ธฐ
์ฌ๊ธฐ์๋ ์ ์ ๋ฆฌํ์ผ๋ ์ฌ๊ธฐ์ ๊ฐ๋จํ๊ฒ ์ ๋ฆฌํ๋ค.
1. ์์ฒญ ํ๋ผ๋ฏธํฐ ๊ตฌ์ฑ
String url = "์น์ฌ์ดํธ์์ ์ ๊ณตํ๋ ํธ์ถ url"
String response = "";
// ๋ฐ๋ ์ค์
Map<String, String> params = new HashMap<>();
params.put("key", ํค๊ฐ);
params.put("user_id", ์์ด๋๊ฐ);
params.put("sender", ๋ฐ์ ์);
params.put("receiver", ์์ ์);
params.put("msg", "์์๋ฟ์๋ฟ์@#$%^&*()_ไบ");
params.put("msg_type", "SMS");
params.put("testmode_yn", "Y");
์์ธํ ์ฌํญ์ ์๋ฆฌ๊ณ ์คํ ๊ท์ฝ์๋ฅผ ๋ณด๋ฉด ๋์ง๋ง.. ์ผ๋จ ํ์ ๊ฐ๋ค์ ์์ ๊ฐ๋ค.
์๋ฆฌ๊ณ ๋ msg_type๊ฐ ํ์๊ฐ์ ์๋์ง๋ง ๋ช ์ํด์ ๋ณด๋ด๋ ๊ฒ์ ๊ถ์ฅํ๊ณ ์๋ค.
testmode_yn์ ํ ์คํธ ๋ชจ๋๋ฅผ ํ ๊ฒ์ธ์ง์ ์ ๋ฌด์ธ๋ฐ, ์ด๊ฑธ ์ํ๋ฉด ๊ณผ๊ธ๋๋ฏ๋ก ๋งค์ฐ ์ฃผ์....
<Map>๊ณ์ด์ key-value ํ ์์ ๋ฐ์ดํฐ๋ฅผ ์ด๋ฃจ๊ณ ์๋ ๊ฐ์ฒด์ด๋ค. <String, String>์ด๋ฏ๋ก ์๋ฅผ ๋ค์ด
params.put("๊ณผ์", "ํ๋ฐ๋ณผ")
๊ณผ ๊ฐ์ด ์ฌ์ฉํ ์ ์์ ๊ฒ์ด๋ค. ํ๋ผ๋ฏธํฐ ๊ตฌ์ฑํ ๋ ๊ฐ์ธ์ ์ผ๋ก ์ ์ฉํ๊ฒ ์ฐ๊ณ ์๋ค.
๋ญ๊ฐ ๋งต๊ณ์ด ์ฌ์ฉํ๋ฉด ์ฝ๋ฉ ๊ณ ์๊ฐ ๋๋ ๋๋.... Map์ ๋ํ ์์ธํ ์ค๋ช ์ ์์ ์ ์ ๋ฆฌํ ์ด๊ฑธ ํด๋ฆญํด์ ํ์ธํ๋ฉด ๋ ๋ฏ..
โ์ฃผ์! HashMap๊ณผ LinkedHashMap์ ์ฐจ์ด์ : HashMap์ ์์๋ฅผ ๋ณด์ฅํ์ง ์์ง๋ง LinkedHashMap์ ์ ๋ ฅ์์๋ฅผ ๋ณด์ฅํ๋ค.
2. URL ์ธ์ฝ๋ฉ ์ฒ๋ฆฌ
StringBuilder formBody = new StringBuilder();
try {
for (Map.Entry<String, String> entry : params.entrySet()) {
if (formBody.length() > 0) formBody.append("&");
formBody.append(URLEncoder.encode(entry.getKey(), "UTF-8"));
formBody.append("=");
formBody.append(URLEncoder.encode(entry.getValue(), "UTF-8"));
}
} catch (Exception ex) {
ex.printStackTrace();
}
(1) StringBuilder : ์๋ฐ์์ ๋ฌธ์์ด์ ํจ์จ์ ์ผ๋ก ์กฐ์ํ๊ธฐ ์ํ ํด๋์ค. ๋ฌธ์์ด์ ๋ฐ๋ณต์ ์ผ๋ก ๋ณ๊ฒฝํด์ผํ๋ ์ํฉ์์ ์ฑ๋ฅ์ ์ต์ ํํ ์ ์๋ฐ.
(2) Map.Entry<String, String> entry : params.entrySet()
- Map.Entry : Map์์ ํ ์์ฉ ๊บผ key-value(=Entry) Map์์ ์๋ ํ ์(=key์ value)์ ๋ฐ์ดํฐ๋ฅผ ์๋ฏธํ๋ค.

- entrySet() : Map์ ํฌํจ๋ ๋ชจ๋ Entry๋ฅผ ๋ด์ Set(๋ฌถ์)์ผ๋ก ๋ฐํํ๋ ๋ฉ์๋์ด๋ค. ๋ฐ๋ผ์ Map์ ์๋ ๋ชจ๋ ์ํธ๋ฆฌ๋ฅผ ๋ฐํํ ์ ์๋ค. "Map์ ์ํธ๋ฆฌ๋ฅผ ์ํํ๋ค!"
3. HTTP ํค๋ ์ค์
// ํค๋ ์ค์
Map<String,String> headers = new HashMap<String,String>();
headers.put("Content-Type", "application/x-www-form-urlencoded; charset=EUC-KR");
์๋ฆฌ๊ณ ๋ json์ด ์๋ ํผ ํํ๋ก ๋ณด๋ด๋ผ๊ณ ์ง์ํ๋ค(๋๋ ๋ชฐ๋๋ค๊ฐ ๊ฐ๋ฐํ๋ฉด์ ์๊ฒ๋จ)
๊ธ๊ณ SMS๋ฌธ์๋ฅผ ๋ณด๋ผ ๋ EUC-KR๋ก ์ธ์ฝ๋ฉํ๋ผ๊ณ ํ๋ค.
๊ทธ๋์ ํค๋์ content-type์ form-urlencoded, EUC-KRํ์ ์ผ๋ก ์ธ์ฝ๋ฉํ๋ค.
4. API ํธ์ถ ๋ฐ ์๋ต ์ฒ๋ฆฌ
try {
// context = @Autowired๋ก ์ ์ธ๋ private ApplicationContext context์ด๋ค.
NetUtil.setApplicationContext(context);
Map<String, Object> res = NetUtil.requestWebClient(url, HttpMethod.POST, headers, formBody.toString(), NetUtil.REST_BASIC);
String responseBody = String.valueOf(res.get("resStr"));
ObjectMapper objectMapper = new ObjectMapper();
JsonNode root = objectMapper.readTree(responseBody);
String resoibseData = root.path("message").asText();
} catch(Exception ex) {
log.error("[ERROR]API ํธ์ถ ์คํจ, " + ex);
}
์ ์ฝ๋์์ ์์์ผํ ๊ฒ์ด ํฌ๊ฒ 2๊ฐ์ง๊ฐ ์๋ค.
(1) ๐ ApplicationContext๋?
Spring์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ฑ๊ณผ ๋น(=๊ฐ์ฒด)์ ๊ด๋ฆฌํด์ผ ํ๋๋ฐ, ๊ทธ๊ฑธ ๋ด๋นํ๋ ๊ฒ์ด ApplicationContext์ด๋ค.
์งํผํฐ ์ ์๋ ์,
"์คํ๋ง์ด ๋ง๋ค์ด๋์ ํฐ ๊ณต์ฅ(์ปจํ
์ด๋)"
๐ ์ด ๊ณต์ฅ์ด ํ๋ ์ผ: ์คํ๋ง ์ ํ๋ฆฌ์ผ์ด์
์์ ์ฌ์ฉํ๋ ๋ชจ๋ ๊ฐ์ฒด(Bean)๋ฅผ ์์ฑ, ๊ด๋ฆฌ, ๋ณด๊ด, ์ ๊ณตํ๋ ์ญํ .
์ด๋ผ ๋ง์ํ์ จ๋ค. ApplicationContext์ ์ญํ ์ BeanFactory๊ฐ ๋ด๋นํ๋ Bean์ ์์ฑํ๊ณ ๊ด๊ณ์ค์ ๊ณผ ๊ฐ์ ์ ์ด์ญํ ๋ฟ๋ง ์๋๋ผ ์ค์ ์ ๋ณด๋ฅผ ํตํด ์ ์ด๊น์ง ๋ด๋นํ๋ค๋ ๊ฒ์ด๋ค.
์ฆ NetUtil.setApplicationContext(context)์
- setApplicationContext(context)๋ ApplicationContext๋ฅผ NetUtil ํด๋์ค ๋ด๋ถ์์ ์ฌ์ฉํ ์ ์๋๋ก ์ค์ ํ๋ ๋ฉ์๋์ด๋ค.
- ์ฆ, NetUtil ํด๋์ค๊ฐ ์คํ๋ง์ ๋น์ ์ฐธ์กฐํ๊ฑฐ๋ ํน์ ๊ธฐ๋ฅ์ ์ํํ ๋ context๋ฅผ ํ์ฉํ ์ ์๊ฒ ๋๋ค = NetUtil ๋ด๋ถ์์ ๋น(bean) ์กฐํ๋ RestTemplate ๊ฐ์ ์คํ๋ง ๋น์ ๊บผ๋ด ์ธ ์ ์๊ฒ ๋๋ค.

์์งํ ๋ฌด์จ ์๋ฆฌ์ธ์ง ์ ์ดํด๊ฐ ์๊ฐ๋๋ฐ... ์ด๊ฑด ์ฌ๊ธฐ๊น์ง๋ง ์๊ณ ๋์ด๊ฐ์. ApplicationContext๊ฐ ๋น(Service, Controller ๋ฑ๊ณผ ๊ฐ์ ๊ฐ์ฒด)์ Spring์์ ๊ณตํต์ ์ผ๋ก ๊ด๋ฆฌํ๊ธฐ ์ํด NetUtil์ applicationContext๋ฅผ ๋ฑ๋กํ๋ค๋๊ฑด ์์๋ค.
์ฆ NetUtil์์ Spring์ Bean์ ์ง์ ๊ด๋ฆฌํ๊ณ ํ์ฉํ๊ธฐ ์ํด ๋ถ๋ฅธ ์ฝ๋์ด๋ค!
Spring๊ตฌ์กฐ๊น์ง ์์์ผ ํ๋๋ฐ ๊ทธ๊ฑด ๋๋ฌด ๋ณต์กํ๊ณ ... ์ด ์ฝ๋๋ฅผ ์ดํดํ๊ธฐ ์ํด์
- ๋น(Bean) : Controller, Service, Repository์ ๊ฐ์ ๊ฐ์ฒด๋ค์ธ๋ฐ, ํ๋ฒํ ๊ฐ์ฒด๊ฐ ์๋ Spring ์ปจํ ์ด๋์ ์ํด ๊ด๋ฆฌ๋๋ ๊ฐ์ฒด์ด๋ค(=๊ฐ๋ฐ์๊ฐ ์๋ Spring ํ๋ ์์ํฌ๊ฐ ์๋์ผ๋ก ์์ฑํ๊ณ ์ฃผ์ ํ๋ ๊ฐ์ฒด)
- @Autowired : Spring์์ ์์กด์ฑ ์ฃผ์ ์ ์ง์ํ๊ธฐ ์ํ ์ด๋ ธํ ์ด์ . ์ด ์ด๋ ธํ ์ด์ ์ ๋ถ์ด๋ฉด ์คํ๋ง์ด ์๋์ผ๋ก ํ์ํ ์์กด์ฑ์ ์ฃผ์ ํ์ฌ ๊ฐ์ฒด ๊ฐ์ ๊ด๊ณ๋ฅผ ์ค์ ํ๋ค(์๋ฐ์์ ์์ฑ์๋ฅผ ์ํด new ์ฌ์ฉํ๋๊ฑฐ๋ ๋๊ฐ๋ค)
- ์์กด์ฑ ์ฃผ์ (Dependency Injection) : ๊ฐ์ฒด(๋น)์ Spring์ด ์์์ ์์ฑ, ์๋ฉธ์ํค๋ ํ์์ด๋ค.
Map<String, Object> res = NetUtil.requestRestTemplate(url, HttpMethod.POST, headers, formBody.toString(), NetUtil.REST_BASIC);
์ด์ด์ ์ ์ฝ๋๋ "์ด๋ค ์๋ฒ์ HTTP POST ์์ฒญ์ ๋ณด๋ด๊ณ , ๊ทธ ๊ฒฐ๊ณผ(JSON)๋ฅผ Map์ผ๋ก ๋ฐ์์ค๋ ์ฝ๋"์ด๋ค.

์ด๋ฐ์์ผ๋ก ๊ฐ์ ธ์ ์ค๋ค๊ณ ํ๋ค. ์ฆ, ์๋ฒ์์ ์๋ตํ JSON์ Map ํํ๋ก ํ์ฑํด์ ๋ฐํํด์ค๋ค.
ํ๋ผ๋ฏธํฐ๋ก๋
- url : ํธ์ถํ url
- HttpMethod.POST : POSTํ์์ผ๋ก ๋ณด๋ผ ๊ฒ์์ ์๋ฆผ
- headers : ํค๋ ์ค์
- formBody.toString() : ํ์ํ ํ๋ผ๋ฏธํฐ ์ค์ (์๋ฆฌ๊ณ ์ฒ๋ผ form์ผ์๋ ์๊ณ , ๋ณดํต์ json์ด๋ค..)
- NetUtil.REST_BASIC : (๋ด๋ถ ์์) ์์ฒญ ๋ชจ๋, ์ธ์ฆ๋ฐฉ์ ๊ตฌ๋ถ ๋ฑ์ ์ฌ์ฉ๋ ๊ฐ
์ ๊ฐ๋ค...
(2) ๐ObjectMapper, JsonNode๋?
์ด๊ฑด ์ฌ์ค ์์ ์ ๋ด์ ํฌ๊ฒ ๋ฏ์ค์ง ์๋ค.
ObjectMapper objectMapper = new ObjectMapper();
JsonNode root = objectMapper.readTree(responseBody);
์ฝ๊ฒ ๋งํ๋ฉด, "JSON ๋ฌธ์์ด์ ์ฝ์ด์ JsonNode ๋ผ๋ ํธ๋ฆฌ ํํ์ ๋ฐ์ดํฐ๋ก ๋ณํํ๋ ์ฝ๋"๋ผ๊ณ ๋ณด๋ฉด ๋๋ค.
- ObjectMapper : JSON ๋ฌธ์์ด ↔ ์๋ฐ ๊ฐ์ฒด ๋ณํ ๋ด๋น. Jackson ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ ๊ณต (=JSONํ์)
- JSON์ ํ์ฑํด์ ๋ด๊ฐ ์ํ๋ ํด๋์ค ๊ฐ์ฒด๋ก ๋ง๋ค์ด์ฃผ๊ฑฐ๋
- ์๋ฐ ๊ฐ์ฒด๋ฅผ JSON๋ฌธ์์ด๋ก ๋ณํํด์ค๋ค.
- JsonNode : ๊ณ์ธต ๊ตฌ์กฐ๋ก JSON๊ตฌ์กฐ๋ฅผ ํ์ํ ์ ์๋ ๊ฐ์ฒด
- readTree() : ๋ฌธ์์ด ํํ์ JSON์ JsonNode ํธ๋ฆฌ ๊ตฌ์กฐ๋ก ๋ณํํ๋ค.

์์ ์ ๋ด์ ์์ฃผ ๋ง๋งํ๊ณ ์ด๋ ค์ด๊ฑด ์๋์ง๋ง ํ๋ฒ ๋ ๋ณต์ต ์ฐจ์์์~
์ฐธ๊ณ :
https://velog.io/@artp/Java-Map%EA%B3%BC-Entry%EC%9D%98-%EA%B4%80%EA%B3%84
[Java] Map๊ณผ Entry์ ๊ด๊ณ
Java์์ Map๊ณผ Entry์ ๊ด๊ณ๋ ๋ง์ ์ด๋ณด ๊ฐ๋ฐ์๋ค์ด ํท๊ฐ๋ คํ๋ ๋ถ๋ถ์ ๋๋ค. ์ด๋ฒ ๊ธ์์๋ Map๊ณผ Entry์ ๊ฐ๋ ๊ณผ ๊ด๊ณ๋ฅผ ๋ช ํํ๊ฒ ์ดํดํด๋ณด๊ฒ ์ต๋๋ค.Map.Entry<K, V>๋ Map ์ธํฐํ์ด์ค ๋ด๋ถ์ ์ ์๋ ๋ด
velog.io
Spring Boot - ApplicationContext์ ๋ํด ์์๋ณด์.
๊ฐ์ ์ค๋์ ApplicationContext์ ๋ํด ์์๋ณด๋ ์๊ฐ์ ๊ฐ์ง๊ฒ ๋ค. ApplicationContext๊ฐ ๋ฌด์์ด๋ฉฐ ์ด๋ ํ ์ญํ ์ ํ๋์ง ์์๋ณด์. ApplicationContext์ ์ญํ ์ ์๋ค๋ฉด ์ ๋ง ์ด ์น๊ตฌ๊ฐ ์๋น์ค ๊ฐ๋ฐ์ ๊ฐ์ฅ ๋นก
velog.io
https://www.notion.so/isSummary-1ac9d6b82d4549f9af5b97e4eeac13ac
(์ด๊ฑด ๋ด๊บผ๋ค)
'Backend๐ฅ๏ธ > Javaโ(Spring๐)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [Spring] Spring Security ๋ง๋ณด๊ธฐ (0) | 2025.12.11 |
|---|---|
| [Spring] Spring Security - application.yml๋ก URL๊ถํ์ ๋์ ์ผ๋ก ๊ด๋ฆฌํ๊ธฐ (0) | 2025.10.20 |
| [Java] length, length(), size()์ ์ฐจ์ด (2) | 2024.12.15 |