Skip to content

🧐 μŠ€ν”„λ§μ€ 데이터에 μ–΄λ–»κ²Œ μ ‘κ·Όν• κΉŒ 🀨

Notifications You must be signed in to change notification settings

thdefn/Deep-Dive-SpringDB

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

19 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

πŸ“Œ

Let Me Start

  1. H2 λ°μ΄ν„°λ² μ΄μŠ€ λ‹€μš΄λ‘œλ“œ

  2. sh ./h2/bin/h2.sh 접속

  3. http://218.38.137.28:8082/?key= ➑️ http://localhost:8082/?key=

  4. 졜초 ν•œλ²ˆ 파일 직접 μ ‘κ·Ό ν›„ ~/test.mv.db 파일 생성 확인

    • JDBC URL: jdbc:h2:~/test
    • μ‚¬μš©μžλͺ…: sa
  5. κ·Έ μ΄ν›„λŠ” ν”„λ‘œν† μ½œλ‘œ 접속

    • JDBC URL: jdbc:h2:tcp://localhost/~/test
    • μ‚¬μš©μžλͺ…: sa

JDBC 이해

  • JDBC λŠ” μžλ°”μ—μ„œ λ°μ΄ν„°λ² μ΄μŠ€μ— 접속할 수 μžˆλ„λ‘ ν•˜λŠ” μžλ°” API
  • μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λ‘œμ§μ€ JDBC ν‘œμ€€ μΈν„°νŽ˜μ΄μŠ€μ—λ§Œ 의쑴 ➑️ DB ꡐ체 μ‹œ JDBC λ“œλΌμ΄λ²„λ§Œ λ³€κ²½ν•˜λ©΄ 됨
  • ν•œκ³„ : JDBCλ₯Ό row 레벨둜 μ‚¬μš© μ‹œ 반볡 μ½”λ“œκ°€ λ§Žλ‹€
JDBC Connection μΈν„°νŽ˜μ΄μŠ€
  • jdbcλŠ” java.sql.Connection ν‘œμ€€ 컀λ„₯μ…˜ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ •μ˜ν•¨
  • H2 λ°μ΄ν„°λ² μ΄μŠ€ λ“œλΌμ΄λ²„λŠ” JDBC Connection μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ org.h2.jdbc.jdbcConnection κ΅¬ν˜„μ²΄λ₯Ό 제곡
JDBC DriverManager
  • μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λ‘œμ§μ—μ„œ 컀λ„₯μ…˜μ΄ ν•„μš”ν•˜λ©΄ DriverManager.getConnection() 호좜
  • DriverManagerλŠ” λΌμ΄λΈŒλŸ¬λ¦¬μ— λ“±λ‘λœ λ“œλΌμ΄λ²„ λͺ©λ‘μ„ μžλ™μœΌλ‘œ 인식
  • 이 λ“œλΌμ΄λ²„λ“€μ—κ²Œ 순차적으둜 컀λ„₯μ…˜μ„ νšλ“ν•  수 μžˆλŠ”μ§€ 확인함
  • μ΄λ ‡κ²Œ 찾은 컀λ„₯μ…˜ κ΅¬ν˜„μ²΄κ°€ ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ λ°˜ν™˜λ¨
JDBC ResultSet
  • ResultSet은 μ•„λž˜μ™€ 같이 생긴 데이터 ꡬ쑰

    27B4443359753B7C04

  • Cursor : ResultSet 내뢀에 μžˆλŠ” μ»€μ„œλ₯Ό μ΄λ™ν•΄μ„œ 데이터λ₯Ό 쑰회

    • rs.next() λ₯Ό ν˜ΈμΆœν•˜λ©΄ μ»€μ„œκ°€ μ΄λ™ν•˜κ³ , row 쑴재 μ—¬λΆ€λ₯Ό λ°˜ν™˜
      • rs.next() κ²°κ³Όκ°€ trueλ©΄ μ»€μ„œμ˜ 이동 κ²°κ³Ό 데이터가 μžˆλ‹€λŠ” 뜻
      • rs.next() κ²°κ³Όκ°€ falseλ©΄ μ»€μ„œμ˜ 이동 κ²°κ³Ό 데이터가 μ—†λ‹€λŠ” 뜻

컀λ„₯μ…˜ ν’€κ³Ό λ°μ΄ν„°μ†ŒμŠ€ 이해

  • DB 컀λ„₯μ…˜μ„ 맀번 νšλ“ν•  경우 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λ‘œμ§λ§ˆλ‹€ 컀λ„₯μ…˜μ„ μƒˆλ‘œ λ§Œλ“œλŠ” μ‹œκ°„κ³Ό λ¦¬μ†ŒμŠ€κ°€ μ†Œμš”λœλ‹€.
    • 컀λ„₯μ…˜ νšλ“ κ³Όμ •
      1. μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λ‘œμ§μ€ DB λ“œλΌμ΄λ²„λ₯Ό 톡해 컀λ„₯μ…˜μ„ μ‘°νšŒν•œλ‹€.
      2. DB λ“œλΌμ΄λ²„λŠ” DB와 TCP/IP 컀λ„₯μ…˜μ„ μ—°κ²°ν•œλ‹€.
      3. DB λ“œλΌμ΄λ²„λŠ” ID, PWλ₯Ό 톡해 DB에 μΈμ¦ν•˜κ³  내뢀에 DB μ„Έμ…˜μ„ μƒμ„±ν•œλ‹€.
      4. DBκ°€ 컀λ„₯μ…˜ 생성이 μ™„λ£Œλ˜μ—ˆλ‹€λŠ” 응닡을 보낸닀.
      5. DB λ“œλΌμ΄λ²„λŠ” 컀λ„₯μ…˜ 객체λ₯Ό μƒμ„±ν•΄μ„œ ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ λ°˜ν™˜ν•œλ‹€.
  • λ”°λΌμ„œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ λ„μšΈ λ•Œ 컀λ„₯μ…˜ 객체λ₯Ό 미리 생성해두고 μ‚¬μš©ν•˜λŠ”λ°, 이λ₯Ό 컀λ„₯μ…˜ ν’€ 이라고 ν•œλ‹€.
컀λ„₯μ…˜ ν’€
  • 컀λ„₯μ…˜ 풀을 ν†΅ν•œ 컀λ„₯μ…˜ νšλ“ κ³Όμ •
    1. μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ λ„μš°λŠ” μ‹œμ μ— 컀λ„₯μ…˜ 풀은 컀λ„₯μ…˜μ„ 미리 ν™•λ³΄ν•΄μ„œ 풀에 λ³΄κ΄€ν•œλ‹€.
    2. μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 둜직이 컀λ„₯μ…˜ 풀에 컀λ„₯μ…˜μ„ μš”μ²­ν•˜λ©΄ 컀λ„₯μ…˜μ€ μžμ‹ μ΄ κ°€μ§€κ³  μžˆλŠ” 컀λ„₯μ…˜ 쀑 ν•˜λ‚˜λ₯Ό λ°˜ν™˜ν•œλ‹€.
    3. μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λ‘œμ§μ€ ν•΄λ‹Ή 컀λ„₯μ…˜μ„ μ‚¬μš©ν•΄μ„œ SQL을 DB에 μ „λ‹¬ν•˜κ³  κ·Έ κ²°κ³Όλ₯Ό λ°›λŠ”λ‹€.
      • 컀λ„₯μ…˜ 풀에 λ“€μ–΄ μžˆλŠ” 컀λ„₯μ…˜μ€ DB와 TCP/IP 컀λ„₯μ…˜μ΄ μ—°κ²°λ˜μ–΄ μžˆλŠ” μƒνƒœμ΄κΈ° λ•Œλ¬Έμ— μ–Έμ œλ“ μ§€ μ¦‰μ‹œ SQL을 전달할 수 μžˆλ‹€.
    4. μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 둜직이 컀λ„₯μ…˜μ„ λͺ¨λ‘ μ‚¬μš©ν•˜λ©΄, 컀λ„₯μ…˜μ΄ μ‚΄μ•„ μžˆλŠ” μƒνƒœλ‘œ 컀λ„₯μ…˜ 풀에 ν•΄λ‹Ή 컀λ„₯μ…˜μ„ λ°˜ν™˜ν•œλ‹€.
  • 컀λ„₯μ…˜ 풀을 μ΄μš©ν•˜λ©΄ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λ‘œμ§μ— DB와 컀λ„₯μ…˜μ„ λ§ΊλŠ” μ‹œκ°„μ΄ μ†Œμš”λ˜μ§€ μ•ŠλŠ”λ‹€.
  • 컀λ„₯μ…˜ 풀은 μ„œλ²„ λ‹Ή μ΅œλŒ€ 컀λ„₯μ…˜ 수λ₯Ό μ œν•œν•  수 μžˆμ–΄, DBλ₯Ό λ³΄ν˜Έν•œλ‹€.
  • μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ λ„μšΈ λ•Œ 컀λ„₯μ…˜ 객체λ₯Ό 미리 생성해두고 μ‚¬μš©ν•˜λŠ” 방법
데이터 μ†ŒμŠ€
  • 컀λ„₯μ…˜μ„ μ–»λŠ” 방법은 μ•žμ„œ ν•™μŠ΅ν•œ JDBC DriverManager λ₯Ό 직접 μ‚¬μš©ν•˜κ±°λ‚˜, 컀λ„₯μ…˜ 풀을 μ‚¬μš©ν•  수 μžˆλ‹€.

    • λ§Œμ•½ JDBC DriverManagerλ₯Ό 톡해 컀λ„₯μ…˜μ„ νšλ“ν•˜λ‹€κ°€, HikariCP 컀λ„₯μ…˜ 풀을 μ‚¬μš©ν•˜λŠ” λ°©λ²•μœΌλ‘œ λ³€κ²½ν•œλ‹€λ©΄?

      ➑️ 컀λ„₯μ…˜μ„ νšλ“ν•˜λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μ½”λ“œλ₯Ό ν•¨κ»˜ λ³€κ²½ν•΄μ•Ό ν•œλ‹€. DriverManager μ—μ„œ HikariCP 둜 의쑴 관계가 λ°”λ€ŒκΈ° λ•Œλ¬Έμ΄λ‹€.

    • 뿐만 μ•„λ‹ˆλΌ DPCP2 μ—μ„œ HikariCP 둜 컀λ„₯μ…˜ 풀을 λ³€κ²½ν•  λ•Œμ—λ„ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μ½”λ“œκ°€ λ³€κ²½λœλ‹€.

  • DataSorce λŠ” 컀λ„₯μ…˜μ„ νšλ“ν•˜λŠ” 방법을 μΆ”μƒν™”ν•˜λŠ” μΈν„°νŽ˜μ΄μŠ€μ΄λ‹€. 핡심 κΈ°λŠ₯은 컀λ„₯μ…˜ 쑰회 getConnection() 이닀. 스크란샷 2023-08-14 α„‹α…©α„Œα…₯ᆫ 8 49 25

  • λŒ€λΆ€λΆ„μ˜ 컀λ„₯μ…˜ 풀은 DataSorce μΈν„°νŽ˜μ΄μŠ€λ₯Ό 이미 κ΅¬ν˜„ν•΄λ‘μ—ˆλ‹€. λ”°λΌμ„œ 컀λ„₯μ…˜ν’€ κ΅¬ν˜„ κΈ°μˆ μ„ λ³€κ²½ν•˜κ³  μ‹ΆμœΌλ©΄ κ΅¬ν˜„μ²΄λ₯Ό κ°ˆμ•„λΌμš΄λ‹€.

    • JDBC DriverManagerλ₯Ό μ΄μš©ν•˜λ €λ©΄, DataSorce μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œDriverManagerDataSource λ₯Ό μ΄μš©ν•œλ‹€.

      DataSource dataSource = new DriverManagerDataSource(URL, USERNAME, PASSWORD);
      Connection con1 = dataSource.getConnection();
      Connection con2 = dataSource.getConnection();
      
    • HikariCP λ₯Ό ν†΅ν•œ 컀λ„₯μ…˜ 풀링

      HikariDataSource dataSource = new HikariDataSource();
      dataSource.setJdbcUrl(URL);
      dataSource.setUsername(USERNAME);
      dataSource.setPassword(PASSWORD);
      dataSource.setMaximumPoolSize(10);
      dataSource.setPoolName("MyPool");
      
      Connection con1 = dataSource.getConnection();
      Connection con2 = dataSource.getConnection();
      
      • 컀λ„₯μ…˜ 풀에 컀λ„₯μ…˜μ„ μ±„μšΈλ•ŒλŠ” λ³„λ„μ˜ μ“°λ ˆλ“œλ₯Ό μ‚¬μš©ν•œλ‹€.
      • μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ λ™μ‹œμ— μ—¬λŸ¬ μš”μ²­μ΄ λ“€μ–΄μ˜€λ©΄ μ—¬λŸ¬ μ“°λ ˆλ“œμ—μ„œ 컀λ„₯μ…˜ ν’€μ˜ 컀λ„₯μ…˜μ„ λ‹€μ–‘ν•˜κ²Œ κ°€μ Έκ°„λ‹€.
  • DataSorce λ₯Ό μ‚¬μš©ν•˜λ©΄ μ„€μ •κ³Ό μ‚¬μš©μ„ 뢄리할 수 μžˆλ‹€.

νŠΈλžœμž­μ…˜ 이해

  • νŠΈλžœμž­μ…˜μ€ λͺ¨λ“  μž‘μ—…μ΄ μˆ˜ν–‰λ˜κ±°λ‚˜, λͺ¨λ“  μž‘μ—…μ΄ μˆ˜ν–‰λ˜μ§€ μ•Šμ•„μ•Ό ν•œλ‹€.
    • 컀밋 Commit : λͺ¨λ“  μž‘μ—…μ΄ μ„±κ³΅ν•΄μ„œ λ°μ΄ν„°λ² μ΄μŠ€μ— 정상 λ°˜μ˜ν•˜λŠ” 것
    • λ‘€λ°± Rollback : μž‘μ—… 쀑 ν•˜λ‚˜λΌλ„ μ‹€νŒ¨ν•΄μ„œ 거래 μ΄μ „μœΌλ‘œ λ˜λŒλ¦¬λŠ” 것
  • νŠΈλžœμž­μ…˜ ACID
    • μ›μžμ„± : νŠΈλžœμž­μ…˜ λ‚΄μ—μ„œ μ‹€ν–‰ν•œ μž‘μ—…λ“€μ€ 마치 ν•˜λ‚˜μ˜ μž‘μ—…μΈ κ²ƒμ²˜λŸΌ λͺ¨λ‘ μ„±κ³΅ν•˜κ±°λ‚˜ λͺ¨λ‘ μ‹€νŒ¨ν•œλ‹€.
    • 일관성 : νŠΈλžœμž­μ…˜ μ‹€ν–‰ μ „κ³Ό ν›„μ˜ λ°μ΄ν„°λ² μ΄μŠ€ μƒνƒœλŠ” 일관적이어야 ν•œλ‹€.
    • 격리성 : λ™μ‹œμ— μ‹€ν–‰λ˜λŠ” νŠΈλžœμž­μ…˜λ“€μ΄ μ„œλ‘œμ—κ²Œ 영ν–₯을 λ―ΈμΉ˜μ§€ μ•Šλ„λ‘ ν•œλ‹€. 격리성은 λ™μ‹œμ„±κ³Ό κ΄€λ ¨λœ μ„±λŠ₯ 이슈둜 인해 νŠΈλžœμž­μ…˜ 격리 μˆ˜μ€€μ„ 선택할 수 μžˆλ‹€.
    • 지속성 : νŠΈλžœμž­μ…˜μ„ μ„±κ³΅μ μœΌλ‘œ 끝내면 κ·Έ κ²°κ³Όκ°€ 항상 κΈ°λ‘λ˜μ–΄μ•Ό ν•œλ‹€. μ‹œμŠ€ν…œμ— λ¬Έμ œκ°€ λ°œμƒν•΄λ„ DB 둜그λ₯Ό 톡해 μ„±κ³΅ν•œ νŠΈλžœμž­μ…˜ λ‚΄μš©μ„ λ³΅κ΅¬ν•œλ‹€.
  • 컀λ„₯μ…˜μ„ μƒμ„±ν•˜λ©΄, DB 내뢀에 μ„Έμ…˜μ΄ 생긴닀.
    • μ„Έμ…˜μ€ νŠΈλžœμž­μ…˜μ„ μ‹œμž‘ν•˜κ³ , 컀밋 λ˜λŠ” 둀백을 톡해 νŠΈλžœμž­μ…˜μ„ μ’…λ£Œν•œλ‹€.
    • μˆ˜λ™ 컀밋 λͺ¨λ“œλ‘œ μ„€μ •ν•˜λŠ” 것을 νŠΈλžœμž­μ…˜μ„ μ‹œμž‘ν•œλ‹€κ³  ν‘œν˜„ν•œλ‹€.
        set autocommit false;
        insert into member(member_id, money) values ('data3', 10000);
        insert into member(member_id, money) values ('data4', 10000);
        commit;
νŠΈλžœμž­μ…˜μ˜ 적용
  • νŠΈλžœμž­μ…˜μ€ λΉ„μ¦ˆλ‹ˆμŠ€ 둜직이 μžˆλŠ” μ„œλΉ„μŠ€ κ³„μΈ΅μ—μ„œ μ‹œμž‘ν•œλ‹€.
  • νŠΈλžœμž­μ…˜μ„ μ‹œμž‘ν•˜λ €λ©΄ 컀λ„₯μ…˜μ΄ ν•„μš”ν•˜λ‹€. ➑️ μ„œλΉ„μŠ€ κ³„μΈ΅μ—μ„œ 컀λ„₯μ…˜μ„ λ§Œλ“€κ³ , νŠΈλžœμž­μ…˜ 컀밋 이후에 컀λ„₯μ…˜μ„ μ’…λ£Œν•œλ‹€.
  • νŠΈλžœμž­μ…˜μ„ μ‚¬μš©ν•˜λŠ” λ™μ•ˆ 같은 컀λ„₯μ…˜(=μ„Έμ…˜)을 μœ μ§€ν•œλ‹€.

About

🧐 μŠ€ν”„λ§μ€ 데이터에 μ–΄λ–»κ²Œ μ ‘κ·Όν• κΉŒ 🀨

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages