1. HTTP์์ ์ ์ผ๋ฐ์ ์ผ๋ก Binary File์ ์ ์กํ ์ ์๋๊ฐ?
(1) ํ์ผ ์ข ๋ฅ
๊ตฌ๋ถ | Binary ํ์ผ | ํ ์คํธ ํ์ผ |
์ ์ฅํ๋ ๋ด์ฉ | ๋ฌธ์์ ์ซ์ ๋ชจ๋ ์ ์ฅ | ๋ฌธ์๋ง ์ ์ฅ ๊ฐ๋ฅ |
๋ฐ์ดํฐ ์ฝ์ ๋ | ์ ํ ๊ทธ๋๋ก ์ฝ๋๋ค . ๋ฌธ์ -> ๋ฌธ์๋ก ์ฝ์, ์ซ์ -> ์ซ์๋ก ์ฝ์ |
์ซ์๋ ๋ฌธ์๋ก ๋ณํ ํด์ ์ฝ๋๋ค. ๋ฌธ์ -> ๋ฌธ์ ์ซ์ -> ๋ฌธ์ |
๋ฐ์ดํฐ ์ธ ๋ | ์ ํ ๊ทธ๋๋ก ์ด๋ค. ๋ฌธ์ -> ๋ฌธ์ ์ซ์ -> ์ซ์ |
์ซ์๋ ๋ฌธ์๋ก ๋ณํ ํ๊ธฐ ๋๋ฌธ์ ๋ฌธ์๋ง ์ด๋ค. ๋ฌธ์ -> ๋ฌธ์ |
์์ | ์ด๋ฏธ์ง, ๋์์ ํ์ผ, ํ๋ก๊ทธ๋จ | ๊ธ๋ก ์ ํ ๊ฒ |
(2)์ HTTP ์์ Binary file์ ๋ชป ์ฝ๋๊ฐ?
HTTP๋ ํ ์คํธ ๊ธฐ๋ฐ์ ํ๋กํ ์ฝ, ์ผ๋ฐ์ ์ผ๋ก ํ ์คํธ ํ์ผ์ ์ฝ๊ธฐ ์ํด ๋์์ธ ๋์๋ค. ๋ฐ๋ผ์
๋ฐ์ด๋๋ฆฌ ํ์ผ์ ์ฝ์ผ๋ ค๋ฉด ๋ค๋ฅธ ๋ฐฉ๋ฒ์ด ํ์ํ๋ค.
์ฌ๊ธฐ์๋ ๋ธ๋ผ์ฐ์ ์๊ฒ ์ด๋ป๊ฒ ์ฝ์ด์ผ ํ๋์ง ๊ฐ์ด๋ ๋ผ์ธ์ ์ฃผ๊ณ ๋ฐ์ด๋๋ฆฌ ํ์ผ์ ๊ทธ๋๋ก ์ ์กํ๋ MIME ๋ฐฉ๋ฒ๊ณผ
๋ฐ์ด๋๋ฆฌ ํ์ผ์ ์ผ์ ๊ท์น์ ํตํด ํ ์คํธ ํ์ผ๋ก ์ ๋ถ ๋ณํํ์ฌ ๋ณด๋ด๋ Base64 ๋ฐฉ๋ฒ์ด ์๋ค.
2. ์ ์กํ๊ธฐ ์ํ ๋ฐฉ๋ฒ (MIME)
HTTP์์ ๋ฐ์ด๋๋ฆฌ ํ์ผ(์ด๋ฏธ์ง, ๋์์)์ ์ฝ๊ธฐ ์ํด ๊ณ ์๋ ๋ฐฉ๋ฒ.
HTTP ๋ฉ์ธ์ง ํค๋ ๋ถ๋ถ์ Content type์ ํด๋น ๋ฉ์ธ์ง๊ฐ ๋ฌด์จ ํ์ ์ธ์ง ์ ์ด์ค๋ค.
๊ทธ๋ฆฌ๊ณ body ๋ถ๋ถ์ ๋ฐ์ด๋๋ฆฌ ๋ฐ์ดํฐ๋ฅผ ํต์งธ๋ก ๋ณด๋ด๋ฉด ๋ธ๋ผ์ฐ์ ๊ฐ ํค๋์ contentType์ ๋ฏธ๋ฆฌ ์ฝ๊ณ
์ด๋ป๊ฒ ํด์ ํด์ผํ ์ง ๊ฐ์ ์ก๊ณ ๊ทธ์ ๋ง๊ฒ ํด์ํ๋ค.
(ํ์ / ์๋ธํ์ ํ์์ผ๋ก ์ ๋๋ค.)
ํ์ง๋ง ๋ง์ฝ์ ์ด๋ฏธ์ง ๋ฌธ์๋ฅผ ๋ณด๋ด๋ฉด์
ContentType : "text/html"๋ก ๋ณด๋ด๋ฉด, ์ด๋ฏธ์ง ๋ฌธ์์ binary data๋ฅผ html ์ฝ๋ฏ์ด ์ฝ์ด๋ฒ๋ ค์ ๋ธ๋ผ์ฐ์ ์ ํ๋ฉด์ด ์ ๋ถ ๊นจ์ ธ์ ๋ณด์ผ ๊ฒ์ด๋ค.
์ฃผ ํ์ | ์ค๋ช | MIME ํ์ ์์(์ฃผ ํ์ / ์๋ธ ํ์ ) |
text | ํ ์คํธ ํฌํจ ๋ฌธ์ | text/plain -> ์ง์ง ํ
์คํธ ๋ฌธ์ text/html -> html ๋ฌธ์ text/css -> Css ๋ฌธ์ |
imgae | ๋ชจ๋ ์ข ๋ฅ์ ์ด๋ฏธ์ง | image/bmp, image/webp |
audio | ๋ชจ๋ ์ข ๋ฅ์ audio ํ์ผ | audio/midi, audio/mpeg |
์์
response.setContentType("text/html");
// ํด๋น http ๋ฉ์ธ์ง๋ฅผ text/html๋ก ํด์ํด๋ผ๋ ๋ป
3. ์ ์กํ๊ธฐ ์ํ ๋ฐฉ๋ฒ (Base64)
(1) ๋ฐฉ๋ฒ
base64๋ 64์ง๋ฒ์ ์ด์ผ๊ธฐ ํ๋ ๊ฒ์ด๋ค.
A~Z (26๊ฐ), a~z(26๊ฐ), 0~9(10๊ฐ), + / (2๊ฐ) ํด์ ์ด 64๊ฐ์ ๋ฌธ์๋ก ๋ฐ์ด๋๋ฆฌ ๋ฐ์ดํฐ๋ฅผ ํ ์คํธ๋ก ๋ณํํ๋ค.
64๋ 2์ 6์น์ด๋ค. ๋ฐ๋ผ์ ํด๋น 64๊ฐ์ ๋ฌธ์๋ 6bit ๋ด์์ ์ ๋ถ ํํ ๊ฐ๋ฅํ๋ค.
**์ฐธ๊ณ **
ASCII ์ฝ๋ 128๋ฌธ์(2^7), 7bit๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ถ ๋ณํํ๋ ๋ฐฉ๋ฒ๋ ์๋ค. 128๊ฐ์๋ ๊ฐํ๋ฌธ์์ ์ด๋ชจํฐ์ฝ, ์ธ ์ ์๋ ๋ฌธ์๋ ๋ค์ด์๋ค. ํ์ง๋ง ๊ฐํ ๋ฌธ์ ๊ฐ์ ๊ฒ์ด OS๋ง๋ค 2์ง์๋ก ์ ์๋ ๊ฒ์ด ๋ฌ๋ผ์, ํด๋น ๋ณํ์ ์ ํ๋๊ฐ ๋จ์ด์ง๊ณ ์์ ํ์ง ์๋ค.
๋ฐ๋ผ์ ์ฌ๊ธฐ์ ํ์ ์๋ ์ด๋ชจํฐ์ฝ๊ณผ ๊ฐํ๋ฌธ์๋ฅผ ๋นผ๊ณ ๋ง๊ตญ ๊ณตํต์ผ๋ก ์ฐ์ด๋ 64๊ฐ์ ๋ฌธ์๋ง์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณํ ํ ๊ฒ์ด Base 64์ด๋ค.
(2) ์์
(3) ์ฅ๋จ์
a. ์ฅ์
: ๋ง๊ตญ ๊ณตํต์ผ๋ก ์ฐ์ด๋ ๋ฌธ์๋ก๋ง ๋ณํ ํ๊ธฐ์ ์๋ OS์ ํ๊ตญ OS ๊ฐ์๋ ๋ฐ์ดํฐ๋ฅผ ์ ํํ๊ฒ ๋ณํํ์ฌ ์๋ก ์ฃผ๊ณ ๋ฐ์ ์ ์๋ค.
--> ๋ฐ์ดํฐ ๋ณํ์ด ์์ ํ๊ณ ์ ํํ๋ค.
b. ๋จ์
์์ ์์์์ ๋ณผ ์ ์๋ฏ์ด, ์ด 16bit ์ง๋ฆฌ ๋ฐ์ดํฐ๋ฅผ 6bit์ฉ ์งค๋ผ์ char ๋ฌธ์๋ก ๋ณํ ํ๋ค. char ๋ฌธ์์ ํฌ๊ธฐ๋ 8bit์ด๋ฏ๋ก,
6bit ํ๋ ๋น 8 bit๊ฐ ๋์๋ค!
์ด๋ ์๋ ๋ฐ์ดํฐ ๋์ 33%๋ฅผ ๋ปฅํ๊ธฐ ํ๋ ๊ฒ์ด๋ค.
๋จ์ : ๋ณํํ ๋ ๋ฐ์ดํฐ ๋์ด ๋์ด๋๋ค.
4. ์ฝ๋ ๋ฆฌ๋ทฐ
(1)RequestHeader
/requestHeader๋ก RequestMapping์ด ์ผ์ด๋๋ฉด, ์์ฒญ ๋ฉ์ธ์ง์ ํค๋๋ฅผ ์ ๋ถ ์ถ๋ ฅํด์ฃผ๋ ํ๋ก๊ทธ๋จ.
package com.fastcampus.ch2;
import java.util.Enumeration;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class RequestHeader {
@RequestMapping("/requestHeader")
public void main(HttpServletRequest request) {
//๋ฐ๋ณต์์ ๊ตฌ๋ฒ์ , ๊ฐ์ฒด e๋ header์ ์ด๋ฆ์ ์ํํจ.
Enumeration<String> e = request.getHeaderNames();
//๋ฐ๋ณต์๊ฐ ๋งจ ๋์ ๊ฐ ๋๊น์ง ๋ฐ๋ณต
while (e.hasMoreElements()) {
String name = e.nextElement();
// header name๊ณผ ํด๋น header name์ด ๊ฐ์ง๋ value๋ฅผ ์์ผ๋ก ์ถ๋ ฅ
System.out.println(name + ":" + request.getHeader(name));
}
}
}
package com.fastcampus.ch2;
import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class RequestMessage {
@RequestMapping("/requestMessage")
public void main(HttpServletRequest request) throws Exception {
// 1. request line
//requestLine์ method๋ถํฐ ์์ํด์ ์ด์ด๋ถ์.
// ์์ //๋ค์ ๋ญ ์ด์ด ๋ถ์ด๋์ง ๋ณด์ฌ์ค
String requestLine = request.getMethod(); // Request ์์ฒญ์ด ๋ฌด์์ด์๋๊ฐ? (GET or POST)
requestLine += " " + request.getRequestURI(); // /ch2/requestMessage (Uri๊ฐ ์ฟผ๋ฆฌ ๋บ ๋ถ๋ถ๊น์ง)
String queryString = request.getQueryString(); // year=2021&month=10&day=1
requestLine += queryString == null ? "" : "?"+queryString;
requestLine += " " + request.getProtocol(); // HTTP/1.1
System.out.println(requestLine);
// ์ต์ข
์ผ๋ก ์ด์ด ๋ถ์ธ ๋ฌธ์ฅ
//GET /ch2/requestMessage?year=2021&month=10&day=1 HTTP/1.1
// 2. request headers
Enumeration<String> e = request.getHeaderNames();
while (e.hasMoreElements()) {
String name = e.nextElement();
System.out.println(name + ":" + request.getHeader(name));
}
// 3. request body - POST์ผ ๋๋ง ํด๋น, GET์ body๊ฐ ์์(CONTENT_LENGTH=0)
//body ๊ธธ์ด
final int CONTENT_LENGTH = request.getContentLength();
// System.out.println("content length="+CONTENT_LENGTH);
// body๊ฐ ์๋ ๊ฒฝ์ฐ
if(CONTENT_LENGTH > 0) {
// ๋ฐ๋ ๊ธธ์ด ๋งํผ ๋ฐฐ์ด์ ๋ง๋ฆ
byte[] content = new byte[CONTENT_LENGTH];
// stream์ ๋ง๋ฆ
InputStream in = request.getInputStream();
// content ๋ฐฐ์ด์ 0์์๋ถํฐ ๋๊น์ง ์คํธ๋ฆผ์ผ๋ก ์ฝ์.
in.read(content, 0, CONTENT_LENGTH);
System.out.println(); // empty line
System.out.println(new String(content, "utf-8")); // year=2021&month=10&day=1
} // if
} // main
}
5. ์ค์ค๋ก ํด๋ณด๊ธฐ
์ด๋ฏธ์ง ํ์ผ์ base64๋ฅผ ์ด์ฉํด ํ ์คํธ ํ์ผ๋ก ๋ณํ ํด์ html์ ์ง์ด๋ฃ์.
์ด๋ฌ๋ฉด ์ด๋ฏธ์ง ํ์ผ์ด ์ ๊นจ์ง๊ณ ์ ๋์ด.