week 3 yongseon - GANGNAM-JAVA/JAVA-STUDY GitHub Wiki
Java8์ heap ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์ค๋ช ํด์ฃผ์ธ์ ๊ทธ๋ฆฌ๊ณ ํ์์ญ๊ณผ ์คํ์์ญ์ ๋ํด์ ์ค๋ช ํ์์ค
์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด JDK7๊น์ง ์ฌ์ฉ๋ Permanent General(PermGen) Space๊ฐ Oracle์ ์ฃผ๋ํ์ ์ ๊ฑฐ๋ ๊ฒ์ด ํฐ ํน์ง ์ค ํ๋์ ๋๋ค.
Metaspace : ์๋ก์ด ๋ฉ๋ชจ๋ฆฌ ์ ์ฅ์์ ํ์
JDK8 HotSpot JVM์ ๊ฒฝ์ฐ, ์ฌ์ฌ์ฉ์ฑ์ ์ํ ๊ฐ์ฒด์ ๋ํ metadata๋ฅผ Metaspace๋ผ๊ณ ๋ถ๋ฆฌ์ฐ๋ Native Memory์ ์ ์ฅํ๊ฒ ๋์ด OS๊ฐ ์๋์ผ๋ก ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ๊ธฐ ๋๋ฌธ์ ๊ธฐ์กด๊ณผ ๋น๊ตํด ํฐ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ์ฌ์ฉํ ์ ์๊ฒ ๋์์ต๋๋ค. ๊ทธ๋ก ์ธํด Perm ์์ญ ํฌ๊ธฐ๋ก ์ธํ java.lang.OutOfMemoryError : PermGen Space๋ฅผ ๋ ๋ณด๊ธฐ ํ๋ค์ด ์ก๊ณ , ๋ ์ด์ tunning๊ณผ monitoring์ ํตํด์ ์ด๋ฌํ memory space๋ฅผ ์กฐ์ ํ ํ์๊ฐ ์๋ค๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ ์ง๋ง, ์ด๋ฌํ ๋ณํ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์๋ณด์ด๊ฒ ์ค์ ์ด ๋๊ธฐ ๋๋ฌธ์ ์ฐ๋ฆฌ๋ ์ด ์๋ก์ด meta memory์ ๋ํ ์กฑ์ ์ ์ฌ์ ํ ์ดํด๋ณผ ํ์์ฑ์ ์กด์ฌํ๊ฒ ๋ฉ๋๋ค.
์์ฝ
PermGen space situation
- memory space๋ ์๋ฒฝํ๊ฒ ์ ๊ฑฐ๋ฉ๋๋ค.
- PermSize์ MaxPermSize JVM argument๋ ๋ฌด์๋๋ฉฐ, ์์๋ ๋ ๊ฒฝ๊ณ ๋ฅผ ํ์ํฉ๋๋ค.
Metaspace memory allocation model
- class์ metadata๋ ๊ฑฐ์ ๋๋ถ๋ถ native memory์ ์ ์ฅ๋ฉ๋๋ค.
- class์ metadata๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํ klasses๋ค์ ๋ชจ๋ ์ ๊ฑฐ๋ฉ๋๋ค.
Metaspace capacity
- ๊ธฐ๋ณธ์ ์ผ๋ก metaspace๋ native memory๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์, OS์์ ์ฌ์ฉ ๊ฐ๋ฅํ memory ์์ญ ๋ชจ๋๋ฅผ ์ฌ์ฉ ๊ฐ๋ฅํฉ๋๋ค.
- ์๋ก์ด Flag(MaxMetaSpaceSize)๊ฐ ๊ฐ๋ฅํฉ๋๋ค. ์ด๋ class metadata๋ฅผ ์ ์ฅํ๊ธฐ ์ํ ์ต๋ํ์ memory size๋ฅผ ์ ํ๋ ๊ฒ์ด ๊ฐ๋ฅํฉ๋๋ค. ๋ง์ฝ์ Flag๋ฅผ ์ค์ ํ์ง ์๋๋ค๋ฉด, Metaspace๋ application์ ๋์์ ๋ฐ๋ผ ๊ฐ๋ณ์ ์ผ๋ก ๋์ํ๊ฒ ๋ฉ๋๋ค.
Metaspace garbage collection
- dead class์ classloader์ GC๋ MaxMetaspaceSize์ ๋๋ฌํ๋ฉด ๋ฐ์ํฉ๋๋ค.
- Metaspace์ tuning๊ณผ monitoring์ GC์ ํ์์ ์ง์ญ์ ์ ํํ๊ธฐ ์ํด ํ์ํ ์์ ์ ๋๋ค. ๊ณผ๋ํ Metaspace GC๋ classloader์ memory leak ๋๋ ์ ํฉํ์ง ์์ Application์ memory size๋ฅผ ์ด๋ํฉ๋๋ค.
Java heap space impact
- ์ฌ๋ฌ ๋ค์ํ ๋ฐ์ดํฐ๋ค์ Java Heap space๋ก ์ ์ฅ ์์ญ์ด ์ด๋๋์์ต๋๋ค. ๊ฒฐ๊ตญ ๊ธฐ์กด JDK7์์ JDK8๋ก ์ ๊ทธ๋ ์ด๋๋ฅผ ํ๋ ๊ฒฝ์ฐ, Java Heap memory๋ฅผ ์ฆ๊ฐ์ํฌ ํ์๊ฐ ์์ต๋๋ค.
Metaspace monitoring
- metaspace ์ฌ์ฉ๋์ GC log output์ ํตํด์ ํ์ธ ๊ฐ๋ฅํฉ๋๋ค.
- Jstat * JVirtualVM ์ ์์ง metaspace๋ฅผ monitoring ํ์ง ๋ชปํฉ๋๋ค. ์์ง ์์ PermGen space reference๋ฅผ ํ์ธํ๋๋ก ๋์ด ์์ต๋๋ค.
Heap Space
Java Heap Space๋ Java Runtime์์ Memory๋ฅผ Object ๋ฐ JRE Class์ ํ ๋นํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ๊ฐ์ฒด๋ฅผ ๋ง๋ค ๋๋ง๋ค ํญ์ Heap Space์ ๋ง๋ค์ด์ง๋๋ค.
Garbage Collection์ Heap Memory์์ ์คํ๋์ด ์ฐธ์กฐ๊ฐ ์๋ Object๊ฐ ์ฌ์ฉํ๋ Memory๋ฅผ ํด์ ํฉ๋๋ค. Heap Space์์ ์์ฑ ๋ ๋ชจ๋ ๊ฐ์ฒด๋ ์ ์ญ ์ก์ธ์ค ๊ถํ์ ๊ฐ์ง๋ฉฐ ์์ฉ ํ๋ก๊ทธ๋จ์ ์ด๋ ๊ณณ์์๋ ์ฐธ์กฐ ํ ์ ์์ต๋๋ค.
Stack Memory
Java Stack Memory๋ Thread ์คํ์ ์ฌ์ฉ๋ฉ๋๋ค. ์ฌ๊ธฐ์๋ ์๋ช ์ด ์งง์ Method ๋ณ ๊ฐ๊ณผ Method์์ ์ฐธ์กฐ๋๋ Heap์ ๋ค๋ฅธ Object์ ๋ํ ์ฐธ์กฐ๊ฐ ํฌํจ๋ฉ๋๋ค.
Stack Memory๋ ํญ์ LIFO(Last-In-First-Out) ์์๋ก ์ฐธ์กฐ๋ฉ๋๋ค. Method๊ฐ ํธ์ถ ๋ ๋๋ง๋ค Method๊ฐ ๋ก์ปฌ ๊ธฐ๋ณธ ๊ฐ์ ๋ณด์ ํ๊ณ Method์ ๋ค๋ฅธ Object์ ๋ํ ์ฐธ์กฐ๋ฅผ ๋ณด์ ํ ์ ์๋๋ก Stack Memory์ ์ ๋ธ๋ก์ด ์์ฑ๋ฉ๋๋ค.
Method๊ฐ ์ข ๋ฃ๋์๋ง์ ๋ธ๋ก์ ์ฌ์ฉ๋์ง ์๊ณ ๋ค์ Method์ ์ฌ์ฉํ ์ ์๊ฒ ๋ฉ๋๋ค. Stack Memory ํฌ๊ธฐ๋ Heap Memory์ ๋นํด ๋งค์ฐ ์์ต๋๋ค.
Java ํ๋ก๊ทธ๋จ์ ํ ๋ฐ ์คํ ๋ฉ๋ชจ๋ฆฌ
public class Memory {
public static void main(String[] args) { // Line 1
int i=1; // Line 2
Object obj = new Object(); // Line 3
Memory mem = new Memory(); // Line 4
mem.foo(obj); // Line 5
} // Line 9
private void foo(Object param) { // Line 6
String str = param.toString(); //// Line 7
System.out.println(str);
} // Line 8
}
}
์๋ ์ด๋ฏธ์ง๋ ์ ํ๋ก๊ทธ๋จ์ ์ฐธ์กฐํ ์คํ ๋ฐ ํ ๋ฉ๋ชจ๋ฆฌ์ ๊ธฐ๋ณธ, ๊ฐ์ฒด ๋ฐ ์ฐธ์กฐ ๋ณ์๋ฅผ ์ ์ฅํ๋ ๋ฐ ์ฌ์ฉ๋๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค.
-
ํ๋ก๊ทธ๋จ์ ์คํํ๋ฉด ๋ชจ๋ ๋ฐํ์ ํด๋์ค๋ฅผ ํ ๊ณต๊ฐ์ผ๋ก ๋ก๋ํฉ๋๋ค. main() ๋ฉ์๋๊ฐ 1ํ์์ ๋ฐ๊ฒฌ๋๋ฉด Java ๋ฐํ์์ main() ๋ฉ์๋ ์ค๋ ๋์์ ์ฌ์ฉํ ์คํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์์ฑํฉ๋๋ค.
-
Line 2์์ ๋ก์ปฌ ๋ณ์๋ฅผ ๋ง๋ค๊ณ ์์ผ๋ฏ๋ก main()๋ฉ์๋์ ์คํ ๋ฉ๋ชจ๋ฆฌ์ ๋ง๋ค์ด ์ ์ฅ๋ฉ๋๋ค.
-
Line 3์์๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ์๊ธฐ ๋๋ฌธ์ ํ ๋ฉ๋ชจ๋ฆฌ์ ์์ฑ๋๋ฉฐ ์คํ ๋ฉ๋ชจ๋ฆฌ์๋ ์ด์ ๋ํ ์ฐธ์กฐ๊ฐ ํฌํจ๋ฉ๋๋ค. Line 4์์ Memory ๊ฐ์ฒด๋ฅผ ๋ง๋ค ๋ ๋น์ทํ ํ๋ก์ธ์ค๊ฐ ๋ฐ์๋ฉ๋๋ค.
-
Line 5์์ foo() ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด ์คํ ๋งจ ์์ ์๋ ๋ธ๋ก์ด foo() ๋ฉ์๋์์ ์ฌ์ฉ๋๋๋ก ์์ฑ๋ฉ๋๋ค. Java๋ ๊ฐ์ผ๋ก ์ ๋ฌ๋๋ฏ๋ก Line 66์ foo() ์คํ ๋ธ๋ก์ Object์ ๋ํ ์๋ก์ด ์ฐธ์กฐ๊ฐ ์์ฑ๋ฉ๋๋ค.
-
๋ฌธ์์ด์ Line 7์์ ๋ง๋ค์ด์ง๊ณ , ํ ๊ณต๊ฐ์ String Pool์ ๋ค์ด๊ฐ๊ณ ์ด์ ๋ํ foo() ์คํ ๊ณต๊ฐ์ ์ฐธ์กฐ๊ฐ ๋ง๋ค์ด์ง๋๋ค.
-
foo() ๋ฉ์๋๋ Line 8์์ ์ข ๋ฃ๋๋ฉฐ, ์ด๋ ์คํ์ foo()์ ํ ๋น ๋ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ์ฌ์ฉ ๊ฐ๋ฅํด์ง๋๋ค.
-
Line 9์์ main() ๋ฉ์๋๊ฐ ์ข ๋ฃ๋๊ณ main() ๋ฉ์๋์ ๋ํด ์์ฑ๋ ์คํ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์์๋ฉ๋๋ค. ๋ํ ํ๋ก๊ทธ๋จ์ ์ด ํ์์ ์ข ๋ฃ๋๋ฏ๋ก Java Runtime์ ๋ชจ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํ๊ณ ํ๋ก๊ทธ๋จ ์คํ์ ์ข ๋ฃํฉ๋๋ค.
ํ ๋ฉ๋ชจ๋ฆฌ์ ์คํ ๋ฉ๋ชจ๋ฆฌ์ ์ฐจ์ด์
-
ํ ๋ฉ๋ชจ๋ฆฌ๋ ์์ฉ ํ๋ก๊ทธ๋จ์ ๋ชจ๋ ๋ถ๋ถ์์ ์ฌ์ฉ๋๋ ๋ฐ๋ฉด ์คํ ๋ฉ๋ชจ๋ฆฌ๋ ํ๋์ ์คํ ์ค๋ ๋์์๋ง ์ฌ์ฉ๋ฉ๋๋ค.
-
๊ฐ์ฒด๊ฐ ์์ฑ ๋ ๋๋ง๋ค ํญ์ ํ ๊ณต๊ฐ์ ์ ์ฅ๋๋ฉฐ ์คํ ๋ฉ๋ชจ๋ฆฌ์๋ ๊ฐ์ฒด์ ๋ํ ์ฐธ์กฐ๊ฐ ํฌํจ๋ฉ๋๋ค. ์คํ ๋ฉ๋ชจ๋ฆฌ์๋ ๋ก์ปฌ ํ๋ฆฌ๋ฏธํฐ๋ธ ๋ณ์์ ํ ๊ณต๊ฐ์ ๊ฐ์ฒด์ ๋ํ ์ฐธ์กฐ ๋ณ์ ๋ง ํฌํจ๋ฉ๋๋ค.
-
ํ์ ์ ์ฅ๋ ๊ฐ์ฒด๋ ์ ์ญ ์ ์ผ๋ก ์ก์ธ์ค ํ ์์๋ ๋ฐ๋ฉด ๋ค๋ฅธ ์ค๋ ๋๋ ์คํ ๋ฉ๋ชจ๋ฆฌ์ ์ก์ธ์ค ํ ์ ์์ต๋๋ค.
-
์คํ์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ LIFO ๋ฐฉ์์ผ๋ก ์ํ๋๋ ๋ฐ๋ฉด, ํ ๋ฉ๋ชจ๋ฆฌ์์๋ ์ ์ฒด์ ์ผ๋ก ์ฌ์ฉ๋๋ฏ๋ก ๋ ๋ณต์กํฉ๋๋ค. ํ ๋ฉ๋ชจ๋ฆฌ๋ Java Garbage Collection ์์ ์์ธํ ๋ด์ฉ์ Young-Generation, Old-Generation ๋ฑ์ผ๋ก ๊ตฌ๋ถ๋ฉ๋๋ค.
-
์คํ ๋ฉ๋ชจ๋ฆฌ๋ ์๋ช ์ด ์งง์ ๋ฐ๋ฉด ํ ๋ฉ๋ชจ๋ฆฌ๋ ์์๋ถํฐ ์ ํ๋ฆฌ์ผ์ด์ ์คํ์ด ๋๋ ๋๊น์ง ์ง์๋ฉ๋๋ค. -Xms ๋ฐ -Xmx JVM ์ต์ ์ ์ฌ์ฉํ์ฌ ์์ ํฌ๊ธฐ ๋ฐ ์ต๋ ํ ๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ๋ฅผ ์ ์ ํ ์ ์์ต๋๋ค . -Xss ๋ฅผ ์ฌ์ฉํ์ฌ ์คํ ๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ๋ฅผ ์ ์ ํ ์ ์์ต๋๋ค.
-
์คํ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๊ฐ๋ ์ฐจ๋ฉด Java ๋ฐํ์์ด ๋ฐ์ java.lang.StackOverFlowErrorํ์ง๋ง ํ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๊ฐ๋ ์ฐจ๋ฉด java.lang.OutOfMemoryError: Java Heap Space์ค๋ฅ ๊ฐ ๋ฐ์ํฉ๋๋ค. ์คํ ๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ๋ ํ ๋ฉ๋ชจ๋ฆฌ์ ๋น๊ตํ ๋ ๋งค์ฐ ์์ต๋๋ค. ๋ฉ๋ชจ๋ฆฌ ํ ๋น (LIFO)์ ๋จ์์ฑ์ผ๋ก ์ธํด ์คํ ๋ฉ๋ชจ๋ฆฌ๋ ํ ๋ฉ๋ชจ๋ฆฌ์ ๋น๊ตํ ๋ ๋งค์ฐ ๋น ๋ฆ ๋๋ค.
๋ฉ์๋๋ก ์ ๋ฌํ ์ ์๋ ์ต๋ช ํจ์(Anonymous Function)๋ฅผ ๋จ์ํํ ๊ฒ์ด๋ผ๊ณ ํ ์ ์์ต๋๋ค. ๋๋ค ํํ์์๋ ์ด๋ฆ์ ์์ง๋ง, ํ๋ผ๋ฏธํฐ ๋ฆฌ์คํธ, ๋ฐ๋, ๋ฐํ ํ์, ๋ฐ์ํ ์ ์๋ ์์ธ ๋ฆฌ์คํธ๋ ๊ฐ์ง ์ ์์ต๋๋ค.
๋๋ค์ ํน์ง
- ์ต๋ช
๋ณดํต์ ๋ฉ์๋์ ๋ฌ๋ฆฌ ์ด๋ฆ์ด ์์ผ๋ฏ๋ก ์ต๋ช ์ด๋ผ ํํํฉ๋๋ค.
- ํจ์
๋๋ค๋ ๋ฉ์๋์ฒ๋ผ ํน์ ํด๋์ค์ ์ข ์๋์ง ์์ผ๋ฏ๋ก ํจ์๋ผ๊ณ ๋ถ๋ฆ ๋๋ค. ํ์ง๋ง ๋ฉ์๋์ฒ๋ผ ํ๋ผ๋ฏธํฐ ๋ฆฌ์คํธ, ๋ฐํ ํ์, ๊ฐ๋ฅํ ์์ธ ๋ฆฌ์คํธ๋ฅผ ํฌํจํฉ๋๋ค.
- ์ ๋ฌ
๋๋ค ํํ์์ ๋ฉ์๋ ์ธ์๋ก ์ ๋ฌํ๊ฑฐ๋ ๋ณ์๋ก ์ ์ฅํ ์ ์์ต๋๋ค.
- ๊ฐ๊ฒฐ์ฑ
์ต๋ช ํด๋์ค์ฒ๋ผ ๋ง์ ์์ง๊ตฌ๋ ํ ์ฝ๋๋ฅผ ๊ตฌํํ ํ์๊ฐ ์์ต๋๋ค.
๋๋ค์ ๊ตฌ์ฑ
ex) (Apple a1, Apple a2) -> a1.getWeight().compareTo(a2.getWeight());
- ํ๋ผ๋ฏธํฐ ๋ฆฌ์คํธ
Comparator์ compare ๋ฉ์๋ ํ๋ผ๋ฏธํฐ(์ฌ๊ณผ ๋๊ฐ)
- ํ์ดํ
ํ์ดํ(->)๋ ๋๋ค์ ํ๋ผ๋ฏธํฐ ๋ฆฌ์คํธ์ ๋ฐ๋๋ฅผ ๊ตฌ๋ถํฉ๋๋ค.
- ๋ฐ๋
๋ ์ฌ๊ณผ์ ๋ฌด๊ฒ๋ฅผ ๋น๊ตํฉ๋๋ค. ๋๋ค์ ๋ฐํ๊ฐ์ ํด๋นํ๋ ํํ์์ ๋๋ค.
๋๋ค ํํ์
- () -> {}
- () -> "Seoul"
- () -> {return "Seoul"}
- (Integer a) -> {return "Seoul" + a;}
return์ ์ฌ์ฉํ๋ฉด ๋ฐ๋์ ์ค๊ดํธ๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
๋๋ค๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ์๋ ๋ฐ๋์ ํจ์ํ ์ธํฐํ์ด์ค๋ฅผ ํตํด์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
ํจ์ํ ์ธํฐํ์ด์ค
ํจ์ํ ์ธํฐํ์ด์ค๋ ์ ํํ ํ๋์ ์ถ์ ๋ฉ์๋๋ฅผ ์ง์ ํ๋ ์ธํฐํ์ด์ค์ ๋๋ค. Java 8 ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค๊ณ์๋ค์ java.util.function ํจํค์ง๋ก ์ฌ๋ฌ๊ฐ์ง ์๋ก์ด ํจ์ํ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํฉ๋๋ค.
- Predicate : test ๋ผ๋ ์ถ์ ๋ฉ์๋๋ฅผ ์ ์ํ๋ฉฐ test๋ ์ ๋ค๋ฆญ ํ์ T์ ๊ฐ์ฒด๋ฅผ ์ธ์๋ก ๋ฐ์ boolean์ ๋ฐํํฉ๋๋ค. ๋ฐ๋ก ์ ์ํ ํ์ ์์ด ๋ฐ๋ก ์ฌ์ฉํ ์ ์๋ค๋ ์ ์ด ํน์ง์ ๋๋ค.
ex) Predicate example source
@FunctionalInterface
public interface Predicate<T> {
boolean test(T t);
}
public <T> List<T> filter(List<T> list, Predicate<T> p) {
List<T> results = new ArrayList<>();
for(T t : list) {
if (p.test(t)) {
results.add(t);
}
}
}
Predicate<String> nonEmptyStringPredicate = (String s) -> !s.isEmpty();
List<String> nonEmpty = filter(listOfStrings, nonEmptyStringPredicate);
- Consumer : ์ ๋ค๋ฆญ ํ์ T ๊ฐ์ฒด๋ฅผ ๋ฐ์์ void๋ฅผ ๋ฐํํ๋ accept ๋ผ๋ ์ถ์ ๋ฉ์๋๋ฅผ ์ ์ํฉ๋๋ค. T ํ์์ ๊ฐ์ฒด๋ฅผ ์ธ์๋ก ๋ฐ์์ ์ด๋ค ๋์์ ์ํํ๊ณ ์ถ์ ๋ Consumer ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
ex) Consumer example source
@FunctionalInterface
public interface Consumer<T> {
void accept(T t);
}
public <T> void forEach(List<T> list, Consumer<T> c) {
for(T t : list) {
c.accept(t);
}
}
forEach(
Arrays.asList(1, 2, 3, 4, 5);
(Integer i) -> System.out.println(i);
);
- Function<T, R> : ์ ๋ค๋ฆญ ํ์ T๋ฅผ ์ธ์๋ก ๋ฐ์์ ์ ๋ค๋ฆญ ํ์ R ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ ์ถ์ ๋ฉ์๋ apply๋ฅผ ์ ์ํฉ๋๋ค. ์ ๋ ฅ์ ์ถ๋ ฅ์ผ๋ก ๋งคํํ๋ ๋๋ค๋ฅผ ์ ์ํ ๋ Function ์ธํฐํ์ด์ค๋ฅผ ํ์ฉํ ์ ์์ต๋๋ค(์๋ฅผ ๋ค๋ฉด ์ฌ๊ณผ์ ๋ฌด๊ฒ ์ ๋ณด๋ฅผ ์ถ์ถํ๊ฑฐ๋ ๋ฌธ์์ด์ ๊ธธ์ด์ ๋งคํ).
ex) Function example source
@FunctionalInterface
public interface Function<T, R> {
R apply(T t);
}
public <T, R> List<R> map(List<T> list, FUnction<T, R> f) {
List<R> result = new ArrayList<>();
for(T t : list) {
result.add(f.apply(t));
}
return result;
}
// [7, 2, 6]
List<Integer> l = map(
Arrays.asList("lambdas", "in", "action"),
(String s) -> s.length() // Function์ apply ๋ฉ์๋๋ฅผ ๊ตฌํํ๋ ๋๋ค
);
- Supplier : ์ธ์ ์์ด ๊ฐ์ ๋ฆฌํดํ๋ ํจ์๋ฅผ ์๋ฏธํฉ๋๋ค.
ex) Supplier example source
@FunctionalInterface
public interface Supplier<T> {
T get();
}
Supplier<Integer> solution = () -> 42;
System.out.println(solution.get());
์์ ๋ค ๊ฐ์ ์ ๋ค๋ฆญ ํจ์ํ ์ธํฐํ์ด์ค ์ธ์ ํนํ๋ ํ์์ ํจ์ํ ์ธํฐํ์ด์ค๋ ์์ต๋๋ค. ์๋ฐ์ ๋ชจ๋ ํ์์ ์ฐธ์กฐํ ์๋๋ฉด ๊ธฐ๋ณธํ์ ํด๋นํ์ง๋ง ์ ๋ค๋ฆญ์ ๋ด๋ถ๊ตฌํ ๋๋ฌธ์ ์ ๋ค๋ฆญ ํ๋ผ๋ฏธํฐ์๋ ์ฐธ์กฐํ๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค. ์๋ฐ์์๋ ๊ธฐ๋ณธํ์ ์ฐธ์กฐํ์ผ๋ก ๋ณํํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ฉฐ ์ด ๊ธฐ๋ฅ์ ๋ฐ์ฑ์ด๋ผ๊ณ ํฉ๋๋ค. ์ฐธ์กฐํ์ ๊ธฐ๋ณธํ์ผ๋ก ๋ณํํ๋ ๋ฐ๋ ๋์์ ์ธ๋ฐ์ฑ์ด๋ผ๊ณ ํฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ํน์ ํ์์ ์ ๋ ฅ์ผ๋ก ๋ฐ๋ ํจ์ํ ์ธํฐํ์ด์ค์ ์ด๋ฆ ์์๋ DoublePredicate, IntConsumer, IntFunction ์ฒ๋ผ ํ์๋ช ์ด ๋ถ์ต๋๋ค.
@FunctionalInterface
@FunctionalInterface๋ ํจ์ํ ์ธํฐํ์ด์ค์์ ๊ฐ๋ฆฌํค๋ ์ด๋ ธํ ์ด์ ์ ๋๋ค. @FunctionalInterface๋ก ์ธํฐํ์ด์ค๋ฅผ ์ ์ธํ์ง๋ง ์ค์ ๋ก ํจ์ํ ์ธํฐํ์ด์ค๊ฐ ์๋๋ฉด ์ปดํ์ผ ํ์ ์๋ฌ๋ฅผ ๋ฐ์์ํต๋๋ค. ์ด๋ค ์ธํฐํ์ด์ค๋ค์ ์ฐ์ฐํ ํจ์ํ์ผ๋ก ์ ์๋ ์๋ ์๊ธฐ ๋๋ฌธ์, Functional Interface๋ค์ด ๋ชจ๋ @FunctionalInterface ์ด๋ ธํ ์ด์ ์ผ๋ก ์ ์ธ๋ ํ์๋ ์๊ณ ๊ทธ๋ ๊ฒ ํ๋ ๊ฒ์ด ๋ฐ๋์งํ์ง๋ ์์ต๋๋ค. ์ฆ, @FunctionalInterface๋ ์์ฑํ ์ธํฐํ์ด์ค๊ฐ Functional Interface์์ ํ์คํ ํ๊ธฐ ์ํ ๋์๋ง ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
- ๋ฉ์๋ ๋ ํผ๋ฐ์ค๋ฅผ ์ด์ฉํ๋ฉด ๊ธฐ์กด์ ๋ฉ์๋ ์ ์๋ฅผ ์ฌํ์ฉํด์ ๋๋ค์ฒ๋ผ ์ ๋ฌํ ์ ์์ผ๋ฉฐ ๋๋ค ํํ์์ ์ฌ์ฉํ๋๊ฒ๋ณด๋ค ๊ฐ๋ ์ฑ์ด ์ข๊ฒ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
๋ฉ์๋ ๋ ํผ๋ฐ์ค๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ
- ์ ์ ๋ฉ์๋ ๋ ํผ๋ฐ์ค
ex) Integer์ parseInt ๋ฉ์๋๋ Integer::parseInt๋ก ํํ๊ฐ๋ฅ
- ๋ค์ํ ํ์์ ์ธ์คํด์ค ๋ฉ์๋ ๋ ํผ๋ฐ์ค
ex) String์ length ๋ฉ์๋๋ String::length๋ก ํํ๊ฐ๋ฅ
- ๊ธฐ์กด ๊ฐ์ฒด์ ์ธ์คํด์ค ๋ฉ์๋ ๋ ํผ๋ฐ์ค
ex) Transaction ๊ฐ์ฒด๋ฅผ ํ ๋น๋ฐ์ expensiveTransaction ์ง์ญ ๋ณ์๊ฐ ์๊ณ , Transaction ๊ฐ์ฒด์๋ getValue ๋ฉ์๋๊ฐ ์๋ค๋ฉด,
์ด๋ฅผ expensiveTransaction::getValue๋ผ๊ณ ํํ๊ฐ๋ฅ
- ์์ฑ์ ๋ ํผ๋ฐ์ค
ex) Apple(Integer weight)๋ผ๋ ์๊ทธ๋์ฒ๋ฅผ ๊ฐ๋ ์์ฑ์๋ Function ์ธํฐํ์ด์ค์ ์๊ทธ๋์ฒ์ ๊ฐ์ ๋ค์๊ณผ ๊ฐ์ด ๊ตฌํํ ์ ์์ต๋๋ค.
Function<Integer, Apple> c = Apple::new; Apple apple = c.apply(110); // Function์ apply ๋ฉ์๋์ ๋ฌด๊ฒ๋ฅผ ์ธ์๋ก ํธ์ถํด์ ์๋ก์ด Apple ๊ฐ์ฒด๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
RuntimeException์ ์์ํ์ง ์๋ ํด๋์ค๋ Checked Exception RuntimeException์ ์์ํ ํด๋์ค๋ Unchecked Exceptin์ผ๋ก ๋ถ๋ฅํ ์ ์์ต๋๋ค.
Checked-Exception๊ณผ Unchecked-Exception์ ๊ฐ์ฅ ๋ช ํํ ๊ตฌ๋ถ ๊ธฐ์ค์ '๊ผญ ์ฒ๋ฆฌ๋ฅผ ํด์ผ ํ๋๋'์ ๋๋ค. Checked-Exception์ด ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ์๋ ๋ฉ์๋๋ผ๋ฉด ๋ฐ๋์ ๋ก์ง์ try/catch๋ก ๊ฐ์ธ๊ฑฐ๋ throw๋ก ๋์ ธ์ ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค.
๋ฐ๋ฉด์ Unchecked-Exception์ ๋ช ์์ ์ธ ์์ธ์ฒ๋ฆฌ๋ฅผ ํ์ง ์์๋ ๋ฉ๋๋ค. ์ด ์์ธ๋ ํผํ ์ ์์ง๋ง ๊ฐ๋ฐ์๊ฐ ๋ถ์ฃผ์ํด์ ๋ฐ์ํ๋ ๊ฒฝ์ฐ๊ฐ ๋๋ถ๋ถ์ด๊ณ , ๋ฏธ๋ฆฌ ์์ธกํ์ง ๋ชปํ๋ ์ํฉ์์ ๋ฐ์ํ๋ ์์ธ๊ฐ ์๋๊ธฐ ๋๋ฌธ์ ๊ตณ์ด ๋ก์ง์ผ๋ก ์ฒ๋ฆฌ๋ฅผ ํ ํ์๊ฐ ์๋๋ก ๋ง๋ค์ด์ ธ ์์ต๋๋ค.
๋ํ ์์ธ๋ฅผ ํ์ธํ ์ ์๋ ์์ ์์๋ ๊ตฌ๋ถํ ์ ์์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ปดํ์ผ ๋จ๊ณ์์ ๋ช ํํ๊ฒ Exception ์ฒดํฌ๊ฐ ๊ฐ๋ฅํ ๊ฒ์ Checked-Exception์ด๋ผ ํ๋ฉฐ, ์คํ๊ณผ์ ์ค ์ด๋ค ํน์ ๋ ผ๋ฆฌ์ ์ํด ๋ฐ๊ฒฌ๋๋ Exception์ Unchecked-Exception์ด๋ผ ํฉ๋๋ค.
ํ๊ฐ์ง ๋ ์ธ์งํ๊ณ ์์ด์ผ ํ ๊ฒ์ ์์ธ๋ฐ์ ์ ํธ๋์ญ์ ์ rollback ์ฌ๋ถ์ ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก Checked-Exception์ ์์ธ๊ฐ ๋ฐ์ํ๋ฉด ํธ๋์ญ์ ์ rollback ํ์ง ์๊ณ ์์ธ๋ฅผ ๋์ ธ์ค๋๋ค. ํ์ง๋ง Uncehcked-Exception์ ์์ธ ๋ฐ์ ์ ํธ๋์ญ์ ์ rollback ํ๋ค๋ ์ ์์ ์ฐจ์ด๊ฐ ์์ต๋๋ค.
์์ธ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ
์์ธ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ์๋ ์์ธ๊ฐ ๋ฐ์ํ๋ฉด ๋ค๋ฅธ ์์ ํ๋ฆ์ผ๋ก ์ ๋ํ๋ ์์ธ ๋ณต๊ตฌ์ ์ฒ๋ฆฌ ํ์ง ์๊ณ ํธ์ถํ ์ชฝ์ผ๋ก ๋์ ธ๋ฒ๋ฆฌ๋ ์์ธ์ฒ๋ฆฌ ํํผ, ๊ทธ๋ฆฌ๊ณ ํธ์ถํ ์ชฝ์ผ๋ก ๋์ง ๋ ๋ช ํํ ์๋ฏธ๋ฅผ ์ ๋ฌํ๊ธฐ ์ํด ๋ค๋ฅธ ์์ธ๋ก ์ ํํ์ฌ ๋์ง๋ ์์ธ ์ ํ์ด ์์ต๋๋ค.
-
์์ธ ๋ณต๊ตฌ
int try = TRY_CNT; while (try-- > 0) { try { // ์์ธ๊ฐ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ์๋ ์๋ return; // ์ฑ๊ณต ์ ๋ฆฌํด } catch (Exception e) { // ๋ก๊ทธ ์ถ๋ ฅ, ์๋ฌ ์ฒ๋ฆฌ } finally { // ๋ฆฌ์์ค ๋ฐ๋ฉ, ์ ๋ฆฌ } } throw new RetryFailedException(); // ์ต๋ ์ฌ์๋ ํ์๋ฅผ ๋๊ธฐ๋ฉด ์ง์ ์์ธ ๋ฐ์
try์์ ์์ธ๊ฐ ๋ฐ์ํ ์ ์๋ ์ฝ๋๋ฅผ ์งํํ๊ณ ์์ธ ๋ฐ์์ catch๋ฌธ์์ ์ฒ๋ฆฌ, ๋ณต๊ตฌ ์๋๋ฅผ ํ๋ ๋ฐฉ๋ฒ์ ๋๋ค. finally๋ ์ฑ๊ณต, ์คํจ์ ๋๊ฐ์ง ๊ฒฝ์ฐ ๋ชจ๋ ์คํ๋๋ ๋ถ๋ถ์ ๋๋ค. ์์ธ๋ณต๊ตฌ์ ํต์ฌ์ ์์ธ๊ฐ ๋ฐ์ํ์ฌ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์์ ์ธ ํ๋ฆ์ผ๋ก ์งํ๋๋ค๋ ๊ฒ์ ๋๋ค.
-
์์ธ์ฒ๋ฆฌ ํํผ
public void add() throws SQLException { ... // ๊ตฌํ ๋ก์ง }
์์ธ๊ฐ ๋ฐ์ํ๋ฉด throws๋ฅผ ํตํด ํธ์ถํ์ชฝ์ผ๋ก ์์ธ๋ฅผ ๋์ง๊ณ ๊ทธ ์ฒ๋ฆฌ๋ฅผ ํํผํ๋ ๊ฒ์ ๋๋ค. ํธ์ถํ ์ชฝ์์ ์์ธ๋ฅผ ๋ฐ์ ์ฒ๋ฆฌํ๋๋ก ํ๊ฑฐ๋, ํด๋น ๋ฉ์๋์์ ์ด ์์ธ๋ฅผ ๋์ง๋ ๊ฒ์ด ์ต์ ์ ๋ฐฉ๋ฒ์ด๋ผ๋ ํ์ ์ด ์์ ๋๋ง ์ฌ์ฉํด์ผ ํฉ๋๋ค.
-
์์ธ ์ ํ
catch(SQLException e) { ... throw DuplicateUserIdException(); }
์์ธ์ ํ์ ์ ์ฝ๋์ฒ๋ผ ์์ธ๋ฅผ ์ก์์ ๋ค๋ฅธ ์์ธ๋ก ๋์ง๋ ๊ฒ์ ๋๋ค. ํธ์ถํ ์ชฝ์์ ์์ธ๋ฅผ ๋ฐ์์ ์ฒ๋ฆฌํ ๋ ์ข ๋ ๋ช ํํ๊ฒ ์ธ์งํ ์ ์๋๋ก ๋๊ธฐ ์ํ ๋ฐฉ๋ฒ์ ๋๋ค. ์ด๋ค ์์ธ์ธ์ง ๋ถ๋ช ํด์ผ ์ฒ๋ฆฌ๊ฐ ์์ํด์ง๊ธฐ ๋๋ฌธ์ ๋๋ค.
@Service
- ๋น์ฆ๋์ค ๋ ผ๋ฆฌ ๋ฐ ํธ์ถ ๋ฉ์๋๋ฅผ ์ ์
- ๋น์ฆ๋์ค ๋ก์ง์ ๊ฐ์ง๊ณ ์์์ ํํ
- Business Layer์ ์ํจ -> ์ปจํธ๋กค๋ฌ์ ๋ทฐ๋ฅผ ์ฐ๊ฒฐ
- ํ์ํ ๋ ํน์ ์์ธ, ์์ธ์ฒ๋ฆฌ๋ฅผ ์ถ๊ฐ ํ ์ ์์
@Component
- ์๋์ผ๋ก ์ค์บํด์ ๋ฑ๋กํ๊ณ ์ถ์ ๊ฒ๋ค์ ์ํด ์ฌ์ฉ
- @Component์ ๊ตฌ์ฒดํ๋ ํํ๋ก @Controller, @Service, @Controller ๋ฑ์ด ์์
- ํด๋ผ์ด์ธํธ์ ์์ฒญ์ด DispatcherServlet์ ์ ๋ฌ
- DispatcherServlet์ HandlerMapping์ ์ฌ์ฉํ์ฌ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์ฒ๋ฆฌํ ์ปจํธ๋กค๋ฌ ๊ฐ์ฒด๋ฅผ ๊ตฌํจ
- DispatcherServlet์ ์ปจํธ๋กค๋ฌ ๊ฐ์ฒด์ handleRequest() ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์ฒ๋ฆฌ
- ์ปจํธ๋กค๋ฌ์ handlerRequest() ๋ฉ์๋๋ ์ฒ๋ฆฌ ๊ฒฐ๊ณผ ์ ๋ณด๋ฅผ ๋ด์ ModelAndView ๊ฐ์ฒด๋ฅผ ๋ฆฌํด
- DispatcherServlet์ ViewResolver๋ก๋ถํฐ ์๋ต ๊ฒฐ๊ณผ๋ฅผ ์์ฑํ ๋ทฐ ๊ฐ์ฒด๋ฅผ ๊ตฌํจ
- ๋ทฐ๋ ํด๋ผ์ด์ธํธ์ ์ ์กํ ์๋ต์ ์์ฑ
Spring MVC์์ ํ์ํ ๋น๋ค์ ๋ฑ๋กํ๊ธฐ ์ํด ์ฌ์ฉํฉ๋๋ค.
@EnableWebMvc๋ ์ด๋ ธํ ์ด์ ๊ธฐ๋ฐ์ Spring MVC๋ฅผ ๊ตฌ์ฑํ ๋ ํ์ํ Bean ์ค์ ๋ค์ ์๋์ผ๋ก ํด์ฃผ๋ ์ด๋ ธํ ์ด์ ์ ๋๋ค.
๋ํ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฑ๋กํด์ฃผ๋ Bean๋ค ์ด์ธ์ ์ถ๊ฐ์ ์ผ๋ก ๊ฐ๋ฐ์๊ฐ ํ์๋ก ํ๋ Bean๋ค์ ๋ฑ๋ก์ ์์ฝ๊ฒ ํ ์ ์๋๋ก ๋์์ค๋๋ค.
-
SSL ํด๋ผ์ด์ธํธ ์ปดํจํฐ๊ฐ ์์ ์ ๋ฒ์ , ์ํธ ์๊ณ ๋ฆฌ์ฆ ๋ชฉ๋ก, ๊ทธ๋ฆฌ๊ณ ์ฌ์ฉ ๊ฐ๋ฅํ ์์ถ ๋ฐฉ์์ "client hello" ๋ฉ์์ง์ ๋ด์ ์๋ฒ๋ก ๋ณด๋ ๋๋ค.
-
SSL ์๋ฒ๋ ํด๋ผ์ด์ธํธ๊ฐ ์ ๊ณตํ ๋ชฉ๋ก์์ ์๋ฒ๊ฐ ์ ํํ ์ํธ ์๊ณ ๋ฆฌ์ฆ, ์ ํํ ์์ถ ๋ฐฉ์๊ณผ ์ธ์ ID ๋ฐ CA(Certificate Authority)๊ฐ ์ฌ์ธํ ์๋ฒ์ ๊ณต๊ฐ ์ธ์ฆ์๋ฅผ "server hello" ๋ฉ์์ง์ ๋ด์ ์๋ตํฉ๋๋ค. ์ด ์ธ์ฆ์๋ ๋์นญํค๊ฐ ์์ฑ๋๊ธฐ ์ ๊น์ง ํด๋ผ์ด์ธํธ๊ฐ ๋๋จธ์ง handshake ๊ณผ์ ์ ์ํธํํ๋ ๋ฐ์ ์ธ ๊ณต๊ฐํค๋ฅผ ๋ด๊ณ ์์ต๋๋ค.
-
SSL ํด๋ผ์ด์ธํธ๋ ์๋ฒ์ ๋์งํธ ์ธ์ฆ์๊ฐ ์ ํจํ์ง ์ ๋ขฐํ ์ ์๋ CA ๋ชฉ๋ก์ ํตํด ํ์ธํฉ๋๋ค.
-
๋ง์ฝ CA๋ฅผ ํตํด ์ ๋ขฐ์ฑ์ด ํ๋ณด๋๋ฉด ํด๋ผ์ด์ธํธ๋ ์์ฌ ๋์(pseudo-random) ๋ฐ์ดํธ๋ฅผ ์์ฑํด ์๋ฒ์ ๊ณต๊ฐํค๋ก ์ํธํํฉ๋๋ค. ์ด ๋์ ๋ฐ์ดํธ๋ ๋์นญํค๋ฅผ ์ ํ๋ ๋ฐ์ ์ฌ์ฉ๋๋ฉฐ ์ด ๋์นญํค๋ ๋์ค์ ๋ฉ์์ง ๋ฐ์ดํฐ๋ฅผ ์ํธํํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
-
SSL ์๋ฒ๊ฐ "ํด๋ผ์ด์ธํธ ์ธ์ฆ์ ์์ฒญ"์ ๋ณด๋ธ ๊ฒฝ์ฐ ํด๋ผ์ด์ธํธ๋ ํด๋ผ์ด์ธํธ์ ๋์งํธ ์ธ์ฆ์ ๋๋ "๋์งํธ ์ธ์ฆ์ ์์ ๊ฒฝ๊ณ " ์ ํจ๊ป ํด๋ผ์ด์ธํธ์ ๊ฐ์ธ ํค๋ก ์ํธํ ๋ ์์์ ๋ฐ์ดํธ ๋ฌธ์์ด์ ๋ณด๋ ๋๋ค. ์ด ๊ฒฝ๊ณ ๋ ๊ฒฝ๊ณ ์ผ ๋ฟ์ด์ง๋ง ์ผ๋ถ ๊ตฌํ์์ ํด๋ผ์ด์ธํธ ์ธ์ฆ์ด ํ์์ผ ๊ฒฝ์ฐ handshake ์คํจํฉ๋๋ค.
-
์๋ฒ๋ ํด๋ผ์ด์ธํธ์ ์ธ์ฆ์๋ฅผ ํ์ธํฉ๋๋ค. ๋์ ๋ฐ์ดํธ๋ฅผ ์๊ธฐ ๊ฐ์ธํค๋ก ๋ณตํธํํด ๋์นญ ๋ง์คํฐํค ์์ฑ์ ํ์ฉํฉ๋๋ค.
-
ํด๋ผ์ด์ธํธ๋ handshake์ ํด๋ผ์ด์ธํธ ๋ถ๋ถ์ด ์๋ฃ๋์์์ ์๋ฆฌ๋ Finished ๋ฉ์์ง๋ฅผ ์๋ฒ์ ๋ณด๋ด๋ฉด์ ์ง๊ธ๊น์ง์ ๊ตํ ๋ด์ญ์ ํด์ํ ๊ฐ์ ๋์นญํค๋ก ์ํธํํ์ฌ ๋ด์ต๋๋ค.
-
์๋ฒ๋ ์ค์ค๋ก๋ ํด์๋ฅผ ์์ฑํด ํด๋ผ์ด์ธํธ์์ ๋์ฐฉํ ๊ฐ๊ณผ ์ผ์นํ๋์ง ๋ด ๋๋ค. ์ผ์นํ๋ฉด ์๋ฒ๋ ๋ง์ฐฌ๊ฐ์ง๋ก ๋์นญํค๋ฅผ ํตํด ์ํธํํ Finished ๋ฉ์์ง๋ฅผ ํด๋ผ์ด์ธํธ์๊ฒ ๋ณด๋ ๋๋ค.
-
์ดํ๋ถํฐ SSL ์ธ์ ๋์ ์๋ฒ์ ํด๋ผ์ด์ธํธ๋ ๋์นญํค๋ก ์ํธํ๋ ์ดํ๋ฆฌ์ผ์ด์ (HTTP) ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ ์ ์์ต๋๋ค.