๐ JDK ์ JRE ์ ์ฐจ์ด์
JDK (Java Development Kit)
JDK๋ Java ์ ํ๋ฆฌ์ผ์ด์
์ ๊ฐ๋ฐํ๊ธฐ ์ํ ๋๊ตฌ ์งํฉ์
๋๋ค.
JDK์๋ JRE๊ฐ ํฌํจ๋์ด ์์ผ๋ฉฐ, ์ถ๊ฐ์ ์ผ๋ก ์ปดํ์ผ๋ฌ(javac), ๋๋ฒ๊ฑฐ, ์์นด์ด๋ฒ(jar), ๋ฌธ์ ์์ฑ๊ธฐ(javadoc) ๋ฑ์ ๋๊ตฌ๋ ํฌํจ๋์ด ์์ต๋๋ค. ์ฆ, JDK๋ ์ํํธ์จ์ด๋ฅผ ๊ฐ๋ฐํ๊ธฐ ์ํ ๋๊ตฌ๋ฅผ ์ ๊ณตํฉ๋๋ค.
JRE (Java Runtime Environment)
JRE๋ Java ์ ํ๋ฆฌ์ผ์ด์
์ ์คํํ๊ธฐ ์ํ ํ๊ฒฝ์
๋๋ค. JRE์๋ JVM (Java Virtual Machine)๊ณผ Java ํด๋์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ(Java API)๊ฐ ํฌํจ๋์ด ์์ต๋๋ค. ์ด๋ ์ ํ๋ฆฌ์ผ์ด์
์ ์คํํ๋๋ฐ ํ์ํ ์ต์ํ์ ๋๊ตฌ ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๊ทธ๋ฌ๋ JRE๋ง์ผ๋ก๋ Java ์ ํ๋ฆฌ์ผ์ด์
์ ๊ฐ๋ฐํ ์๋ ์์ต๋๋ค.
์์ฝํ๋ฉด, JDK๋ Java ์ ํ๋ฆฌ์ผ์ด์
์ ๊ฐ๋ฐํ๊ณ ์คํํ๊ธฐ ์ํ ๋๊ตฌ๋ฅผ ์ ๊ณตํ๋ฉฐ, JRE๋ Java ์ ํ๋ฆฌ์ผ์ด์
์ ์คํํ๊ธฐ ์ํ ํ๊ฒฝ์ ์ ๊ณตํฉ๋๋ค. ๋ง์ฝ ๋น์ ์ด Java ๊ฐ๋ฐ์๋ผ๋ฉด JDK๋ฅผ ์ค์นํด์ผ ํ๊ณ , ๋จ์ง Java ์ ํ๋ฆฌ์ผ์ด์
์ ์คํํ๋ ค๋ ์ฌ์ฉ์๋ผ๋ฉด JRE๋ง ์ค์นํ๋ฉด ๋ฉ๋๋ค.
๐ == ์ equals ์ ์ฐจ์ด์
== ์ฐ์ฐ์์ equals ๋ฉ์๋๋ Java์์ ๊ฐ์ฒด ๋๋ ๊ฐ์ ๋์ผ์ฑ ๋๋ ๋๋ฑ์ฑ์ ๋น๊ตํ๋ ๋ฐ ์ฌ์ฉ๋์ง๋ง, ๊ทธ๋ค์ด ํ๋ ์ผ์ ๋ค๋ฆ
๋๋ค.
== ์ฐ์ฐ์
== ์ฐ์ฐ์๋ ์์ ํ์
(primitive type, ์: int, float, boolean ๋ฑ)์์ ๊ฐ์ ๋น๊ตํ๊ฑฐ๋ ๊ฐ์ฒด ์ฐธ์กฐ์์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ๋น๊ตํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
์๋ฅผ ๋ค์ด,
int a = 10;
int b = 10;
System.out.println(a == b); // true, ๊ฐ์ด ๊ฐ์ผ๋ฏ๋ก
String str1 = new String("Hello");
String str2 = new String("Hello");
System.out.println(str1 == str2); // false, ๊ฐ์ฒด์ ์ฐธ์กฐ(๋ฉ๋ชจ๋ฆฌ ์ฃผ์)๊ฐ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์
equals ๋ฉ์๋
equals ๋ฉ์๋๋ Java ๊ฐ์ฒด๊ฐ ๋
ผ๋ฆฌ์ ์ผ๋ก ๋์ผํ์ง๋ฅผ ๋น๊ตํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก equals ๋ฉ์๋๋ == ์ฐ์ฐ์์ ๋์ผํ๊ฒ ์๋ํ๋ฏ๋ก, ๊ฐ์ฒด ์ฐธ์กฐ๊ฐ ๋์ผํ ๊ฒฝ์ฐ์๋ง true๋ฅผ ๋ฐํํฉ๋๋ค.
๊ทธ๋ฌ๋ equals ๋ฉ์๋๋ ํด๋์ค์ ๋ฐ๋ผ ์ฌ์ ์(override)๋ ์ ์์ผ๋ฉฐ, ๋๋ถ๋ถ์ ๋ด์ฅ Java ํด๋์ค(์: String, Integer ๋ฑ)์์๋ ์ด ๋ฉ์๋๊ฐ ๋
ผ๋ฆฌ์ ๋๋ฑ์ฑ์ ๋น๊ตํ๋๋ก ์ฌ์ ์๋์ด ์์ต๋๋ค.
์๋ฅผ ๋ค์ด,
String str1 = new String("Hello");
String str2 = new String("Hello");
System.out.println(str1.equals(str2)); // true, ๋ ๋ฌธ์์ด์ ๋ด์ฉ์ด ๊ฐ์ผ๋ฏ๋ก
์์ฝํ๋ฉด, == ์ฐ์ฐ์๋ ์์ ํ์
์ ๊ฐ์ ๋น๊ตํ๊ฑฐ๋ ๊ฐ์ฒด ์ฐธ์กฐ์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ๋น๊ตํ๋ ๋ฐ ์ฌ์ฉ๋๊ณ , equals ๋ฉ์๋๋ ๊ฐ์ฒด์ ๋
ผ๋ฆฌ์ ๋๋ฑ์ฑ์ ๋น๊ตํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ด๋ equals ๋ฉ์๋์ ๋์์ ํด๋น ํด๋์ค์ ๋ฐ๋ผ ๋ฌ๋ผ์ง ์ ์์ต๋๋ค.
๐ ๋ ๊ฐ์ฒด๊ฐ ๋์ผํ hashCode ๋ฅผ ๊ฐ์ง๋ฉด Equals() ์ ๋ํด
Java์์ ๋ ๊ฐ์ฒด๊ฐ ๋์ผํ hashCode()๋ฅผ ๋ฐํํ๋ค๋ฉด ๊ทธ๊ฒ์ ๊ทธ ๋ ๊ฐ์ฒด๊ฐ ๋๋ฑํ๋ค๋ ๊ฒ์ ์๋ฏธํ์ง๋ ์์ต๋๋ค. hashCode() ๋ฉ์๋๋ ๊ฐ์ฒด๋ฅผ ๋ํ๋ด๋ ์ ์ ๊ฐ์ ๋ฐํํ๋ฉฐ, ์ด ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์์ ์ฃผ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ์ง๋ง, ์ผ๋ฐ์ ์ผ๋ก ๊ฐ์ฒด์ ๋ด์ฉ์ ๊ธฐ๋ฐ์ผ๋ก ๊ณ์ฐ๋ฉ๋๋ค. ์ด๋ ๊ฐ์ฒด์ ๋ฐ์ดํฐ๊ฐ ๋ฐ๋๋ฉด ํด์ ์ฝ๋๋ ๋ฐ๋ ์ ์์์ ์๋ฏธํฉ๋๋ค.
๊ทธ๋ฌ๋ Java์ hashCode() ๋ฉ์๋์๋ ํน์ ๊ท์น์ด ์์ต๋๋ค. ๋ง์ฝ ๋ ๊ฐ์ฒด๊ฐ equals() ๋ฉ์๋์ ์ํด ๋๋ฑํ๋ค๊ณ ํ๋จ๋๋ฉด, ๊ทธ ๋ ๊ฐ์ฒด๋ ๋ฐ๋์ ๋์ผํ ํด์ ์ฝ๋๋ฅผ ๋ฐํํด์ผ ํฉ๋๋ค. ์ด๋ HashMap, HashSet ๋ฑ์ ์ปฌ๋ ์
์์ ๊ฐ์ฒด์ ๋๋ฑ์ฑ์ ํ๋จํ๋๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
๋ฐ๋๋ก, ๋ ๊ฐ์ฒด์ hashCode()๊ฐ ๋์ผํ๋ค๊ณ ํด์ ๊ทธ ๋ ๊ฐ์ฒด๊ฐ equals()์ ์ํด ๋๋ฑํ๋ค๋ ๊ฒ์ ๋ณด์ฅํ์ง๋ ์์ต๋๋ค. ์ฆ, ํด์ ์ถฉ๋(hash collision)์ด ๋ฐ์ํ ์ ์์ต๋๋ค. ์ด๋ ๋ ๊ฐ ์ด์์ ๋ค๋ฅธ ๊ฐ์ฒด(์ฆ, equals()๋ก ๋น๊ตํ์ ๋ false๋ฅผ ๋ฐํํ๋ ๊ฐ์ฒด)๊ฐ ๋์ผํ ํด์ ์ฝ๋๋ฅผ ๋ฐํํ๋ ๊ฒฝ์ฐ๋ฅผ ์๋ฏธํฉ๋๋ค. ์ด๋ ํด์ ํจ์์ ์์ฑ ๋๋ฌธ์ ๋ฐ์ํ๋ฉฐ, ํนํ ํด์ ์ฝ๋๊ฐ ๊ฐ๋ฅํ ๊ฐ์ ๋ฒ์๊ฐ ๊ฐ์ฒด์ ์๋ณด๋ค ์์ ๋ ๋ฐ์ํฉ๋๋ค.
๋ฐ๋ผ์ ๋ ๊ฐ์ฒด๊ฐ ๋์ผํ hashCode()๋ฅผ ๊ฐ์ง๋ค๊ณ ํด์ ๊ทธ ๊ฐ์ฒด๋ค์ด equals()์ ์ํด ๋๋ฑํ๋ค๊ณ ํ ์๋ ์์ต๋๋ค. ํ์ง๋ง equals()์ ์ํด ๋๋ฑํ๋ค๊ณ ํ๋จ๋ ๊ฐ์ฒด๋ค์ ๋ฐ๋์ ๋์ผํ hashCode()๋ฅผ ๊ฐ์ ธ์ผ ํฉ๋๋ค.
๐ String ๋ ๊ธฐ๋ณธ ๋ฐ์ดํฐ ํ์ ์ ๋๊น ?
Java์์ String์ ๊ธฐ๋ณธ ๋ฐ์ดํฐ ํ์
(primitive data type)์ด ์๋๋๋ค. String์ ์ฐธ์กฐ ๋ฐ์ดํฐ ํ์
(reference data type) ํน์ ๊ฐ์ฒด ํ์
(object type) ์ค ํ๋์
๋๋ค.
Java์์๋ 8๊ฐ์ ๊ธฐ๋ณธ ๋ฐ์ดํฐ ํ์
์ด ์์ต๋๋ค:
1. byte
2. short
3. int
4. long
5. float
6. double
7. boolean
8. char
์ด๋ค์ Java์์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณตํ๋ ๋ฐ์ดํฐ ํ์
์ผ๋ก, ๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ์ ํํ๊ฐ ์ ํด์ ธ ์์ต๋๋ค.
๋ฐ๋ฉด์ String๊ณผ ๊ฐ์ ์ฐธ์กฐ ๋ฐ์ดํฐ ํ์
์ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ฉฐ, new ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ธ์คํด์ค๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. String์ ์ผ๋ฐ์ ์ผ๋ก ๋ฌธ์์ด์ ํํํ๋ฉฐ, ์ฌ๋ฌ ๊ฐ์ง ๋ฉ์๋๋ฅผ ๊ฐ์ง๊ณ ์์ด ๋ฌธ์์ด์ ์กฐ์ํ๋ ๋ฐ ์ ์ฉํฉ๋๋ค.
๋ํ String์ ๋ถ๋ณ(immutable) ํด๋์ค์
๋๋ค. ์ฆ, ํ ๋ฒ ์์ฑ๋ String ๊ฐ์ฒด๋ ๋ณํ์ง ์์ต๋๋ค. String์ ๋ฉ์๋ ์ค ์ด๋ค ๊ฒ์ ํธ์ถํ๋๋ผ๋ ์๋ String ๊ฐ์ฒด๋ ๋ณํ์ง ์์ผ๋ฉฐ, ๋์ ์๋ก์ด String ๊ฐ์ฒด๊ฐ ์์ฑ๋ฉ๋๋ค. ์ด๋ฌํ ํน์ฑ ๋๋ถ์ String์ ํ๋ก๊ทธ๋จ์์ ์์ ํ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๐ ์๋ฐ์์ ๋ฌธ์์ด์ ์กฐ์ํ๋ ํด๋์ค๋ ๋ฌด์์ด ์์ต๋๊น ?
String: ๋ถ๋ณ์ฑ์ ๊ฐ์ง ๋ฌธ์์ด์ ํํํฉ๋๋ค. ํ๋ฒ ์์ฑ๋ String ๊ฐ์ฒด๋ ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค. ๋ฌธ์์ด ์กฐ์ ์์
์ด ๋ง์ ๊ฒฝ์ฐ์๋ ์ฑ๋ฅ์์ ์ด์๊ฐ ์์ ์ ์์ต๋๋ค.
StringBuilder: String ํด๋์ค์ ๋น์ทํ์ง๋ง, ๊ฐ๋ณ์ฑ(mutable)์ ๊ฐ์ง ํด๋์ค์
๋๋ค. ์ฆ, ํ๋ฒ ์์ฑ๋ StringBuilder ๊ฐ์ฒด๋ ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค. StringBuilder๋ ๋ด๋ถ์ ์ผ๋ก ๋ฌธ์์ด ์กฐ์์ด ๋น๋ฒํ๊ฒ ์ผ์ด๋๋ ๊ฒฝ์ฐ์ ์ฌ์ฉํ๋ฉด ์ฑ๋ฅ ํฅ์์ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
StringBuffer: StringBuilder์ ๋์ผํ API๋ฅผ ๊ฐ์ง๋ฉฐ ๊ฐ๋ณ์ ์ธ ํน์ฑ์ ๊ฐ์ง๋๋ค. ํ์ง๋ง StringBuffer๋ ์ค๋ ๋์ ์์ (thread-safe)ํ๊ฒ ๋๊ธฐํ๊ฐ ๋์ด ์์ต๋๋ค. ์ฆ, ์ฌ๋ฌ ์ค๋ ๋์์ ๋์์ ์ ๊ทผํด๋ ์์ ํ๊ฒ ๋์ํฉ๋๋ค.
StringTokenizer: String์ ํน์ ๊ตฌ๋ถ์๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ถํ ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
์ด ์ธ์๋ ๋ฌธ์์ด์ ์กฐ์ํ๊ฑฐ๋ ์ฒ๋ฆฌํ๋๋ฐ ํ์ํ ๋ง์ ๊ธฐ๋ฅ๋ค์ด Java์ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํฌํจ๋์ด ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ ๊ท ํํ์์ ํ์ฉํ๋ ค๋ฉด Pattern๊ณผ Matcher ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
๐ String str ="i" ์ String str = new String("i") ๋ ๋์ผํ๊ฐ ?
String str = "i";์ String str = new String("i");๋ ๊ธฐ์ ์ ์ผ๋ก ์๋ก ๋ค๋ฅด๊ฒ ๋์ํฉ๋๋ค.
String str = "i";: ์ด ์ฝ๋๋ ๋ฌธ์์ด ๋ฆฌํฐ๋ด์ ์ฌ์ฉํฉ๋๋ค. ์๋ฐ์์๋ ์ด๋ฐ ๋ฐฉ์์ผ๋ก ์์ฑ๋ String ๊ฐ์ฒด๊ฐ "String Constant Pool"์ด๋ผ๋ ํน๋ณํ ์์ญ์ ์ ์ฅ๋ฉ๋๋ค. ๋์ผํ ๋ฌธ์์ด ๋ฆฌํฐ๋ด์ด ์ฌ๋ฌ๋ฒ ์ฌ์ฉ๋ ๊ฒฝ์ฐ, ๋ชจ๋ ๋ณ์๋ ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ฑ์ ์ํด ๊ฐ์ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๊ฒ ๋ฉ๋๋ค.
String str = new String("i");: ์ด ์ฝ๋๋ new ํค์๋๋ฅผ ์ฌ์ฉํด ์๋ก์ด String ๊ฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค. ์ด๋ฐ ๋ฐฉ์์ผ๋ก ์์ฑ๋ String ๊ฐ์ฒด๋ ํ ๋ฉ๋ชจ๋ฆฌ(heap memory)์ ์ ์ฅ๋๋ฉฐ, ๊ฐ๊ฐ์ new ํํ์์ ์๋ก์ด, ๋ณ๊ฐ์ String ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ฒ ๋ฉ๋๋ค. ์ด๋ ๋ฌธ์์ด์ด ๊ฐ๋๋ผ๋ ์๋ก ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๊ฒ ๋ฉ๋๋ค.
๋ฐ๋ผ์, String str = "i";์ String str = new String("i");๋ ์ ์ฅ๋๋ ์์น์ ์ฐธ์กฐํ๋ ๊ฐ์ฒด๊ฐ ์๋ก ๋ค๋ฆ
๋๋ค.
๋ค์๊ณผ ๊ฐ์ ์์๋ฅผ ๋ณด๋ฉด ๋ ๋ช
ํํ๊ฒ ์ดํดํ ์ ์์ต๋๋ค.
String str1 = "i";
String str2 = "i";
String str3 = new String("i");
System.out.println(str1 == str2); // true
System.out.println(str1 == str3); // false
System.out.println(str1.equals(str3)); // true
str1๊ณผ str2๋ ๋ฌธ์์ด ๋ฆฌํฐ๋ด๋ก ์์ฑ๋์ด ๊ฐ์ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๊ธฐ ๋๋ฌธ์ ==๋ก ๋น๊ตํ๋ฉด true๊ฐ ๋ฐํ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ str3๋ new ํค์๋๋ก ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ธฐ ๋๋ฌธ์ str1์ด๋ str2์ ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํฉ๋๋ค. ๊ทธ๋์ str1 == str3๋ false๋ฅผ ๋ฐํํฉ๋๋ค. ํ์ง๋ง String ํด๋์ค์ equals() ๋ฉ์๋๋ ๊ฐ์ฒด์ ๋ด์ฉ์ ๋น๊ตํ๋ฏ๋ก, str1.equals(str3)๋ true๋ฅผ ๋ฐํํฉ๋๋ค.
๐ ๋ฌธ์์ด์ ๋ฐ์ ์ํค๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ๋ํด
Java์์ ๋ฌธ์์ด์ ๋ฐ์ ์ํค๋ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ ์ค ํ๋๋ StringBuilder ํด๋์ค์ reverse ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์
๋๋ค.
๋ค์์ ๋ฌธ์์ด์ ๋ฐ์ ์ํค๋ ๊ฐ๋จํ ์์ ์ฝ๋์
๋๋ค:
String str = "Hello World";
String reversed = new StringBuilder(str).reverse().toString();
System.out.println(reversed);
์ด ์ฝ๋๋ฅผ ์คํํ๋ฉด, ์ถ๋ ฅ ๊ฒฐ๊ณผ๋ "dlroW olleH"์
๋๋ค.
StringBuilder์ reverse ๋ฉ์๋๋ ๋ฌธ์์ด์ ๋ฐ์ ์ํค๋ ๋ฐ ํจ์จ์ ์
๋๋ค. StringBuilder๋ ๋ฌธ์์ด ์กฐ์์ ์ํ ๊ฐ๋ณ์ ์ธ ๊ฐ์ฒด๋ฅผ ์ ๊ณตํ๋ฏ๋ก, ๋ฌธ์์ด์ ๋ฐ์ ์ํค๋๋ฐ ํ์ํ ์ถ๊ฐ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ์์ด ์์
์ ์ํํ ์ ์์ต๋๋ค.
๋ฌผ๋ก ๋ค๋ฅธ ๋ฐฉ๋ฒ๋ค๋ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋ฌธ์ ๋ฐฐ์ด์ ์ฌ์ฉํ์ฌ ๋ฌธ์์ด์ ๋ฐ์ ์ํฌ ์ ์์ต๋๋ค:
String str = "Hello World";
char[] strArray = str.toCharArray();
String reversed = "";
for (int i = strArray.length - 1; i >= 0; i--) {
reversed += strArray[i];
}
System.out.println(reversed);
ํ์ง๋ง ์ด ๋ฐฉ๋ฒ์ ๋ฌธ์์ด์ด ๊ธธ ๊ฒฝ์ฐ ์ฑ๋ฅ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ์๋ํ๋ฉด ๋ฌธ์์ด์ ๊ฐ ๋ฌธ์๋ง๋ค ์๋ก์ด ๋ฌธ์์ด ๊ฐ์ฒด๊ฐ ์์ฑ๋๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ฐ๋ผ์, ์ผ๋ฐ์ ์ผ๋ก๋ StringBuilder์ reverse ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
๐ String ํด๋์ค์ ์ผ๋ฐ์ ์ธ ๋ฉ์๋๋ ๋ฌด์์ธ๊ฐ
length(): ๋ฌธ์์ด์ ๊ธธ์ด(๋ฌธ์ ์)๋ฅผ ๋ฐํํฉ๋๋ค.
charAt(int index): ์ง์ ๋ ์ธ๋ฑ์ค์ ์๋ ๋ฌธ์๋ฅผ ๋ฐํํฉ๋๋ค.
substring(int beginIndex, int endIndex): ๋ฌธ์์ด์ ํน์ ๋ถ๋ถ์ ์ถ์ถํ์ฌ ๋ฐํํฉ๋๋ค. beginIndex๋ ์์ ์ธ๋ฑ์ค์ด๊ณ , endIndex๋ ์ข
๋ฃ ์ธ๋ฑ์ค์
๋๋ค. endIndex๋ ์ ํ์ ์ด๋ฉฐ, ์ ๊ณต๋์ง ์์ผ๋ฉด ๋ฌธ์์ด์ ๋๊น์ง ๋ถ๋ถ ๋ฌธ์์ด์ ์์ฑํฉ๋๋ค.
contains(CharSequence sequence): ๋ฌธ์์ด์ด ํน์ ๋ฌธ์์ด์ ํฌํจํ๊ณ ์๋์ง ํ์ธํฉ๋๋ค. ํฌํจํ๋ฉด true, ๊ทธ๋ ์ง ์์ผ๋ฉด false๋ฅผ ๋ฐํํฉ๋๋ค.
indexOf(String str): ๋ฌธ์์ด์์ ํน์ ๋ฌธ์์ด์ด ์์๋๋ ์ฒซ ๋ฒ์งธ ์ธ๋ฑ์ค๋ฅผ ๋ฐํํฉ๋๋ค. ์ฐพ๋ ๋ฌธ์์ด์ด ์์ผ๋ฉด -1์ ๋ฐํํฉ๋๋ค.
lastIndexOf(String str): ๋ฌธ์์ด์์ ํน์ ๋ฌธ์์ด์ด ์์๋๋ ๋ง์ง๋ง ์ธ๋ฑ์ค๋ฅผ ๋ฐํํฉ๋๋ค. ์ฐพ๋ ๋ฌธ์์ด์ด ์์ผ๋ฉด -1์ ๋ฐํํฉ๋๋ค.
equals(Object obj): ๋ฌธ์์ด์ด ๋ค๋ฅธ ๋ฌธ์์ด๊ณผ ๋์ผํ์ง ํ์ธํฉ๋๋ค. ๋์ผํ๋ฉด true, ๊ทธ๋ ์ง ์์ผ๋ฉด false๋ฅผ ๋ฐํํฉ๋๋ค.
equalsIgnoreCase(String str): ๋ฌธ์์ด์ด ๋ค๋ฅธ ๋ฌธ์์ด๊ณผ ๋์๋ฌธ์๋ฅผ ๋ฌด์ํ๊ณ ๋์ผํ์ง ํ์ธํฉ๋๋ค.
startsWith(String prefix), endsWith(String suffix): ๋ฌธ์์ด์ด ํน์ ๋ฌธ์์ด๋ก ์์ํ๊ฑฐ๋ ๋๋๋์ง ํ์ธํฉ๋๋ค.
replace(char oldChar, char newChar): ๋ฌธ์์ด์์ ํน์ ๋ฌธ์๋ฅผ ๋ค๋ฅธ ๋ฌธ์๋ก ๋ชจ๋ ๊ต์ฒดํฉ๋๋ค.
toUpperCase(), toLowerCase(): ๋ฌธ์์ด์ ๋ชจ๋ ๋ฌธ์๋ฅผ ๋๋ฌธ์ ๋๋ ์๋ฌธ์๋ก ๋ณํํฉ๋๋ค.
trim(): ๋ฌธ์์ด์ ์๋ค ๊ณต๋ฐฑ์ ์ ๊ฑฐํฉ๋๋ค.
๐ ์ถ์ ํด๋์ค์์ ์ถ์ ๋ฉ์๋๋ ํ์์ ์ธ๊ฐ์ ?
์ถ์ ํด๋์ค์์ ์ถ์ ๋ฉ์๋๋ ํ์์ ์ด์ง ์์ต๋๋ค.
์ถ์ ํด๋์ค๋ ์ผ๋ฐ ๋ฉ์๋์ ํ๋๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ถ์ ๋ฉ์๋๋ฅผ ํ๋ ์ด์ ๊ฐ์ง๋ฉด ๊ทธ ํด๋์ค๋ ๋ฐ๋์ ์ถ์ ํด๋์ค๋ก ์ ์ธ๋์ด์ผ ํฉ๋๋ค.
์ถ์ ํด๋์ค๋ ์ธ์คํด์คํ ๋ ์ ์์ผ๋ฉฐ, ์ฃผ๋ก ํ์ ํด๋์ค์ ์ํด ํ์ฅ๋์ด ์ฌ์ฉ๋ฉ๋๋ค. ์ด ํด๋์ค๋ฅผ ํ์ฅํ๋ ํ์ ํด๋์ค๋ ์ถ์ ํด๋์ค๊ฐ ๊ฐ์ง๊ณ ์๋ ๋ชจ๋ ์ถ์ ๋ฉ์๋๋ฅผ ๊ตฌํํด์ผ ํฉ๋๋ค.
์ถ์ ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ ์ฃผ๋ ์ด์ ์ค ํ๋๋ ์ด๋ค ๋ฉ์๋๋ฅผ ๋ฐ๋์ ๊ตฌํํ๋๋ก ๊ฐ์ ํ๊ฑฐ๋, ํด๋์ค์ ์ผ๋ถ ๊ธฐ๋ฅ๋ง์ ์ ๊ณตํ๊ณ ์๋ธ ํด๋์ค์์ ๋๋จธ์ง ๊ธฐ๋ฅ์ ๊ตฌํํ๋๋ก ํ๊ธฐ ์ํจ์
๋๋ค. ํ์ง๋ง ์ถ์ ํด๋์ค๋ ์ถ์ ๋ฉ์๋ ์์ด๋ ๊ตฌํ๋ ์ ์์ผ๋ฉฐ, ์ด๋ ์ถ์ ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ ๋ค๋ฅธ ๋ชฉ์ ์ ๊ฐ์ง ๋ ์ ์ฉํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์๋ธ ํด๋์ค ๊ฐ์ ๊ณตํต์ ์ํ๋ ๊ธฐ๋ฅ์ ๊ณต์ ํ๋๋ก ํ๊ธฐ ์ํด ์ถ์ ํด๋์ค๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๐ ๋ณดํต์ ํด๋์ค์ ์ถ์ ํด๋์ค์ ์ฐจ์ด๋ ๋ฌด์์ธ๊ฐ์ ?
์ธ์คํด์คํ: ์ผ๋ฐ ํด๋์ค๋ ๊ฐ์ฒด๋ก ์ธ์คํด์คํ ๋ ์ ์์ต๋๋ค. ์ฆ, ์ผ๋ฐ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ๋ฐ๋ฉด์ ์ถ์ ํด๋์ค๋ ๊ฐ์ฒด๋ก ์ธ์คํด์คํ ๋ ์ ์์ต๋๋ค. ์ฆ, ์ถ์ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์ง์ ์์ฑํ ์ ์์ต๋๋ค. ๋์ ์ถ์ ํด๋์ค๋ ๋ค๋ฅธ ํด๋์ค์ ์ํด ์์๋์ด์ผ ํฉ๋๋ค.
๋ฉ์๋์ ๊ตฌํ: ์ผ๋ฐ ํด๋์ค์์ ์ ์ธ๋ ๋ฉ์๋๋ ๋ฐ๋์ ๊ตฌํ๋์ด์ผ ํฉ๋๋ค. ๋ฐ๋ฉด์, ์ถ์ ํด๋์ค๋ ๊ตฌํ๋์ง ์์ ๋ฉ์๋, ์ฆ '์ถ์ ๋ฉ์๋'๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค. ์ด๋ฌํ ์ถ์ ๋ฉ์๋๋ ์๋ธํด๋์ค์์ ๊ตฌํ๋ฉ๋๋ค.
์ฌ์ฉ ๋ชฉ์ : ์ผ๋ฐ ํด๋์ค๋ ๋๋ถ๋ถ ๊ฐ์ฒด์ ๊ตฌ์ฒด์ ์ธ ํ๋์ ์ ์ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ๋ฐ๋ฉด์ ์ถ์ ํด๋์ค๋ ์ฃผ๋ก ๋ฒ ์ด์ค ํด๋์ค๋ก ์ฌ์ฉ๋๋ฉฐ, ๋์ผํ '์ข
๋ฅ'์ ์ํ๋ ์ฌ๋ฌ ๊ฐ์ฒด๋ค์ ๊ณตํต๋ ํน์ฑ๊ณผ ๋์์ ์ ์ํ๋๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
ํ์ฅ์ฑ: ์ผ๋ฐ ํด๋์ค๋ ํ์์ ๋ฐ๋ผ ํ์ฅ๋ ์ ์์ง๋ง, ํน์ ํ ํ๋์ด๋ ์์ฑ์ ๊ฐ์ ํ๊ฑฐ๋ ์ ๊ณตํ์ง๋ ์์ต๋๋ค. ๋ฐ๋ฉด์, ์ถ์ ํด๋์ค๋ ์๋ธ ํด๋์ค๊ฐ ๋ฐ๋์ ๊ตฌํํด์ผ ํ๋ ํ๋ ์ด์์ ๋ฉ์๋๋ฅผ ์ง์ ํจ์ผ๋ก์จ ํน์ ํ๋์ ๊ฐ์ ํ ์ ์์ต๋๋ค.
์ด๋ฌํ ์ฐจ์ด์ ๋ค๋ก ์ธํด, ์ถ์ ํด๋์ค์ ์ผ๋ฐ ํด๋์ค๋ ๋ค์ํ ์ํฉ๊ณผ ์๊ตฌ์ฌํญ์ ๋ฐ๋ผ ์ ํ๋๊ณ ์ฌ์ฉ๋ฉ๋๋ค.
๐ final ์ ์ถ์ ํด๋์ค๋ฅผ ์์ ํ ๋ ์ฌ์ฉํ ์ ์๋์ ?
final๊ณผ abstract๋ ์๋ก ๋ฐฐํ์ ์ธ ํค์๋๋ก, ๋์์ ์ฌ์ฉ๋ ์ ์์ต๋๋ค.
final ํด๋์ค: final ํค์๋๊ฐ ๋ถ์ ํด๋์ค๋ ๋ ์ด์ ํ์ฅ(์์)๋ ์ ์์ต๋๋ค. ์ฆ, ๋ค๋ฅธ ํด๋์ค๊ฐ final ํด๋์ค๋ฅผ ์์๋ฐ์ ์๋ก์ด ์๋ธํด๋์ค๋ฅผ ์์ฑํ๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค. ๋ํ, final ํค์๋๋ ๋ฉ์๋์ ๋ณ์์๋ ์ฌ์ฉ๋ ์ ์์ด, final ๋ฉ์๋๋ ์ค๋ฒ๋ผ์ด๋ํ ์ ์๊ณ , final ๋ณ์๋ ๊ฐ์ ์ฌํ ๋นํ ์ ์๊ฒ ํฉ๋๋ค.
์ถ์ ํด๋์ค: ๋ฐ๋ฉด์ abstract ํค์๋๊ฐ ๋ถ์ ํด๋์ค๋ ๋ฐ๋์ ํ๋ ์ด์์ ํด๋์ค์ ์ํด ์์๋์ด์ผ ํฉ๋๋ค. ์ถ์ ํด๋์ค๋ ํ๋ ์ด์์ ์ถ์ ๋ฉ์๋๋ฅผ ํฌํจํ ์ ์์ผ๋ฉฐ, ์ด๋ฌํ ์ถ์ ๋ฉ์๋๋ ์๋ธํด๋์ค์์ ๋ฐ๋์ ๊ตฌํ๋์ด์ผ ํฉ๋๋ค.
๋ฐ๋ผ์, final ํค์๋๋ ์์๊ณผ ์ค๋ฒ๋ผ์ด๋ฉ์ ๋ฐฉ์งํ๋ ๋ฐ๋ฉด, abstract ํค์๋๋ ์์๊ณผ ์ค๋ฒ๋ผ์ด๋ฉ์ ๊ฐ์ ํ๊ธฐ ๋๋ฌธ์, ์ด ๋ ํค์๋๋ ๋์์ ์ฌ์ฉ๋ ์ ์์ต๋๋ค. ์ฆ, ํด๋์ค๋ final์ผ ์๋ ์๊ณ abstract์ผ ์๋ ์์ง๋ง, ๋ ๋์์๋ ๋ ์ ์์ต๋๋ค.
๐ ์๋ฐ ์ปจํ ์ด๋๋ ๋ฌด์์ธ๊ฐ์ ?
์๋ฐ ์ปจํ
์ด๋๋ ์ผ๋ฐ์ ์ผ๋ก ์๋ฐ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ผ์ดํ์ฌ์ดํด์ ๊ด๋ฆฌํ๋๋ฐ ์ฌ์ฉ๋๋ ์ปดํฌ๋ํธ๋ฅผ ๊ฐ๋ฆฌํค๋ ์ฉ์ด์
๋๋ค. ํนํ, ์น ์ ํ๋ฆฌ์ผ์ด์
์ปจํ
์ด๋ ๋๋ ์๋ธ๋ฆฟ ์ปจํ
์ด๋๋ผ๊ณ ๋ ํ๋ฉฐ, ์๋ธ๋ฆฟ ๋ฐ JSP ํ์ด์ง์ ์คํ์ ๊ด๋ฆฌํฉ๋๋ค.
์ปจํ
์ด๋๋ ์ ํ๋ฆฌ์ผ์ด์
์ ์์, ์ค์ง, ๋ฐฐํฌ, ์ธ๋ฐฐํฌ์ ๊ฐ์ ์ฌ๋ฌ ๊ฐ์ง ์์
์ ์ํํฉ๋๋ค. ๋ํ, ์ธ์
๊ด๋ฆฌ, ๋ณด์, ํธ๋์ญ์
๊ด๋ฆฌ, ๋ฆฌ์์ค ํ๋ง ๋ฑ๊ณผ ๊ฐ์ ๋ค์ํ ์๋น์ค๋ฅผ ์ ๊ณตํฉ๋๋ค.
์๋ฐ ํ๋ซํผ, ์ํฐํ๋ผ์ด์ฆ ์๋์
(Java EE, ์ด์ ์ J2EE)์์๋ ๋ ๊ฐ์ง ์ฃผ์ํ ์ข
๋ฅ์ ์ปจํ
์ด๋๋ฅผ ์ ์ํ๊ณ ์์ต๋๋ค:
EJB ์ปจํ
์ด๋: ์ด ์ปจํ
์ด๋๋ ์ํฐํ๋ผ์ด์ฆ ์๋ฐ ๋น(Enterprise Java Beans)์ ์๋ช
์ฃผ๊ธฐ๋ฅผ ๊ด๋ฆฌํฉ๋๋ค. ๋ํ, ์์คํ
๋ ๋ฒจ์ ์๋น์ค๋ฅผ ์ ๊ณตํ๋ฉฐ, ํธ๋์ญ์
์ฒ๋ฆฌ, ๋ณด์, ๋ฆฌ๋ชจํธ ์ ๊ทผ ๋ฑ์ ์ฒ๋ฆฌํฉ๋๋ค.
์น ์ปจํ
์ด๋ (๋๋ ์๋ธ๋ฆฟ ์ปจํ
์ด๋): ์ด ์ปจํ
์ด๋๋ ์น ์ปดํฌ๋ํธ์ธ ์๋ธ๋ฆฟ๊ณผ JSP(JavaServer Pages)์ ์๋ช
์ฃผ๊ธฐ๋ฅผ ๊ด๋ฆฌํฉ๋๋ค. HTTP ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ , ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ์ ํต์ ์ ๋ด๋นํฉ๋๋ค.
์๋ฐ ์ปจํ
์ด๋์ ๋ํ์ ์ธ ์๋ก๋ Apache Tomcat, Jetty, JBoss, GlassFish ๋ฑ์ด ์์ต๋๋ค. ์ด๋ค์ ์น ์ ํ๋ฆฌ์ผ์ด์
์ ํธ์คํ
ํ๊ณ ๊ด๋ฆฌํ๋๋ฐ ๋๋ฆฌ ์ฌ์ฉ๋ฉ๋๋ค.
๐ Collection ๊ณผ Collections ์ ์ฐจ์ด๋ ๋ฌด์์ธ๊ฐ ?
Collection๊ณผ Collections๋ ์๋ฐ์ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ด์ ์๋ ๋ ๊ฐ์ง ๋ค๋ฅธ ๊ฒ์ ๋ํ๋
๋๋ค.
Collection: java.util.Collection ์ธํฐํ์ด์ค๋ ์๋ฐ์์ ์ ๊ณตํ๋ ์ฃผ์ ์ปฌ๋ ์
ํ์
๋ค(List, Set, Queue ๋ฑ)์ ๋ฃจํธ ์ธํฐํ์ด์ค์
๋๋ค. ์ด ์ธํฐํ์ด์ค๋ ์ฌ๋ฌ ์์๋ฅผ ๋ค๋ฃจ๋๋ฐ ์ฌ์ฉ๋๋ ๊ธฐ๋ณธ ๋ฉ์๋๋ค(add, remove, contains, isEmpty ๋ฑ)์ ์ ์ํ๊ณ ์์ต๋๋ค. Collection์ ์ธํฐํ์ด์ค๋ก์, ์ง์ ์ ์ผ๋ก ์ธ์คํด์คํ ํ ์ ์์ผ๋ฉฐ, ๋์ ๊ทธ ํ์์ ๊ตฌํ์ฒด๋ค(List, Set, Queue ๋ฑ)์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
Collections: ๋ฐ๋ฉด์ java.util.Collections๋ ์ ํธ๋ฆฌํฐ ํด๋์ค์
๋๋ค. ์ด ํด๋์ค๋ ์ ์ ๋ฉ์๋๋ง์ ํฌํจํ๋ฉฐ, ์ด๋ค ๋ฉ์๋๋ ์ฃผ๋ก Collection ๊ฐ์ฒด๋ค์ ์กฐ์ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, Collections.sort(List) ๋ฉ์๋๋ ์ฃผ์ด์ง ๋ฆฌ์คํธ๋ฅผ ์ ๋ ฌํ๊ณ , Collections.binarySearch(List, Object) ๋ฉ์๋๋ ์ฃผ์ด์ง ๋ฆฌ์คํธ์์ ์ด์ง ํ์์ ์ํํ๋๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
๋ฐ๋ผ์, Collection์ ๋ค์ํ ์ข
๋ฅ์ ๋ฐ์ดํฐ ์งํฉ์ ๋ค๋ฃจ๋ ๊ธฐ๋ณธ ์ธํฐํ์ด์ค์ด๋ฉฐ, Collections๋ ์ด๋ฐ ๋ฐ์ดํฐ ์งํฉ๋ค์ ๋ค๋ฃจ๋ ๋ฐ ๋์์ด ๋๋ ์ ํธ๋ฆฌํฐ ๋ฉ์๋๋ค์ ์ ๊ณตํ๋ ํด๋์ค์
๋๋ค.
๐ Hash Map ๊ณผ Hash Table ์ ์ฐจ์ด์
HashMap๊ณผ Hashtable์ ๋ ๋ค Java์ ์ปฌ๋ ์
ํ๋ ์์ํฌ์ ์ผ๋ถ๋ก, ํค์ ๊ฐ์ ์์ผ๋ก ์ ์ฅํ๋ ๋งต ๊ตฌ์กฐ๋ฅผ ๋ํ๋
๋๋ค. ๊ทธ๋ฌ๋ ๋ ํด๋์ค ์ฌ์ด์๋ ๋ช ๊ฐ์ง ์ค์ํ ์ฐจ์ด์ ์ด ์์ต๋๋ค.
๋๊ธฐํ: Hashtable์ ๋๊ธฐํ๋์ด ์์ด์, ๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ์์ ์์ (thread-safe)ํ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ฐ๋ฉด์ HashMap์ ๋๊ธฐํ๋์ด ์์ง ์์ผ๋ฏ๋ก, ๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ์์ ์์ ํ์ง ์์ต๋๋ค. HashMap์ ๋๊ธฐํํ๋ ค๋ฉด Collections.synchronizedMap() ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
null ํ์ฉ: HashMap์ ํค ๋๋ ๊ฐ์ผ๋ก null์ ํ์ฉํฉ๋๋ค. ํ๋์ null ํค์ ์ฌ๋ฌ ๊ฐ์ null ๊ฐ์ด ํ์ฉ๋ฉ๋๋ค. ๋ฐ๋ฉด์ Hashtable์ ์ด๋ ํ ํํ์ null ๊ฐ๋ ํ์ฉํ์ง ์์ต๋๋ค. ํค ๋๋ ๊ฐ์ผ๋ก null์ ์ฌ์ฉํ๋ ค๊ณ ์๋ํ๋ฉด NullPointerException์ด ๋ฐ์ํฉ๋๋ค.
์ํ ์์: HashMap์ ์์๋ฅผ ๋ณด์ฅํ์ง ์์ต๋๋ค. ์ฆ, ์์๋ค์ ์ด๋ ํ ํน์ ์์๋ก ์ ์ฅ๋๊ฑฐ๋ ์ํ๋์ง ์์ต๋๋ค. ๋ฐ๋ฉด์ Hashtable๋ ๋ง์ฐฌ๊ฐ์ง๋ก ์์๋ฅผ ๋ณด์ฅํ์ง ์์ต๋๋ค.
ํจ์จ์ฑ: HashMap์ Hashtable๋ณด๋ค ๋ ํจ์จ์ ์ธ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ์ด๋ HashMap์ด ๋๊ธฐํ๋ฅผ ์ฌ์ฉํ์ง ์๊ธฐ ๋๋ฌธ์, ๋๊ธฐํ๋ก ์ธํ ์ค๋ฒํค๋๊ฐ ์๊ธฐ ๋๋ฌธ์
๋๋ค.
๋ง์ง๋ง์ผ๋ก, ์ด ๋ ํด๋์ค ๋ชจ๋ ํด์ ํ
์ด๋ธ์ ๊ธฐ๋ฐ์ ๋ ๋งต์
๋๋ค. ๊ทธ๋ฌ๋ Java 1.2๋ถํฐ HashMap์ด ๋์
๋๋ฉด์, Hashtable์ ๊ฑฐ์ ์ฌ์ฉ๋์ง ์๊ฒ ๋์์ต๋๋ค. ์ด๋ HashMap์ด ๋์ฑ ์ ์ฐํ๊ณ ํจ์จ์ ์ด๊ธฐ ๋๋ฌธ์
๋๋ค. ๋ฐ๋ผ์ ๋๊ธฐํ๊ฐ ํ์ํ์ง ์์ ๊ฒฝ์ฐ์๋ HashMap์, ํ์ํ ๊ฒฝ์ฐ์๋ Collections.synchronizedMap() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ HashMap์ ๋๊ธฐํํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ผ๋ก ์ข์ ์ ํ์
๋๋ค.
๐ List, Set, Map ์ ์ฐจ์ด์
๐ ๊ฐ๊ฐ ์ด๋ค ์ํฉ์์ HashMap ๊ณผ TreeMap ์ ์ ํํ๋์ ?
๐ HashMap ์ ๊ตฌํ์์น์ ๋ํด
๐ HashSet ์ ๊ตฌํ์์น์ ๋ํด
๐ ArrayList ์ LinkedList ์ ์ฐจ์ด์ ์ ๋ฌด์์ธ๊ฐ ?
๐ ArrayList ์ Vector ์ ์ฐจ์ด์ ์ ๋ํด์
๐ Queue ์์ pull() ๊ณผ remove() ์ ์ฐจ์ด์
๐ thread-safe ํ ์ปฌ๋ ์ ํด๋์ค๋ค์ ๋ฌด์์ด ์์๊น ?
Java์์๋ ์ฌ๋ฌ ์ฐ๋ ๋์ ์์ ํ(thread-safe) ์ปฌ๋ ์
์ ์ ๊ณตํ๊ณ ์์ต๋๋ค. ์ด๋ฌํ ์ปฌ๋ ์
๋ค์ ๋์์ฑ ์ปฌ๋ ์
(Concurrent Collection)์ด๋ผ๊ณ ๋ ๋ถ๋ฆ
๋๋ค. ์ด๋ฌํ ์ปฌ๋ ์
๋ค์ ๋๊ธฐํ๋ฅผ ํตํด ์ฌ๋ฌ ์ฐ๋ ๋์์ ๋์์ ์์ ํ๊ฒ ์ฌ์ฉ๋ ์ ์์ต๋๋ค. ๋ค์์ ๋ช ๊ฐ์ง ์ฃผ์ ๋์์ฑ ์ปฌ๋ ์
์
๋๋ค:
Vector: Vector๋ ArrayList์ ๋น์ทํ์ง๋ง, Vector์ ๋ชจ๋ ๋ฉ์๋๋ ๋๊ธฐํ๋์ด ์์ด ์ฐ๋ ๋์ ์์ ํฉ๋๋ค.
Hashtable: Hashtable์ HashMap๊ณผ ๋น์ทํ์ง๋ง, Hashtable์ ๋ชจ๋ ๋ฉ์๋๋ ๋๊ธฐํ๋์ด ์์ด ์ฐ๋ ๋์ ์์ ํฉ๋๋ค.
ConcurrentHashMap: ConcurrentHashMap์ HashMap๊ณผ ์ ์ฌํ์ง๋ง, ๋์์ฑ ํ๊ฒฝ์์ ์ฌ์ฉ๋ ์ ์๋๋ก ์ค๊ณ๋ ๋งต์
๋๋ค. ConcurrentHashMap์ ์ ์ฒด ๋งต์ ์ ๊ทธ๋ ๋์ ์น์
(์ผ๋ฐ์ ์ผ๋ก ๋งต์ ๋ถ๋ถ์ ์ธ ์์ญ)์ ์ ๊ทธ๋ ๋ฐฉ์์ ์ฌ์ฉํ์ฌ ๋์์ฑ์ ํฅ์์ํต๋๋ค.
CopyOnWriteArrayList: CopyOnWriteArrayList๋ ArrayList์ ๋์์ฑ ๋ฒ์ ์
๋๋ค. ์ด ํด๋์ค๋ ์ฐ๋ ๋์ ์์ ํ๋ฉฐ, ๋ชจ๋ ๋ณ๊ฒฝ ์ฌํญ(์ถ๊ฐ, ์ค์ , ์ ๊ฑฐ ๋ฑ)์ด ๋ฐ์ํ ๋๋ง๋ค ๋ฆฌ์คํธ์ ์๋ก์ด ์ฌ๋ณธ์ ๋ง๋ญ๋๋ค.
CopyOnWriteArraySet: CopyOnWriteArraySet์ Set ์ธํฐํ์ด์ค์ ๋์์ฑ ๊ตฌํ์ฒด์
๋๋ค. ์ด ํด๋์ค๋ ๋ด๋ถ์ ์ผ๋ก CopyOnWriteArrayList๋ฅผ ์ฌ์ฉํฉ๋๋ค.
BlockingQueue ์ธํฐํ์ด์ค์ ๊ทธ ๊ตฌํ์ฒด๋ค: BlockingQueue ์ธํฐํ์ด์ค๋ ์ฝ์
, ์ ๊ฑฐ, ๊ฒ์ฌ ์ฐ์ฐ์ ์ง์ํ๋ฉฐ, ํ๊ฐ ๋น์ด ์์ ๋ ์ ๊ฑฐ ์ฐ์ฐ์ ๊ธฐ๋ค๋ฆฌ๊ฑฐ๋ ํ๊ฐ ๊ฐ๋ ์ฐผ์ ๋ ์ฝ์
์ฐ์ฐ์ ๊ธฐ๋ค๋ฆฌ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ์ด ์ธํฐํ์ด์ค์ ์ผ๋ฐ์ ์ธ ๊ตฌํ์ฒด๋ก๋ ArrayBlockingQueue, LinkedBlockingQueue, PriorityBlockingQueue ๋ฑ์ด ์์ต๋๋ค.
์ด๋ฌํ ์ปฌ๋ ์
๋ค์ ๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ์์ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๊ฒ ์ฒ๋ฆฌํ ์ ์๊ฒ ํด์ค๋๋ค. ๊ทธ๋ฌ๋ ๋์์ฑ ์ปฌ๋ ์
์ ์ฌ์ฉํ ๋๋ ์ถ๊ฐ์ ์ธ ์ค๋ฒํค๋๊ฐ ๋ฐ์ํ ์ ์์ผ๋ฏ๋ก, ์ฌ์ฉ ์ํฉ์ ๋ฐ๋ผ ์ ์ ํ ์ปฌ๋ ์
์ ์ ํํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
๐ iterator ์ด๋ ?
Iterator๋ Java์ Collection ํ๋ ์์ํฌ์์ ์ ๊ณตํ๋ ์ธํฐํ์ด์ค๋ก, ์ปฌ๋ ์
์ ์ ์ฅ๋ ์์๋ค์ ์์ฐจ์ ์ผ๋ก ์ ๊ทผํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ฅผ ํตํด ๊ฐ๋ฐ์๋ ์ปฌ๋ ์
์ ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ๋ชฐ๋ผ๋ ๊ฐํธํ๊ฒ ์์๋ฅผ ํ์ํ ์ ์์ต๋๋ค.
Iterator๋ ์ฃผ๋ก next(), hasNext(), remove() ๋ฑ์ ๋ฉ์๋๋ฅผ ์ ๊ณตํฉ๋๋ค.
next(): ์ปฌ๋ ์
์์ ๋ค์ ์์๋ฅผ ๋ฐํํฉ๋๋ค. ๋ค์ ์์๊ฐ ์์ ๊ฒฝ์ฐ NoSuchElementException์ ๋ฐ์์ํต๋๋ค.
hasNext(): ์ปฌ๋ ์
์์ ์ฝ์ด์ฌ ๋ค์ ์์๊ฐ ๋ ์๋์ง ํ์ธํฉ๋๋ค. ๋ค์ ์์๊ฐ ์์ผ๋ฉด true๋ฅผ, ์์ผ๋ฉด false๋ฅผ ๋ฐํํฉ๋๋ค.
remove(): next()๋ฅผ ํตํด ์ต๊ทผ์ ๋ฐํ๋ ์์๋ฅผ ์ปฌ๋ ์
์์ ์ ๊ฑฐํฉ๋๋ค. next() ํธ์ถ ์์ด remove()๋ฅผ ํธ์ถํ๋ฉด IllegalStateException์ด ๋ฐ์ํฉ๋๋ค.
๋ค์์ Iterator ์ฌ์ฉ์ ๊ธฐ๋ณธ์ ์ธ ์์ ์
๋๋ค:
List<String> list = new ArrayList<>();
list.add("One");
list.add("Two");
list.add("Three");
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String element = iterator.next();
System.out.println(element);
}
๐ iterator ์ ์ฌ์ฉ ๋ชฉ์ ์ ๋ฌด์์ธ๊ฐ์ ?
๐ iterator ์ listlterator ์ ์ฐจ์ด๋ ?
๐ ๋ณ๋ ฌ๊ณผ ๋์์ฑ์ ์ฐจ์ด์ ์ ๋ํด
"๋ณ๋ ฌ์ฒ๋ฆฌ"์ "๋์์ฑ"์ ์ข
์ข
ํผ์ฉ๋๋ ์ฉ์ด์ด์ง๋ง, ๊ทธ๋ค์ด ์ง์นญํ๋ ๊ฐ๋
์ ์ฌ์ค์ ๋ค๋ฆ
๋๋ค.
๋์์ฑ(Concurrency): ๋์์ฑ์ ์ฌ๋ฌ ์์
์ด ๋์์ ์คํ๋๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๊ฒ ํ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ์ด๋ ์ฑ๊ธ ์ฝ์ด ์์คํ
์์๋ ๊ฐ๋ฅํ๋ฉฐ, ์ค์ ๋ก๋ ์ปดํจํฐ๊ฐ ๋งค์ฐ ๋น ๋ฅด๊ฒ ์์
๊ฐ์ ์ ํํ๋ฉด์ ๋ง์น ๋์์ ์ฒ๋ฆฌ๋๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๊ฒ ํฉ๋๋ค. ์ด๋ ๊ฒ ํจ์ผ๋ก์จ ๋ค์์ ์์
์ด ๋์์ ์คํ๋๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๊ฒ ๋ง๋ค ์ ์์ต๋๋ค. ์ด๋ ํนํ I/O ์์
์ ์ํํ๊ฑฐ๋ ๋ค์์ ์์
์ ๋์์ ์ฒ๋ฆฌํด์ผ ํ ๋ ์ ์ฉํฉ๋๋ค.
๋ณ๋ ฌ์ฒ๋ฆฌ(Parallelism): ๋ณ๋ ฌ์ฒ๋ฆฌ๋ ์ฌ๋ฌ ์์
์ด ๋์์ ์ค์ ๋ก ์คํ๋๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ์ด๋ฅผ ์ํด์ ๋ฉํฐ์ฝ์ด๋ ๋ฉํฐํ๋ก์ธ์ ์์คํ
์ด ํ์ํฉ๋๋ค. ๋ณ๋ ฌ์ฒ๋ฆฌ๋ CPU ์ง์ฝ์ ์ธ ์์
์ ์ํํ ๋ ๋งค์ฐ ์ ์ฉํ๋ฉฐ, ์ด๋ฅผ ํตํด ์์
์ ๋ถํ ํ๊ณ ์ฌ๋ฌ ์ฝ์ด์์ ๋์์ ์คํํ์ฌ ์ ์ฒด ์์
์๊ฐ์ ์ค์ผ ์ ์์ต๋๋ค.
๊ฐ๋จํ ๋งํด์, ๋์์ฑ์ ์ฌ๋ฌ ์์
์ ๋์์ ๊ด๋ฆฌํ๋ ๋ฅ๋ ฅ์ด๊ณ , ๋ณ๋ ฌ์ฒ๋ฆฌ๋ ์ฌ๋ฌ ์์
์ ๋์์ ์คํํ๋ ๋ฅ๋ ฅ์
๋๋ค. ๋ฐ๋ผ์ ๋ณ๋ ฌ์ฒ๋ฆฌ ์์คํ
์ ํญ์ ๋์์ฑ์ ํฌํจํ์ง๋ง, ๋์์ฑ ์์คํ
์ด ๋ณ๋ ฌ๋ก ์คํ๋ ํ์๋ ์์ต๋๋ค.
๐ ์ค๋ ๋์ ํ๋ก์ธ์ค์ ์ฐจ์ด์ ์ ๋ํด
ํ๋ก์ธ์ค์ ์ค๋ ๋๋ ๋์์ฑ ์คํ์ ๊ฐ๋ฅํ๊ฒ ํ๋ ์ปดํจํ
์ ํต์ฌ์ ์ธ ๊ฐ๋
๋ค์
๋๋ค. ๋ ๊ฐ๋
์ ์ฃผ์ ์ฐจ์ด๋ ๊ทธ๋ค์ ๋
๋ฆฝ์ฑ, ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ, ๊ทธ๋ฆฌ๊ณ ํต์ ๋ฐฉ์์ ์์ต๋๋ค.
ํ๋ก์ธ์ค(Process):
ํ๋ก์ธ์ค๋ ์คํ ์ค์ธ ํ๋ก๊ทธ๋จ์ ์ธ์คํด์ค๋ฅผ ์๋ฏธํฉ๋๋ค. ๊ฐ ํ๋ก์ธ์ค๋ ๋
๋ฆฝ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ, ๋ฐ์ดํฐ, ๋ช
๋ น์ด ๋ฑ์ ๊ฐ์ง๋ฉฐ, ๋ค๋ฅธ ํ๋ก์ธ์ค์ ์ ๋ณด๋ฅผ ๊ณต์ ํ์ง ์์ต๋๋ค. ํ๋ก์ธ์ค ๊ฐ ํต์ ์ Inter-Process Communication (IPC) ๋ฉ์ปค๋์ฆ์ ํตํด ์ด๋ฃจ์ด์ง๋๋ค. ํ๋ก์ธ์ค๋ ํ๋ ์ด์์ ์ค๋ ๋๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค.
์ค๋ ๋(Thread):
์ค๋ ๋๋ ํ๋ก์ธ์ค ๋ด์์ ์คํ๋๋ ๊ฐ์ฅ ์์ ์คํ ๋จ์์
๋๋ค. ๋ชจ๋ ์ค๋ ๋๋ ํด๋น ํ๋ก์ธ์ค์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ๊ณผ ์์์ ๊ณต์ ํ๋ฉฐ, ๊ฐ ์ค๋ ๋๋ ๊ณ ์ ํ ํ๋ก๊ทธ๋จ ์นด์ดํฐ, ๋ ์ง์คํฐ ์งํฉ, ๊ทธ๋ฆฌ๊ณ ์คํ ๊ณต๊ฐ์ ๊ฐ์ง๋๋ค. ์ค๋ ๋ ๊ฐ ํต์ ์ ์ฃผ๋ก ๊ณต์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํตํด ์ด๋ฃจ์ด์ง๋ฉฐ, ๋ฐ๋ผ์ ๋๊ธฐํ์ ์ฃผ์๋ฅผ ๊ธฐ์ธ์ฌ์ผ ํฉ๋๋ค.
๋ฐ๋ผ์, ํ๋ก์ธ์ค๋ ์ด์์ฒด์ ์ ์ํด ์ค์ผ์ค๋ง๋๊ณ ๊ด๋ฆฌ๋๋ ๋
๋ฆฝ์ ์ธ ๋จ์์ด๊ณ , ์ค๋ ๋๋ ํ๋ก์ธ์ค ๋ด์์ ์คํ๋๋ ๊ฒฝ๋ํ๋ ์คํ ๋จ์๋ก, ์์์ ๊ณต์ ํ๋ฉด์ ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
๐ ๋ฐ๋ชฌ ์ค๋ ๋๋ ๋ฌด์์ธ๊ฐ
๋ฐ๋ชฌ ์ค๋ ๋(Daemon Thread)๋ Java ๋๋ ๋ค๋ฅธ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์ ์ฃผ๋ก ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์คํ๋๋ ์ค๋ ๋๋ฅผ ๋งํฉ๋๋ค. ์ด ์ค๋ ๋๋ค์ ์ผ๋ฐ์ ์ผ๋ก ์ผ๋ถ ์ฃผ์ ์์
์ ์ง์ํ๊ฑฐ๋ ์์คํ
์๋น์ค๋ฅผ ์ ๊ณตํ๋๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
๋ฐ๋ชฌ ์ค๋ ๋์ ์ฃผ์ ํน์ง ์ค ํ๋๋ ํ๋ก๊ทธ๋จ์ด ์ข
๋ฃ๋ ๋ ์๋์ผ๋ก ์ข
๋ฃ๋๋ค๋ ๊ฒ์
๋๋ค. ์ฆ, ํ๋ก๊ทธ๋จ์ ๋ฉ์ธ ์ค๋ ๋๊ฐ ์ข
๋ฃ๋๋ฉด JVM(Java Virtual Machine)์ ๋ฐ๋ชฌ ์ค๋ ๋๊ฐ ์์ง ์๋ฃ๋์ง ์์๋๋ผ๋ ์ด๋ฅผ ์ค๋จ์ํต๋๋ค. ์ด๊ฒ์ ํ๋ก๊ทธ๋จ์ด ์ข
๋ฃ๋ ๋ ํ์ ์๋ ๋ฐฑ๊ทธ๋ผ์ด๋ ์์
์ ์ฒญ์ํ๋๋ฐ ์ ์ฉํฉ๋๋ค.
๋ฐ๋ชฌ ์ค๋ ๋๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ ์ค๋ ๋๋ฅผ ์์ฑํ ํ, setDaemon(true)๋ฅผ ํธ์ถํ์ฌ ๋ฐ๋ชฌ ์ค๋ ๋๋ก ์ค์ ํ๋ ๊ฒ์
๋๋ค. ์ด ์์
์ ์ค๋ ๋๊ฐ ์์๋๊ธฐ ์ ์ ์ํ๋์ด์ผ ํฉ๋๋ค. ๋ฐ๋ชฌ ์ค๋ ๋๋ ๋ณดํต ๋ฌดํ ๋ฃจํ ๋ด์์ ์คํ๋๋ฉฐ, ํ์ํ ์์
์ ๋ฐ๋ณต์ ์ผ๋ก ์ํํ๊ฑฐ๋ ํน์ ์กฐ๊ฑด์ด ์ถฉ์กฑ๋ ๋๊น์ง ๋๊ธฐํฉ๋๋ค.
ํ์ง๋ง ์ฃผ์ํ ์ ์ ๋ฐ๋ชฌ ์ค๋ ๋๊ฐ ์ค์ํ ์์
์ ์ํํ๊ณ ์์ ๋ ํ๋ก๊ทธ๋จ์ด ์ข
๋ฃ๋๋ฉด, ๊ทธ ์์
์ด ๊ฐ์๊ธฐ ์ค๋จ๋ ์ ์๋ค๋ ๊ฒ์
๋๋ค. ๋ฐ๋ผ์ ๋ฐ๋ชฌ ์ค๋ ๋์์๋ ์ค์ํ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ฑฐ๋ ๋ฆฌ์์ค๋ฅผ ์ ๋ฆฌํ๋ ๋ฑ์ ์์
์ ์ํํ์ง ์๋ ๊ฒ์ด ์ข์ต๋๋ค.
๐ v์ค๋ ๋๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ ๋์ด
๐ runnable ๊ณผ callable ์ ์ฐจ์ด๋ ๋ฌด์์ธ๊ฐ ?
๐ sleep() ๊ณผ wait() ์ ์ฐจ์ด๋ ๋ฌด์์ธ๊ฐ ?
๐ thread run() ๊ณผ thread start() ์ ์ฐจ์ด๋ ๋ฌด์์ธ๊ฐ์ ?
๐ ์ค๋ ๋ ํ์ ์ํ์ ๋ํด
๐ ์ค๋ ํธ ํ์์ submit() ๊ณผ execute() ์ ์ฐจ์ด
๐ ์๋ฐ ํ๋ก๊ทธ๋จ์์ ๋ฉํฐ ์ค๋ ๋ ์์ ์ ์์ ์ฑ์ ์ด๋ป๊ฒ ๋ณด์ฅํ ์ ์์๊น ?
๐ reflection ์ด๋ ๋ฌด์์ธ๊ฐ ?
๐ ์๋ฐ ์ง๋ ฌํ๋ ๋ฌด์์ธ๊ฐ ? ์ด๋ค ์ํฉ์์ ํ์ํ๊ฐ ?
๐ ๋์ ํ๋ก์๋ ๋ฌด์์ธ๊ฐ ?
๐ ๋์ ํ๋ก์๋ ์ด๋ป๊ฒ ์ฌ์ฉํ๋ ?
๐ Object Copy ๋ณต์ฌ๊ฐ ๋๋ ์ด์ ๋ ์ด๋ป๊ฒ ํ ์ ์๋ ?
๐ Object Copy ๊ฐ์ฒด ๋ณต์ฌ๋ ์ด๋ป๊ฒ ํ ์ ์๋ ?
๐ Object Copy ์ ๊น์ ๋ณต์ฌ์ ์์ ๋ณต์ฌ์ ์ฐจ์ด์ ๋ํด
๐ jsp ์ servlet ์ ์ฐจ์ด์ ๋ํด
๐ jsp ๋ฅผ ๊ธฐ๋ณธ ์ ๊ณตํ๋ ๊ฐ์ฒด๋ ๋ฌด์์ธ๊ฐ
๐ 4๊ฐ์ jsp score ์๋ ๋ฌด์์ด ์๋ ?
๐ ์ธ์ ๊ณผ์ ์ ์ค๋ช
์ธ์
์ ์ฌ์ฉ์๊ฐ ์น ์ฌ์ดํธ๋ฅผ ๋ฐฉ๋ฌธํ ๋๋ถํฐ ๋ธ๋ผ์ฐ์ ๋ฅผ ๋ซ๊ฑฐ๋ ๋ก๊ทธ์์ํ ๋๊น์ง ์ฌ์ฉ์์ ์ํ๋ฅผ ์ถ์ ํ๋ ๋ฐฉ๋ฒ์
๋๋ค. ์ธ์
์ ์๋ฒ ์ธก์์ ์์ฑ๋๊ณ ๊ด๋ฆฌ๋ฉ๋๋ค. ์ฌ๊ธฐ์๋ ๋ก๊ทธ์ธ ์ ๋ณด, ์ฌ์ฉ์๊ฐ ์ฅ๋ฐ๊ตฌ๋์ ์ถ๊ฐํ ํญ๋ชฉ ๋ฑ์ ์ ๋ณด๊ฐ ํฌํจ๋ ์ ์์ต๋๋ค. ์ธ์
์ ํด๋ผ์ด์ธํธ์ ๋ํ ์ ๋ํฌํ ์๋ณ์, ์ฆ ์ธ์
ID๋ฅผ ์์ฑํ๊ณ ์ด๋ฅผ ์ฌ์ฉํ์ฌ ํน์ ํด๋ผ์ด์ธํธ์ ์ ๋ณด๋ฅผ ์ ์ฅํ๊ณ ๊ฒ์ํฉ๋๋ค.
์ธ์
์ ์ผ๋ฐ์ ์ธ ํ๋ฆ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ธ์
์์ฑ: ์ฌ์ฉ์๊ฐ ์น ์ฌ์ดํธ์ ์ฒ์ ์ ์ํ๋ฉด, ์๋ฒ๋ ์ฌ์ฉ์์๊ฒ ๊ณ ์ ํ ์ธ์
ID๋ฅผ ์์ฑํฉ๋๋ค. ์ด ์ธ์
ID๋ ์๋ฒ ๋ด์ ์ธ์
์ ์ฅ์์ ์ฐ๊ฒฐ๋์ด, ๊ทธ ์ธ์
์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ์กฐํํ ์ ์๊ฒ ํฉ๋๋ค.
์ธ์
ID ์ ๋ฌ: ์์ฑ๋ ์ธ์
ID๋ ํด๋ผ์ด์ธํธ์๊ฒ ์ ๋ฌ๋์ด, ํด๋ผ์ด์ธํธ์ ๋ธ๋ผ์ฐ์ ๋ ์ด๋ฅผ ์ฟ ํค๋ URL ๋งค๊ฐ๋ณ์ ๋ฑ์ ํตํด ์ ์ฅํฉ๋๋ค. ์ดํ ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์ ์์ฒญ์ ๋ณด๋ผ ๋๋ง๋ค ์ด ์ธ์
ID๋ฅผ ํจ๊ป ์ ์กํฉ๋๋ค.
์ธ์
๋ฐ์ดํฐ ํ์ฉ: ์๋ฒ๋ ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ๋ฐ์ ์ธ์
ID๋ฅผ ์ด์ฉํด ์ธ์
์ ์ฅ์์์ ํด๋น ์ธ์
์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๊ณ ํ์ฉํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธํ๋ฉด ์ฌ์ฉ์์ ์์ด๋๋ ๊ถํ ์ ๋ณด๋ฅผ ์ธ์
๋ฐ์ดํฐ์ ์ ์ฅํ๊ณ , ์ดํ ์ฌ์ฉ์์ ์์ฒญ์ด ๋ค์ด์ฌ ๋๋ง๋ค ์ด ์ ๋ณด๋ฅผ ์ด์ฉํด ์ธ์ฆ ๋ฐ ์ธ๊ฐ ์์
์ ์ํํ ์ ์์ต๋๋ค.
์ธ์
์ข
๋ฃ: ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์์ํ๊ฑฐ๋ ์ผ์ ์๊ฐ๋์ ํ๋์ด ์๋ ๊ฒฝ์ฐ(์ธ์
ํ์์์), ์ธ์
์ ์ข
๋ฃ๋๊ณ ์ธ์
์ ์ฅ์์์ ํด๋น ์ธ์
์ ๋ฐ์ดํฐ๋ ์ญ์ ๋ฉ๋๋ค.
์ธ์
์ ์ฌ์ฉ์ ๋ณ๋ก ๊ฐ๋ณ์ ์ผ๋ก ์์ฑ๋๋ฏ๋ก, ์ฌ๋ฌ ์ฌ์ฉ์๊ฐ ๋์์ ์๋น์ค๋ฅผ ์ด์ฉํ๋๋ผ๋ ์ฌ์ฉ์ ๊ฐ์ ๋ฐ์ดํฐ๊ฐ ํผ์ ์ด ์ผ์ด๋์ง ์์ต๋๋ค. ํ์ง๋ง ์ธ์
์ ๋ณด๋ ์๋ฒ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋๋ฏ๋ก, ๊ณผ๋ํ๊ฒ ๋ง์ ์ธ์
์ ์๋ฒ์ ๋ถํ๋ฅผ ์ด๋ํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ์ ์ ํ ์ธ์
๊ด๋ฆฌ ์ ๋ต์ด ํ์ํฉ๋๋ค.
๐ ์ฟ ํค๋ฅผ ์ฌ์ฉํ ์ ์์ ๋ ์ธ์ ์ ๋์ ์ฌ์ฉํ ์ ์์๊น ?
๋ค, ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ธ์
๊ณผ ์ฟ ํค๋ ์น ์๋ฒ์ ์น ๋ธ๋ผ์ฐ์ ์ฌ์ด์์ ์ํ๋ฅผ ์ ์งํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ๋ฐฉ๋ฒ์
๋๋ค. HTTP๋ ์์ฒด์ ์ผ๋ก ์ํ๋ฅผ ์ ์งํ์ง ์๋(stateless) ํ๋กํ ์ฝ์ด๋ฏ๋ก, ์ด๋ฅผ ๋ณด์ํ๊ธฐ ์ํด ์ธ์
๊ณผ ์ฟ ํค๊ฐ ์ฌ์ฉ๋ฉ๋๋ค.
์ฟ ํค๋ ํด๋ผ์ด์ธํธ(์ฆ, ์น ๋ธ๋ผ์ฐ์ ) ์ธก์ ์ ๋ณด๋ฅผ ์ ์ฅํ๊ณ , ์ด ์ ๋ณด๋ ์๋ฒ์ ์์ฒญ์ ๋ณด๋ผ ๋๋ง๋ค ์๋ฒ๋ก ์ ์ก๋ฉ๋๋ค. ์ฟ ํค๋ ์ฌ์ฉ์๊ฐ ์ฌ์ดํธ๋ฅผ ์ฌ์ฉํ๋ ๋์์ ํ์ํ ์ ๋ณด(๋ก๊ทธ์ธ ์ํ, ์ฅ๋ฐ๊ตฌ๋ ํญ๋ชฉ ๋ฑ)๋ฅผ ์ ์ฅํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ์ฟ ํค๊ฐ ํด๋ผ์ด์ธํธ ์ธก์ ์ ์ฅ๋๊ธฐ ๋๋ฌธ์ ๋ณด์์์ ๋ฌธ์ ๊ฐ ์๊ธธ ์ ์๊ณ , ์ผ๋ถ ์ฌ์ฉ์๋ ์ฟ ํค๋ฅผ ๋นํ์ฑํํ๊ฑฐ๋ ์ ํํ ์ ์์ต๋๋ค.
์ด๋ด ๋ ์ธ์
์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ธ์
์ ๋ณด๋ ์๋ฒ ์ธก์ ์ ์ฅ๋๋ฉฐ, ํด๋ผ์ด์ธํธ๋ ์ธ์
ID๋ง์ ๊ฐ๊ณ ์์ต๋๋ค. ์ด ์ธ์
ID๋ ์์ฒญ์ ๋ณด๋ผ ๋๋ง๋ค ์๋ฒ๋ก ์ ์ก๋์ด ํด๋น ์ธ์
์ ์๋ณํ๊ฒ ๋ฉ๋๋ค. ์ธ์
์ ์๋ฒ ์ธก์ ์ ์ฅ๋๊ธฐ ๋๋ฌธ์ ์๋์ ์ผ๋ก ๋ณด์์ฑ์ด ๋์ง๋ง, ๋๋ฌด ๋ง์ ์ธ์
์ ๋ณด๊ฐ ์๋ฒ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฐจ์งํ ์ ์์ผ๋ฏ๋ก ๊ด๋ฆฌ์ ์ฃผ์ํด์ผ ํฉ๋๋ค.
๋ฐ๋ผ์ ์ฟ ํค๋ฅผ ์ฌ์ฉํ ์ ์๋ ์ํฉ์์๋ ์ธ์
์ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์์ ์ํ๋ฅผ ์ ์งํ๊ณ ์๋ณํ๋ ๊ฒ์ด ๊ฐ๋ฅํฉ๋๋ค.
๐ ์คํ๋ง MVC ์ struts ์ ์ฐจ์ด๋ ๋ฌด์์ธ๊ฐ ?
Struts์ Spring MVC๋ ๋ชจ๋ Java ๊ธฐ๋ฐ ์น ์ ํ๋ฆฌ์ผ์ด์
๊ฐ๋ฐ์ ์ํ ํ๋ ์์ํฌ์
๋๋ค. ๊ทธ๋ฌ๋ ๊ตฌ์กฐ, ์ค๊ณ, ๊ธฐ๋ฅ ๋ฑ์ ์์ด ๋ช ๊ฐ์ง ์ฐจ์ด์ ์ด ์์ต๋๋ค:
์ค๊ณ์ ๊ตฌ์กฐ:
Struts๋ ์ก์
๊ธฐ๋ฐ MVC(Model-View-Controller) ํจํด์ ๋ฐ๋ฅด๋ ์น ํ๋ ์์ํฌ์
๋๋ค. Struts๋ ์น ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ ๋ผ์ฐํ
ํ๊ธฐ ์ํด '์ก์
'๊ณผ '์ก์
๋งตํ'์ ์ฌ์ฉํฉ๋๋ค. ์ด๋ ์ฃผ๋ก ๊ณ ์ ๋ ํ์ด์ง ํ๋ฆ์ ๊ฐ์ง, ์น ์ ํ๋ฆฌ์ผ์ด์
์ ์ ํฉํฉ๋๋ค.
๋ฐ๋ฉด์ Spring MVC๋ ๋ ์ ์ฐํ ์ ๊ทผ ๋ฐฉ์์ ์ ๊ณตํ๋ ํ๋ก ํธ ์ปจํธ๋กค๋ฌ ํจํด์ ์ฌ์ฉํฉ๋๋ค. Spring MVC๋ ๊ฐ๋ ฅํ ๋์คํจ์ฒ ์๋ธ๋ฆฟ์ด ์น ์์ฒญ์ ์ ์ ํ ์ปจํธ๋กค๋ฌ์ ๋ผ์ฐํ
ํฉ๋๋ค. ์ด๋ ๋์ ํ์ด์ง ํ๋ฆ์ ๊ฐ์ง ์น ์ ํ๋ฆฌ์ผ์ด์
์ ์ ํฉํฉ๋๋ค.
ํตํฉ:
Struts๋ ์ผ๋ฐ์ ์ผ๋ก ์น ๊ณ์ธต์ ์ด์ ์ ๋ง์ถ ์น ํ๋ ์์ํฌ๋ก, ๋ค๋ฅธ ๊ธฐ์ ๊ณผ์ ํตํฉ์ ๊ฐ๋ฐ์์ ์ฑ
์์
๋๋ค.
Spring MVC๋ Spring Framework์ ์ผ๋ถ๋ก, ๋ฐ์ดํฐ ์์ธ์ค, ํธ๋์ญ์
๊ด๋ฆฌ, ์ค์ , ๋ณด์ ๋ฑ๊ณผ ๊ฐ์ ๋ง์ ๊ธฐ๋ฅ๋ค์ ํตํฉํ๊ณ ์ง์ํฉ๋๋ค.
์ ์ง ๊ด๋ฆฌ์ ์ง์:
Struts๋ ์ด์ ์ ๋ง์ด ์ฌ์ฉ๋์์ง๋ง, 2017๋
์ ๋ฐ์ํ ์ฌ๊ฐํ ๋ณด์ ์ด์ ์ดํ๋ก ์ฌ์ฉ์ด ๊ฐ์ํ์ต๋๋ค. Struts 2๋ ์์ง๋ ์ง์๋์ง๋ง, ๊ทธ ํ๋์ ์๋นํ ์ค์ด๋ค์์ต๋๋ค.
Spring MVC๋ Spring ์ปค๋ฎค๋ํฐ์ ๊ฐ๋ ฅํ ์ง์์ ๋ฐ๊ณ ์์ผ๋ฉฐ ์ง์์ ์ผ๋ก ์
๋ฐ์ดํธ์ ๊ฐ์ ์ด ์ด๋ฃจ์ด์ง๊ณ ์์ต๋๋ค. ๋ํ Spring Boot์ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ด์ฉํด ์ด๊ธฐ ์ค์ ๊ณผ์ ์ด ๊ฐ์ํ๋์์ต๋๋ค.
ํ
์คํธ ์ฉ์ด์ฑ:
Spring MVC๋ ์์กด์ฑ ์ฃผ์
(DI)๋ฅผ ์ด์ฉํด ์ ๋ ํ
์คํธ์ ํตํฉ ํ
์คํธ๋ฅผ ์ฝ๊ฒ ์์ฑํ ์ ์์ต๋๋ค.
Struts์์์ ํ
์คํธ ์์ฑ์ Spring MVC๋ณด๋ค ์๋์ ์ผ๋ก ๋ณต์กํ ์ ์์ต๋๋ค.
๋ฐ๋ผ์ ์ ํ์ ํ๋ก์ ํธ์ ์๊ตฌ์ฌํญ, ํ์ ๊ธฐ์ ์ ๋ฅ๋ ฅ, ํ์ํ ๊ธฐ๋ฅ ๋ฑ ์ฌ๋ฌ ์์ธ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง ์ ์์ต๋๋ค.
๐ SQL Injection ์ ํผํ ์ ์๋ ๋ฐฉ๋ฒ์
SQL Injection์ ๊ณต๊ฒฉ์๊ฐ ์
์์ ์ธ SQL ์ฝ๋๋ฅผ ์น ์ดํ๋ฆฌ์ผ์ด์
์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฃผ์
ํ๋ ๊ณต๊ฒฉ์
๋๋ค. ์ด๋ฐ ๊ณต๊ฒฉ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ดํฐ๋ฅผ ๋ณผ ์ ์๊ฒ ํ๊ฑฐ๋, ๋ณ๊ฒฝํ๊ฑฐ๋, ์ฌ์ง์ด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ด๋ฅผ ์์ ํ ์๊ฒ ๋ง๋ค ์ ์์ต๋๋ค. ๋ค์์ SQL Injection ๊ณต๊ฒฉ์ ํผํ๋ ๋ช ๊ฐ์ง ๋ฐฉ๋ฒ์
๋๋ค:
Prepared Statements (Parameterized Queries) ์ฌ์ฉ: Prepared Statements๋ SQL ์ฟผ๋ฆฌ์์ ํน์ ๊ฐ์ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌํ์ฌ ์ฌ์ฉํ ์ ์๊ฒ ํ๋ ๊ธฐ๋ฅ์
๋๋ค. ์ด ๊ธฐ๋ฅ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฟผ๋ฆฌ๋ฅผ ์ ์กํ๊ธฐ ์ ์ ๋ชจ๋ ํ๋ผ๋ฏธํฐ์ ๊ฐ์ ์ ์ ํ๊ฒ ์ด์ค์ผ์ดํ ํ๊ธฐ ๋๋ฌธ์ SQL Injection ๊ณต๊ฒฉ์ ๋ฐฉ์งํ๋ ๋ฐ ๋งค์ฐ ํจ๊ณผ์ ์
๋๋ค.
Stored Procedures ์ฌ์ฉ: Stored Procedures๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ง์ ์คํ๋๋ ์ฝ๋ ๋ธ๋ก์
๋๋ค. ์ด ๋ฐฉ์๋ Prepared Statements์ ์ ์ฌํ๊ฒ SQL Injection์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
์
๋ ฅ๊ฐ ๊ฒ์ฆ: ์ฌ์ฉ์๋ก๋ถํฐ ๋ฐ๋ ๋ชจ๋ ์
๋ ฅ์ ์ ์ ํ ํ์๊ณผ ๊ธธ์ด๋ฅผ ๊ฐ์ง๊ณ ์๋์ง ๋ฐ๋์ ๊ฒ์ฆํด์ผ ํฉ๋๋ค. ๊ฒ์ฆ์ ํตํด ๋ถํ์ํ ๋๋ ์
์์ ์ธ ๊ฐ์ ๊ฑธ๋ฌ๋ผ ์ ์์ต๋๋ค.
์ต์ ๊ถํ์ ์์น: ์ ํ๋ฆฌ์ผ์ด์
์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ณ์ ์ ํ์ํ ์ต์ํ์ ๊ถํ๋ง์ ๊ฐ์ ธ์ผ ํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด, ๋ง์ฝ ๊ณต๊ฒฉ์ด ์ฑ๊ณตํ๋๋ผ๋ ๊ณต๊ฒฉ์๊ฐ ํ ์ ์๋ ํผํด๋ฅผ ์ต์ํํ ์ ์์ต๋๋ค.
์๋ฌ ๋ฉ์์ง ๊ด๋ฆฌ: ์์ธํ ์๋ฌ ๋ฉ์์ง๋ ๊ณต๊ฒฉ์์๊ฒ ๊ณต๊ฒฉ์ ๋ ์ฝ๊ฒ ์ํํ ์ ์๋ ์ ๋ณด๋ฅผ ์ ๊ณตํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, "table 'users' does not exist"์ ๊ฐ์ ์๋ฌ ๋ฉ์์ง๋ ๊ณต๊ฒฉ์์๊ฒ 'users'๋ผ๋ ํ
์ด๋ธ์ด ์กด์ฌํ์ง ์์์ ์๋ ค์ฃผ๋ฏ๋ก ๊ณต๊ฒฉ์ ๋์์ ์ค ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ์๋ฌ ๋ฉ์์ง๋ ์ฌ์ฉ์์๊ฒ ๋ณด์ฌ์ฃผ์ง ์๊ฑฐ๋ ์ต๋ํ ์ถ์ํ๋ ์ ๋ณด๋ง์ ์ ๊ณตํด์ผ ํฉ๋๋ค.
์น ์ดํ๋ฆฌ์ผ์ด์
๋ฐฉํ๋ฒฝ (WAF) ์ฌ์ฉ: WAF๋ ์
์์ ์ธ ์น ํธ๋ํฝ์ ๊ฐ์งํ๊ณ ์ฐจ๋จํ๋ ๋ณด์ ๋ ์ด์ด์
๋๋ค. WAF๋ ์ผ๋ฐ์ ์ผ๋ก ์๋ ค์ง SQL Injection ํจํด์ ๊ฐ์งํ๊ณ ์ฐจ๋จํ์ฌ ์ด๋ฐ ์ข
๋ฅ์ ๊ณต๊ฒฉ์ ๋ฐฉ์งํ๋ ๋ฐ ๋์์ ์ค๋๋ค.
์ด์ ๊ฐ์ ๋ฐฉ๋ฒ๋ค์ ์ฌ์ฉํ์ฌ SQL Injection ๊ณต๊ฒฉ์ ๋ฐฉ์ดํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ํญ์ ๊ฐ์ฅ ์ต์ ์ ๋ณด์ ์ฐ๊ตฌ์ ์ต์ ์ ๋ณด์ ๊ดํ์ ๋ฐ๋ฅด๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
๐ XSS ๊ณต๊ฒฉ์ด ๋ฌด์์ด๊ณ , ํผํ ์ ์๋ ๋ฐฉ๋ฒ์
XSS(Cross-Site Scripting) ๊ณต๊ฒฉ์ ์น์ฌ์ดํธ์ ์
์์ ์ธ ์คํฌ๋ฆฝํธ๋ฅผ ์ฝ์
ํ๋ ๊ณต๊ฒฉ ๋ฐฉ๋ฒ์
๋๋ค. ์ฌ์ฉ์์ ์น ๋ธ๋ผ์ฐ์ ์์ ์คํ๋๋ ์ด ์คํฌ๋ฆฝํธ๋ ์ฌ์ฉ์์ ๋ฐ์ดํฐ๋ฅผ ํ์ทจํ๊ฑฐ๋ ์ฌ์ฉ์๋ฅผ ๋ค๋ฅธ ์นํ์ด์ง๋ก ๋ฆฌ๋ค์ด๋ ํธํ๊ฑฐ๋ ์น์ฌ์ดํธ์ ๋์์ ๋ณ์กฐํ๋ ๋ฑ์ ํ์๋ฅผ ํ ์ ์์ต๋๋ค.
XSS ๊ณต๊ฒฉ์ ํฌ๊ฒ ์ธ ๊ฐ์ง ์ข
๋ฅ๋ก ๋ถ๋ฅ๋ฉ๋๋ค: Stored XSS, Reflected XSS, ๊ทธ๋ฆฌ๊ณ DOM-based XSS. Stored XSS๋ ์ฌ์ฉ์ ์
๋ ฅ๊ฐ์ด ๊ฒ์ฆ ์์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋๊ณ , ์ดํ์ ๊ทธ ๊ฐ์ ์ถ๋ ฅํ ๋ ์คํฌ๋ฆฝํธ๊ฐ ์คํ๋๋ ํํ์
๋๋ค. Reflected XSS๋ URL์ ํฌํจ๋ ์
์์ ์ธ ์คํฌ๋ฆฝํธ๊ฐ ์น์ฌ์ดํธ์ ๋ฐ์๋์ด ์คํ๋๋ ํํ์
๋๋ค. DOM-based XSS๋ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ด์ฉํด DOM์ ๊ตฌ์กฐ๋ ๋ด์ฉ์ ๋ณ๊ฒฝํ๋ฉด์ ๋ฐ์ํ๋ XSS ๊ณต๊ฒฉ์
๋๋ค.
XSS๋ฅผ ํผํ๋ ๋ฐฉ๋ฒ:
์ฌ์ฉ์ ์
๋ ฅ๊ฐ ๊ฒ์ฆ ๋ฐ ์ด์ค์ผ์ดํ: ์ฌ์ฉ์๋ก๋ถํฐ ์
๋ ฅ ๋ฐ๋ ๋ชจ๋ ๋ฐ์ดํฐ๋ ์น์ฌ์ดํธ์์ ๊ทธ๋๋ก ์ถ๋ ฅ๋๊ธฐ ์ ์ ๋ฐ๋์ ์ด์ค์ผ์ดํ(ํน์ ๋ฌธ์๋ฅผ ์์ ํ ํํ๋ก ๋ณํ)๋์ด์ผ ํฉ๋๋ค. ๋ํ ๊ฐ๋ฅํ ๊ฒฝ์ฐ ์ฌ์ฉ์ ์
๋ ฅ๊ฐ์ ๋ํด ๊ฐ๋ ฅํ ๊ฒ์ฆ์ ์ํํด์ผ ํฉ๋๋ค.
์ฝํ
์ธ ๋ณด์ ์ ์ฑ
(Content Security Policy, CSP): CSP๋ ์น์ฌ์ดํธ๊ฐ ์คํํ ์ ์๋ ์คํฌ๋ฆฝํธ์ ์ถ์ฒ๋ฅผ ์ ํํ๋ ๋ฐฉ๋ฒ์
๋๋ค. CSP๋ ์น ๋ธ๋ผ์ฐ์ ์๊ฒ ์ด๋ค ์ถ์ฒ์ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ ์ง ์ง์ํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ๊ณต๊ฒฉ์๊ฐ ์น์ฌ์ดํธ์ ์
์์ ์ธ ์คํฌ๋ฆฝํธ๋ฅผ ์ฝ์
ํ๋ ๊ฒ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
HTTP-only ์ฟ ํค ์ฌ์ฉ: HTTP-only ์ฟ ํค๋ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ํตํด ์ ๊ทผํ ์ ์๋๋ก ์ค๊ณ๋์ด ์์ต๋๋ค. ์ด๋ฅผ ํตํด XSS ๊ณต๊ฒฉ์ผ๋ก ์ธํ ์ฟ ํค ํ์ทจ๋ฅผ ๋ง์ ์ ์์ต๋๋ค.
์ด ์ธ์๋ XSS ๊ณต๊ฒฉ์ ๋ฐฉ์ดํ๊ธฐ ์ํ ๋ค์ํ ๋ฐฉ๋ฒ๋ค์ด ์์ต๋๋ค. ์๋ฅผ ๋ค๋ฉด, ์ฌ์ฉ์๊ฐ ์
๋ ฅํ ๋ด์ฉ์ ์์ ํ๊ฒ ํํํ ์ ์๋๋ก ํ๋ ์์ํฌ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ง์์ ๋ฐ๋ ๊ฒ์ด ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, React์ ๊ฐ์ ํ๋ ์์ํฌ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ฉ์ ์
๋ ฅ๊ฐ์ ์ด์ค์ผ์ดํํ์ฌ XSS ๊ณต๊ฒฉ์ ๋ฐฉ์งํฉ๋๋ค.
๐ CSRF ๊ณต๊ฒฉ์ด ๋ฌด์์ด๊ณ , ํผํ ์ ์๋ ๋ฐฉ๋ฒ์
CSRF(Cross-Site Request Forgery)๋ ์น ์ฌ์ดํธ ์ทจ์ฝ์ ์ ์ด์ฉํ์ฌ ์ฌ์ฉ์๊ฐ ์์ ์ ์์ง์๋ ๋ฌด๊ดํ๊ฒ ๊ณต๊ฒฉ์๊ฐ ์ ํํ ํ๋์ ์คํํ๊ฒ ํ๋ ๊ณต๊ฒฉ ๋ฐฉ๋ฒ์
๋๋ค. ์ด ๊ณต๊ฒฉ์ ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธํ ์ํ์์ ๋ฐ์ํ๋ฉฐ, ๊ณต๊ฒฉ์๋ ์ฌ์ฉ์์ ๊ถํ์ ์ด์ฉํด ๋น์ ์์ ์ธ ์์ฒญ์ ์๋ฒ์ ๋ณด๋ผ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด, ์ฌ์ฉ์๊ฐ ์จ๋ผ์ธ ๋ฑ
ํน ์๋น์ค์ ๋ก๊ทธ์ธํด ์๋ ์ํฉ์์ ๊ณต๊ฒฉ์๊ฐ ๋ง๋ ์น์ฌ์ดํธ๋ฅผ ๋ฐฉ๋ฌธํ๋ฉด, ์ด ์น์ฌ์ดํธ๋ ์ฌ์ฉ์์ ๋ฑ
ํน ์๋น์ค์ ๋ํ ์
์์ ์ธ ์์ฒญ์ ๋ง๋ค์ด ๋ณด๋ผ ์ ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ ์ฌ์ฉ์๋ ์์ ๋ ๋ชจ๋ฅด๊ฒ ๊ณต๊ฒฉ์๊ฐ ์ง์ ํ ๊ณ์ข๋ก ์์ ์ ๋์ ์ก๊ธํ๊ฒ ๋ ์ ์์ต๋๋ค.
CSRF๋ฅผ ํผํ๋ ๋ฐฉ๋ฒ:
SameSite ์ฟ ํค: ์ต์ ๋ธ๋ผ์ฐ์ ๋ SameSite ์ฟ ํค ์ค์ ์ ์ง์ํฉ๋๋ค. ์ด ์ค์ ์ ์ฟ ํค๊ฐ ๊ฐ์ ์ฌ์ดํธ์์๋ง ์ ์ก๋๋๋ก ํฉ๋๋ค. ์ฆ, ์ฌ์ฉ์๊ฐ ์น์ฌ์ดํธ A์ ๋ก๊ทธ์ธํ๊ณ ์๋ค๊ณ ํด๋, ์น์ฌ์ดํธ B์์๋ A์ ์ฟ ํค๋ฅผ ์ด์ฉํ ์ ์์ต๋๋ค.
CSRF ํ ํฐ: ์๋ฒ๋ ๋งค ์์ฒญ๋ง๋ค ๊ณ ์ ํ CSRF ํ ํฐ์ ์์ฑํ๊ณ ์ด๋ฅผ ์ธ์
์ ์ ์ฅํฉ๋๋ค. ํด๋ผ์ด์ธํธ๋ ์ด ํ ํฐ์ ์์ฒญ์ ํฌํจ์์ผ ์๋ฒ๋ก ๋ณด๋ด๊ณ , ์๋ฒ๋ ์ด ํ ํฐ์ด ์์ฒญ๋ง๋ค ์ผ์นํ๋์ง ํ์ธํฉ๋๋ค. ๊ณต๊ฒฉ์๋ CSRF ํ ํฐ์ ์ ์ ์์ผ๋ฏ๋ก ์ด ๋ฐฉ๋ฒ์ด CSRF ๊ณต๊ฒฉ์ ๋ง๋ ๋ฐ ํจ๊ณผ์ ์
๋๋ค.
๊ฒ์ฆ๋ Referrer ํค๋ ์ฌ์ฉ: ์ด ๋ฐฉ๋ฒ์ HTTP ์์ฒญ ํค๋์ Referer๋ฅผ ํ์ธํด ์์ฒญ์ด ์ ๋ขฐํ ์ ์๋ ์์ค์์ ๋ฐ์ํ๋์ง ํ์ธํ๋ ๊ฒ์
๋๋ค. ํ์ง๋ง ํค๋ ์กฐ์ ๊ฐ๋ฅ์ฑ๊ณผ ํ๋ผ์ด๋ฒ์ ๋ฌธ์ ๋๋ฌธ์ ์ด ๋ฐฉ๋ฒ๋ง์ผ๋ก๋ ์ถฉ๋ถํ์ง ์์ ์ ์์ต๋๋ค.
์ด ์ธ์๋ ์ฌ์ฉ์์ ํ๋์ ์ ๊ด์ฐฐํ๊ณ ๋น์ ์์ ์ธ ํจํด์ ํ์งํ๋ ๋ฑ ๋ค์ํ ๋ฐฉ๋ฒ์ผ๋ก CSRF ๊ณต๊ฒฉ์ ๋ฐฉ์ดํ ์ ์์ต๋๋ค.
'๊ฐ๋ฐ์ค > Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Java] ๊ฐ์ฒด ๋งคํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ModelMapper (0) | 2023.03.22 |
---|---|
[JAVA] ๋ฌธ์์ด ๋ฐ๊ณ , ์ด์ฑ์ผ๋ก ๋ฐํํด์ฃผ์. (0) | 2023.01.25 |
[Gson] String => Object Array ํ์ฉํ๊ธฐ (0) | 2022.11.29 |
65279 ์์คํค์ฝ๋๊ฐ ๋์์ ๋ฌธ์์ด ๋น๊ต ์๋จ ?! ๐ (1) | 2022.10.19 |
[Java] mysql ์ ์์ ๋ณด๋ก ์ฟผ๋ฆฌ์กฐํ (0) | 2022.09.20 |