๐ŸŽฏ F-lab Java 6์ฃผ์ฐจ ํ•™์Šต ์ปค๋ฆฌํ˜๋Ÿผ

6์ฃผ์ฐจ ์ž๋ฃŒ์˜ ๋ชจ๋“  ํ† ํ”ฝ์„ ๋‘ ๊ฐœ์˜ ํฐ ํ๋ฆ„์œผ๋กœ ์ •๋ฆฌํ•œ ํ•™์Šต ๊ฒฝ๋กœ.
1) ํ•™์Šต ๋„๊ตฌ์™€ ํ™˜๊ฒฝ โ€” JUnit ํ…Œ์ŠคํŠธ, ์›น ์ธํ”„๋ผ(์„œ๋ฒ„/WAS/JAR/WAR)
2) DB ์ ‘๊ทผ์˜ ์ง„ํ™” โ€” JDBC โ†’ Connection Pool โ†’ DataSource โ†’ ํŠธ๋žœ์žญ์…˜ โ†’ JdbcTemplate

5์ฃผ์ฐจ์—์„œ IoC/DI๋ฅผ ๋ฐฐ์› ๋‹ค๋ฉด, 6์ฃผ์ฐจ๋Š” ๊ทธ๊ฒƒ์„ ํ…Œ์ŠคํŠธ๋กœ ๊ฒ€์ฆ ํ•˜๊ณ  ์›นยทDB ํ™˜๊ฒฝ์œผ๋กœ ํ™•์žฅํ•œ๋‹ค.


๐Ÿ“Š ํ•™์Šต ๊ฒฝ๋กœ ํ•œ๋ˆˆ์— ๋ณด๊ธฐ

[Part A โ€” ํ•™์Šต ๋„๊ตฌ์™€ ํ™˜๊ฒฝ]
  [Phase 1] JUnit ํ…Œ์ŠคํŠธ
     โ†“
  [Phase 2] ์›น ์ธํ”„๋ผ ๊ธฐ์ดˆ (์›น์„œ๋ฒ„/WAS/์„œ๋ธ”๋ฆฟ/JAR/WAR)

[Part B โ€” DB ์ ‘๊ทผ์˜ ์ง„ํ™”] โ† 6์ฃผ์ฐจ์˜ ์ •์ 
  [Phase 3] JDBC ํ‘œ์ค€ํ™”์˜ ๋“ฑ์žฅ
     โ†“
  [Phase 4] Connection Pool๊ณผ DB ์„ธ์…˜
     โ†“
  [Phase 5] DataSource ์ธํ„ฐํŽ˜์ด์Šค (์ถ”์ƒํ™”์˜ ์ง„ํ™”)
     โ†“
  [Phase 6] ํŠธ๋žœ์žญ์…˜๊ณผ ACID
     โ†“
  [Phase 7] JdbcTemplate (๋ฐ˜๋ณต ์ œ๊ฑฐ)

์ด 7 Phase ร— 28 Unit

๐Ÿ”— 1~6์ฃผ์ฐจ ํ๋ฆ„ ์ •๋ฆฌ

์ฃผ์ฐจ์ฃผ์ œํ•ต์‹ฌ ๋ณ€ํ™”
1์ฃผ์ฐจOOPยทJVMยทGCยท์ปฌ๋ ‰์…˜ยทI/O ๊ฐœ๋ก ์ž๋ฐ” ํฐ ๊ทธ๋ฆผ
2์ฃผ์ฐจJVM ๋‚ด๋ถ€ยท๋ฐ”์ดํŠธ์ฝ”๋“œยทG1 GC"์–ด๋–ป๊ฒŒ ๋Œ์•„๊ฐ€๋‚˜"
3์ฃผ์ฐจ์ปฌ๋ ‰์…˜ยท์ œ๋„ค๋ฆญยทํ•จ์ˆ˜ํ˜•์ž๋ฐ” ํ‘œํ˜„๋ ฅ
4์ฃผ์ฐจ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉยท๋™์‹œ์„ฑยทExecutor๋™์‹œ์„ฑ ์ •๋ณต
5์ฃผ์ฐจAtomic + Spring IoC/DI ์ž…๋ฌธ์ž๋ฐ” โ†’ Spring ๋‹ค๋ฆฌ
6์ฃผ์ฐจ (์ง€๊ธˆ)ํ…Œ์ŠคํŠธ + ์›น ์ธํ”„๋ผ + DB ์ ‘๊ทผ์˜ ์ง„ํ™”Spring ์‹ค์ „ ํ™˜๊ฒฝ

๐Ÿ—“๏ธ ๊ถŒ์žฅ ํ•™์Šต ์ผ์ • (์••์ถ• 7์ผ)

DayPhaseํ•™์Šต ๋ชฉํ‘œ
1์ผ์ฐจPhase 1JUnit ํ…Œ์ŠคํŠธ ๋งˆ์Šคํ„ฐ
2์ผ์ฐจPhase 2์›น ์ธํ”„๋ผ ๊ธฐ์ดˆ + JAR/WAR
3์ผ์ฐจPhase 3JDBC์˜ ๋ณธ์งˆ ์ดํ•ด
4์ผ์ฐจPhase 4Connection Pool + DB ์„ธ์…˜
5์ผ์ฐจPhase 5DataSource ์ถ”์ƒํ™”
6์ผ์ฐจPhase 6ํŠธ๋žœ์žญ์…˜ ACID ์™„์ „ ์ •๋ณต
7์ผ์ฐจPhase 7JdbcTemplate ์‹ค์ „

๐Ÿงช Part A โ€” ํ•™์Šต ๋„๊ตฌ์™€ ํ™˜๊ฒฝ

๐Ÿ“š Phase 1 โ€” JUnit ํ…Œ์ŠคํŠธ

๋ชฉํ‘œ: 5์ฃผ์ฐจ์—์„œ ๋งŒ๋“  IoC/DI ์ฝ”๋“œ๋ฅผ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋กœ ๊ฒ€์ฆํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ตํžŒ๋‹ค. ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ = ์ข‹์€ ์ฝ”๋“œ ๋ผ๋Š” ๋ช…์ œ๋ฅผ ์ฒดํ™”ํ•œ๋‹ค.

Unit 1.1 โ€” ๋‹จ์œ„ ํ…Œ์ŠคํŠธ์˜ ํ•„์š”์„ฑ

์„ ์ˆ˜ ์ง€์‹: 5์ฃผ์ฐจ Phase 8 (DI)

ํ•ต์‹ฌ ๊ฐœ๋…

์™œ ํ…Œ์ŠคํŠธ์ธ๊ฐ€:

  • main()์œผ๋กœ ๊ฒ€์ฆ = ๋งค๋ฒˆ ์ง์ ‘ ๋ณด๊ณ  ํŒ๋‹จํ•ด์•ผ ํ•จ โ†’ ๋น„ํšจ์œจ
  • ์ฝ”๋“œ ๋ณ€๊ฒฝ ์‹œ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ๋‹ค์‹œ ๊ฒ€์ฆํ•ด์•ผ ํ•จ โ†’ ์‚ฌ๋žŒ์ด ๋ชป ํ•œ๋‹ค
  • ์ž๋™ํ™”๋œ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ = ์ฝ”๋“œ๊ฐ€ ์ฝ”๋“œ๋ฅผ ๊ฒ€์ฆ

์ข‹์€ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ์˜ ์กฐ๊ฑด:

  • ์ž๋™ํ™”: ์‚ฌ๋žŒ ๊ฐœ์ž… ์—†์ด ์‹คํ–‰
  • ๊ฒฉ๋ฆฌ: ๋‹ค๋ฅธ ํ…Œ์ŠคํŠธ์˜ ์˜ํ–ฅ ์—†์Œ
  • ๋น ๋ฆ„: ์ž์ฃผ ๋Œ๋ฆด ์ˆ˜ ์žˆ๋Š” ์†๋„
  • ๋ฐ˜๋ณต ๊ฐ€๋Šฅ: ๊ฐ™์€ ๊ฒฐ๊ณผ ๋ณด์žฅ

์ž๊ธฐ ์ ๊ฒ€

  • main()์œผ๋กœ ๋™์ž‘ ํ™•์ธํ•˜๋Š” ๊ฒƒ๊ณผ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ์˜ ๋ณธ์งˆ์  ์ฐจ์ด๋Š”?
  • 5์ฃผ์ฐจ์—์„œ ๋งŒ๋“  UserDao ์ฝ”๋“œ๋ฅผ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์–ด๋ ค์šด ๋ถ€๋ถ„์ด ์žˆ๋‹ค๋ฉด?

Unit 1.2 โ€” assertThat๊ณผ ๋งค์ฒ˜(Matcher)

์„ ์ˆ˜ ์ง€์‹: Unit 1.1

ํ•ต์‹ฌ ๊ฐœ๋…

import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertThat;

assertThat(user2.getName(), is(user.getName()));

๊ตฌ์„ฑ:

  • assertThat(actual, matcher): ์ฒซ ์ธ์ž(์‹ค์ œ ๊ฐ’)๋ฅผ ๋งค์ฒ˜์™€ ๋น„๊ต
  • is(expected): equals ๋น„๊ต ๋งค์ฒ˜ (Hamcrest ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ)

์ „ํ†ต ๋ฐฉ์‹ vs Hamcrest:

// ์ „ํ†ต (JUnit 4)
assertEquals(user.getName(), user2.getName());

// Hamcrest ๋งค์ฒ˜
assertThat(user2.getName(), is(user.getName()));

์žฅ์ : ์ž์—ฐ์–ด์ฒ˜๋Ÿผ ์ฝํž˜ ("user2์˜ ์ด๋ฆ„์ด user์˜ ์ด๋ฆ„์ด๋‹ค")

์ž๊ธฐ ์ ๊ฒ€

  • is() ์™ธ์— ์ž์ฃผ ์“ฐ๋Š” ๋งค์ฒ˜๋Š”? (ํžŒํŠธ: nullValue, containsString, greaterThan)
  • ์ตœ์‹  JUnit 5์˜ assertEquals์™€ Hamcrest ์ค‘ ๋ฌด์—‡์„ ์“ธ๊นŒ?

์›๋ณธ ์ž๋ฃŒ: ํ† ๋น„์˜ ์Šคํ”„๋ง vol.1, p.159


Unit 1.3 โ€” JUnit์ด ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ์‹

์„ ์ˆ˜ ์ง€์‹: Unit 1.2

ํ•ต์‹ฌ ๊ฐœ๋…

JUnit์ด ํ•œ ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” 7๋‹จ๊ณ„:
1. @Test๊ฐ€ ๋ถ™์€ public void ํŒŒ๋ผ๋ฏธํ„ฐ ์—†๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ๋ชจ๋‘ ์ฐพ์Œ
2. ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค์˜ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ฆ
3. @BeforeEach(๋˜๋Š” @Before) ๋ฉ”์„œ๋“œ ์‹คํ–‰
4. @Test ๋ฉ”์„œ๋“œ ํ•˜๋‚˜ ํ˜ธ์ถœ, ๊ฒฐ๊ณผ ์ €์žฅ
5. @AfterEach ๋ฉ”์„œ๋“œ ์‹คํ–‰
6. ๋‚˜๋จธ์ง€ ํ…Œ์ŠคํŠธ ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•ด 2~5 ๋ฐ˜๋ณต
7. ๋ชจ๋“  ๊ฒฐ๊ณผ ์ข…ํ•ฉ ๋ฐ˜ํ™˜

ํ•ต์‹ฌ ํฌ์ธํŠธ: ๊ฐ ํ…Œ์ŠคํŠธ๋งˆ๋‹ค ์ƒˆ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ

์ž๊ธฐ ์ ๊ฒ€

  • ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜์— ๋ฐ์ดํ„ฐ๋ฅผ ๋ˆ„์ ์‹œํ‚ค๋Š” ์ฝ”๋“œ๊ฐ€ ๊ฐ€๋Šฅํ•œ๊ฐ€? (ํžŒํŠธ: NO)
  • @BeforeAll ๊ณผ @BeforeEach ์˜ ์ฐจ์ด๋Š”?

์›๋ณธ ์ž๋ฃŒ: ํ† ๋น„์˜ ์Šคํ”„๋ง vol.1, p.181


Unit 1.4 โ€” ๋งค๋ฒˆ ์ƒˆ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋งŒ๋“œ๋Š” ์ด์œ 

์„ ์ˆ˜ ์ง€์‹: Unit 1.3

ํ•ต์‹ฌ ๊ฐœ๋…

"๊ฐ ํ…Œ์ŠคํŠธ๊ฐ€ ์„œ๋กœ ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๊ณ  ๋…๋ฆฝ์ ์œผ๋กœ ์‹คํ–‰๋จ์„ ํ™•์‹คํžˆ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด"

์–ป๋Š” ์ด์ :

  • ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๋ฅผ ๋ถ€๋‹ด ์—†์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅ (์–ด์ฐจํ”ผ ๋‹ค์Œ ํ…Œ์ŠคํŠธ์—์„œ ์ดˆ๊ธฐํ™”๋จ)
  • ํ…Œ์ŠคํŠธ ๊ฐ„ ์˜์กด์„ฑ ์ œ๊ฑฐ
  • ์‹คํ–‰ ์ˆœ์„œ ๋ฌด๊ด€

์ž๊ธฐ ์ ๊ฒ€

  • ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜์— ๋น„์‹ผ ์ž์›(์˜ˆ: DB Connection)์„ ๋งŒ๋“ค๋ฉด ์–ด๋–ป๊ฒŒ ๋˜๋Š”๊ฐ€? (ํžŒํŠธ: ๋งค๋ฒˆ ์ƒ์„ฑ)
  • ํ…Œ์ŠคํŠธ ๊ฐ„ ๊ณต์œ ๊ฐ€ ์ •๋ง ํ•„์š”ํ•œ ์ž์›์€ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ• ๊นŒ? (ํžŒํŠธ: @BeforeAll)

์›๋ณธ ์ž๋ฃŒ: ํ† ๋น„์˜ ์Šคํ”„๋ง vol.1, p.182


Unit 1.5 โ€” ํ”ฝ์Šค์ฒ˜(Fixture)์™€ @BeforeEach

์„ ์ˆ˜ ์ง€์‹: Unit 1.4

ํ•ต์‹ฌ ๊ฐœ๋…

ํ”ฝ์Šค์ฒ˜(Fixture): ํ…Œ์ŠคํŠธ ์ˆ˜ํ–‰์— ํ•„์š”ํ•œ ์ •๋ณดยท์˜ค๋ธŒ์ ํŠธ

  • ์—ฌ๋Ÿฌ ํ…Œ์ŠคํŠธ๊ฐ€ ๊ณตํ†ต์œผ๋กœ ์“ฐ๋Š” ์ค€๋น„๋ฌผ
  • @BeforeEach๋กœ ๋งค ํ…Œ์ŠคํŠธ ์ „์— ์ƒˆ๋กœ ์ƒ์„ฑ
public class UserDaoTest {
    private UserDao dao;  // ํ”ฝ์Šค์ฒ˜

    @BeforeEach
    public void setUp() {
        ApplicationContext context = ...;
        this.dao = context.getBean("userDao", UserDao.class);
    }

    @Test
    public void test1() {
        dao.add(...);  // ํ”ฝ์Šค์ฒ˜ ์‚ฌ์šฉ
    }
}

ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ์˜ ์ผ๊ด€์„ฑ:

  • ์ฝ”๋“œ ๋ณ€๊ฒฝ์ด ์—†์œผ๋ฉด ํ•ญ์ƒ ๊ฐ™์€ ๊ฒฐ๊ณผ
  • DB ๋ฐ์ดํ„ฐ ์ž”์—ฌ๋กœ ์ธํ•œ ์‹คํŒจ = ์ž˜๋ชป๋œ ํ…Œ์ŠคํŠธ
  • โ†’ dao.deleteAll() ๊ฐ™์ด ์‹œ์ž‘ ์ƒํƒœ ๋ณด์žฅ

์ž๊ธฐ ์ ๊ฒ€

  • ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ์—์„œ DB ์ž”์—ฌ ๋ฐ์ดํ„ฐ ๋ฌธ์ œ๋Š” ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•˜๋Š”๊ฐ€? (ํžŒํŠธ: @Transactional, @Sql)
  • "ํ…Œ์ŠคํŠธ๋Š” ์™ธ๋ถ€ ํ™˜๊ฒฝ์— ์˜์กดํ•˜๋ฉด ์•ˆ ๋œ๋‹ค"๋Š” ์›์น™์˜ ์˜๋ฏธ๋Š”?

๐Ÿ“š Phase 2 โ€” ์›น ์ธํ”„๋ผ ๊ธฐ์ดˆ

๋ชฉํ‘œ: Spring MVC ํ•™์Šต ์ „, ์›น ๋ฐฑ์—”๋“œ์˜ ๊ธฐ๋ณธ ์ธํ”„๋ผ ์šฉ์–ด๋ฅผ ์ •๋ฆฌํ•œ๋‹ค. ๋ชจ๋ฅด๋ฉด ๋ฉด์ ‘ยท์‹ค๋ฌด ๋ชจ๋‘์—์„œ ํ—ค๋งจ๋‹ค.

Unit 2.1 โ€” ์›น์„œ๋ฒ„(Web Server) vs WAS(Web Application Server)

์„ ์ˆ˜ ์ง€์‹: 1์ฃผ์ฐจ Phase 7 (I/O)

ํ•ต์‹ฌ ๊ฐœ๋…

๊ตฌ๋ถ„์›น์„œ๋ฒ„WAS
์—ญํ• ์ •์  ์ž์› (HTML, CSS, ์ด๋ฏธ์ง€) ์ œ๊ณต๋™์  ์ž์› (์„œ๋ธ”๋ฆฟ, JSP) ์ฒ˜๋ฆฌ
์˜ˆ์‹œApache, NginxTomcat, Jetty, Undertow
์ฒ˜๋ฆฌํŒŒ์ผ ๊ทธ๋Œ€๋กœ ์‘๋‹ต์ฝ”๋“œ ์‹คํ–‰ โ†’ ๊ฒฐ๊ณผ ์‘๋‹ต

์‹ค๋ฌด ๊ตฌ์„ฑ:

[ํด๋ผ์ด์–ธํŠธ] โ†” [Nginx (์›น์„œ๋ฒ„)] โ†” [Tomcat (WAS)] โ†” [DB]
                ์ •์  ํŒŒ์ผ ์ฒ˜๋ฆฌ      ๋™์  ์š”์ฒญ๋งŒ ์œ„์ž„

์ž๊ธฐ ์ ๊ฒ€

  • WAS๋งŒ ์žˆ์–ด๋„ ์ •์  ํŒŒ์ผ ์„œ๋น™์ด ๋˜๋Š”๋ฐ, ์™œ ์›น์„œ๋ฒ„๋ฅผ ๋”ฐ๋กœ ๋‘๋Š”๊ฐ€?
  • Spring Boot์˜ ๋‚ด์žฅ ํ†ฐ์บฃ์€ ์–ด๋А ์˜์—ญ์— ํ•ด๋‹นํ•˜๋Š”๊ฐ€?

Unit 2.2 โ€” ์„œ๋ธ”๋ฆฟ(Servlet)๊ณผ JSP

์„ ์ˆ˜ ์ง€์‹: Unit 2.1

ํ•ต์‹ฌ ๊ฐœ๋…

์„œ๋ธ”๋ฆฟ(Servlet):

  • ์ž๋ฐ” ์ฝ”๋“œ๋กœ HTTP ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ํด๋ž˜์Šค
  • WAS ์œ„์—์„œ ์‹คํ–‰๋จ

JSP (Java Server Pages):

  • HTML ์•ˆ์— ์ž๋ฐ” ์ฝ”๋“œ๋ฅผ ์„ž์„ ์ˆ˜ ์žˆ๋Š” ํ…œํ”Œ๋ฆฟ
  • ๊ฒฐ๊ตญ ์ปดํŒŒ์ผ ์‹œ ์„œ๋ธ”๋ฆฟ์œผ๋กœ ๋ณ€ํ™˜๋˜์–ด ์‹คํ–‰

์—ญํ•  ๋ถ„๋‹ด์˜ ์ง„ํ™”:

  • ์ดˆ๊ธฐ: ์„œ๋ธ”๋ฆฟ์œผ๋กœ HTML๊นŒ์ง€ ๋‹ค ์ถœ๋ ฅ โ†’ ๊ฐ€๋…์„ฑ ์ตœ์•…
  • ํ•œ๋•Œ: JSP๋กœ๋งŒ ๋ชจ๋“  ๋กœ์ง โ†’ ์œ ์ง€๋ณด์ˆ˜ ์ง€์˜ฅ
  • ํ˜„์žฌ: JSP๋Š” View, ์„œ๋ธ”๋ฆฟ์€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง (MVC ํŒจํ„ด)

์ž๊ธฐ ์ ๊ฒ€

  • JSP๊ฐ€ ์„œ๋ธ”๋ฆฟ์œผ๋กœ ๋ณ€ํ™˜๋œ๋‹ค๋Š” ์‚ฌ์‹ค์ด ์–ด๋–ค ์˜๋ฏธ๋ฅผ ๊ฐ–๋Š”๊ฐ€?
  • ํ˜„๋Œ€ Spring ํ™˜๊ฒฝ์—์„œ JSP๋Š” ์—ฌ์ „ํžˆ ์“ฐ์ด๋Š”๊ฐ€? (ํžŒํŠธ: Thymeleaf)

Unit 2.3 โ€” SSR vs CSR

์„ ์ˆ˜ ์ง€์‹: Unit 2.2

ํ•ต์‹ฌ ๊ฐœ๋…

๊ตฌ๋ถ„SSR (Server Side Rendering)CSR (Client Side Rendering)
ํ™”๋ฉด ์ƒ์„ฑ์„œ๋ฒ„์—์„œ HTML ์™„์„ฑ๋ธŒ๋ผ์šฐ์ €(JS)๊ฐ€ ํ™”๋ฉด ๊ทธ๋ฆผ
์ดˆ๊ธฐ ๋กœ๋”ฉ๋น ๋ฆ„๋А๋ฆผ (JS ๋‹ค์šด๋กœ๋“œ ํ•„์š”)
SEO์ข‹์Œ๊นŒ๋‹ค๋กœ์›€
์„œ๋ฒ„ ๋ถ€ํ•˜ํผ์ž‘์Œ (JSON๋งŒ)
์˜ˆ์‹œJSP, Thymeleaf, Next.js (SSR)React SPA, Vue SPA

์ž๊ธฐ ์ ๊ฒ€

  • SEO๊ฐ€ ์ค‘์š”ํ•œ ์„œ๋น„์Šค(์˜ˆ: ์‡ผํ•‘๋ชฐ, ๋ธ”๋กœ๊ทธ)์— ์ ํ•ฉํ•œ ๋ฐฉ์‹์€?
  • SSR์—์„œ๋„ React๋ฅผ ์“ธ ์ˆ˜ ์žˆ๋Š”๊ฐ€? (ํžŒํŠธ: Next.js)

Unit 2.4 โ€” JAR vs WAR

์„ ์ˆ˜ ์ง€์‹: Unit 2.2

ํ•ต์‹ฌ ๊ฐœ๋…

JARWAR
์ •์‹ ๋ช…์นญJava ArchiveWeb Application Archive
ํฌํ•จClass, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ+ JSP, Servlet, WEB-INF, META-INF
์‹คํ–‰ ํ™˜๊ฒฝJRE๋งŒ ์žˆ์œผ๋ฉด OK์™ธ๋ถ€ WAS ํ•„์š”
์‹คํ–‰java -jar app.jarTomcat ๋“ฑ์— ๋ฐฐํฌ
๊ตฌ์กฐ์ž์œ ์‚ฌ์ „ ์ •์˜๋œ ๋””๋ ‰ํ„ฐ๋ฆฌ ๊ตฌ์กฐ

Spring Boot์˜ ์„ ํƒ: JAR

  • ์ด์œ : WAS(Tomcat) ๋‚ด์žฅ โ†’ ๋ฐฐํฌยท์‹คํ–‰ ๊ฐ„๋‹จ
  • ๋ณ„๋„ WAS ์šด์˜ ๋ถˆํ•„์š” โ†’ DevOps ๋ถ€๋‹ด โ†“

WAR๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ:

  • JSP๋ฅผ ๋ฐ˜๋“œ์‹œ ์จ์•ผ ํ•˜๋Š” ๋ ˆ๊ฑฐ์‹œ
  • ์™ธ์žฅ WAS ์‚ฌ์šฉ ์ •์ฑ…์ด ์žˆ๋Š” ํ™˜๊ฒฝ

์ž๊ธฐ ์ ๊ฒ€

  • Spring Boot์˜ JAR๊ฐ€ ๋‚ด์žฅ ํ†ฐ์บฃ์„ ์–ด๋–ป๊ฒŒ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”๊ฐ€? (ํžŒํŠธ: BOOT-INF/lib)
  • ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค์—์„œ JAR๊ฐ€ ์„ ํ˜ธ๋˜๋Š” ์ด์œ ๋Š”?

๐Ÿ’พ Part B โ€” DB ์ ‘๊ทผ์˜ ์ง„ํ™” (6์ฃผ์ฐจ์˜ ์ •์ )

์ด ํŒŒํŠธ์˜ ํฐ ๊ทธ๋ฆผ:
"DB ์ฝ”๋“œ ํ•œ ์ค„์ด ์–ด๋–ป๊ฒŒ JdbcTemplate๊นŒ์ง€ ์ง„ํ™”ํ•˜๋Š”์ง€" โ€” 5์ฃผ์ฐจ์˜ DAO ์ง„ํ™”์— ์ด์–ด, ์ด๋ฒˆ์—” DB ์ ‘๊ทผ ์ž์ฒด์˜ ์ถ”์ƒํ™” ์—ฌ์ • ์„ ๋”ฐ๋ผ๊ฐ„๋‹ค.

๐Ÿ“š Phase 3 โ€” JDBC ํ‘œ์ค€ํ™”์˜ ๋“ฑ์žฅ

๋ชฉํ‘œ: JDBC๊ฐ€ ์™œ ๋“ฑ์žฅํ–ˆ๋Š”์ง€, ์–ด๋–ค ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ๊ณ  ์–ด๋–ค ๋ฌธ์ œ๋Š” ์•ˆ ํ•ด๊ฒฐํ–ˆ๋Š”์ง€ ๋ช…ํ™•ํžˆ ํ•œ๋‹ค.

Unit 3.1 โ€” JDBC ์—†๋˜ ์‹œ์ ˆ์˜ ๊ณ ํ†ต

์„ ์ˆ˜ ์ง€์‹: Phase 2

ํ•ต์‹ฌ ๊ฐœ๋…

JDBC ๋“ฑ์žฅ ์ „:

  • ๊ฐ DB๋งˆ๋‹ค ๊ณ ์œ  API (Oracle์šฉ, MySQL์šฉ, ...)
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ณ€๊ฒฝ ์‹œ ๋ชจ๋“  DB ์ฝ”๋“œ๋ฅผ ๋‹ค์‹œ ์ž‘์„ฑ
  • ๊ฐ DB์˜ ์‚ฌ์šฉ๋ฒ•์„ ์ƒˆ๋กœ ํ•™์Šต

์˜ˆ์‹œ (JDBC ์—†์„ ๋•Œ):

// ์ง์ ‘ ์†Œ์ผ“์œผ๋กœ MySQL ํ”„๋กœํ† ์ฝœ๊ณผ ํ†ต์‹ 
Socket socket = new Socket("localhost", 3306);
DataOutputStream out = new DataOutputStream(...);
out.writeUTF("Handshake request to MySQL server");
// MySQL์˜ ๋ฐ”์ด๋„ˆ๋ฆฌ ํ”„๋กœํ† ์ฝœ์„ ์ง์ ‘ ์•Œ์•„์•ผ ํ•จ

โ†’ ๊ฐœ๋ฐœ์ž๊ฐ€ DB ํ”„๋กœํ† ์ฝœ๊นŒ์ง€ ์•Œ์•„์•ผ ํ•˜๋Š” ์ง€์˜ฅ

์ž๊ธฐ ์ ๊ฒ€

  • ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ Oracle๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ–ˆ์„๊นŒ?
  • ์ด ๋ฌธ์ œ์™€ 5์ฃผ์ฐจ์˜ OCP ์œ„๋ฐ˜์€ ์–ด๋–ป๊ฒŒ ๋‹ฎ์•˜๋Š”๊ฐ€?

Unit 3.2 โ€” JDBC์˜ ํ‘œ์ค€ํ™” ํšจ๊ณผ

์„ ์ˆ˜ ์ง€์‹: Unit 3.1

ํ•ต์‹ฌ ๊ฐœ๋…

JDBC = ์ž๋ฐ”์˜ DB ์ ‘๊ทผ ํ‘œ์ค€ API

๊ฐ™์€ ์ฝ”๋“œ, ๋‹ค๋ฅธ DB:

// MySQL
String url = "jdbc:mysql://localhost:3306/mydb";
// Oracle
String url = "jdbc:oracle:thin:@localhost:1521:xe";
// PostgreSQL  
String url = "jdbc:postgresql://localhost:5432/mydb";

// ์ดํ›„ ๋ชจ๋“  ์ฝ”๋“œ๋Š” ๋™์ผ!
Connection conn = DriverManager.getConnection(url, user, pwd);
PreparedStatement ps = conn.prepareStatement("SELECT ...");
ResultSet rs = ps.executeQuery();

JDBC๊ฐ€ ํ•ด๊ฒฐํ•œ ๊ฒƒ:

  • DB ์—ฐ๊ฒฐ ๋ฐฉ์‹ ํ†ต์ผ
  • SQL ์‹คํ–‰ ๋ฐฉ์‹ ํ†ต์ผ
  • ๊ฒฐ๊ณผ ์ฒ˜๋ฆฌ ๋ฐฉ์‹ ํ†ต์ผ
  • DB ๊ต์ฒด ์‹œ URL๊ณผ ๋“œ๋ผ์ด๋ฒ„๋งŒ ๋ณ€๊ฒฝ

์ž๊ธฐ ์ ๊ฒ€

  • JDBC๋Š” 5์ฃผ์ฐจ์˜ ์–ด๋–ค ๋””์ž์ธ ํŒจํ„ด๊ณผ ๋‹ฎ์•˜๋Š”๊ฐ€? (ํžŒํŠธ: ์ „๋žต ํŒจํ„ด, ์ธํ„ฐํŽ˜์ด์Šค)
  • DriverManager๊ฐ€ ํ•˜๋Š” ์ผ์€?

Unit 3.3 โ€” JDBC๊ฐ€ ํ•ด๊ฒฐํ•˜์ง€ ์•Š๋Š” ๊ฒƒ

์„ ์ˆ˜ ์ง€์‹: Unit 3.2

ํ•ต์‹ฌ ํ•œ๊ณ„

JDBC๋Š” API๋Š” ํ†ต์ผ ํ–ˆ์ง€๋งŒ, SQL ๋ฌธ๋ฒ• ์ฐจ์ด๋Š” ๊ทธ๋Œ€๋กœ:

  • LIMIT vs ROWNUM (MySQL vs Oracle)
  • ์ž๋™ ์ฆ๊ฐ€ ์ปฌ๋Ÿผ ๋ฌธ๋ฒ• (AUTO_INCREMENT vs SEQUENCE)
  • ํŽ˜์ด์ง• ์ฒ˜๋ฆฌ ๋ฐฉ์‹

ํ•ด๊ฒฐ: ์ƒ์œ„ ํ”„๋ ˆ์ž„์›Œํฌ ์‚ฌ์šฉ

  • JdbcTemplate (Spring) โ€” JDBC ์ฝ”๋“œ ๋ฐ˜๋ณต ์ œ๊ฑฐ (Phase 7์—์„œ)
  • JPA / Hibernate โ€” ORM, SQL ์ž์ฒด๋ฅผ ๊ฑฐ์˜ ์•ˆ ์”€
  • MyBatis โ€” SQL์„ XML๋กœ ๋ถ„๋ฆฌ, DB๋ณ„ ๋ถ„๊ธฐ ๊ฐ€๋Šฅ

์ž๊ธฐ ์ ๊ฒ€

  • "JDBC๋Š” ํ‘œ์ค€ํ™”๊ฐ€ ๋๋Š”๋ฐ ์™œ ORM์ด ๋“ฑ์žฅํ–ˆ๋‚˜?"์˜ ๋‹ต์€?
  • ORM์ด SQL ๋ฌธ๋ฒ• ์ฐจ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•˜๋Š”๊ฐ€? (ํžŒํŠธ: Dialect)

๐Ÿ“š Phase 4 โ€” Connection Pool๊ณผ DB ์„ธ์…˜

๋ชฉํ‘œ: "์™œ ๋งค๋ฒˆ ์ƒˆ๋กœ ์—ฐ๊ฒฐํ•˜๋ฉด ์•ˆ ๋˜๋Š”๊ฐ€" ๋ผ๋Š” ๊ทผ๋ณธ ์งˆ๋ฌธ์— TCP/IP ๋ ˆ๋ฒจ๋กœ ๋‹ตํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

Unit 4.1 โ€” ๋งค ์š”์ฒญ๋งˆ๋‹ค ์—ฐ๊ฒฐ์˜ ๋น„ํšจ์œจ

์„ ์ˆ˜ ์ง€์‹: Phase 3

ํ•ต์‹ฌ ๊ฐœ๋…

DB ์—ฐ๊ฒฐ์˜ ๋น„์šฉ:
1. TCP/IP 3-way handshake (๋„คํŠธ์›Œํฌ ์™•๋ณต)
2. DB ์ธ์ฆ (ID/PW ๊ฒ€์ฆ)
3. DB๊ฐ€ ์„ธ์…˜ ์ƒ์„ฑ

โ†’ ๋งค ์š”์ฒญ๋งˆ๋‹ค ์ด๊ฑธ ๋‹ค ํ•˜๋ฉด?

  • 100๋งŒ ์š”์ฒญ = 100๋งŒ ๋ฒˆ์˜ handshake
  • DB ์‘๋‹ต์‹œ๊ฐ„๋ณด๋‹ค ์—ฐ๊ฒฐ ์„ค์ • ์‹œ๊ฐ„์ด ๋” ๊ธธ ์ˆ˜ ์žˆ์Œ

์ž๊ธฐ ์ ๊ฒ€

  • TCP 3-way handshake๊ฐ€ ์ •ํ™•ํžˆ ๋ญ”๊ฐ€? (ํžŒํŠธ: SYN, SYN-ACK, ACK)
  • DB ์—ฐ๊ฒฐ 1ํšŒ ์„ค์ •์— ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์€ ๋Œ€๋žต ์–ผ๋งˆ? (ํžŒํŠธ: ์ˆ˜~์ˆ˜๋ฐฑ ms)

Unit 4.2 โ€” Connection Pool ๊ฐœ๋…

์„ ์ˆ˜ ์ง€์‹: Unit 4.1

ํ•ต์‹ฌ ๊ฐœ๋…

"Connection์˜ ์ˆ˜์˜์žฅ"

๋™์ž‘ ๋ฐฉ์‹:
1. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹œ์ž‘ ์‹œ N๊ฐœ์˜ Connection ๋ฏธ๋ฆฌ ์ƒ์„ฑ
2. ์š”์ฒญ ์‹œ: ํ’€์—์„œ ๋นŒ๋ ค์˜ด
3. ์‚ฌ์šฉ ํ›„: ํ’€์— ๋ฐ˜ํ™˜
4. ํ’€์˜ Connection์€ ์žฌ์‚ฌ์šฉ

[์š”์ฒญ1] โ”€โ”€> [Pool์—์„œ Conn1 ๋นŒ๋ฆผ] โ”€โ”€> [DB ์ž‘์—…] โ”€โ”€> [Conn1 ๋ฐ˜ํ™˜]
[์š”์ฒญ2] โ”€โ”€> [Pool์—์„œ Conn2 ๋นŒ๋ฆผ] โ”€โ”€> [DB ์ž‘์—…] โ”€โ”€> [Conn2 ๋ฐ˜ํ™˜]
                ...

๋Œ€ํ‘œ ๊ตฌํ˜„์ฒด:

  • HikariCP (Spring Boot ๊ธฐ๋ณธ)
  • DBCP2
  • Tomcat JDBC Pool

์ž๊ธฐ ์ ๊ฒ€

  • Connection ํ’€ ํฌ๊ธฐ๋Š” ์–ด๋–ป๊ฒŒ ๊ฒฐ์ •ํ•˜๋Š”๊ฐ€? (ํžŒํŠธ: CPU ์ฝ”์–ด, ์ž‘์—… ์‹œ๊ฐ„)
  • ํ’€ ํฌ๊ธฐ๋ณด๋‹ค ๋™์‹œ ์š”์ฒญ์ด ๋งŽ์œผ๋ฉด?

Unit 4.3 โ€” DB ์„ธ์…˜๊ณผ ์—ฐ๊ฒฐ ๊ตฌ์กฐ

์„ ์ˆ˜ ์ง€์‹: Unit 4.2

ํ•ต์‹ฌ ๊ฐœ๋…

์—ฐ๊ฒฐ ์ ˆ์ฐจ:
1. ํด๋ผ์ด์–ธํŠธ โ†’ DB ์„œ๋ฒ„์— ์—ฐ๊ฒฐ ์š”์ฒญ (TCP ์—ฐ๊ฒฐ)
2. DB๊ฐ€ ์„ธ์…˜ ์ƒ์„ฑ (ํŠธ๋žœ์žญ์…˜ ๋‹จ์œ„)
3. ํด๋ผ์ด์–ธํŠธ๊ฐ€ SQL ์ „๋‹ฌ โ†’ ์„ธ์…˜์ด ์‹คํ–‰
4. ์„ธ์…˜์ด ํŠธ๋žœ์žญ์…˜ ์‹œ์ž‘ โ†’ commit/rollback์œผ๋กœ ์ข…๋ฃŒ
5. ์‚ฌ์šฉ์ž๊ฐ€ ์ปค๋„ฅ์…˜ ๋‹ซ๊ฑฐ๋‚˜ DB ๊ด€๋ฆฌ์ž๊ฐ€ ์„ธ์…˜ ์ข…๋ฃŒ

์ค‘์š”ํ•œ ๋งคํ•‘:

  • ์ปค๋„ฅ์…˜ ํ’€์˜ Connection N๊ฐœ = DB ์„ธ์…˜ N๊ฐœ

์ž๊ธฐ ์ ๊ฒ€

  • ํ•œ Connection์—์„œ ๋™์‹œ์— ๋‘ ํŠธ๋žœ์žญ์…˜์ด ๊ฐ€๋Šฅํ•œ๊ฐ€? (ํžŒํŠธ: NO)
  • ํ’€์— Connection 100๊ฐœ๋ฉด DB ์ž…์žฅ์—์„œ ๋ฌด์—‡์ด ๋งŒ๋“ค์–ด์ง€๋Š”๊ฐ€?

Unit 4.4 โ€” DB Lock ๊ฐœ๋…

์„ ์ˆ˜ ์ง€์‹: Unit 4.3

ํ•ต์‹ฌ ๊ฐœ๋…

์™œ ๋ฝ์ด ํ•„์š”ํ•œ๊ฐ€:

  • ์„ธ์…˜1: ๋ฐ์ดํ„ฐ ์ˆ˜์ • ์ค‘ (์•„์ง commit ์•ˆ ํ•จ)
  • ์„ธ์…˜2: ๊ฐ™์€ ๋ฐ์ดํ„ฐ ๋™์‹œ ์ˆ˜์ • ์‹œ๋„
  • โ†’ ํŠธ๋žœ์žญ์…˜์˜ ์›์ž์„ฑ ๊นจ์ง
  • โ†’ ์„ธ์…˜1์ด ๋กค๋ฐฑํ•˜๋ฉด ์„ธ์…˜2๋Š” ์ž˜๋ชป๋œ ๋ฐ์ดํ„ฐ ์ˆ˜์ •

ํ•ด๊ฒฐ: ํŠธ๋žœ์žญ์…˜ ์ง„ํ–‰ ์ค‘์—๋Š” ๋‹ค๋ฅธ ์„ธ์…˜์ด ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ • ๋ชป ํ•˜๋„๋ก ๋ฝ

๋ฝ์˜ ์ข…๋ฅ˜ (๊ฐ„๋žต):

  • ๊ณต์œ  ๋ฝ(S): ์ฝ๊ธฐ์šฉ, ์—ฌ๋Ÿฌ ์„ธ์…˜์ด ๋™์‹œ ๋ณด์œ  ๊ฐ€๋Šฅ
  • ๋ฐฐํƒ€ ๋ฝ(X): ์“ฐ๊ธฐ์šฉ, ํ•œ ์„ธ์…˜๋งŒ ๋ณด์œ 

์ž๊ธฐ ์ ๊ฒ€

  • DB ๋ฝ๊ณผ 4์ฃผ์ฐจ์˜ ์ž๋ฐ” synchronized ๋ฝ์€ ์–ด๋–ค ์ ์ด ๋‹ฎ์•˜๋Š”๊ฐ€?
  • ๋ฐ๋“œ๋ฝ์ด DB์—์„œ๋„ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€?

๐Ÿ“š Phase 5 โ€” DataSource ์ธํ„ฐํŽ˜์ด์Šค (์ถ”์ƒํ™”์˜ ์ง„ํ™”)

๋ชฉํ‘œ: 5์ฃผ์ฐจ์˜ ์ธํ„ฐํŽ˜์ด์Šค ์ถ”์ƒํ™” ์ •์‹ ์ด ์ž๋ฐ” ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์–ด๋–ป๊ฒŒ ๋…น์•„์žˆ๋Š”์ง€ ๋ณธ๋‹ค.

Unit 5.1 โ€” ๋‹ค์–‘ํ•œ ์ปค๋„ฅ์…˜ ํš๋“ ๋ฐฉ์‹

์„ ์ˆ˜ ์ง€์‹: Phase 4

ํ•ต์‹ฌ ๊ฐœ๋…

์ปค๋„ฅ์…˜์„ ์–ป๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์–‘:

  • DriverManager.getConnection() โ€” ๋งค๋ฒˆ ์ƒˆ๋กœ ๋งŒ๋“ฆ (ํ’€ X)
  • HikariCP โ€” ์ปค๋„ฅ์…˜ ํ’€
  • DBCP2 โ€” ์ปค๋„ฅ์…˜ ํ’€
  • Tomcat JDBC Pool โ€” ์ปค๋„ฅ์…˜ ํ’€

๋ฌธ์ œ:

// DriverManager ์‚ฌ์šฉ ์ฝ”๋“œ
Connection c = DriverManager.getConnection(url, user, pwd);

// HikariCP๋กœ ๋ณ€๊ฒฝ ์‹œ
HikariDataSource ds = new HikariDataSource();
ds.setJdbcUrl(url); ...
Connection c = ds.getConnection();  // โ† ์‚ฌ์šฉ๋ฒ•์ด ๋‹ค๋ฆ„!

โ†’ ์ปค๋„ฅ์…˜ ํš๋“ ๋ฐฉ๋ฒ•์ด ๋ฐ”๋€Œ๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ๊ฐ€ ๋‹ค ๋ฐ”๋€๋‹ค

์ž๊ธฐ ์ ๊ฒ€

  • ์ด ๋ฌธ์ œ์™€ 5์ฃผ์ฐจ์˜ ConnectionMaker ์ธํ„ฐํŽ˜์ด์Šค ๋„์ž…์€ ์–ด๋–ป๊ฒŒ ๋‹ฎ์•˜๋Š”๊ฐ€?

Unit 5.2 โ€” ์ถ”์ƒํ™”์˜ ํ•„์š”์„ฑ

์„ ์ˆ˜ ์ง€์‹: Unit 5.1

ํ•ต์‹ฌ ํ†ต์ฐฐ

5์ฃผ์ฐจ์—์„œ ๋ณธ OCP ์ •์‹ ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ:

  • ๋ณ€๊ฒฝ์˜ ์••๋ ฅ์ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ๊นŒ์ง€ ์ „ํŒŒ
  • โ†’ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ถ”์ƒํ™”
  • โ†’ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ธํ„ฐํŽ˜์ด์Šค์—๋งŒ ์˜์กด

ํ•ด๊ฒฐ์˜ ๋ฐฉํ–ฅ:

"์ปค๋„ฅ์…˜์„ ์–ป๋Š” ๋ฐฉ๋ฒ•" ์ž์ฒด๋ฅผ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋ถ„๋ฆฌ

์ž๊ธฐ ์ ๊ฒ€

  • 5์ฃผ์ฐจ์˜ ConnectionMaker์™€ ์ด๋ฒˆ์— ๋‚˜์˜ฌ DataSource๋Š” ๊ฐ™์€ ์‚ฌ์ƒ์˜ ๋‹ค๋ฅธ ์ด๋ฆ„์ธ๊ฐ€?

Unit 5.3 โ€” DataSource ์ธํ„ฐํŽ˜์ด์Šค

์„ ์ˆ˜ ์ง€์‹: Unit 5.2

ํ•ต์‹ฌ ๊ฐœ๋…

javax.sql.DataSource โ€” ์ž๋ฐ” ํ‘œ์ค€ ์ธํ„ฐํŽ˜์ด์Šค

public interface DataSource {
    Connection getConnection() throws SQLException;
    // ... ๊ธฐํƒ€
}

ํ•ต์‹ฌ ๋ฉ”์„œ๋“œ๋Š” getConnection() ํ•˜๋‚˜.

๊ตฌํ˜„์ฒด๋“ค:

  • HikariDataSource (HikariCP)
  • BasicDataSource (DBCP2)
  • DriverManagerDataSource (Spring ์ œ๊ณต, ํ’€ ์—†์Œ)

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ:

@Autowired
private DataSource dataSource;  // ์ธํ„ฐํŽ˜์ด์Šค์— ์˜์กด

public void something() {
    Connection c = dataSource.getConnection();  // ์–ด๋–ค ๊ตฌํ˜„์ฒด๋“  OK
    // ...
}

HikariCP โ†’ DBCP2 ๋ณ€๊ฒฝ ์‹œ: ์„ค์ • ํŒŒ์ผ๋งŒ ๋ณ€๊ฒฝ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ๋Š” ๊ทธ๋Œ€๋กœ.

์ž๊ธฐ ์ ๊ฒ€

  • DataSource๋Š” 1์ฃผ์ฐจ์˜ ์–ด๋–ค SOLID ์›์น™์˜ ๊ตฌํ˜„์ฒด์ธ๊ฐ€? (ํžŒํŠธ: DIP)
  • Spring Boot๊ฐ€ ๊ธฐ๋ณธ DataSource๋กœ ๋ฌด์—‡์„ ์“ฐ๋Š”๊ฐ€?

Unit 5.4 โ€” DriverManagerDataSource (ํŠน์ˆ˜ ์ผ€์ด์Šค)

์„ ์ˆ˜ ์ง€์‹: Unit 5.3

ํ•ต์‹ฌ ๊ฐœ๋…

๋ฌธ์ œ: DriverManager๋Š” DataSource๋ฅผ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์Œ

Spring์˜ ํ•ด๊ฒฐ: DriverManagerDataSource

  • ๋‚ด๋ถ€์ ์œผ๋กœ DriverManager ํ˜ธ์ถœ
  • ์™ธ๋ถ€์ ์œผ๋กœ๋Š” DataSource ์ธํ„ฐํŽ˜์ด์Šค ์ œ๊ณต
  • โ†’ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ DataSource์—๋งŒ ์˜์กด

์šฉ๋„:

  • ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ (ํ’€ ๋ถˆํ•„์š”)
  • ํ•™์Šต์šฉ

ํ”„๋กœ๋•์…˜์—์„œ๋Š” ์ ˆ๋Œ€ ์“ฐ์ง€ ๋ง ๊ฒƒ (ํ’€์ด ์—†์–ด์„œ ์„ฑ๋Šฅ ํญ๋ง)

์ž๊ธฐ ์ ๊ฒ€

  • DriverManagerDataSource์™€ HikariDataSource๋ฅผ ๊ฐ™์€ ์ฝ”๋“œ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ด์œ ๋Š”?
  • ์ด๊ฒŒ 5์ฃผ์ฐจ์˜ ์–ด๋Œ‘ํ„ฐ ํŒจํ„ด๊ณผ ๋‹ฎ์€๊ฐ€?

๐Ÿ“š Phase 6 โ€” ํŠธ๋žœ์žญ์…˜๊ณผ ACID

๋ชฉํ‘œ: DB ํŠธ๋žœ์žญ์…˜์˜ 4๊ฐ€์ง€ ํ•ต์‹ฌ ์„ฑ์งˆ์„ ์‹ค์ƒํ™œ ์˜ˆ์ œ๋กœ ์ฒดํ™”ํ•˜๊ณ , ๋ฉ€ํ‹ฐ ์„ธ์…˜ ํ™˜๊ฒฝ์—์„œ์˜ ๋™์ž‘์„ ๋ณธ๋‹ค.

Unit 6.1 โ€” ํŠธ๋žœ์žญ์…˜์ด๋ž€

์„ ์ˆ˜ ์ง€์‹: Phase 4

ํ•ต์‹ฌ ๊ฐœ๋…

"ํ•œ ๋‹จ์œ„์˜ ์ž‘์—… ์œผ๋กœ ์ทจ๊ธ‰๋˜๋Š” ๋ชจ๋“  ์ž‘์—…"

๊ณ„์ขŒ ์ด์ฒด ์˜ˆ์‹œ:

  • ์ž‘์—…1: A ๊ณ„์ขŒ์—์„œ ์ถœ๊ธˆ
  • ์ž‘์—…2: B ๊ณ„์ขŒ์— ์ž…๊ธˆ
  • ๋‘ ์ž‘์—…์„ ํ•˜๋‚˜์˜ ๋‹จ์œ„ ๋กœ ๋ฌถ์Œ = ํŠธ๋žœ์žญ์…˜

ํŠธ๋žœ์žญ์…˜์˜ ๋:

  • Commit: ๋ชจ๋“  ๋ณ€๊ฒฝ ์˜๊ตฌ ์ ์šฉ
  • Rollback: ๋ชจ๋“  ๋ณ€๊ฒฝ ์ทจ์†Œ

์ž๊ธฐ ์ ๊ฒ€

  • ๊ฒŒ์‹œ๊ธ€ ์ž‘์„ฑ ์‹œ ํŠธ๋žœ์žญ์…˜ ๋‹จ์œ„๋Š”?
  • "๋‹จ์œ„"์˜ ํฌ๊ธฐ๋Š” ์–ด๋–ป๊ฒŒ ์ •ํ•˜๋Š”๊ฐ€?

Unit 6.2 โ€” Atomicity (์›์ž์„ฑ)

์„ ์ˆ˜ ์ง€์‹: Unit 6.1

ํ•ต์‹ฌ ๊ฐœ๋…

"ํŠธ๋žœ์žญ์…˜์˜ ๋ชจ๋“  ์—ฐ์‚ฐ์ด ๋ชจ๋‘ ์„ฑ๊ณต ํ•˜๊ฑฐ๋‚˜ ๋ชจ๋‘ ์‹คํŒจ ํ•ด์•ผ ํ•œ๋‹ค"

๊ณ„์ขŒ ์ด์ฒด ์‹œ๋‚˜๋ฆฌ์˜ค:

  • A์—์„œ ์ถœ๊ธˆ โœ…
  • B์— ์ž…๊ธˆ โŒ (์žฅ์• )
  • โ†’ A์˜ ๋ˆ์€ ์‚ฌ๋ผ์ง? NO!
  • โ†’ ์ „์ฒด ๋กค๋ฐฑ, A์˜ ์ถœ๊ธˆ๋„ ์ทจ์†Œ

4์ฃผ์ฐจ์˜ ์ž๋ฐ” Atomic๊ณผ ๋‹ค๋ฅธ ์ :

  • ์ž๋ฐ” Atomic: ํ•˜๋‚˜์˜ ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ์›์ž์„ฑ
  • DB Atomicity: ์—ฌ๋Ÿฌ ์ž‘์—…์˜ ๋ฌถ์Œ ์›์ž์„ฑ

์ž๊ธฐ ์ ๊ฒ€

  • ์›์ž์„ฑ์ด ๊นจ์ง€๋ฉด ์–ด๋–ค ์‚ฌ๊ณ ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”๊ฐ€?
  • ๋ถ€๋ถ„ ์„ฑ๊ณต์„ ํ—ˆ์šฉํ•˜๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋Š”๊ฐ€? (ํžŒํŠธ: Saga ํŒจํ„ด)

Unit 6.3 โ€” Consistency (์ผ๊ด€์„ฑ)

์„ ์ˆ˜ ์ง€์‹: Unit 6.2

ํ•ต์‹ฌ ๊ฐœ๋…

"ํŠธ๋žœ์žญ์…˜ ์™„๋ฃŒ ํ›„ DB ์ œ์•ฝ์กฐ๊ฑด์ด ํ•ญ์ƒ ์ง€์ผœ์ ธ์•ผ ํ•œ๋‹ค"

์˜ˆ์‹œ:

  • "๊ณ„์ขŒ ์ž”์•ก์€ ์Œ์ˆ˜๊ฐ€ ๋  ์ˆ˜ ์—†๋‹ค"๋Š” ์ œ์•ฝ
  • ์ด์ฒด ํ›„์—๋„ ์ด ์ œ์•ฝ์ด ๊นจ์ง€๋ฉด ์•ˆ ๋จ
  • ๊นจ์ง€๋Š” ํŠธ๋žœ์žญ์…˜์€ ์ž๋™ ๋กค๋ฐฑ

์ œ์•ฝ์กฐ๊ฑด์˜ ์ข…๋ฅ˜:

  • NOT NULL, UNIQUE, CHECK
  • FOREIGN KEY
  • ๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™ (์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๊ฐ•์ œ)

์ž๊ธฐ ์ ๊ฒ€

  • ์ผ๊ด€์„ฑ๊ณผ ๋ฌด๊ฒฐ์„ฑ(Integrity)์€ ๊ฐ™์€ ๋ง์ธ๊ฐ€?
  • ์ผ๊ด€์„ฑ์„ ๊นจ๋Š” ์‹œ๋„๋ฅผ DB๊ฐ€ ์–ด๋–ป๊ฒŒ ๊ฐ์ง€ํ•˜๋Š”๊ฐ€?

Unit 6.4 โ€” Isolation (๊ฒฉ๋ฆฌ์„ฑ)

์„ ์ˆ˜ ์ง€์‹: Unit 6.3

ํ•ต์‹ฌ ๊ฐœ๋…

"๊ฐ ํŠธ๋žœ์žญ์…˜์€ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜๊ณผ ๋…๋ฆฝ์  ์œผ๋กœ ์‹คํ–‰๋˜์–ด์•ผ ํ•œ๋‹ค"

์˜ˆ์‹œ:

  • A ๊ณ„์ขŒ์— 1๋งŒ์›
  • ํŠธ๋žœ์žญ์…˜1: A โ†’ B๋กœ 6์ฒœ์› ์ด์ฒด
  • ํŠธ๋žœ์žญ์…˜2: A โ†’ C๋กœ 6์ฒœ์› ์ด์ฒด (๋™์‹œ)
  • โ†’ ๋‘˜ ๋‹ค ์„ฑ๊ณตํ•˜๋ฉด ์ž”์•ก -2์ฒœ์›? NO!
  • โ†’ ๊ฒฉ๋ฆฌ์„ฑ์ด ๋ณด์žฅ๋˜๋ฉด ํ•œ์ชฝ์ด ์‹คํŒจํ•ด์•ผ ํ•จ

๊ฒฉ๋ฆฌ ์ˆ˜์ค€ (๊ฐ„๋žต):

  • READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ, SERIALIZABLE
  • ๋†’์„์ˆ˜๋ก ์•ˆ์ „, ๋‚ฎ์„์ˆ˜๋ก ๋น ๋ฆ„

์ž๊ธฐ ์ ๊ฒ€

  • ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์ด ๋„ˆ๋ฌด ๋†’์œผ๋ฉด ์–ด๋–ค ๋ฌธ์ œ๊ฐ€? (ํžŒํŠธ: ๋™์‹œ์„ฑ โ†“)
  • "Dirty Read" ๊ฐ€ ๋ฌด์—‡์ธ๊ฐ€?

Unit 6.5 โ€” Durability (์ง€์†์„ฑ)

์„ ์ˆ˜ ์ง€์‹: Unit 6.4

ํ•ต์‹ฌ ๊ฐœ๋…

"Commit๋œ ํŠธ๋žœ์žญ์…˜ ์€ DB์— ์˜๊ตฌ ๋ณด์กด ๋˜์–ด์•ผ ํ•œ๋‹ค"

๋ณด์žฅ ์ˆ˜๋‹จ:

  • ํŠธ๋žœ์žญ์…˜ ๋กœ๊ทธ (WAL: Write-Ahead Logging)
  • ๋น„ํœ˜๋ฐœ์„ฑ ์ €์žฅ์†Œ (HDD, SSD)
  • ์‹œ์Šคํ…œ ์žฅ์•  ํ›„ ๋ณต๊ตฌ

์‹œ์Šคํ…œ์ด ๋‹ค์šด๋˜์–ด๋„ ์ปค๋ฐ‹๋œ ๋ฐ์ดํ„ฐ๋Š” ์‚ด์•„์žˆ์–ด์•ผ ํ•œ๋‹ค.

์ž๊ธฐ ์ ๊ฒ€

  • ์ง€์†์„ฑ์ด ๋‹จ์ˆœํžˆ "๋””์Šคํฌ ์ €์žฅ"๋ณด๋‹ค ๋ณต์žกํ•œ ์ด์œ ๋Š”? (ํžŒํŠธ: ์บ์‹œ, fsync)
  • ACID ์ค‘ ๊ฐ€์žฅ ๋น„์‹ผ ์„ฑ์งˆ์€?

Unit 6.6 โ€” Commit ์ด์ „์˜ ํŠธ๋žœ์žญ์…˜ ๋™์‹œ์„ฑ

์„ ์ˆ˜ ์ง€์‹: Unit 6.5

ํ•ต์‹ฌ ์‹œ๋‚˜๋ฆฌ์˜ค

์„ธ์…˜1: ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ (commit X)
์„ธ์…˜2: ๊ฐ™์€ ๋ฐ์ดํ„ฐ ์กฐํšŒ

๊ฒฐ๊ณผ:

  • ์„ธ์…˜2๋Š” ๋ณ€๊ฒฝ ์ „ ๋ฐ์ดํ„ฐ๋ฅผ ๋ด„ (๊ฒฉ๋ฆฌ์„ฑ)
  • ์„ธ์…˜1์˜ ๋ณ€๊ฒฝ์€ ์ž๊ธฐ ์„ธ์…˜์—์„œ๋งŒ ๋ณด์ž„ (์ž„์‹œ ์ €์žฅ)
  • ์„ธ์…˜1์ด commitํ•˜๋ฉด โ†’ ๊ทธ์ œ์„œ์•ผ ์„ธ์…˜2๋„ ๋ณ€๊ฒฝ ๋ฐ์ดํ„ฐ ํ™•์ธ

๋น„์œ :

  • ์„ธ์…˜ = ๊ฐ์ž์˜ ๋…ธํŠธ๋ถ
  • ๋ณ€๊ฒฝ = ๋…ธํŠธ๋ถ์— ์ž„์‹œ ๊ธฐ๋ก
  • Commit = ๊ณต์œ  ํด๋ผ์šฐ๋“œ์— ์ €์žฅ

์ž๊ธฐ ์ ๊ฒ€

  • ์ด ๊ฒฉ๋ฆฌ ๋™์ž‘์€ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง€๋Š”๊ฐ€?
  • ๊ณต์œ  ์บ์‹œ(Redis)์˜ ์ผ๊ด€์„ฑ๊ณผ DB ๊ฒฉ๋ฆฌ์˜ ์ฐจ์ด๋Š”?

๐Ÿ“š Phase 7 โ€” JdbcTemplate (๋ฐ˜๋ณต ์ œ๊ฑฐ)

๋ชฉํ‘œ: JDBC ์ฝ”๋“œ์˜ ๋”์ฐํ•œ ๋ฐ˜๋ณต์„ Spring์ด ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ–ˆ๋Š”์ง€ ๋ณธ๋‹ค.

Unit 7.1 โ€” JDBC๋งŒ ์“ธ ๋•Œ์˜ ๋ฐ˜๋ณต ์ฝ”๋“œ

์„ ์ˆ˜ ์ง€์‹: Phase 3

ํ•ต์‹ฌ ๋ฌธ์ œ

Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;

try {
    conn = ...;
    stmt = conn.prepareStatement(sql);
    stmt.setInt(1, age);
    rs = stmt.executeQuery();
    while (rs.next()) {
        // ๊ฒฐ๊ณผ ์ฒ˜๋ฆฌ
    }
} catch (SQLException e) {
    e.printStackTrace();
} finally {
    if (rs != null) try { rs.close(); } catch (...) { ... }
    if (stmt != null) try { stmt.close(); } catch (...) { ... }
    if (conn != null) try { conn.close(); } catch (...) { ... }
}

๋ฌธ์ œ:

  • ๋งค ์ฟผ๋ฆฌ๋งˆ๋‹ค ๋˜‘๊ฐ™์€ try/catch/finally
  • ์ž์› ํ•ด์ œ ์ฝ”๋“œ๊ฐ€ ๋ณธ ๋กœ์ง๋ณด๋‹ค ๊ธธ์Œ
  • ์‹ค์ˆ˜๋กœ close ๋ˆ„๋ฝ โ†’ Connection ๋ˆ„์ˆ˜

5์ฃผ์ฐจ์—์„œ ๋ณธ ํŒจํ„ด:

  • "๋ณ€ํ•˜์ง€ ์•Š๋Š” ํ๋ฆ„ + ๋ณ€ํ•˜๋Š” ๋ถ€๋ถ„" โ†’ ํ…œํ”Œ๋ฆฟ ๋ฉ”์†Œ๋“œ ํŒจํ„ด / ์ „๋žต ํŒจํ„ด

์ž๊ธฐ ์ ๊ฒ€

  • ์œ„ ์ฝ”๋“œ์—์„œ ๋ณ€ํ•˜๋Š” ๋ถ€๋ถ„๊ณผ ๋ณ€ํ•˜์ง€ ์•Š๋Š” ๋ถ€๋ถ„์€?
  • try-with-resources๋กœ๋Š” ์ถฉ๋ถ„ํžˆ ๋ชป ์ค„์ด๋Š” ์ด์œ ๋Š”?

Unit 7.2 โ€” JdbcTemplate์˜ ๋“ฑ์žฅ

์„ ์ˆ˜ ์ง€์‹: Unit 7.1

ํ•ต์‹ฌ ๊ฐœ๋…

JdbcTemplate = 5์ฃผ์ฐจ์—์„œ ๋ณธ ํ…œํ”Œ๋ฆฟ ๋ฉ”์†Œ๋“œ + ์ „๋žต ํŒจํ„ด์˜ ์‹ค์ œ ๊ตฌํ˜„

@Autowired
private JdbcTemplate jdbcTemplate;

public List<Customer> getCustomersByAge(int age) {
    String sql = "SELECT * FROM customers WHERE age > ?";
    return jdbcTemplate.query(sql, new Object[]{age},
        new BeanPropertyRowMapper<>(Customer.class));
}

์ˆจ๊ฒจ์ง„ ๊ฒƒ:

  • Connection ํš๋“/๋ฐ˜ํ™˜ (DataSource์—์„œ ์ž๋™)
  • PreparedStatement ์ƒ์„ฑ/ํ•ด์ œ
  • ResultSet ์ฒ˜๋ฆฌ
  • ์˜ˆ์™ธ ์ฒ˜๋ฆฌ

๊ฐœ๋ฐœ์ž๋Š” ๋ณ€ํ•˜๋Š” ๋ถ€๋ถ„๋งŒ:

  • SQL
  • ํŒŒ๋ผ๋ฏธํ„ฐ
  • ๊ฒฐ๊ณผ ๋งคํ•‘

์ž๊ธฐ ์ ๊ฒ€

  • "Template"์ด ์ด๋ฆ„์— ๋“ค์–ด๊ฐ„ ์ด์œ ๋Š”?
  • 5์ฃผ์ฐจ์˜ ์–ด๋–ค ๋””์ž์ธ ํŒจํ„ด์ด ์—ฌ๊ธฐ ์ ์šฉ๋๋Š”๊ฐ€?

Unit 7.3 โ€” update() / queryForObject() / query()

์„ ์ˆ˜ ์ง€์‹: Unit 7.2

ํ•ต์‹ฌ ๋ฉ”์„œ๋“œ

๋ฉ”์„œ๋“œ์šฉ๋„๋ฐ˜ํ™˜
update(sql, params)INSERT / UPDATE / DELETE์˜ํ–ฅ๋ฐ›์€ ํ–‰ ์ˆ˜
queryForObject(sql, mapper, params)๋‹จ์ผ ํ–‰ ์กฐํšŒ๊ฐ์ฒด 1๊ฐœ
query(sql, mapper, params)์—ฌ๋Ÿฌ ํ–‰ ์กฐํšŒList<๊ฐ์ฒด>
execute(sql)์ž„์˜ SQL (DDL ๋“ฑ)void

์˜ˆ์‹œ:

// UPDATE
jdbcTemplate.update(
    "UPDATE item SET price=? WHERE id=?",
    newPrice, itemId
);

// ๋‹จ์ผ ํ–‰
Item item = jdbcTemplate.queryForObject(
    "SELECT * FROM item WHERE id=?",
    itemRowMapper, id
);

// ์—ฌ๋Ÿฌ ํ–‰
List<Item> items = jdbcTemplate.query(
    "SELECT * FROM item",
    itemRowMapper
);

// DDL
jdbcTemplate.execute(
    "CREATE TABLE mytable (id INT, name VARCHAR(100))"
);

์ž๊ธฐ ์ ๊ฒ€

  • queryForObject๊ฐ€ ๊ฒฐ๊ณผ 0๊ฑด์ด๋ฉด ๋ฌด์Šจ ์˜ˆ์™ธ๊ฐ€? (ํžŒํŠธ: EmptyResultDataAccessException)
  • queryForObject๊ฐ€ ๊ฒฐ๊ณผ 2๊ฑด ์ด์ƒ์ด๋ฉด? (ํžŒํŠธ: IncorrectResultSizeDataAccessException)

Unit 7.4 โ€” RowMapper

์„ ์ˆ˜ ์ง€์‹: Unit 7.3

ํ•ต์‹ฌ ๊ฐœ๋…

RowMapper: ResultSet์˜ ํ•œ ํ–‰ โ†’ ์ž๋ฐ” ๊ฐ์ฒด๋กœ ๋งคํ•‘

์ „ํ†ต JDBC:

while (rs.next()) {
    User user = new User();
    user.setId(rs.getInt(1));
    user.setName(rs.getString(2));
    userList.add(user);
}

RowMapper ์‚ฌ์šฉ:

RowMapper<Item> itemRowMapper = (rs, rowNum) -> {
    Item item = new Item();
    item.setId(rs.getLong("id"));
    item.setItemName(rs.getString("item_name"));
    return item;
};

// ์‚ฌ์šฉ
Item item = jdbcTemplate.queryForObject(sql, itemRowMapper, id);
List<Item> items = jdbcTemplate.query(sql, itemRowMapper);

๋žŒ๋‹ค์™€ ์ž˜ ๋งž์Œ (ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค):

RowMapper<Item> mapper = (rs, n) -> new Item(...);

BeanPropertyRowMapper โ€” ์ž๋™ ๋งคํ•‘:

new BeanPropertyRowMapper<>(Item.class)
// SQL ์ปฌ๋Ÿผ๋ช…๊ณผ ์ž๋ฐ” ํ•„๋“œ๋ช…์ด ๊ฐ™์œผ๋ฉด ์ž๋™ ๋งคํ•‘
// item_name โ†’ itemName ์ฒ˜๋Ÿผ snake โ†’ camel ๋ณ€ํ™˜๋„ ๋จ

์ž๊ธฐ ์ ๊ฒ€

  • RowMapper๊ฐ€ ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค์ธ ๊ฒŒ ์–ด๋–ค ์ด์ ์„ ์ฃผ๋Š”๊ฐ€? (ํžŒํŠธ: 3์ฃผ์ฐจ ๋žŒ๋‹ค)
  • BeanPropertyRowMapper๊ฐ€ ์•ˆ ํ†ตํ•˜๋Š” ์ผ€์ด์Šค๋Š”?

Unit 7.5 โ€” JdbcTemplate์˜ ๊ตฌ์กฐ์  ์˜๋ฏธ

์„ ์ˆ˜ ์ง€์‹: Unit 7.4

ํ•ต์‹ฌ ํ†ต์ฐฐ

JdbcTemplate์€ 5์ฃผ์ฐจ์—์„œ ๋ฐฐ์šด ๋ชจ๋“  ์›์น™์˜ ์ง‘์•ฝ์ฒด:

์›์น™/ํŒจํ„ดJdbcTemplate์—์„œ์˜ ์ ์šฉ
๊ด€์‹ฌ์‚ฌ ๋ถ„๋ฆฌSQL/๋งคํ•‘ โ†” ์ž์› ๊ด€๋ฆฌ ๋ถ„๋ฆฌ
ํ…œํ”Œ๋ฆฟ ๋ฉ”์†Œ๋“œ ํŒจํ„ด๋ณ€ํ•˜์ง€ ์•Š๋Š” ํ๋ฆ„์ด ํ…œํ”Œ๋ฆฟ ์•ˆ
์ „๋žต ํŒจํ„ดRowMapper, PreparedStatementSetter
OCP์ƒˆ ๋งคํ•‘ ์ถ”๊ฐ€ ์‹œ ๊ธฐ์กด ์ฝ”๋“œ ๋ณ€๊ฒฝ X
DIDataSource๋ฅผ ์™ธ๋ถ€์—์„œ ์ฃผ์ž…๋ฐ›์Œ
๋žŒ๋‹ค ํ™œ์šฉ (3์ฃผ์ฐจ)RowMapper๋ฅผ ๋žŒ๋‹ค๋กœ

โ†’ "Spring์„ ๋ฐฐ์šฐ๋ฉด OOP์˜ ์ข‹์€ ์‚ฌ๋ก€๊ฐ€ ๋ณด์ธ๋‹ค"

์ž๊ธฐ ์ ๊ฒ€

  • JPA/Hibernate๊ฐ€ ๋“ฑ์žฅํ•œ ์ดํ›„ JdbcTemplate์€ ์™œ ์—ฌ์ „ํžˆ ์œ ํšจํ•œ๊ฐ€? (ํžŒํŠธ: ๋‹จ์ˆœ์„ฑ, ์„ฑ๋Šฅ)
  • MyBatis์™€ JdbcTemplate์˜ ์ฐจ์ด๋Š”?

๐ŸŽ“ ์ข…ํ•ฉ ์ž๊ธฐ ์ ๊ฒ€ (6์ฃผ์ฐจ ์กธ์—… ์‹œํ—˜)

Part A: ํ…Œ์ŠคํŠธ์™€ ์›น ์ธํ”„๋ผ

  1. JUnit์ด ๋งค ํ…Œ์ŠคํŠธ๋งˆ๋‹ค ์ƒˆ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“œ๋Š” ์ด์œ ๋Š”?
  2. @BeforeEach ์™€ @BeforeAll ์˜ ์ฐจ์ด๋Š”?
  3. ํ”ฝ์Šค์ฒ˜(Fixture)์˜ ์ •์˜๋Š”?
  4. assertThat + ๋งค์ฒ˜ ๋ฐฉ์‹์ด assertEquals๋ณด๋‹ค ๊ฐ–๋Š” ์žฅ์ ์€?
  5. ์›น์„œ๋ฒ„์™€ WAS์˜ ์—ญํ•  ์ฐจ์ด๋Š”?
  6. JSP๊ฐ€ ๊ฒฐ๊ตญ ๋ฌด์—‡์œผ๋กœ ๋ณ€ํ™˜๋˜๋Š”๊ฐ€?
  7. SSR๊ณผ CSR ์ค‘ SEO์— ์œ ๋ฆฌํ•œ ๊ฒƒ์€?
  8. JAR๊ณผ WAR์˜ ์ฐจ์ด 3๊ฐ€์ง€๋Š”?
  9. Spring Boot๊ฐ€ JAR๋ฅผ ๊ถŒ์žฅํ•˜๋Š” ์ด์œ ๋Š”?

Part B: JDBC

  1. JDBC๊ฐ€ ๋“ฑ์žฅํ•˜๊ธฐ ์ „ ์–ด๋–ค ๊ณ ํ†ต์ด ์žˆ์—ˆ๋Š”๊ฐ€?
  2. JDBC๊ฐ€ ํ•ด๊ฒฐํ•œ ๊ฒƒ๊ณผ ํ•ด๊ฒฐํ•˜์ง€ ์•Š์€ ๊ฒƒ์€?
  3. Connection Pool์ด ํ•„์š”ํ•œ ์ด์œ ๋ฅผ TCP ๊ด€์ ์—์„œ?
  4. Connection ํ’€์˜ Connection 100๊ฐœ = DB์˜ ๋ฌด์—‡์ด 100๊ฐœ?

Part B: DataSource

  1. DataSource ์ธํ„ฐํŽ˜์ด์Šค์˜ ํ•ต์‹ฌ ๋ฉ”์„œ๋“œ๋Š”?
  2. DriverManagerDataSource๊ฐ€ ์กด์žฌํ•˜๋Š” ์ด์œ ๋Š”?
  3. DataSource ๋„์ž…์ด 5์ฃผ์ฐจ์˜ ์–ด๋–ค ์›์น™(SOLID)์˜ ๊ตฌํ˜„์ธ๊ฐ€?

Part B: ํŠธ๋žœ์žญ์…˜ ACID

  1. ํŠธ๋žœ์žญ์…˜์˜ ์ •์˜๋Š”?
  2. ACID 4๊ฐ€์ง€๋ฅผ ํ•œ ๋ฌธ์žฅ์”ฉ ์„ค๋ช…ํ•˜๋ผ
  3. ๊ฒฉ๋ฆฌ์„ฑ์ด ๊นจ์ง€๋ฉด ์–ด๋–ค ์‚ฌ๊ณ ๊ฐ€ ๊ฐ€๋Šฅํ•œ๊ฐ€?
  4. 4์ฃผ์ฐจ์˜ ์ž๋ฐ” Atomic๊ณผ DB Atomicity์˜ ์ฐจ์ด๋Š”?
  5. Commit ์ด์ „ ๋ณ€๊ฒฝ์€ ๋‹ค๋ฅธ ์„ธ์…˜์—์„œ ๋ณด์ด๋Š”๊ฐ€?

Part B: JdbcTemplate

  1. JdbcTemplate์ด ์ˆจ๊ฒจ์ฃผ๋Š” 4๊ฐ€์ง€๋Š”?
  2. queryForObject๊ฐ€ ๊ฒฐ๊ณผ 0๊ฑด์ผ ๋•Œ์˜ ์˜ˆ์™ธ๋Š”?
  3. RowMapper๊ฐ€ ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค์ธ ๊ฒŒ ์ฃผ๋Š” ์ด์ ์€?
  4. JdbcTemplate์— ์ ์šฉ๋œ ๋””์ž์ธ ํŒจํ„ด 2๊ฐ€์ง€๋Š”?

๐Ÿ“Œ ํ•™์Šต ์šด์˜ ํŒ

9-์„น์…˜ ๋งˆ์Šคํ„ฐ ํ”„๋กฌํ”„ํŠธ๋กœ ๊นŠ์ด ํŒŒ์•ผ ํ•  Unit

๋ฐ˜๋“œ์‹œ ๊นŠ์ด ํŒŒ๊ธฐ:

  • Unit 4.2 โ€” Connection Pool (์‹ค๋ฌด ์ง๊ฒฐ)
  • Unit 5.3 โ€” DataSource ์ธํ„ฐํŽ˜์ด์Šค (Spring DB์˜ ์ถœ๋ฐœ์ )
  • Unit 6.2 ~ 6.5 โ€” ACID 4๊ฐ€์ง€ (๋ฉด์ ‘ ๋‹จ๊ณจ)
  • Unit 6.6 โ€” Commit ์ด์ „์˜ ๊ฒฉ๋ฆฌ์„ฑ (๋ฉ€ํ‹ฐ ์„ธ์…˜ ์ดํ•ด)
  • Unit 7.2 โ€” JdbcTemplate์˜ ๊ตฌ์กฐ (๋””์ž์ธ ํŒจํ„ด์˜ ์ง‘์•ฝ)

Phase๋ณ„ ์ง„๋„ ์ฒดํฌ๋ฆฌ์ŠคํŠธ

[ ] Phase 1 โ€” JUnit ํ…Œ์ŠคํŠธ (Unit 1.1~1.5)
[ ] Phase 2 โ€” ์›น ์ธํ”„๋ผ ๊ธฐ์ดˆ (Unit 2.1~2.4)
[ ] Phase 3 โ€” JDBC ํ‘œ์ค€ํ™” (Unit 3.1~3.3)
[ ] Phase 4 โ€” Connection Pool๊ณผ DB ์„ธ์…˜ (Unit 4.1~4.4)
[ ] Phase 5 โ€” DataSource ์ธํ„ฐํŽ˜์ด์Šค (Unit 5.1~5.4)
[ ] Phase 6 โ€” ํŠธ๋žœ์žญ์…˜ ACID (Unit 6.1~6.6)
[ ] Phase 7 โ€” JdbcTemplate (Unit 7.1~7.5)
[ ] ์ข…ํ•ฉ ์ž๊ธฐ ์ ๊ฒ€ 25๋ฌธํ•ญ ํ†ต๊ณผ

5์ฃผ์ฐจ โ†’ 6์ฃผ์ฐจ ์—ฐ๊ฒฐ ํฌ์ธํŠธ

5์ฃผ์ฐจ์—์„œ ๋ฐฐ์šด ๋””์ž์ธ ์›์น™์ด ์ด๋ฒˆ ์ฃผ์— ์‹ค์ œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„๋˜์—ˆ๋Š”์ง€ ์ถ”์ ํ•ด๋ณด์„ธ์š”:

5์ฃผ์ฐจ ๊ฐœ๋…6์ฃผ์ฐจ์—์„œ์˜ ๊ตฌํ˜„
๊ด€์‹ฌ์‚ฌ์˜ ๋ถ„๋ฆฌDataSource (์ปค๋„ฅ์…˜ ํš๋“๊ณผ ์‚ฌ์šฉ ๋ถ„๋ฆฌ)
ํ…œํ”Œ๋ฆฟ ๋ฉ”์†Œ๋“œ / ์ „๋žต ํŒจํ„ดJdbcTemplate
OCPDataSource๋กœ ํ’€ ๊ตฌํ˜„ ๊ต์ฒด ๊ฐ€๋Šฅ
DI@Autowired DataSource

โ†’ "์ข‹์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ข‹์€ OOP ์›์น™์˜ ์ง‘์•ฝ์ฒด๋‹ค" ๊ฐ€ 6์ฃผ์ฐจ์˜ ๋ฉ”์‹œ์ง€.


1~6์ฃผ์ฐจ ํ†ตํ•ฉ ํ๋ฆ„

  • 1~3์ฃผ์ฐจ: ์ž๋ฐ” ์–ธ์–ด ์ž์ฒด (OOPยทJVMยท์ปฌ๋ ‰์…˜ยทํ•จ์ˆ˜ํ˜•)
  • 4์ฃผ์ฐจ: ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ์™€ ๋™์‹œ์„ฑ
  • 5์ฃผ์ฐจ: Spring IoC/DI ์ž…๋ฌธ
  • 6์ฃผ์ฐจ (์ง€๊ธˆ): ํ…Œ์ŠคํŠธ + ์›น ์ธํ”„๋ผ + DB ์ ‘๊ทผ์˜ ์ง„ํ™”
profile
Software Developer

0๊ฐœ์˜ ๋Œ“๊ธ€