์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- MySQL LEFT()
- build.gradle ์ค์ ์ค๋ฅ
- ๋น๋๊ด๋ฆฌ๋๊ตฌ
- Spring Security 5
- ๋ฌ๋ฆฌ๊ธฐ ๊ฒฝ์ฃผ ํ์ด์ฌ ์๊ฐ์ด๊ณผ
- ์ ๊ทํ ์ฅ๋จ์
- www.google.com๏ปฟ ๊ฒ์ํ๋ฉด ์ผ์ด๋๋ ์ผ
- DDL DML DCL ์ฐจ์ด
- ๋ฐฑํธ๋ํน
- ์๊ณ ๋ฆฌ์ฆ 1000000007 ๋๋๊ธฐ
- ๊ธฐ์ฌ๋จ์์ ๋ฌด๊ธฐ ์ ๊ณฑ๊ทผ
- Python 1000000007
- ์ด์ฝํ 2021
- commit message convention
- ๋ชจ๋๋ก ์ฐ์ฐ
- ์น ๋์ ๊ณผ์
- ๊ธฐ์ฌ๋จ์์ ๋ฌด๊ธฐ ํ์ด์ฌ
- PCB
- ํ๋ก๊ทธ๋๋จธ์ค 142086
- finalize ์๋ ํธ์ถ
- MySQL RIGHT()
- @RequestMapping๊ณผ @GetMapping
- OOP์ ํน์ง
- ํ๋ก์ธ์ค
- ๋ฌ๋ฆฌ๊ธฐ ๊ฒฝ์ฃผ ํ์ด์ฌ
- ์คํ๋ง ๋ถํธ์ AWS๋ก ํผ์ ๊ตฌํํ๋ ์น ์๋น์ค
- Spring Security ๋ฒ์ ๋ฌธ์
- java ๋๊ธฐํ
- RDBMS์ NoSQL ์ฐจ์ด
- ๋น๋๊ด๋ฆฌ๋๊ตฌ ์ฐจ์ด
- Today
- Total
BUILD_SSO
[Java] ์๋ฐ ํ ํฌ ์ธํฐ๋ทฐ part3 ๋ณธ๋ฌธ
๐๐ปJava 8
โผ ์คํธ๋ฆผStream API์ ๋ํด ์ค๋ช
ํด์ฃผ์ธ์.
- Java 8์์ ๋์จ ํจ์ํ ์ธํฐํ์ด์ค, ์ผ๋ จ์ element ๋ค์ ๋ํ ์ฐ์ฐ์ ์์ฐจ์ , ๋๋ ๋ณ๋ ฌ์ ์ผ๋ก ์ฒ๋ฆฌํด ์ค๋ค.
- ๋ฐ์ดํฐ ์์ค์ ๋ํ ๊ณตํต๋ ์ ๊ทผ ๋ฐฉ์์ ์ ๊ณตํ๋ค.
- ์คํธ๋ฆผ์ ์๋ณธ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ์ง ์๋๋ค.
- ์คํธ๋ฆผ์ ์ธ๋ถ ๋ฐ๋ณต์ ํตํด ์์ ํ๋ ์ปฌ๋ ์ ๊ณผ๋ ๋ฌ๋ฆฌ ๋ด๋ถ ๋ฐ๋ณต(internal iteration)์ ํตํด ์์ ์ ์ํํ๋ค.
- ์คํธ๋ฆผ์ ์ฌ์ฌ์ฉ์ด ๊ฐ๋ฅํ ์ปฌ๋ ์ ๊ณผ๋ ๋ฌ๋ฆฌ ๋จ ํ ๋ฒ๋ง ์ฌ์ฉํ ์ ์๋ค.
- ์คํธ๋ฆผ์ ์ฐ์ฐ์ ํํฐ(filter)-๋งต(map) ๊ธฐ๋ฐ์ API๋ฅผ ์ฌ์ฉํ์ฌ ์ง์ฐ(lazy) ์ฐ์ฐ์ ํตํด ์ฑ๋ฅ์ ์ต์ ํํ๋ค.
- ์คํธ๋ฆผ์ parallelStream() ๋ฉ์๋๋ฅผ ํตํ ์์ฌ์ด ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ฅผ ์ง์ํ๋ค.
- ์คํธ๋ฆผ์ [์คํธ๋ฆผ์ ์์ฑ -> ์คํธ๋ฆผ์ ์ค๊ฐ ์ฐ์ฐ -> ์คํธ๋ฆผ์ ์ต์ข ์ฐ์ฐ] ์ ์ธ ๊ฐ์ง ๋จ๊ณ์ ๊ฑธ์ณ์ ๋์ํ๋ฉฐ, ์ค๊ฐ ์ฐ์ฐ์ ๊ฒฝ์ฐ Streamํํ๋ก ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๊ธฐ ๋๋ฌธ์ ์ฐ์์ ์ผ๋ก ์ฐ๊ฒฐํด์ ์ฌ์ฉํ ์ ์๋ค.
โผ ์คํธ๋ฆผ์ด ๋์ค๊ฒ๋ ์ด์ ๋?
- ์๋ฐ์์ ๋ฐฐ์ด์ด๋ ์ปฌ๋ ์ ์ ์ฌ์ฉํ ๋ ์ฌ๊ธฐ์ ์ ์ฅ๋ ๋ฐ์ดํฐ์ ์ ๊ทผํ๊ธฐ ์ํด์๋ ๋ฐ๋ณต๋ฌธ์ด๋ ๋ฐ๋ณต์(Iterator)๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ์ ์ ๊ทผํด์ผํ๋๋ฐ, ๊ทธ๋ ๊ฒ ๋๋ฉด ์ฝ๋๊ฐ ๋๋ฌด ๊ธธ์ด์ง๊ณ ๊ฐ๋ ์ฑ๋ ๋จ์ด์ง๊ณ , ์ฝ๋์ ์ฌ์ฌ์ฉ์ด ๊ฑฐ์ ๋ถ๊ฐ๋ฅํ ์ํ์ ์ฝ๋๊ฐ ํ์ํ๋ค. ์ด๋ฌํ ๋ฌธ์ ์ ์ ๊ทน๋ณตํ๊ธฐ ์ํด ์คํธ๋ฆผ์ด ๋ฑ์ฅํ๋ค.
โผ ์ผ๋ฐ์ ์ธ for-loop ๋ณด๋ค ์คํธ๋ฆผ์ for-each๊ฐ ๋๋ฆฐ์ด์ ๋ฅผ ์ค๋ช ํด์ฃผ์ธ์.
- ์ต์ ํ๋ฌธ์
Stream์ ๊ฒฝ์ฐ ๋น๊ต์ ์ต๊ทผ์ ๋์จ ๊ธฐ๋ฅ์ด๊ธฐ ๋๋ฌธ์ Stream์ ๋ํด์ ์ถฉ๋ถํ ์ต์ ํ๊ฐ ์งํ๋์ง ์์์ ๊ฒ์ด๋ผ๋ ์ถ์ธก - for๋ฌธ์ ๋จ์ ์ธ๋ฑ์ค ๊ธฐ๋ฐ
for๋ฌธ์ ๋จ์ ์ธ๋ฑ์ค ๊ธฐ๋ฐ์ผ๋ก ๋๋ ๋ฐ๋ณต๋ฌธ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ์ด๊ธฐ ๋๋ฌธ์ Stream์ ๋นํด ๋น ๋ฅด๊ณ ์ค๋ฒํค๋๋ ์๋ค.
stream์ ๊ฒฝ์ฐ๋ JVM์ด ์ฒ๋ฆฌํด์ค์ผํ๋ ๊ฒ๋ค์ด ๋ง์ ์คํ ์ ๋๋ฆด ์ ๋ฐ์ ์๋ค.
โผ ํจ์ํ ์ธํฐํ์ด์ค์๋ํด ์ค๋ช ํด์ฃผ์ธ์.
- ํจ์ํ ์ธํฐํ์ด์ค๋ 1 ๊ฐ์ ์ถ์ ๋ฉ์๋๋ฅผ ๊ฐ๋ ์ธํฐํ์ด์ค๋ฅผ ๋งํ๋ค.
โก ์ถ์ ๋ฉ์๋๊ฐ ํ๋๋ผ๋ ๋ป์ default method ๋๋ static method ๋ ์ฌ๋ฌ ๊ฐ ์กด์ฌํด๋ ์๊ด ์๋ค๋ ๋ป์ ๋๋ค. - Java8 ๋ถํฐ ์ธํฐํ์ด์ค๋ ๊ธฐ๋ณธ ๊ตฌํ์ฒด๋ฅผ ํฌํจํ ๋ํดํธ ๋ฉ์๋ (default method) ๋ฅผ ํฌํจํ ์ ์๋ค.
- ์ฌ๋ฌ ๊ฐ์ ๋ํดํธ ๋ฉ์๋๊ฐ ์๋๋ผ๋ ์ถ์ ๋ฉ์๋๊ฐ ์ค์ง ํ๋๋ฉด ํจ์ํ ์ธํฐํ์ด์ค์ด๋ค.
- ์๋ฐ์ ๋๋ค ํํ์์ ํจ์ํ ์ธํฐํ์ด์ค๋ก๋ง ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
- @FunctionalInterface ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ๋๋ฐ, ์ด ์ด๋ ธํ ์ด์ ์ ํด๋น ์ธํฐํ์ด์ค๊ฐ ํจ์ํ ์ธํฐํ์ด์ค ์กฐ๊ฑด์ ๋ง๋์ง ๊ฒ์ฌํด์ค๋ค.
- @FunctionalInterface ์ด๋ ธํ ์ด์ ์ด ์์ด๋ ํจ์ํ ์ธํฐํ์ด์ค๋ก ๋์ํ๊ณ ์ฌ์ฉํ๋ ๋ฐ ๋ฌธ์ ๋ ์์ง๋ง, ์ธํฐํ์ด์ค ๊ฒ์ฆ๊ณผ ์ ์ง๋ณด์๋ฅผ ์ํด ๋ถ์ฌ์ฃผ๋ ๊ฒ ์ข๋ค.
โผ Java์์ ๊ธฐ๋ณธ ์ ๊ณตํ๋ ํจ์ํ ์ธํฐํ์ด์ค์๋ํด ์ค๋ช ํด์ฃผ์ธ์.
//๊ธฐ๋ณธ ์์ ํ์
@FunctionalInterface
public interface Predicate<T> {
boolean test(T t);
}
- Predicate
Predicate ํจ์ํ ์ธํฐํ์ด์ค๋ T ํ์ ์ ์ธ์๋ฅผ ๋ฐ์ boolean ๊ฐ์ ๋ฐํํฉ๋๋ค.
โก boolean test(T t); - Consumer
์ด๋ฆ์์ ์ ์ ์๋ฏ์ด Consumer ํจ์ํ ์ธํฐํ์ด์ค๋ ๋ฐ์ดํฐ๋ง ์๋นํ๊ณ ์๋ฌด๊ฒ๋ ์์ฑํ์ง ์์ต๋๋ค. T ํ์ ์ ์ธ์์ ๋ํด ๋ชจ๋ ์์ ์ ์ํํ ์ ์์ผ๋ฉฐ, ๋ฐํ ํ์ ์ void์ ๋๋ค.
โก void accept(T t); - Supplier
Supplier ํจ์ํ ์ธํฐํ์ด์ค๋ ๋งค๊ฐ๋ณ์๊ฐ ์กด์ฌํ์ง ์์ผ๋ฉฐ, ๊ณต๊ธ์๋ผ๋ ์ด๋ฆ์ฒ๋ผ ์๋ฌด๊ฒ๋ ๋ฐ์ง ์๊ณ T ํ์ ์ ๊ฐ์ฒด๋ฅผ ๋ฐํํฉ๋๋ค.
โก T get(); - Function
Function ํจ์ํ ์ธํฐํ์ด์ค๋ T ํ์ ์ ์ธ์๋ฅผ ๋ฐ์ ํน์ ์์ ์ ์ํ ํ R ํ์ ์ ๊ฐ์ฒด๋ฅผ ๋ฐํํฉ๋๋ค.
์ํ์์์์ ํจ์์ฒ๋ผ ํน์ ๊ฐ์ ๋ฐ์์ ๋ค๋ฅธ ๊ฐ์ผ๋ก ๋ฐํํด์ฃผ๋ฉฐ, T ์ R ์ ๊ฐ์ ํ์ ์ ์ฌ์ฉํ ์๋ ์์ต๋๋ค.
Consumer์ Supplier์ ์กฐํฉ์ ๋๋ค.
โก R apply(T t); - Runnable
Runnable ํจ์ํ ์ธํฐํ์ด์ค๋ ๋งค๊ฐ๋ณ์์ ๋ฐํ ํ์ ์ด ์กด์ฌํ์ง ์์ต๋๋ค. run() ๋ฉ์๋์ ์ ์๋ ์ฝ๋๋ง ์คํํฉ๋๋ค.
Runnable ์ด๋ผ๋ ์ด๋ฆ์ ๋ง๊ฒ "์คํ ๊ฐ๋ฅํ" ์ด๋ผ๋ ๋ป์ ๋ํ๋ด๋ฉฐ ์ด๋ฆ ๊ทธ๋๋ก ์คํ๋ง ํ ์ ์๋ค๊ณ ์๊ฐํ๋ฉด ๋ฉ๋๋ค.
โผ Optional ์๋ํด ์ค๋ช ํด์ฃผ์ธ์.
- Java8์์๋ Optional<T> ํด๋์ค๋ฅผ ์ฌ์ฉํด NPE(NullPointerException)๋ฅผ ๋ฐฉ์งํ ์ ์๋๋ก ๋์์ค๋ค.
- Optional<T>๋ null์ด ์ฌ ์ ์๋ ๊ฐ์ ๊ฐ์ธ๋ Wrapper ํด๋์ค๋ก, ์ฐธ์กฐํ๋๋ผ๋ NPE๊ฐ ๋ฐ์ํ์ง ์๋๋ก ๋์์ค๋ค. Optional ํด๋์ค๋ ์๋์ ๊ฐ์ value์ ๊ฐ์ ์ ์ฅํ๊ธฐ ๋๋ฌธ์ ๊ฐ์ด null์ด๋๋ผ๋ ๋ฐ๋ก NPE๊ฐ ๋ฐ์ํ์ง ์์ผ๋ฉฐ, ํด๋์ค์ด๊ธฐ ๋๋ฌธ์ ๊ฐ์ข ๋ฉ์๋๋ฅผ ์ ๊ณตํด์ค๋ค.
โก ์ฆ, Optional์ null ๋๋ ๊ฐ์ ๊ฐ์ธ์ NPE(NullPointerException)๋ก๋ถํฐ ๋ถ๋ด์ ์ค์ด๊ธฐ ์ํด ๋ฑ์ฅํ Wrapper ํด๋์ค์ด๋ค.
๐๐ปModifier
โผ ์ ์ด์๋(modifier) ?
๋ณ์, ๋ฉ์๋, ํด๋์ค ์ ์ธ๋ถ์ ํ์๋์ด ๋ถ๊ฐ์ ์ธ ์๋ฏธ๋ฅผ ๋ถ์ฌํ๋ ํค์๋๋ฅผ ๋งํ๋ค. ์ ์ด์๋ ์ ๊ทผ ์ ์ด์์ ๊ทธ ์ธ์ ์ ์ด์, ๋ ๊ฐ์ง ์ข ๋ฅ๋ก ๋๋ ์ ์๋ค.
- ์ ๊ทผ์ ์ด์๋
๋ณ์ ๋๋ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ ๋ฒ์๋ฅผ ์ค์ ํด์ฃผ๊ธฐ ์ํด ์ฌ์ฉํ๋ Java์ ์์ฝ์ด๋ฅผ ์๋ฏธํฉ๋๋ค. ์ด 4๊ฐ์ง ์ข ๋ฅ๊ฐ ์์ต๋๋ค.
์ ๊ทผ ์ ์ด์๋ ํ ๋ฒ์ ๋ค ๊ฐ์ง ์ค ํ๋๋ง ์ ํํด์ ์ฌ์ฉํ ์ ์์ต๋๋ค.- public์ ์ ๊ทผ ์ ํ์ด ์์ผ๋ฏ๋ก, ๊ฐ์ ํ๋ก์ ํธ ๋ด ์ด๋์๋ ์ฌ์ฉ ๊ฐ๋ฅํฉ๋๋ค.
- protected๋ ํด๋น ํจํค์ง ๋ด, ๋ค๋ฅธ ํจํค์ง์์ ์์๋ฐ์ ์์ ํด๋์ค์์ ์ฌ์ฉ์ด ๊ฐ๋ฅํฉ๋๋ค.
- default๋ ํด๋น ํจํค์ง ๋ด์์๋ง ์ ๊ทผ์ด ๊ฐ๋ฅํฉ๋๋ค.
- private๋ ํด๋น ํด๋์ค ๋ด์์๋ง ์ ๊ทผ์ด ๊ฐ๋ฅํฉ๋๋ค.
- ๊ทธ์ธ์ ์ ์ด์
- static์ ํด๋์ค์, ๊ณตํต์ ์ธ์ ์๋ฏธ๋ฅผ ๊ฐ์ง๊ณ ์๋ค. static์ด ๋ถ์ ๋ฉค๋ฒ๋ณ์์ ๋ฉ์๋, ์ด๊ธฐํ ๋ธ๋ญ์ ์ธ์คํด์ค๊ฐ ์๋ ํด๋์ค์ ๊ด๊ณ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์, ์ธ์คํด์ค ์์ฑ ์ฌ๋ถ์ ๊ด๊ณ ์์ด ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
- final์ ๋ง์ง๋ง์, ๋ณ๊ฒฝ๋ ์ ์๋ ์๋ฏธ๋ฅผ ๊ฐ์ง๊ณ ์๊ณ , ๊ฑฐ์ ๋ชจ๋ ๋์์ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
- abstract์ ์ถ์์, ๋ฏธ์์ฑ์ ์๋ฏธ๋ฅผ ๊ฐ์ง๊ณ ์๋ค. ๋ฉ์๋์ ์ ์ธ๋ถ์๋ง ์์ฑํ๊ณ , ์ค์ ์ํ๋ด์ฉ์ ๊ตฌํํ์ง ์์ ์ถ์ ๋ฉ์๋๋ฅผ ์ ์ธํ๋๋ฐ ์ฌ์ฉ๋๋ค
โผ ๋ฉ์๋ parameter ์ final ์ ๋ถ์ด๋ ๊ฒฝ์ฐ๋ฅผ ์ด๋ป๊ฒ ์๊ฐํ์๋์ง ์ค๋ช ํด์ฃผ์ธ์
- ๋ถ๋ณ ์ฑ์ง์ ๊ฐ์กฐํ๋ ค๋ ๊ฒฝ์ฐ final ํค์๋๋ฅผ ๋ถ์ฌ ์ด ๋งค๊ฐ๋ณ์์ ๊ฐ์ด ๋ฉ์๋ ๋ด์์ ๋ณ๊ฒฝ๋์ง ์์์ผ ํจ์ ๋ช ์์ ์ผ๋ก ๋ณด์ฅํ๊ณ ์ ํ๋ ์๋๋ก ์ฌ์ฉํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
- ํ์ง๋ง, final ํค์๋๋ฅผ ๋๋ฌด ๋จ๋ฐํ๋ฉด ์ฝ๋๊ฐ ๋ณต์กํด์ง๊ณ ๊ฐ๋ ์ฑ์ด ๋จ์ด์ง ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ๋ฉ์๋์ ๋ก์ง์ด ๋ณต์กํด์ง์ง ์๋๋ค๋ฉด, ์ผ๋ฐ์ ์ผ๋ก ๋ฉ์๋ ๋งค๊ฐ๋ณ์์ final์ ๊ตณ์ด ๋ถ์ด์ง ์๋ ๊ฒ์ด ์ผ๋ฐ์ ์ ๋๋ค.
- ์ค๋ฒ๋ผ์ด๋ฉ์ด ๋ถ๊ฐํ๊ณ ์ค๋ฒ๋ก๋ฉ๋ง ๊ฐ๋ฅํด์ง๋ค.
๐๐ปSynchronization
โผ ๋๊ธฐํ(synchronization) ๋?
์ฌ๋ฌ ๊ฐ์ ์ฐ๋ ๋๊ฐ ํ ๊ฐ์ ์์์ ์ฌ์ฉํ๊ณ ์ ํ ๋, ํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๊ณ ์๋ ์ฐ๋ ๋๋ฅผ ์ ์ธํ๊ณ ๋๋จธ์ง ์ฐ๋ ๋๋ค์ ๋ฐ์ดํฐ์ ์ ๊ทผํ ์ ์๊ฒ ๋ง๋ ๊ฐ๋ ์ ๋๋ค.
- ๋ฉํฐ์ค๋ ๋ ์ ๊ทผ ์ ํ ํค์๋ ์ด๋ค.
- ๋ฉ์๋ ๋จ์, ๋ธ๋ก ๋จ์ ์ ์ฉ ๊ฐ๋ฅํ๋ค.
- ๋จ, ์๊ณ์์ญ์ด ์์์๋ก ์ข๊ธฐ ๋๋ฌธ์ ๋ธ๋ก ๋จ์์ ์ฌ์ฉ์ ๊ถ์ฅํ๋ค.
โผ synchronized ๋ฅผ ์ฌ์ฉํ ์ sychronized method, sychronized block, static sychronized method, static synchonized block ์ 4๊ฐ์ง ์ฐ์์ ๊ฒฝ์ฐ์ ๋ํด ์ค๋ช ํด์ฃผ์ธ์.
- sychronized method
- ํด๋์ค ์ธ์คํด์ค ์ lock์ ๊ฒ๋๋ค.
- ์ธ์คํด์ค์ lock์ ๊ฑฐ๋ synchronized ํค์๋๋ synchronized๊ฐ ์ ์ฉ๋ ๋ฉ์๋๋ผ๋ฆฌ ์ผ๊ด์ ์ผ๋ก lock์ ๊ณต์ ํฉ๋๋ค.
- static sychronized method
- static์ด ๋ถ์ synchronized method๋ ์ผ๋ฐ์ ์ผ๋ก ์๊ฐํ๋ static ์ฑ์ง์ ๊ฐ์ผ๋ฏ๋ก ์ธ์คํด์ค๊ฐ ์๋ ํด๋์ค ๋จ์ ๋ก lock์ ๊ฒ๋๋ค.
- ๋ค๋ฅธ ์ธ์คํด์ค๋๋ผ๋ static ๋ฉ์๋์ synchronized๊ฐ ๋ถ์ ๊ฒฝ์ฐ lock์ ๊ณต์ ํ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
- static synchronized method์ synchronized method์ lock์ ๊ณต์ ๋์ง ์์ต๋๋ค.
- sychronized block
- ์ธ์คํด์ค์ block ๋จ์ ๋ก lock์ ๊ฑธ๊ณ lock ๊ฐ์ฒด๋ฅผ ์ง์ ํด์ผ ํฉ๋๋ค.
- block์ this๋ฅผ ๋ช ์ํ ๊ฒฝ์ฐ method์ synchornized๋ฅผ ๋ถ์ธ ๊ฒ์ฒ๋ผ ์ธ์คํด์ค ๋จ์๋ก lock์ด ๊ฑธ๋ฆฝ๋๋ค.
- block์๋ ๊ฐ์ฒด๋ฅผ ์ง์ ํ ์๋ ์๊ณ class ํ์์ผ๋ก ๋๊ธฐ๋ฉด ํด๋น class์ lock์ ๊ฑธ ์ ์์ต๋๋ค.
- static synchonized block
- this์ ๊ฐ์ด ํ์ฌ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฅดํค๋ ํํ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- static synchronized method ๋ฐฉ์๊ณผ์ ์ฐจ์ด๋ lock ๊ฐ์ฒด๋ฅผ ์ง์ ํ๊ณ block ๋ฒ์๋ฅผ ํ์ ์ง์ ์ ์๋ค๋ ์ ์ ๋๋ค. ํด๋์ค ๋จ์๋ก lock์ ๊ณต์ ํ๋ค๋ ์ ์ ๊ฐ์ต๋๋ค.
- block์ ์ธ์๋ก ์ ์ ์ธ์คํด์ค๋ ํด๋์ค๋ง ์ฌ์ฉํฉ๋๋ค.
- this์ ๊ฐ์ด ํ์ฌ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฅดํค๋ ํํ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
โผ synchronized ์ฌ์ฉ ์ ๋ฐ๋๋ฝ์ด ๋ฐ์ํ๋ ์ํฉ์ ์ค๋ช ํด์ฃผ์ธ์.
- ์ํธ ๋ฐฐ์ (Mutual Exclusion) : ํ ์์์ ๋ํด ์ฌ๋ฌ ์ฐ๋ ๋ ๋์ ์ ๊ทผ ๋ถ๊ฐ
- ์ ์ ์ ๋๊ธฐ (Hold and Wait) : ์์์ ๊ฐ์ง๊ณ ์๋ ์ํ์์ ๋ค๋ฅธ ์ฐ๋ ๋๊ฐ ์ฌ์ฉํ๊ณ ์๋ ์์ ๋ฐ๋ฉ์ ๊ธฐ๋ค๋ฆฌ๋ ๊ฒ
- ๋น์ ์ (Non Preemptive) : ๋ค๋ฅธ ์ฐ๋ ๋์ ์์์ ์คํ ์ค๊ฐ์ ๊ฐ์ ๋ก ๊ฐ์ ธ์ฌ ์ ์์
- ํํ๋๊ธฐ (Circle Wait) : ๊ฐ ์ฐ๋ ๋๊ฐ ์ํ์ ์ผ๋ก ๋ค์ ์ฐ๋ ๋๊ฐ ์๊ตฌํ๋ ์์์ ๊ฐ์ง๊ณ ์๋ ๊ฒ
์์ 4๊ฐ์ง ์กฐ๊ฑด์ ๋ชจ๋ ์ถฉ์กฑํ ๊ฒฝ์ฐ ๋ฐ๋๋ฝ์ด ๋ฐ์ํ์ฌ ์๋ฌด๋ฐ ์คํํ์ง ๋ชปํ ์ฑ ๋ฌดํ์ ๋๊ธฐํ๊ฒ ๋ฉ๋๋ค.
โผ volatile ํค์๋์ ๋ํด ์ค๋ช ํด์ฃผ์ธ์.
๋๊ธฐํ ๋ฌธ์ ๋ฐฉ์ง๋ฅผ ์ํด volatileํค์๋๋ฅผ ์ฌ์ฉํฉ๋๋ค.
๋ณ์๋ฅผ volatile๋ก ์ ์ธํ๋ฉด ๋ฉ์ธ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ์ฐธ์กฐํ๊ฒ ๋๋ฏ๋ก ๋ค๋ฅธ ์ค๋ ๋๋ผ๋ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ์ฐธ์กฐํ๊ฒ ๋ฉ๋๋ค.
ํน์ง์ ์๋์ ๊ฐ์ต๋๋ค.
- volatile๋ก ์ ์ธ๋ ๋ณ์๊ฐ ์๋ ์ฝ๋๋ ์ต์ ํ๋์ง ์์ต๋๋ค.
- volatile ํค์๋๋ ๋ณ์๋ฅผ 'Main Memory์ ์ ์ฅํ๊ฒ ๋ค'๋ผ๊ณ ๋ช ์ํ๋ ๊ฒ์ ๋๋ค.
- ๋ณ์์ ๊ฐ์ Readํ ๋๋ง๋ค CPU cache์ ์ ์ฅ๋ ๊ฐ์ด ์๋, Main Memory์์ ์ฝ์ต๋๋ค.
โผ lock์ ์ฌ์ฉํ์ ์์ volatile์ ์ฌ์ฉํ ์์, volatile ๋จ์ ์ ๋ํด์ ์ค๋ช ํด์ฃผ์ธ์.
- Multi Thread ํ๊ฒฝ์์ ์ฌ๋ฌ๊ฐ์ Thread๊ฐ writeํ๋ ์ํฉ์ด๋ผ๋ฉด race conditionrace์ ํด๊ฒฐํ ์ ์์ต๋๋ค. ์ด๋ด ๊ฒฝ์ฐ์๋ synchronized๋ฅผ ์ฌ์ฉํ์ฌ ์์์ฑ(atomic)์ ๋ณด์ฅํด์ผ ํฉ๋๋ค.
๐๐ปThread
โผ ์๋ฐ์์ thread ๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ๊ณผ ์คํํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช ํด์ฃผ์ธ์.
์๋ฐ์์ ์ค๋ ๋๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ ๊ฐ์ง๊ฐ ์์ต๋๋ค.
- Thread๋ฅผ ์์๋ฐ๋ ๋ฐฉ๋ฒ
- Thread ํด๋์ค๋ฅผ ์์ํ ํด๋์ค ์ ์ํ๋ค.
- run() ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ํ์ฌ ์ค๋ ๋ ์ฝ๋ ์์ฑํ๋ค.
- ์ค๋ ๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค.
- start() ๋ฉ์๋๋ก ์ค๋ ๋๋ฅผ ์์ํ๋ค.
- Runnable ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ
- Runnable ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ํด๋์ค๋ฅผ ์ ์ํ๋ค.
- run() ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ํ์ฌ ์ค๋ ๋ ์ฝ๋๋ฅผ ์์ฑํ๋ค.
- Runnable ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค.
- Thread ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค.
- start() ๋ฉ์๋๋ก ์ค๋ ๋๋ฅผ ์์ํ๋ค.
์๋ฐ๋ ๋ค์ค ์์์ ํ์ฉํ์ง ์๊ธฐ ๋๋ฌธ์ Thread ํด๋์ค๋ฅผ ์์๋ฐ๊ฒ ๋๋ฉด ๋ค๋ฅธ ํด๋์ค๋ฅผ ์์๋ฐ์์๊ฐ ์์ต๋๋ค. ๊ทธ๋์ ์ธํฐํ์ด์ค์ธ Runnable๋ก ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ด ์ผ๋ฐ์ ์ ๋๋ค. ๋ํ ์ฌ์ฌ์ฉ์ฑ(reusability)์ด ๋๊ณ ์ฝ๋์ ์ผ๊ด์ฑ(consistency)์ ์ ์งํ ์ ์๊ธฐ ๋๋ฌธ์ ๋ณด๋ค ๊ฐ์ฒด์งํฅ์ ์ธ ๋ฐฉ๋ฒ์ด๋ค.
์ฐธ๊ณ ๋ก, ์ฌ์ฉ์๊ฐ ์ค๋ ๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ์คํ์์ฒญ์ ํ๋๋ผ๋ ์ค๋ ๋๊ฐ ์คํ๋๋ ๊ฒ์ ์ ์ ์ผ๋ก JVM์ ์ํ ์ค์ผ์ฅด๋ฌ์ ๋ฐ๋ฆ ๋๋ค. ์ฌ์ฉ์๋ Thread์ ์ฌ๋ฌ ๋ฉ์๋๋ค์ ํตํด์ JVM์ ํด๋น ๋ช ๋ น๋ค์ด ์คํ๋๋๋ก ์์ฒญํ๋ ๊ฒ์ ๋๋ค.
*์ค๋ ๋ Thread ๋?
์ค๋ ๋๋ ํ๋ก์ธ์ค์์์ ์ค์ง์ ์ผ๋ก ์์
์ ์คํํ๋ ๋จ์๋ฅผ ๋งํฉ๋๋ค. ์๋ฐ์์๋ JVM(Java Virtual Machine)์ ์ํด ๊ด๋ฆฌ๋ฉ๋๋ค.
ํ๋ก์ธ์ค์๋ ์ ์ด๋ ํ๊ฐ ์ด์์ ์ค๋ ๋๊ฐ ์์ผ๋ฉฐ, Main ์ค๋ ๋ ํ๋๋ก ์์ํ์ฌ ์ค๋ ๋๋ฅผ ์ถ๊ฐ ์์ฑํ๊ฒ ๋๋ฉด ๋ฉํฐ ์ค๋ ๋ ํ๊ฒฝ์ด ๋ฉ๋๋ค. ์ด๋ฌํ ์ค๋ ๋๋ค์ ํ๋ก์ธ์ค์ ๋ฆฌ์์ค๋ฅผ ๊ณต์ ํ๊ธฐ ๋๋ฌธ์ ํจ์จ์ ์ด๊ธด ํ์ง๋ง ์ ์ฌ์ ์ธ ๋ฌธ์ ์ ์ ๋
ธ์ถ๋ ์๋ ์์ต๋๋ค.
โผ Thread ์คํ ์ run()์ผ๋ก ์ํํ ๋์ start()๋ก ์ํํ ๋์์ ์ฐจ์ด๋ฅผ ์ค๋ช ํด์ฃผ์ธ์.
- run()
run()์ ํธ์ถํ๋ ๊ฒ์ ๋จ์ํ ํด๋์ค์ ์ ์ธ๋ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ ๊ฒ์ด๋ค. - start()
start()๋ ์๋ก์ด ์ฐ๋ ๋๊ฐ ์์ ์ ์คํํ๋๋ฐ ํ์ํ ํธ์ถ์คํ(call stack)์ ์์ฑํ ๋ค์์ run()์ ํธ์ถํด์ ์์ฑ๋ ํธ์ถ์คํ์ run()์ด ์ฒซ๋ฒ์งธ๋ก ์ฌ๋ผ๊ฐ๊ฒ ํ๋ค.
โผ ์ผ๋ฐ ๋ฐฉ์์์ main thread๊ฐ ์ข ๋ฃ๋๋ฉด ์ดํ๋ฆฌ์ผ์ด์ ์ด ์ข ๋ฃ๋ ํ ๋ฐ, ๋ฉํฐ์ค๋ ๋ ๋ฐฉ์์์ main thread๋ ์ธ์ ์ข ๋ฃ๋๋์?
- ์๋ฐ ์ดํ๋ฆฌ์ผ์ด์ ์ main ์ค๋ ๋๊ฐ main() ๋ฉ์๋๋ฅผ ์คํํ๋ฉด์ ์์๋ฉ๋๋ค. main ์ค๋ ๋์ ํ๋ฆ ์์์ ๋ฉํฐ ์ค๋ ๋ ์ดํ๋ฆฌ์ผ์ด์ ์ ํ์์ ๋ฐ๋ผ ์์ ์ค๋ ๋๋ฅผ ๋ง๋ค์ด ๋ณ๋ ฌ๋ก ์ฝ๋๋ฅผ ์คํํ ์ ์๊ฒ ๋ฉ๋๋ค.
- ์ฑ๊ธ ์ค๋ ๋์ ๊ฒฝ์ฐ, ๋ฉ์ธ ์ค๋ ๋๊ฐ ์ข ๋ฃ๋๋ฉด ํ๋ก์ธ์ค๋ ์ข ๋ฃ๋์ง๋ง, ๋ฉํฐ ์ค๋ ๋๋ ๋ฉ์ธ ์ค๋ ๋๊ฐ ์ข ๋ฃ๋๋๋ผ๋ ์คํ ์ค์ธ ์ค๋ ๋๊ฐ ํ๋๋ผ๋ ์๋ค๋ฉด ํ๋ก์ธ์ค๊ฐ ๊ณ์ ์คํ๋๊ฒ ๋ฉ๋๋ค. (์ค๋ ๋๋ ๋ณ๋ ฌ์ ์ผ๋ก ์์ ํ๊ธฐ ๋๋ฌธ)
๊ฒฐ๊ณผ์ ์ผ๋ก, ๋ฉํฐ ์ค๋ ๋์์ ๋ฉ์ธ ์ค๋ ๋๋ return ์ ๋ง๋๊ฑฐ๋, main ๋ฉ์๋์ ๋์ด์ค๋ฉด ์ข ๋ฃํ๊ฒ ๋๋ค.
*์ง๋ฌธ์์ ์ํ๋ ๋ต์ด ์๋ ๊ฒ ๊ฐ์ ๋๋์ด ๋๋๋ฐ ๋ ์ฐพ์๋ด์ผ๊ฒ ๋ค..
โผ ThreadLocal ์ ๋ํด์ ์ค๋ช ํด์ฃผ์ธ์.
- ThreadLocal์ ํ ์ฐ๋ ๋์์ ์ฝ๊ณ ์ฐ์ฌ์ง ์ ์๋ ๋ณ์๋ฅผ ํ ๋นํ์ฌ ์ ๊ทผํ ์ ์๋๋ก ํฉ๋๋ค.
- ๋ฉํฐ ์ฐ๋ ๋ ํ๊ฒฝ์์ ๊ฐ ์ฐ๋ ๋๋ง๋ค get(), set() ๋ฉ์๋๋ฅผ ํตํด ๋ ๋ฆฝ์ ์ผ๋ก ๋ณ์์ ์ ๊ทผํ ์ ์์ต๋๋ค. ๋ง๊ทธ๋๋ก Thread ๋ด๋ถ์์ ์ฌ์ฉํ๋ ์ง์ญ๋ณ์์ ๋๋ค.
- ThreadLocal์ ๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ThreadLocal ๊ฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค.
- ThreadLocal.set() ๋ฉ์๋๋ฅผ ์ด์ฉํ์ฌ ํ์ฌ thread์ ๋ก์ปฌ ๋ณ์์ ๊ฐ์ ์ ์ฅํฉ๋๋ค.
- ThreadLocal.get() ๋ฉ์๋๋ฅผ ์ด์ฉํ์ฌ ํ์ฌ thread์ ๋ก์ปฌ ๋ณ์๊ฐ์ ์ฝ์ด์ต๋๋ค.
- ThreadLocal.remove() ๋ฉ์๋๋ฅผ ์ด์ฉํ์ฌ ํ์ฌ thread ๋ก์ปฌ ๋ณ์๊ฐ์ ์ญ์ ํฉ๋๋ค.
โผ ๋ฉํฐ์ฐ๋ ๋ ํ๊ฒฝ์์ ThreadLocal ์ ์ฌ์ฉํ ๋ ์ ์ํ ์ ์ ๋ํด ์ค๋ช ํด์ฃผ์ธ์.
- ์ค๋ ๋ ๋ก์ปฌ์ ์ค๋ ๋ ํ(thread pool)์ ์ฌ์ฉํ๋ ํ๊ฒฝ์์๋ ์ฃผ์ํด์ผ ํฉ๋๋ค. ์ค๋ ๋๊ฐ ์ฌํ์ฉ๋ ์ ์๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ์ด ๋๋ฌ๋ค๋ฉด ์ค๋ ๋ ๋ก์ปฌ์ ๋น์์ฃผ๋ ๊ณผ์ ์ด ํ์์ ์ด๋ค.
๐๐ปError & Exception
โผ ์์ธ์ฒ๋ฆฌ๋ฅผ ํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์ค๋ช ํด ์ฃผ์ธ์.
- try, catch
์์ธ๊ฐ ๋ฐ์ํ์๋ ์ฐ๋ฆฌ๋ try ... catch ... finally ๋ผ๋ ํค์๋๋ก ์์ธ๋ฅผ ์ฒ๋ฆฌํ ์ ์๊ฑฐ๋ ๋ฉ์๋๋ฅผ ํธ์ถํ ๊ณณ์ผ๋ก ๋์ง ์ ์์ต๋๋ค. ํ ๊ฐ์ง ์ค์ํ ์ ์ ์๋ฐ์์ ๋ชจ๋ ์์ธ๋ Exception์ด๋ผ๋ ํด๋์ค๋ฅผ ์์๋ฐ์ต๋๋ค.- try ๋ธ๋ก : ๊ฐ์ฅ ๋จผ์ ์คํ๋๋ ์ฝ๋๋ก ์ฌ๊ธฐ์์ ๋ฐ์ํ ์์ธ๋ catch ๋ธ๋ก์์ ์ฒ๋ฆฌ๋๋ค.
- catch ๋ธ๋ก : try ๋ธ๋ก์์ ๋ฐ์ํ ์์ธ ์ฝ๋๋ ์์ธ ๊ฐ์ฒด๋ฅผ ์ธ์๋ก ์ ๋ฌ๋ฐ์ ์ฒ๋ฆฌํ๋ค.
- finally ๋ธ๋ก : ์์ธ์ ๋ฐ์ ์ ๋ฌด์ ์๊ด์์ด ๋ง์ง๋ง์ ๋ฌด์กฐ๊ฑด ์คํ๋๋ค.
- throws
๋ง๊ทธ๋๋ก ์์ธ๋ฅผ ๋์ง๋ ๊ฒ์ ๋ปํฉ๋๋ค.- ์์ธ๋ฅผ ์ฌ๊ธฐ์ ์ฒ๋ฆฌํ์ง ์์ํ ๋ ๋๋ฅผ ๋ถ๋ฌ๋ค๊ฐ ์ฐ๋ ๋ ์์๊ฒ ์๋ฌ ์ฒ๋ฆฌ๋ฅผ ์ ๊ฐํ๊ฒ ๋ค๋ ์๋ฏธ์ด๋ฉฐ ์ฝ๋๋ฅผ ์ง๋ ์ฌ๋์ด ์ด ์ ์ธ๋ถ๋ฅผ ๋ณด๊ณ ์ด๋ค ์์ธ๊ฐ ๋ฐ์ํ ์ ์๋์ง๋ ์๊ฒ ํด์ค๋๋ค.
โผ Checked Exception ๊ณผ Unchecked Exception ์ transaction ์์ธ ์ฒ๋ฆฌ ๋ฐฉ์์ ์ค๋ช ํด์ฃผ์ธ์.
- Checked Exception
- ๋ช ์์ ์ผ๋ก ์์ธ ์ฒ๋ฆฌ๋ฅผ ๊ฐ์ ํ๊ธฐ ๋๋ฌธ์ checked exception์ด๋ผ ๋ถ๋ฅธ๋ค.
- ์ด๋ Exception ํด๋์ค๋ฅผ ์ง์ ์์ํ๊ฑฐ๋ IOException, SQLException ๊ฐ์ ํ์ ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์ ํด๋นํฉ๋๋ค.
- try~catch, throws ๋ฑ์ ์ฌ์ฉํ์ฌ ์์ธ๋ฅผ ๋์ง๋ค.
- ์์ธ์ฒ๋ฆฌ๋ฅผ ํ์ง ์์ผ๋ฉด IDE์์ ์ปดํ์ผ์ ์๋ฌ๋ฅผ ๋ฑ๋๋ค.
- compile Exception์ผ๋ก runtime exception ํ์ exception์ ์ ์ธํ๊ณ ๋งํ๋ค.
- Unchecked Exception
- ๊ฐ์ ํ์ง ์๊ธฐ ๋๋ฌธ์ UnChecked Exception์ด๋ผ ๋ถ๋ฅธ๋ค.
- ์ด ์์ธ๋ค์ ๋ฐํ์ ์ ๋ฐ์ํ๋ฉฐ, ํ๋ก๊ทธ๋๋จธ์ ์ค์๋ก ๋ํ๋๋ ๊ฒฝ์ฐ์ด๋ค.
- ์์ธ์ฒ๋ฆฌ๋ฅผ ํ์ง ์์๋ IDE์์ ์๋ฌ๋ฅผ ๋ฑ์ง ์๋๋ค.
- Runtime Exception์ผ๋ก ์คํ ์ค ๋ฐ์ํ๋ Exception์ ๋งํ๋ค.
- Runtime Exception ํ์์ NullPointException, IndexOutOfBoundException ๋ฑ์ด ์๋ค.
- ํธ๋์ญ์ ์ ๊ทธ๋ฅrollback
- check ๋ rollback ์์ํค๊ณ ์ปค๋ฐํ๋ค๊ณ ํ๋ค
โผ @Transactional ๋ ์ด๋ป๊ฒ ๊ตฌํ๋๋์?
- @Transactional์ ๋ฉ์๋ ๋๋ ํด๋์ค์ ๋ช
์ํ๋ฉด,
AOP๋ฅผ ํตํด Target์ด ์์ํ๊ณ ์๋ ์ธํฐํ์ด์ค ๋๋ Target ๊ฐ์ฒด๋ฅผ ์์ํ Proxy ๊ฐ์ฒด๊ฐ ์์ฑ๋๋ฉฐ,
Proxy ๊ฐ์ฒด์ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด Target ๋ฉ์๋ ์ ํ๋ก ํธ๋์ญ์ ์ฒ๋ฆฌ๋ฅผ ์ํํฉ๋๋ค.
โผ @Transactional ์ด ๋ถ์ง ์์ ๋ฉ์๋์ ๋ด๋ถ์์ @Transactional ์ด ๋ถ์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์, ์ด ๋ด๋ถ ๋ฉ์๋๋ @Transactional์ด ์ ์ฉ๋ ๊น์?
- ์ ์ฉ๋์ง ์๋๋ค.
- ๋ฉ์๋ ๋จ์๋ก ํธ๋์ญ์ ์ด ๋์ํ๋๋ฐ, ํธ์ถ๋๋ ๋ฉ์๋์๋ ํธ๋์ญ์ ์ด ๋ถ์ด์์ด์ผ ์ ์ฉ๋๋ค. ๋ด๋ฌด ๋ฉ์๋์๋ ํ๋ก์๊ฐ์ฒด๊ฐ ์์ด์ ๋์ํ์ง ์๋๋ค.
์ฐธ๊ณ
- https://brorica.tistory.com/entry/java-stream
- https://bcp0109.tistory.com/313
- https://kangyb.tistory.com/17
- https://icarus8050.tistory.com/95
- https://kadosholy.tistory.com/121
- https://backtony.github.io/java/2022-05-04-java-50/#synchronized-method
- https://ttl-blog.tistory.com/238#%F0%9F%A7%90%20volatile%EC%9D%98%20%EB%AC%B8%EC%A0%9C-1
'Tech Interview' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Java] ์๋ฐ ํ ํฌ ์ธํฐ๋ทฐ part2 (0) | 2023.05.22 |
---|---|
[Java] ์๋ฐ ํ ํฌ ์ธํฐ๋ทฐ part 1 (0) | 2023.05.17 |
[Database/๋ฐ์ดํฐ๋ฒ ์ด์ค] ์ธ๋ฑ์ค Index (0) | 2023.05.03 |
[Database/๋ฐ์ดํฐ๋ฒ ์ด์ค] ์ ๊ทํ Normalization (0) | 2023.05.03 |
[Database/๋ฐ์ดํฐ๋ฒ ์ด์ค] DB Query & JOIN (0) | 2023.05.03 |