๐™ฑ๐šŠ๐šŒ๐š”๐šŽ๐š—๐š

NAVER Clova OCR๋กœ ์˜์ˆ˜์ฆ ์ •๋ณด ์ž๋™ ์ถ”์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•

ํ•ด๋ฒ„๋‹ˆ 2025. 5. 23. 23:52
๋ฐ˜์‘ํ˜•

 

Clova์—์„œ ์ œ๊ณตํ•˜๋Š” ์˜์ˆ˜์ฆ ๋ถ„์„ api๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜์ˆ˜์ฆ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋ฝ‘์•„๋‚ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค. 

์•„๋ž˜์— ๋‚˜์™€์žˆ๋Š” NAVER CLOUD PLATFORM ํŽ˜์ด์ง€์— ์ ‘์†ํ•˜๋ฉด ํ•ด๋‹น ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ์ž์„ธํ•˜๊ฒŒ ์‚ดํŽด๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๊ทธ ์ค‘์—์„œ ์˜์ˆ˜์ฆ์„ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์–ด๋–ค ์ข…๋ฅ˜๋ฅผ ์‹ ์ฒญํ•ด์•ผ ํ•˜๋Š”์ง€๋ฅผ ํฌ์ŠคํŒ…ํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

 

https://www.ncloud.com/product/aiService/ocr#overview

 

NAVER CLOUD PLATFORM

cloud computing services for corporations, IaaS, PaaS, SaaS, with Global region and Security Technology Certification

www.ncloud.com

 

 

1. Clova OCR์ด๋ž€?

CLOVA OCR(Optical Character Recognition)์€ ์ „์†กํ•œ ๋ฌธ์„œ๋‚˜ ์ด๋ฏธ์ง€๋ฅผ ์ธ์‹ํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ ์ง€์ •ํ•œ ์˜์—ญ์˜ ํ…์ŠคํŠธ์™€ ๋ฐ์ดํ„ฐ๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ์ถ”์ถœํ•˜๋Š” ๋„ค์ด๋ฒ„ ํด๋ผ์šฐ๋“œ ํ”Œ๋žซํผ์˜ ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค. ์ด๋ฏธ์ง€์˜ ๋ชจ๋“  ํ…์ŠคํŠธ ์ธ์‹, ๋„๋ฉ”์ธ์— ๋ฐฐํฌ๋œ ํ…œํ”Œ๋ฆฟ์ด ํฌํ•จ๋œ ์ด๋ฏธ์ง€์˜ ํ…์ŠคํŠธ ์ธ์‹, ํ…œํ”Œ๋ฆฟ ๋‚ด์—์„œ ํ•„์š”ํ•œ ๊ธ€์ž๋งŒ ๋น ๋ฅด๊ฒŒ ์ถ”์ถœํ•˜๋Š” ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ API๋ฅผ RESTful ํ˜•ํƒœ๋กœ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

 

1-1. OCR ์ข…๋ฅ˜

Clova์—์„œ ์ œ๊ณตํ•˜๋Š” OCR์€ ํฌ๊ฒŒ General OCR, Template OCR, Document OCR๋กœ ์„ธ ๊ฐ€์ง€๋กœ ๋‚˜๋ˆ„์–ด์ ธ ์žˆ๋‹ค.

General OCR ์ผ๋ฐ˜ ํ…์ŠคํŠธ ๋ฐ ํ‘œ ์ถ”์ถœ OCR
Template OCR Template OCR
Document OCR > ๋ช…ํ•จ ๋ช…ํ•จ ์ •๋ณด OCR
Document OCR > ์‚ฌ์—…์ž๋“ฑ๋ก์ฆ ์‚ฌ์—…์ž๋“ฑ๋ก์ฆ ์ •๋ณด OCR
Document OCR > ์‹ ์šฉ์นด๋“œ ์‹ ์šฉ์นด๋“œ ์ •๋ณด OCR
Document OCR > ์˜์ˆ˜์ฆ ์˜์ˆ˜์ฆ ์ •๋ณด OCR
Document OCR > ์‹ ๋ถ„์ฆ > ์—ฌ๊ถŒ ์—ฌ๊ถŒ ์ •๋ณด OCR
Document OCR > ์‹ ๋ถ„์ฆ > ์™ธ๊ตญ์ธ๋“ฑ๋ก์ฆ ์™ธ๊ตญ์ธ๋“ฑ๋ก์ฆ ์ •๋ณด OCR
Document OCR > ์‹ ๋ถ„์ฆ > ์šด์ „๋ฉดํ—ˆ์ฆ ์šด์ „๋ฉดํ—ˆ์ฆ ์ •๋ณด OCR
Document OCR > ์‹ ๋ถ„์ฆ > ์ฃผ๋ฏผ๋“ฑ๋ก์ฆ ์ฃผ๋ฏผ๋“ฑ๋ก์ฆ ์ •๋ณด OCR

 

General OCR์€ ์ด๋ฏธ์ง€์—์„œ ๋‹จ์ˆœํžˆ ํ…์ŠคํŠธ๋งŒ ์ถ”์ถœํ•˜๋Š” ๊ธฐ๋Šฅ์ด๊ณ ,

Document OCR์€ ์˜์ˆ˜์ฆ์ฒ˜๋Ÿผ ๊ตฌ์กฐํ™”๋œ ๋ฌธ์„œ์— ํŠนํ™”๋˜์–ด, ๋‚ ์งœ, ์ƒํ˜ธ๋ช…, ๊ธˆ์•ก ๊ฐ™์€ ์˜๋ฏธ ์žˆ๋Š” ์ •๋ณด๋ฅผ ํ•ญ๋ชฉ๋ณ„๋กœ ์ถ”์ถœํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋‹ค.

 

 

2.OCR API ์‹ ์ฒญํ•˜๊ธฐ

2-1. ๋„ค์ด๋ฒ„ ํด๋ผ์šฐ๋“œ ํ”Œ๋žซํผ ๊ฐ€์ž…

๋„ค์ด๋ฒ„ ๋กœ๊ทธ์ธํ•˜๋ฉด ๋ฐ”๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„ ์ค„ ์•Œ์•˜๋Š”๋ฐ, ๋ณ„๋„๋กœ ํšŒ์›๊ฐ€์ž…์„ ์ง„ํ–‰ํ•ด์•ผ ํ•œ๋‹ค.

 

2-2. ๊ฒฐ์ œ ์ˆ˜๋‹จ ๋“ฑ๋ก

๋„ค์ด๋ฒ„ ํด๋ผ์šฐ๋“œ ํ”Œ๋žซํผ์€ ๊ฒฐ์ œ ์ˆ˜๋‹จ์„ ๋“ฑ๋กํ•ด์•ผ api๋“ค์„ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

๊ทธ๋ž˜์„œ ๊ฒฐ์ œ ์ˆ˜๋‹จ์„ ๋ฏธ๋ฆฌ ๋“ฑ๋กํ•˜์˜€๋‹ค. 

 

2-3. ์ฝ˜์†” ์„œ๋น„์Šค > CLOVA OCR Service ์ ‘์†

 

CLOUD PLATFORM์—์„œ ํŠน์ • ์„œ๋น„์Šค์— ์ ‘์†ํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.

 

1. Dashboard > Services์— CLOVA OCR์„ ๊ฒ€์ƒ‰ํ•˜๋ฉด ํ•ด๋‹น ์„œ๋น„์Šค์— ๋“ค์–ด์˜ฌ์ˆ˜์žˆ๋‹ค.

https://console.ncloud.com/dashboard

 

 

2.๋ฐ‘ ๋งํฌ ํด๋ฆญํ•˜๋ฉด ๋ฐ”๋กœ  OCR service ๋ฉ”์ธ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•œ๋‹ค.

https://console.ncloud.com/ocr/domain

 

 

์ ‘์†ํ•˜๋ฉด ์œ„์™€ ๊ฐ™์ด CLOVA OCR Domain ํŽ˜์ด์ง€๊ฐ€ ๋‚˜์˜จ๋‹ค.

 

 

2-4. ํŠนํ™” ๋ชจ๋ธ ์„ค์ • > ํŠนํ™” ๋ชจ๋ธ ์‹ ์ฒญ

 

Document OCR์€ ํŠนํ™” ๋ชจ๋ธ๋กœ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

ํŠนํ™” ๋ชจ๋ธ ์„ค์ • > ํŠนํ™” ๋ชจ๋ธ ์‹ ์ฒญ์„ ํด๋ฆญํ•œ๋‹ค.

 

 

ํŠนํ™” ๋ชจ๋ธ ์‹ ์ฒญ์„ ํ•˜๋ฉด ์œ„์™€ ๊ฐ™์€ ํŒ์—…์ฐฝ์ด ํ‘œ์‹œ๋œ๋‹ค.

๋ชจ๋“  ์นธ์ด ํ•„์ˆ˜์นธ์ด๋ผ ์ž…๋ ฅํ•˜๊ณ  ํ™•์ธ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅธ๋‹ค

(์บก์ณ ๋ถ€๋ถ„์€ ์ด๋ฏธ ์‹ ์ฒญ์„ ํ•œ ์ƒํƒœ๋ผ ํ™•์ธ ๋ฒ„ํŠผ์ด ํ™œ์„ฑํ™”๋˜์ง€ ์•Š์•˜๋Š”๋ฐ, ์ฒ˜์Œ ์‹ ์ฒญํ•˜๋Š” ์ƒํƒœ๋ผ๋ฉด ํ™œ์„ฑํ™” ์ƒํƒœ๋กœ ๋ณด์ผ ๊ฒƒ์ด๋‹ค.)

 

 

 

์‹ ์ฒญ์„ ํ•˜๋ฉด ์Šน์ธ๊นŒ์ง€ ์‹œ๊ฐ„์ด ์กฐ๊ธˆ ๊ฑธ๋ฆฐ๋‹ค.

11์‹œ 30๋ถ„์— ์‹ ์ฒญ์„ ํ•˜์˜€๊ณ , ์ ์‹ฌ์„ ๋จน๊ณ  1์‹œ 40๋ถ„์— ๋“ค์–ด์™€์„œ ํ™•์ธ์„ ํ•ด๋ณด๋‹ˆ ์Šน์ธ์ด ์™„๋ฃŒ๋˜์–ด ์žˆ์—ˆ๋‹ค.

 

 

2-5. ๋„๋ฉ”์ธ ์ƒ์„ฑ

 

์Šน์ธ์„ ๋ฐ›์•˜๋‹ค๋ฉด ์ด์ œ ํŠนํ™” ๋ชจ๋ธ ๋„๋ฉ”์ธ ์ƒ์„ฑ์„ ํ†ตํ•ด์„œ ๋„๋ฉ”์ธ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

๋„๋ฉ”์ธ ์ƒ์„ฑ > ํŠนํ™” ๋ชจ๋ธ ๋„๋ฉ”์ธ ์ƒ์„ฑ

 

 

 

๋„๋ฉ”์ธ๋ช…๊ณผ ๋„๋ฉ”์ธ ์ฝ”๋“œ๋ฅผ ์ ์–ด์ค€๋‹ค.

- ๋„๋ฉ”์ธ ๋ช…, ๋„๋ฉ”์ธ ์ฝ”๋“œ : ์ค‘๋ณต๋งŒ ๋˜์ง€ ์•Š๊ฒŒ ํ•œ๋‹ค๋ฉด ์•„๋ฌด ์ด๋ฆ„์„ ์ž…๋ ฅํ•ด๋„ ๊ดœ์ฐฎ์€ ๊ฒƒ ๊ฐ™๋‹ค.

- ์„œ๋น„์Šคํƒ€์ž… : Document

- ์ธ์‹๋ชจ๋ธ : ์˜์ˆ˜์ฆ

- ์„œ๋น„์Šค ํ”Œ๋žœ : Basic (์œ ๋ฃŒ์ž„)

 

ํŠนํ™” ๋ชจ๋ธ ์ƒ์„ฑ์„ ํด๋ฆญํ•˜๋ฉด ๋„๋ฉ”์ธ์ด ์ƒ์„ฑ๋œ๋‹ค. 

 

 

2-6. API Gateway ์—ฐ๋™ ํด๋ฆญ

๋„๋ฉ”์ธ์—์„œ API Gateway ์—ฐ๋™์„ ํด๋ฆญํ•œ๋‹ค.

 

 

Document OCR ํ‚ค ์ƒ์„ฑํ•˜๋Š” ํŒ์—…์ฐฝ์ด ํ‘œ์‹œ๋œ๋‹ค.

์ด๋ฏธ ๋‹ค ์—ฐ๊ฒฐ์„ ํ•œ ๋’ค๋ผ key๊ฐ€ ๋‹ค ์ƒ์„ฑ์ด ๋˜์–ด์žˆ์ง€๋งŒ, ๋งŒ์•ฝ secret key๊ฐ€ ์ƒ์„ฑ๋˜์–ด์žˆ์ง€ ์•Š๋‹ค๋ฉด ์ƒ์„ฑ์„ ๋ˆŒ๋Ÿฌ์„œ ์ƒ์„ฑ์„ ํ•ด์ค€๋‹ค.

๊ทธ๋ฆฌ๊ณ  API ์ž๋™ ์ƒ์„ฑ์„ ํด๋ฆญํ•˜๋ฉด ์ž๋™์œผ๋กœ API๋ฅผ ์ƒ์„ฑํ•ด์ฃผ๋ฉฐ Invoke URL์„ ์žก์•„์ค€๋‹ค.

API ์ž๋™ ์ƒ์„ฑ์€ ์‹œ๊ฐ„์ด ์กฐ๊ธˆ ๊ฑธ๋ฆฌ๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

 

 

2-7 API ์ƒ์„ฑ ํ™•์ธ

 

์กฐ๊ธˆ ๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ€ API Gateway Services์— ๋“ค์–ด์˜ค๋ฉด API๊ฐ€ ์ƒ์„ฑ๋œ ๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด์ œ Document ์˜์ˆ˜์ฆ API๋ฅผ ์‚ฌ์šฉํ•  ๋ชจ๋“  ์ค€๋น„๊ฐ€ ๋๋‚ฌ๋‹ค!

 

 

3. ์ƒ˜ํ”Œ ์ฝ”๋“œ ์ž‘์„ฑ

 

 

https://api.ncloud-docs.com/docs/ai-application-service-ocr-example02

 

Document OCR

 

api.ncloud-docs.com

 

clova์—์„œ ์ œ๊ณตํ•ด์ฃผ๋Š” ์˜ˆ์ œ ์ฝ”๋“œ๊ฐ€ ์žˆ๋‹ค.

์‚ฌ์šฉํ•˜๊ณ ์ž ํ•˜๋Š” ์–ธ์–ด๋ฅผ ์ด์šฉํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

Content-Type: multipart/form-data์ธ ์ž๋ฐ” ์˜ˆ์ œ ์ฝ”๋“œ๋ฅผ ์ด์šฉํ•˜์˜€๋‹ค.

์˜ˆ์ œ ์ฝ”๋“œ์—์„œ apiURL, secretKey, imageFile ๋ฅผ ์ˆ˜์ •ํ•œ ๋’ค ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.UUID;

import org.json.JSONArray;
import org.json.JSONObject;

public class OCRAPIDemo {

	public static void main(String[] args) {
		String apiURL = "YOUR_API_URL";
		String secretKey = "YOUR_SECRET_KEY";
		String imageFile = "YOUR_IMAGE_FILE";

		try {
			URL url = new URL(apiURL);
			HttpURLConnection con = (HttpURLConnection)url.openConnection();
			con.setUseCaches(false);
			con.setDoInput(true);
			con.setDoOutput(true);
			con.setReadTimeout(30000);
			con.setRequestMethod("POST");
			String boundary = "----" + UUID.randomUUID().toString().replaceAll("-", "");
			con.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);
			con.setRequestProperty("X-OCR-SECRET", secretKey);

			JSONObject json = new JSONObject();
			json.put("version", "V2");
			json.put("requestId", UUID.randomUUID().toString());
			json.put("timestamp", System.currentTimeMillis());
			JSONObject image = new JSONObject();
			image.put("format", "jpg");
			image.put("name", "demo");
			JSONArray images = new JSONArray();
			images.put(image);
			json.put("images", images);
			String postParams = json.toString();

			con.connect();
			DataOutputStream wr = new DataOutputStream(con.getOutputStream());
			long start = System.currentTimeMillis();
			File file = new File(imageFile);
			writeMultiPart(wr, postParams, file, boundary);
			wr.close();

			int responseCode = con.getResponseCode();
			BufferedReader br;
			if (responseCode == 200) {
				br = new BufferedReader(new InputStreamReader(con.getInputStream()));
			} else {
				br = new BufferedReader(new InputStreamReader(con.getErrorStream()));
			}
			String inputLine;
			StringBuffer response = new StringBuffer();
			while ((inputLine = br.readLine()) != null) {
				response.append(inputLine);
			}
			br.close();

			System.out.println(response);
		} catch (Exception e) {
			System.out.println(e);
		}
	}

	private static void writeMultiPart(OutputStream out, String jsonMessage, File file, String boundary) throws
		IOException {
		StringBuilder sb = new StringBuilder();
		sb.append("--").append(boundary).append("\r\n");
		sb.append("Content-Disposition:form-data; name=\"message\"\r\n\r\n");
		sb.append(jsonMessage);
		sb.append("\r\n");

		out.write(sb.toString().getBytes("UTF-8"));
		out.flush();

		if (file != null && file.isFile()) {
			out.write(("--" + boundary + "\r\n").getBytes("UTF-8"));
			StringBuilder fileString = new StringBuilder();
			fileString
				.append("Content-Disposition:form-data; name=\"file\"; filename=");
			fileString.append("\"" + file.getName() + "\"\r\n");
			fileString.append("Content-Type: application/octet-stream\r\n\r\n");
			out.write(fileString.toString().getBytes("UTF-8"));
			out.flush();

			try (FileInputStream fis = new FileInputStream(file)) {
				byte[] buffer = new byte[8192];
				int count;
				while ((count = fis.read(buffer)) != -1) {
					out.write(buffer, 0, count);
				}
				out.write("\r\n".getBytes());
			}

			out.write(("--" + boundary + "--\r\n").getBytes("UTF-8"));
		}
		out.flush();
	}
}

 

 

 

 

3-1. ์ƒ˜ํ”Œ์ฝ”๋“œ Sysout์œผ๋กœ ์ถœ๋ ฅํ•ด๋ณด๊ธฐ

package com.receipt.clova;

import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.UUID;

import org.json.JSONArray;
import org.json.JSONObject;

public class ClovaOcrApplication {
    public static void main(String[] args) {
        String apiURL = "https://<api-gateway>/custom/v1/<project-id>/<custom-id>/document/receipt";
        String secretKey = "<your-secret-key>";
        String imageFile = "C:/Users/username/Desktop/ocr/images/input";

        try{
            // API ์š”์ฒญ์„ ์œ„ํ•œ URL ๊ฐ์ฒด ์ƒ์„ฑ
            URL url = new URL(apiURL);
            HttpURLConnection con = (HttpURLConnection)url.openConnection();

            // ์—ฐ๊ฒฐ ์„ค์ •
            con.setUseCaches(false);        // ์บ์‹œ ์‚ฌ์šฉ ์•ˆ ํ•จ
            con.setDoInput(true);           // ์ž…๋ ฅ ์ŠคํŠธ๋ฆผ ์‚ฌ์šฉ
            con.setDoOutput(true);          // ์ถœ๋ ฅ ์ŠคํŠธ๋ฆผ ์‚ฌ์šฉ
            con.setReadTimeout(30000);      // ์‘๋‹ต ๋Œ€๊ธฐ ์‹œ๊ฐ„ ์„ค์ • (30์ดˆ)
            con.setRequestMethod("POST");   // POST ๋ฐฉ์‹

            // multipart/form-data๋ฅผ ์œ„ํ•œ boundary ์„ค์ •
            String boundary = "----" + UUID.randomUUID().toString().replaceAll("-", "");
            con.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);
            con.setRequestProperty("X-OCR-SECRET", secretKey); // ์ธ์ฆ ํ‚ค ํ—ค๋”

            JSONObject json = new JSONObject();
            json.put("version", "V2"); // OCR API ๋ฒ„์ „
            json.put("requestId", UUID.randomUUID().toString()); // ์š”์ฒญ ์‹๋ณ„์šฉ ID
            json.put("timestamp", System.currentTimeMillis()); // ํ˜„์žฌ ์‹œ๊ฐ„

            // ์ „์†กํ•  ์ด๋ฏธ์ง€ ์ •๋ณด ์„ค์ •
            JSONObject image = new JSONObject();
            image.put("format", "jpg"); // ํŒŒ์ผ ํฌ๋งท
            image.put("name", "demo"); // ํŒŒ์ผ ์ด๋ฆ„(์‹๋ณ„์šฉ)

            JSONArray images = new JSONArray();
            images.put(image); // ์ด๋ฏธ์ง€ ์ •๋ณด ๋ฐฐ์—ด์— ์ถ”๊ฐ€
            json.put("images", images); // JSON ๊ฐ์ฒด์— ์ด๋ฏธ์ง€ ์ •๋ณด ํฌํ•จ

            String postParams = json.toString(); // ์ตœ์ข… JSON ํŒŒ๋ผ๋ฏธํ„ฐ ๋ฌธ์ž์—ด

            // ์—ฐ๊ฒฐ ์‹œ์ž‘
            con.connect();

            // ์„œ๋ฒ„๋กœ ๋ฐ์ดํ„ฐ ์ „์†ก์šฉ ์ŠคํŠธ๋ฆผ ์ƒ์„ฑ
            DataOutputStream wr = new DataOutputStream(con.getOutputStream());
            long start = System.currentTimeMillis();

            // ์ด๋ฏธ์ง€ ํŒŒ์ผ ๊ฐ์ฒด ์ƒ์„ฑ
            File file = new File(imageFile);

            // multipart/form-data ํ˜•์‹์œผ๋กœ ๋ฐ์ดํ„ฐ ์ „์†ก
            writeMultiPart(wr, postParams, file, boundary);
            wr.close(); // ์ „์†ก ๋

            // ์‘๋‹ต ์ฝ”๋“œ ํ™•์ธ
            int responseCode = con.getResponseCode();
            BufferedReader br;
            if (responseCode == 200) {
                // ์„ฑ๊ณต ์‘๋‹ต์ด๋ฉด input stream ์ฝ๊ธฐ
                br = new BufferedReader(new InputStreamReader(con.getInputStream()));
            } else {
                // ์‹คํŒจ ์‘๋‹ต์ด๋ฉด error stream ์ฝ๊ธฐ
                br = new BufferedReader(new InputStreamReader(con.getErrorStream()));
            }

            // ์‘๋‹ต ๊ฒฐ๊ณผ ์ฝ์–ด์„œ ์ถœ๋ ฅ
            String inputLine;
            StringBuffer response = new StringBuffer();
            while ((inputLine = br.readLine()) != null) {
                response.append(inputLine);
            }
            br.close();

            System.out.println(response); // ๊ฒฐ๊ณผ ์ถœ๋ ฅ

        } catch (Exception e) {
            System.out.println(e);
        }
    }

    /**
     * multipart/form-data ํ˜•์‹์œผ๋กœ JSON ํŒŒ๋ผ๋ฏธํ„ฐ์™€ ํŒŒ์ผ ์ „์†ก
     * @param out
     * @param jsonMessage
     * @param file
     * @param boundary
     * @throws IOException
     */
    private static void writeMultiPart(OutputStream out, String jsonMessage, File file, String boundary) throws
            IOException {
        StringBuilder sb = new StringBuilder();

        // message ํŒŒํŠธ ์ž‘์„ฑ (JSON ๋ณธ๋ฌธ)
        sb.append("--").append(boundary).append("\r\n");
        sb.append("Content-Disposition:form-data; name=\"message\"\r\n\r\n");
        sb.append(jsonMessage);
        sb.append("\r\n");

        out.write(sb.toString().getBytes("UTF-8"));
        out.flush();

        // ํŒŒ์ผ์ด ์กด์žฌํ•˜๋ฉด ํŒŒ์ผ ๋ฐ์ดํ„ฐ๋„ multipart ํ˜•์‹์œผ๋กœ ์ „์†ก
        if (file != null && file.isFile()) {
            out.write(("--" + boundary + "\r\n").getBytes("UTF-8"));

            // ํŒŒ์ผ ์ „์†ก์„ ์œ„ํ•œ ํ—ค๋” ์„ค์ •
            StringBuilder fileString = new StringBuilder();
            fileString
                    .append("Content-Disposition:form-data; name=\"file\"; filename=");
            fileString.append("\"" + file.getName() + "\"\r\n");
            fileString.append("Content-Type: application/octet-stream\r\n\r\n");

            out.write(fileString.toString().getBytes("UTF-8"));
            out.flush();

            // ์‹ค์ œ ํŒŒ์ผ ๋‚ด์šฉ ์ „์†ก
            try (FileInputStream fis = new FileInputStream(file)) {
                byte[] buffer = new byte[8192]; // 8KB ๋ฒ„ํผ
                int count;
                while ((count = fis.read(buffer)) != -1) {
                    out.write(buffer, 0, count);
                }
                out.write("\r\n".getBytes()); // ํŒŒ์ผ ์ „์†ก ์ข…๋ฃŒ ๋งˆํฌ
            }

            out.write(("--" + boundary + "--\r\n").getBytes("UTF-8"));
        }
        out.flush();
    }
}

 

๊ฐ ์ค„์— ์„ค๋ช…์„ ์ž‘์„ฑํ•˜๊ณ , response๋ฅผ Sysout์œผ๋กœ ์ฐ์–ด๋‚ด์–ด ๊ฒฐ๊ณผ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๊ฒŒ ํ–ˆ๋‹ค.

 

 

 

 

๋‹ค์Œ ๊ธ€์—์„  ํ•ด๋‹น response๋กœ ์˜์ˆ˜์ฆ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๊ณตํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ํฌ์ŠคํŒ… ํ•ด๋ณด๊ฒ ๋‹ค.

 

 

 

 

 

๋ฐ˜์‘ํ˜•