5์ฃผ์ฐจ ์๋ฃ์ ๋ชจ๋ ํ ํฝ์ ๋ ๊ฐ์ ํฐ ํ๋ฆ์ผ๋ก ์ ๋ฆฌํ ํ์ต ๊ฒฝ๋ก.
1) ๋์์ฑ ๋ง๋ฌด๋ฆฌ (Atomic/CAS, ์ค๋ ๋ ํ์ ํ์์ฑ)
2) ํ ๋น์ ์คํ๋ง ์์ (DAO ์งํ โ ๊ด์ฌ์ฌ ๋ถ๋ฆฌ โ ๋์์ธ ํจํด โ IoC/DI)์๋ฐ ๊ธฐ์ดยท๋์์ฑ์ ๋๋ด๊ณ Spring ํ๋ ์์ํฌ์ ํต์ฌ ์๋ฆฌ๋ก ์ง์ ํ๋ ๋ค๋ฆฌ ์ฃผ์ฐจ๋ค.
[Part A โ ๋์์ฑ ๋ง๋ฌด๋ฆฌ]
[Phase 1] ์ค๋ ๋ ํ์ ํ์์ฑ ์ฌ์ ๋ฆฌ
โ
[Phase 2] ๋์์ฑ ์์ ๋๊ตฌ 3์ข
๋น๊ต (synchronized/volatile/Atomic)
โ (์๋ฐ ๊ธฐ์ด ์์ฑ)
[Part B โ ํ ๋น์ ์คํ๋ง: ๊ฐ์ฒด ์ค๊ณ์ ์งํ]
[Phase 3] ์ ํต DAO์ ๋ฌธ์
โ
[Phase 4] ๊ด์ฌ์ฌ์ ๋ถ๋ฆฌ
โ
[Phase 5] ๋์์ธ ํจํด ์ ์ฉ (ํ
ํ๋ฆฟ ๋ฉ์๋ / ํฉํ ๋ฆฌ ๋ฉ์๋)
โ
[Phase 6] ๊ฐ์ฒด์งํฅ ์ค๊ณ ์์น (OCP, ์ ๋ต ํจํด)
โ
[Phase 7] ์ ์ด์ ์ญ์ (IoC)
โ
[Phase 8] Spring ์ปจํ
์ด๋ (ApplicationContext + DI)
์ด 8 Phase ร 26 Unit
| ์ฃผ์ฐจ | ์ฃผ์ | ํต์ฌ ๋ณํ |
|---|---|---|
| 1์ฃผ์ฐจ | OOPยทJVMยทGCยท์ปฌ๋ ์ ยทI/O ๊ฐ๋ก | ์๋ฐ ํฐ ๊ทธ๋ฆผ |
| 2์ฃผ์ฐจ | JVM ๋ด๋ถยท๋ฐ์ดํธ์ฝ๋ยทG1 GC | "์ด๋ป๊ฒ ๋์๊ฐ๋" |
| 3์ฃผ์ฐจ | ์ปฌ๋ ์ ์ ์ฒด ์ง๋ยท์ ๋ค๋ฆญยทํจ์ํ | ์๋ฐ ํํ๋ ฅ ์์ฑ |
| 4์ฃผ์ฐจ | ๋ฉํฐ์ค๋ ๋ฉยท๋์์ฑยทExecutor | ๋์์ฑ ์ฒซ ์ ๋ณต |
| 5์ฃผ์ฐจ (์ง๊ธ) | Atomic + Spring IoC/DI ์ ๋ฌธ | ์๋ฐ โ Spring ๋ค๋ฆฌ |
| Day | Phase | ํ์ต ๋ชฉํ |
|---|---|---|
| 1์ผ์ฐจ | Phase 1 + 2 | ๋์์ฑ ๋ง๋ฌด๋ฆฌ (Atomic/CAS) |
| 2์ผ์ฐจ | Phase 3 | ์ ํต DAO ๋ถ์ |
| 3์ผ์ฐจ | Phase 4 | ๊ด์ฌ์ฌ ๋ถ๋ฆฌ (1ยท2๋จ๊ณ) |
| 4์ผ์ฐจ | Phase 5 | ํ ํ๋ฆฟ ๋ฉ์๋ + ํฉํ ๋ฆฌ ๋ฉ์๋ ํจํด |
| 5์ผ์ฐจ | Phase 6 | OCP + ์ ๋ต ํจํด |
| 6์ผ์ฐจ | Phase 7 | IoC + ํ๋ ์์ํฌ vs ๋ผ์ด๋ธ๋ฌ๋ฆฌ |
| 7์ผ์ฐจ | Phase 8 | ApplicationContext + DI |
๋ชฉํ: 4์ฃผ์ฐจ์์ ๋ณธ Executor ํ๋ ์์ํฌ๊ฐ "์" ํ์ํ์ง๋ฅผ ์ค๋ ๋ ์์ฒด์ ๋น์ฉ ๊ด์ ์์ ๋ค์ ํ๋ฒ ๋ชป ๋ฐ๋๋ค.
์ ์ ์ง์: 4์ฃผ์ฐจ Phase 1, 7
ํต์ฌ ๊ฐ๋
"์ค๋ ๋๋ฅผ ๋ง์ด ์ธ์๋ก ํญ์ ๋น ๋ฅผ๊น?" โ NO
3๊ฐ์ง ํจ์ :
1. ์ปจํ
์คํธ ์ค์์นญ ์ค๋ฒํค๋: ์ค๋ ๋ N๊ฐ โ โ ์ค์์นญ ๋น์ฉ โ
2. ๋ฐ๋๋ฝ: ๋ฝ์ด ๋ง์์๋ก ๋ฐ๋๋ฝ ๊ฐ๋ฅ์ฑ โ
3. ๋
ธ๋ ์ค๋ ๋์ ์์ ๋ญ๋น: ์์
์ ํด๋ ๋ฉ๋ชจ๋ฆฌ ์ฐจ์ง + ์ค์ผ์ค๋ง ๋น์ฉ
ํต์ฌ ํต์ฐฐ: ์ค๋ ๋๋ "๊ณต์ง๊ฐ ์๋๋ค". ์กด์ฌ ์์ฒด๋ก ๋น์ฉ.
์๊ธฐ ์ ๊ฒ
์ ์ ์ง์: Unit 1.1, 4์ฃผ์ฐจ Phase 1
ํต์ฌ ๊ฐ๋
์ค์์นญ ์ ์ผ์ด๋๋ ์ผ:
1. ํ์ฌ ์ค๋ ๋์ CPU ๋ ์ง์คํฐ โ ๋ฉ๋ชจ๋ฆฌ์ ๋ฐฑ์
2. ๋ค์ ์ค๋ ๋์ ์ด์ ์ํ โ ๋ฉ๋ชจ๋ฆฌ์์ ๋ณต์
3. CPU ์บ์ ๋ฌดํจํ (์บ์ ๋ฏธ์ค ๋ฐ์)
4. ์ค๋ ๋ ์คํ, PC ์นด์ดํฐ ๋ฑ ์ปจํ
์คํธ ์ ํ
์ค์์นญ ํ์ = ์ค๋ ๋ ์ ร ์๊ฐ ๋น๋ก โ ์ค๋ ๋ ๋๋ฌด ๋ง์ผ๋ฉด CPU๊ฐ ์์ ๋ณด๋ค ์ค์์นญ์ ๋ ๋ง์ ์๊ฐ ์๋น
์๊ธฐ ์ ๊ฒ
์ ์ ์ง์: Unit 1.2, 4์ฃผ์ฐจ Phase 7
ํต์ฌ ๊ฐ๋
๋ฌธ์ โ ํด๊ฒฐ:
์ด๊ฒ 4์ฃผ์ฐจ์์ ๋ณธ Executor ํ๋ ์์ํฌ์ ์กด์ฌ ์ด์ ๋ค.
์ค๋ฌด ๊ฒฐ๋ก :
"์ค๋ ๋๋ฅผ ์ง์ ๋ง๋ค์ง ๋ง๋ผ. ExecutorService๋ฅผ ์จ๋ผ. ํ ํฌ๊ธฐ๋ ์ ์คํ ์ ํ๋ผ."
์๊ธฐ ์ ๊ฒ
๋ชฉํ: 4์ฃผ์ฐจ์์ synchronized์ volatile์ ๋ณธ ๋ค์, ์ด๋ฒ์ Atomic๊น์ง ๋ํด 3๊ฐ์ง ๋๊ตฌ์ ์ ํํ ์ฐจ์ด๋ฅผ ๋งคํธ๋ฆญ์ค๋ก ์ก๋๋ค.
์ ์ ์ง์: 4์ฃผ์ฐจ Phase 4
ํต์ฌ ๊ฐ๋
๋์์ฑ ๋ฌธ์ ๋ ์ ํํ 2๊ฐ์ง ๋ค:
| ๋ฌธ์ | ์ ์ | ์์ |
|---|---|---|
| ๊ฐ์์ฑ(Visibility) | ํ ์ค๋ ๋์ ๋ณ๊ฒฝ์ด ๋ค๋ฅธ ์ค๋ ๋์ ์ ๋ณด์ | runFlag = false ํ๋๋ฐ ๋ฌดํ ๋ฃจํ |
| ๋์ ์ ๊ทผ(Atomicity) | ๋์ ์์ ์ด ์๋ก๋ฅผ ๋ฎ์ด์ | count++ ๊ฐ ์ผ๋ถ ์์ค |
์ด ๋์ ๋ถ๋ฆฌํด์ ๋ณด๋ ๊ฒ์ด ํต์ฌ. ๋๊ตฌ๋ง๋ค ํด๊ฒฐ ๋ฒ์๊ฐ ๋ค๋ฅด๋ค.
์๊ธฐ ์ ๊ฒ
์ ์ ์ง์: Unit 2.1
ํต์ฌ ๊ฐ๋
๊ฐ์ฅ ์์ ํ์ง๋ง ๊ฐ์ฅ ๋น์ผ ๋๊ตฌ.
์๊ธฐ ์ ๊ฒ
์ ์ ์ง์: Unit 2.2
ํต์ฌ ๊ฐ๋
volatile int count = 0;
count++; // โ ๏ธ ์ฌ์ ํ ์ํ! (read โ +1 โ write 3๋จ๊ณ)
์ ํฉํ ์ฌ์ฉ์ฒ: ํ ์ค๋ ๋๋ง ์ฐ๊ณ , ์ฌ๋ฌ ์ค๋ ๋๊ฐ ์ฝ๋ ํ๋๊ทธ
volatile boolean shutdown = false; // ํ ๊ณณ์์๋ง true ์ค์
์๊ธฐ ์ ๊ฒ
count++ ๊ฐ volatile๋ก ์์ ํ์ง ์์ ์ด์ ๋ฅผ ์ด์
๋ธ๋ฆฌ ์์ค์ผ๋ก?์ ์ ์ง์: Unit 2.3
ํต์ฌ ๊ฐ๋
CAS (Compare And Swap) ์๊ณ ๋ฆฌ์ฆ:
1. ํ์ฌ ๊ฐ ์ฝ๊ธฐ โ ๋ ์ง์คํฐ์ ์ ์ฅ (A)
2. ์ ๊ฐ ๊ณ์ฐ (B)
3. ๋ฉ๋ชจ๋ฆฌ์ ๊ฐ๊ณผ A๋ฅผ ๋น๊ต
์ํ ์์ก ์์:
AtomicInteger num = new AtomicInteger(0);
num.incrementAndGet(); // ๋ฝ ์์ด ์์์
๋น๊ต ๋งคํธ๋ฆญ์ค:
| ๋๊ตฌ | ๊ฐ์์ฑ | ์์์ฑ | ๋ฐฉ์ | ์ฑ๋ฅ |
|---|---|---|---|---|
| synchronized | โ | โ | ๋ฝ (๋ธ๋กํน) | ๊ฐ์ฅ ๋๋ฆผ |
| volatile | โ | โ | ๋ฉ๋ชจ๋ฆฌ ๋๊ธฐํ | ๋น ๋ฆ |
| Atomic | โ | โ | CAS (๋ ผ๋ธ๋กํน) | ๋น ๋ฆ |
์๊ธฐ ์ ๊ฒ
์ด ํํธ์ ํต์ฌ ๋ฉ์์ง:
"DAO ์ฝ๋ ํ ์ค์ด ์ด๋ป๊ฒ Spring์ IoC/DI๊น์ง ์งํํ๋์ง" โ ํ ํด๋์ค์ ๋ฆฌํฉํ ๋ง ์ฌ์ ์ ๋ฐ๋ผ๊ฐ๋ฉฐ ๊ฐ์ฒด์งํฅ ์ค๊ณ ์์น๊ณผ Spring์ ๋ณธ์ง์ ๋์์ ์ตํ๋ค.
๋ชฉํ: Spring์ด ์ ํ์ํ์ง๋ฅผ, "Spring ์์ด ์ง ์ฝ๋์ ๊ณ ํต" ์ผ๋ก ์ง์ ๋ณธ๋ค.
์ ์ ์ง์: 1์ฃผ์ฐจ Phase 7 (JDBC ๊ฐ๋ )
ํต์ฌ ๊ฐ๋
์๊ธฐ ์ ๊ฒ
์ ์ ์ง์: Unit 3.1
ํต์ฌ ์ฝ๋ ๋ถ์
public void add(User user) throws ... {
Class.forName("com.mysql.jdbc.Driver"); // โ ๋๋ผ์ด๋ฒ ๋ก๋ฉ
Connection c = DriverManager.getConnection( // โก DB ์ ์ ์ ๋ณด
"jdbc:mysql://localhost/toby", "root", "*****");
PreparedStatement ps = c.prepareStatement( // โข SQL ์์ฑ
"insert into users(id, name, password) values (?,?,?)");
ps.setString(1, user.getId()); // โฃ ํ๋ผ๋ฏธํฐ ๋ฐ์ธ๋ฉ
// ...
ps.executeUpdate(); // โค ์คํ
ps.close(); c.close(); // โฅ ์์ ํด์
}
์๊ธฐ ์ ๊ฒ
์๋ณธ ์๋ฃ: ํ ๋น์ ์คํ๋ง vol.1, p.56
์ ์ ์ง์: Unit 3.2
ํต์ฌ ๋ฌธ์ ์ง๋จ
์ด ํ ๋ฉ์๋ ์์ ์์ฌ์๋ ์ฑ
์:
1. DB ์ฐ๊ฒฐ ์ ๋ณด ๊ด๋ฆฌ (URL, user, password)
2. DB ๋๋ผ์ด๋ฒ ๋ก๋ฉ
3. SQL ์์ฑ๊ณผ ์คํ
4. ์์ ํด์
5. ์์ธ ์ฒ๋ฆฌ
์ ๋ฌธ์ ์ธ๊ฐ:
getConnection) ๊ฐ ๋ฉ์๋๋ง๋ค ์ค๋ณตโ ๋ณ๊ฒฝ 1๋ฒ = ์์ N๊ณณ = ์ ์ง๋ณด์ ์ง์ฅ
์๊ธฐ ์ ๊ฒ
๋ชฉํ: ๋ฆฌํฉํ ๋ง์ ๊ฐ์ฅ ๊ธฐ๋ณธ ์๋ฆฌ๋ฅผ ์ฝ๋ ๋ณํ๋ก ์ง์ ๋ณธ๋ค.
์ ์ ์ง์: Unit 3.3
ํต์ฌ ๊ฐ๋
"๊ด์ฌ์ด ๊ฐ์ ๊ฒ๋ผ๋ฆฌ๋ ํ๋๋ก ๋ชจ์ผ๊ณ , ๊ด์ฌ์ด ๋ค๋ฅธ ๊ฒ์ ๋จ์ด๋จ๋ ค๋ผ"
๊ด์ฌ์ฌ(Concern)์ ์๋ฏธ:
์ฒ์์ ํ๋ฐ ๋ชจ์ ๊ฒ ํธํ์ง๋ง, ์์คํ ์ด ์ปค์ง๋ฉด ๋ถ๋ฆฌํด์ผ๋ง ์ด์๋จ๋๋ค.
์๊ธฐ ์ ๊ฒ
์๋ณธ ์๋ฃ: ํ ๋น์ ์คํ๋ง vol.1, p.61
์ ์ ์ง์: Unit 4.1
ํต์ฌ ๋ณํ
Before (๊ฐ ๋ฉ์๋๊ฐ ์ง์ ์ฐ๊ฒฐ):
public void add(...) {
Class.forName(...);
Connection c = DriverManager.getConnection(...);
// ...
}
public User get(...) {
Class.forName(...); // โ ์ค๋ณต
Connection c = DriverManager.getConnection(...); // โ ์ค๋ณต
// ...
}
After (๋ฉ์๋ ์ถ์ถ):
private Connection getConnection() throws ... {
Class.forName("com.mysql.jdbc.Driver");
return DriverManager.getConnection(...);
}
public void add(...) {
Connection c = getConnection(); // ๊น๋
// ...
}
public User get(...) {
Connection c = getConnection(); // ๊น๋
// ...
}
์ป์ ๊ฒ:
์๊ธฐ ์ ๊ฒ
์ ์ ์ง์: Unit 4.2
ํต์ฌ ๋ณํ
๋ฌธ์ : "๊ณ ๊ฐ์ฌ๋ง๋ค ๋ค๋ฅธ DB๋ฅผ ์ฐ๊ณ ์ถ๋ค. ๊ทธ๋ฐ๋ฐ UserDao ์ฝ๋๋ ๊ณต๊ฐํ๊ณ ์ถ์ง ์๋ค."
ํด๊ฒฐ: getConnection์ ์ถ์ ๋ฉ์๋๋ก
public abstract class UserDao {
public void add(...) {
Connection c = getConnection(); // ๋ณํ์ง ์๋ ํ๋ฆ
// ...
}
public abstract Connection getConnection(); // ๋ณํ๋ ๋ถ๋ถ
}
class NUserDao extends UserDao {
public Connection getConnection() {
// N์ฌ DB ์ฐ๊ฒฐ ์ฝ๋
}
}
class DUserDao extends UserDao {
public Connection getConnection() {
// D์ฌ DB ์ฐ๊ฒฐ ์ฝ๋
}
}
์๊ธฐ ์ ๊ฒ
์๋ณธ ์๋ฃ: ํ ๋น์ ์คํ๋ง vol.1, p.65
๋ชฉํ: Phase 4์ ๋ฆฌํฉํ ๋ง์ด ์ฌ์ค์ ๋์์ธ ํจํด 2๊ฐ์ ์ ์ฉ ์ด์์์ ์๊ณ , ๊ทธ ํ๊ณ๊น์ง ๋ณธ๋ค.
์ ์ ์ง์: Unit 4.3
ํต์ฌ ๊ฐ๋
"์ํผํด๋์ค์ ๊ธฐ๋ณธ ํ๋ฆ์ ๋ง๋ค๊ณ , ๋ณํ๋ ๋ถ๋ถ๋ง ์๋ธํด๋์ค์์ ๊ตฌํํ๊ฒ ํ๋ ํจํด"
๊ตฌ์กฐ:
[์ํผํด๋์ค]
โโ ํ
ํ๋ฆฟ ๋ฉ์๋ (๋ณํ์ง ์๋ ํ๋ฆ)
โโ ์ถ์ ๋ฉ์๋ (๋ณํ๋ ๋ถ๋ถ)
โ ์ค๋ฒ๋ผ์ด๋
[์๋ธํด๋์ค]
Phase 4-3์ UserDao ์ฝ๋๊ฐ ์ ํํ ์ด ํจํด.
์๊ธฐ ์ ๊ฒ
JdbcTemplate์ด ์ด๋ฆ์ "Template"์ด ๋ถ์ ์ด์ ๋?์๋ณธ ์๋ฃ: ํ ๋น์ ์คํ๋ง vol.1, p.67
์ ์ ์ง์: Unit 5.1
ํต์ฌ ๊ฐ๋
"๊ฐ์ฒด ์์ฑ์ ์๋ธํด๋์ค์ ์์ํ๋ ํจํด"
getConnection() ๋ ์ฌ์ค์:
๊ทธ๋์ ๊ฐ์ ์ฝ๋๊ฐ ๋ ํจํด์ผ๋ก ๋์์ ํด์๋๋ค:
์๊ธฐ ์ ๊ฒ
BeanFactory ์ด๋ฆ์ "Factory"๋ ์ด ํจํด๊ณผ ์ด๋ค ๊ด๋ จ์ด ์๋๊ฐ?์๋ณธ ์๋ฃ: ํ ๋น์ ์คํ๋ง vol.1, p.67
์ ์ ์ง์: Unit 5.2
ํต์ฌ ํ๊ณ
์์์ ์ด์ฉํ ๋ถ๋ฆฌ์ ๋จ์ :
โ ์์ ๋์ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ด ํ์ํ๋ค: ์ธํฐํ์ด์ค + ํฉ์ฑ(composition)
์๊ธฐ ์ ๊ฒ
๋ชฉํ: ์ธํฐํ์ด์ค๋ฅผ ํตํ ๊ฒฐํฉ๋ ๋ฎ์ถ๊ธฐ๋ก OCP๋ฅผ ๋ฌ์ฑํ๊ณ , ์ ๋ต ํจํด์ผ๋ก ๋ ์ ์ฐํ ๊ตฌ์กฐ๋ฅผ ๋ง๋ ๋ค.
์ ์ ์ง์: Unit 5.3
ํต์ฌ ๋ณํ
public interface ConnectionMaker {
Connection makeConnection();
}
public class UserDao {
private ConnectionMaker connectionMaker; // ์ธํฐํ์ด์ค์ ์์กด
public UserDao(ConnectionMaker cm) {
this.connectionMaker = cm; // ์ธ๋ถ์์ ์ฃผ์
๋ฐ์
}
public void add(User user) {
Connection c = connectionMaker.makeConnection();
// ...
}
}
public class NConnectionMaker implements ConnectionMaker { ... }
public class DConnectionMaker implements ConnectionMaker { ... }
ํต์ฌ ๋ณํ:
์๊ธฐ ์ ๊ฒ
์๋ณธ ์๋ฃ: ํ ๋น์ ์คํ๋ง vol.1, p.74~78
์ ์ ์ง์: Unit 6.1
ํต์ฌ ๊ฐ๋
"ํ์ฅ์๋ ์ด๋ ค์๊ณ , ๋ณ๊ฒฝ์๋ ๋ซํ์์ด์ผ ํ๋ค"
UserDao์ ๋ณํ:
โ OCP ๋ง์กฑ
OCP๊ฐ ๊นจ์ง๋ ์ฝ๋์ ์ ํธ:
if (type.equals("MySQL")) ... else if (type.equals("Oracle"))switch ๋ฌธ์ด ์ ์ผ์ด์ค ์ถ๊ฐ๋ ๋๋ง๋ค ์์ ๋จ์๊ธฐ ์ ๊ฒ
์๋ณธ ์๋ฃ: ํ ๋น์ ์คํ๋ง vol.1, p.83
์ ์ ์ง์: Unit 6.2
ํต์ฌ ๊ฐ๋
"ํ์์ ๋ฐ๋ผ ๋ณ๊ฒฝ๋๋ ์๊ณ ๋ฆฌ์ฆ์ ์ธํฐํ์ด์ค๋ก ๋ถ๋ฆฌํ๊ณ , ๊ตฌ์ฒด ๊ตฌํ์ ์ธ๋ถ์์ ์ฃผ์ ๋ฐ๋ ํจํด"
์ฉ์ด ๋งคํ:
์ ๋ต ํจํด์ ๊ณง OCP์ ๊ตฌํ ๋๊ตฌ:
์๊ธฐ ์ ๊ฒ
์๋ณธ ์๋ฃ: ํ ๋น์ ์คํ๋ง vol.1, p.87
๋ชฉํ: ๊ฐ์ฒด ์์ฑยท์ฐ๊ฒฐยท๊ด๋ฆฌ์ ์ฑ ์์ด ์ด๋์ ์ด๋๋ก ์ฎ๊ฒจ๊ฐ๋์ง ์ถ์ ํ๋ค.
์ ์ ์ง์: Phase 6
ํต์ฌ ๊ฐ๋
์ ํต ๋ฐฉ์:
public class UserDao {
public UserDao() {
this.connectionMaker = new NConnectionMaker(); // ์๊ธฐ๊ฐ ๊ฒฐ์
}
}
โ UserDao๊ฐ ์์ ์ด ์ฌ์ฉํ ๊ฐ์ฒด๋ฅผ ์ค์ค๋ก ๊ฒฐ์ ยท์์ฑ
IoC ๋ฐฉ์:
public class UserDao {
public UserDao(ConnectionMaker cm) {
this.connectionMaker = cm; // ์ธ๋ถ์์ ์ฃผ์
}
}
โ "์ด๋ค ConnectionMaker๋ฅผ ์ธ์ง"์ ๊ฒฐ์ ๊ถํ์ด ์ธ๋ถ๋ก ๋์ด๊ฐ
์ ์ด์ ์ญ์ :
์๊ธฐ ์ ๊ฒ
์๋ณธ ์๋ฃ: ํ ๋น์ ์คํ๋ง vol.1, p.92
์ ์ ์ง์: Unit 7.1
ํต์ฌ ์ฐจ์ด:
| ๋ผ์ด๋ธ๋ฌ๋ฆฌ | ํ๋ ์์ํฌ | |
|---|---|---|
| ๋๊ฐ ํ๋ฆ์ ์ ์ด | ๋ด ์ฝ๋ | ํ๋ ์์ํฌ |
| ํธ์ถ ๋ฐฉํฅ | ๋ด ์ฝ๋ โ ๋ผ์ด๋ธ๋ฌ๋ฆฌ | ํ๋ ์์ํฌ โ ๋ด ์ฝ๋ |
| ๋น์ | ๋ง์น (ํ์ํ ๋ ๊บผ๋ด ์) | ๊ณต์ฅ (๋ค์ด๊ฐ์ ์ผํจ) |
Hollywood Principle: "Don't call us, we'll call you" (ํ๋ ์์ํฌ๊ฐ ๋๋ฅผ ๋ถ๋ฅธ๋ค)
์๊ธฐ ์ ๋ณ
์๋ณธ ์๋ฃ: ํ ๋น์ ์คํ๋ง vol.1, p.93
์ ์ ์ง์: Unit 7.2
ํต์ฌ ๊ฐ๋
IoC๋ฅผ ์ค์ ๋ก ๊ตฌํํ๋ ค๋ฉด ๋๊ตฐ๊ฐ๊ฐ:
์ด ์ญํ ์ ํ๋ ๊ฒ IoC ์ปจํ ์ด๋ = Spring์ ApplicationContext.
์๊ธฐ ์ ๊ฒ
์๋ณธ ์๋ฃ: ํ ๋น์ ์คํ๋ง vol.1, p.94
๋ชฉํ: Spring์ ํต์ฌ ํด๋์ค ApplicationContext์ DI์ ๋์์ ์ดํดํ๋ค.
์ ์ ์ง์: Phase 7
ํต์ฌ ๊ฐ๋
@Configuration
public class DaoFactory {
@Bean
public UserDao userDao() {
return new UserDao(connectionMaker());
}
@Bean
public ConnectionMaker connectionMaker() {
return new DConnectionMaker();
}
}
ApplicationContext ctx = new AnnotationConfigApplicationContext(DaoFactory.class);
UserDao dao = ctx.getBean("userDao", UserDao.class);
์๊ธฐ ์ ๊ฒ
@Bean ๋ฉ์๋์ ์ด๋ฆ์ด ๋น์ ID๊ฐ ๋๋ ์ด์ ๋?์๋ณธ ์๋ฃ: ํ ๋น์ ์คํ๋ง vol.1, p.95
์ ์ ์ง์: Unit 8.1
ํต์ฌ ๋์
ctx.getBean("userDao") ํธ์ถ ์ ApplicationContext๋:
1. ๋น ๋ชฉ๋ก์์ "userDao" ์ฐพ๊ธฐ
2. ์์ผ๋ฉด @Bean ๋ฉ์๋ ํธ์ถ โ ๊ฐ์ฒด ์์ฑ
3. ์์กดํ๋ ๋ค๋ฅธ ๋น๋ ์๋์ผ๋ก ๊ฐ์ด ์์ฑยท์ฃผ์
4. ๋ง๋ค์ด์ง ๋น ๋ฐํ
์๊ธฐ ์ ๊ฒ
์๋ณธ ์๋ฃ: ํ ๋น์ ์คํ๋ง vol.1, p.100
์ ์ ์ง์: Unit 8.2
ํต์ฌ ๊ฐ๋
getBean()์ 100๋ฒ ํธ์ถํด๋ ๊ฐ์ฒด๋ 1๊ฐ.
์ ์ฑ๊ธํค?
์ฃผ์: ์ฑ๊ธํค ๋น์ stateless ์ฌ์ผ ์์ :
์๊ธฐ ์ ๊ฒ
getInstance())๊ณผ Spring ์ฑ๊ธํค์ ์ฐจ์ด๋?์๋ณธ ์๋ฃ: ํ ๋น์ ์คํ๋ง vol.1, p.104~106
์ ์ ์ง์: Unit 8.3
ํต์ฌ ๊ฐ๋
DI (Dependency Injection):
"๊ตฌ์ฒด์ ์ธ ์์กด ์ค๋ธ์ ํธ์ ๊ทธ๊ฒ์ ์ฌ์ฉํ ํด๋ผ์ด์ธํธ๋ฅผ ๋ฐํ์์ ์ฐ๊ฒฐํด์ฃผ๋ ์์ "
3๊ฐ์ง ํต์ฌ:
1. ์์กด: A๊ฐ B๋ฅผ ์ฌ์ฉ (A โ B)
2. ์ธํฐํ์ด์ค ์์กด: A๋ B์ ์ธํฐํ์ด์ค์๋ง ์์กด (๊ตฌ์ฒด ๊ตฌํ ๋ชจ๋ฆ)
3. ์ธ๋ถ ์ฃผ์
: ์ปจํ
์ด๋๊ฐ ๋ฐํ์์ ๊ตฌ์ฒด ๊ตฌํ์ ์ฃผ์
3๊ฐ์ง ์ฃผ์ ๋ฐฉ์:
@Autowired ํ๋)์๊ธฐ ์ ๊ฒ
๋ฐ๋์ ๊น์ด ํ๊ธฐ:
[ ] Phase 1 โ ์ค๋ ๋ ํ์ ํ์์ฑ ์ฌ์ ๋ฆฌ (Unit 1.1~1.3)
[ ] Phase 2 โ ๋์์ฑ ์์ ๋๊ตฌ 3์ข
๋น๊ต (Unit 2.1~2.4)
[ ] Phase 3 โ ์ ํต DAO์ ๋ฌธ์ (Unit 3.1~3.3)
[ ] Phase 4 โ ๊ด์ฌ์ฌ์ ๋ถ๋ฆฌ (Unit 4.1~4.3)
[ ] Phase 5 โ ๋์์ธ ํจํด ์ ์ฉ (Unit 5.1~5.3)
[ ] Phase 6 โ OCP & ์ ๋ต ํจํด (Unit 6.1~6.3)
[ ] Phase 7 โ ์ ์ด์ ์ญ์ (Unit 7.1~7.3)
[ ] Phase 8 โ Spring ์ปจํ
์ด๋ (Unit 8.1~8.4)
[ ] ์ข
ํฉ ์๊ธฐ ์ ๊ฒ 20๋ฌธํญ ํต๊ณผ
| ๋์์ฑ (Part A) | Spring (Part B) |
|---|---|
| ์ค๋ ๋ ํ = "์ค๋ ๋๋ฅผ ๋๊ฐ ๊ด๋ฆฌํ๋๊ฐ" | IoC ์ปจํ ์ด๋ = "๊ฐ์ฒด๋ฅผ ๋๊ฐ ๊ด๋ฆฌํ๋๊ฐ" |
| Atomic/synchronized = "๊ณต์ ์์ ๋ณดํธ" | ์ฑ๊ธํค ๋น = "๊ณต์ ๋๋ ๊ฐ์ฒด" โ stateless ํ์ |
| ExecutorService = ์ค๋ ๋ ์ถ์ํ | ApplicationContext = ๊ฐ์ฒด ์ถ์ํ |
โ ๋ ํ๋ฆ์ ๋ณธ์ง์ "๊ด๋ฆฌ ์ฑ ์์ ์์" ์ด๋ผ๋ ๋์ผํ ์ฌ์.