day80 πŸŒ•

μž₯λ―ΈΒ·2022λ…„ 9μ›” 2일

였늘의 μ„±κ³Ό

λͺ©λ‘ 보기
80/129

μŠ€ν”„λ§ DB 2편 - 데이터 μ ‘κ·Ό ν™œμš© 기술 μ„Ήμ…˜ 2 μˆ˜κ°•

μ„Ήμ…˜ 2. 데이터 μ ‘κ·Ό 기술 - μŠ€ν”„λ§ JdbcTemplate μˆ˜κ°• μ™„λ£Œ!!

JdbcTemplate μž₯점

  • μ„€μ •μ˜ νŽΈλ¦¬ν•¨

    • JdbcTemplate은 spring-jdbc λΌμ΄λΈŒλŸ¬λ¦¬μ— ν¬ν•¨λ˜μ–΄ μžˆλŠ”λ°, 이 λΌμ΄λΈŒλŸ¬λ¦¬λŠ” μŠ€ν”„λ§μœΌλ‘œ JDBCλ₯Ό μ‚¬μš©ν•  λ•Œ 기본으둜 μ‚¬μš©λ˜λŠ” λΌμ΄λΈŒλŸ¬λ¦¬λ‹€.
  • 반볡 문제 ν•΄κ²°

    • JdbcTemplate은 ν…œν”Œλ¦Ώ 콜백 νŒ¨ν„΄μ„ μ‚¬μš©ν•΄μ„œ, JDBCλ₯Ό 직접 μ‚¬μš©ν•  λ•Œ λ°œμƒν•˜λŠ” λŒ€λΆ€λΆ„μ˜ 반볡 μž‘μ—…μ„ λŒ€μ‹  μ²˜λ¦¬ν•΄μ€€λ‹€.

      • 컀λ„₯μ…˜ νšλ“
      • statementλ₯Ό μ€€λΉ„ν•˜κ³  μ‹€ν–‰
      • κ²°κ³Όλ₯Ό λ°˜λ³΅ν•˜λ„λ‘ 루프 μ‹€ν–‰
      • 컀λ„₯μ…˜ μ’…λ£Œ, statement, resultset μ’…λ£Œ
      • νŠΈλžœμž­μ…˜μ„ 닀루기 μœ„ν•œ 컀λ„₯μ…˜ 동기화
      • μ˜ˆμ™Έ λ°œμƒ μ‹œ μŠ€ν”„λ§ μ˜ˆμ™Έ λ³€ν™˜κΈ° μ‹€ν–‰
    • κ°œλ°œμžλŠ” SQL을 μž‘μ„±ν•˜κ³ , 전달할 νŒŒλΌλ―Έν„°λ₯Ό μ •μ˜ν•˜κ³  응닡 값을 λ§€ν•‘ν•˜κΈ°λ§Œ ν•˜λ©΄ λœλ‹€.

JdbcTemplate 단점

  • 동적 SQL을 ν•΄κ²°ν•˜κΈ° μ–΄λ ΅λ‹€.

template.queryForObject()

  • κ²°κ³Ό λ‘œμš°κ°€ ν•˜λ‚˜μΌ λ•Œ μ‚¬μš©ν•œλ‹€.
  • RowMapperλŠ” λ°μ΄ν„°λ² μ΄μŠ€μ˜ λ°˜ν™˜ 결과인 ResultSet을 객체둜 λ³€ν™˜ν•œλ‹€.
  • κ²°κ³Όκ°€ μ—†μœΌλ©΄ EmptyResultDataAccessException μ˜ˆμ™Έκ°€ λ°œμƒν•œλ‹€.
  • κ²°κ³Όκ°€ λ‘˜ 이상이면 IncorrectResultSizeDataAccessException μ˜ˆμ™Έκ°€ λ°œμƒν•œλ‹€.

template.query()

  • κ²°κ³Όκ°€ ν•˜λ‚˜ 이상일 λ•Œ μ‚¬μš©ν•œλ‹€.
  • RowMapperλŠ” λ°μ΄ν„°λ² μ΄μŠ€μ˜ λ°˜ν™˜ 결과인 ResultSet을 객체둜 λ³€ν™˜ν•œλ‹€.
  • κ²°κ³Όκ°€ μ—†μœΌλ©΄ 빈 μ»¬λ ‰μ…˜μ„ λ°˜ν™˜ν•œλ‹€.

JdbcTemplate - 이름 μ§€μ • νŒŒλΌλ―Έν„° 1

μˆœμ„œλŒ€λ‘œ 바인딩
JdbcTemplate을 기본으둜 μ‚¬μš©ν•˜λ©΄ νŒŒλΌλ―Έν„°λ₯Ό μˆœμ„œλŒ€λ‘œ λ°”μΈλ”©ν•œλ‹€.
νŒŒλΌλ―Έν„°λ₯Ό μˆœμ„œλŒ€λ‘œ λ°”μΈλ”©ν•˜λŠ” 것은 νŽΈλ¦¬ν•˜μ§€λ§Œ, μˆœμ„œκ°€ λ§žμ§€ μ•Šμ•„μ„œ 버그가 λ°œμƒν•  μˆ˜λ„ μžˆλ‹€.

이름 μ§€μ • 바인딩
JdbcTemplate은 이런 문제λ₯Ό λ³΄μ™„ν•˜κΈ° μœ„ν•΄ NamedParameterJdbcTemplateμ΄λΌλŠ”, 이름을 μ§€μ •ν•΄μ„œ νŒŒλΌλ―Έν„°λ₯Ό λ°”μΈλ”©ν•˜λŠ” κΈ°λŠ₯을 μ œκ³΅ν•œλ‹€.

JdbcTemplate - 이름 μ§€μ • νŒŒλΌλ―Έν„° 2

이름 μ§€μ • νŒŒλΌλ―Έν„°
νŒŒλΌλ―Έν„°λ₯Ό μ „λ‹¬ν•˜λ €λ©΄ Map처럼 key, value 데이터 ꡬ쑰λ₯Ό λ§Œλ“€μ–΄μ„œ 전달해야 ν•œλ‹€.
μ—¬κΈ°μ„œ keyλŠ” νŒŒλΌλ―Έν„° 이름, valueλŠ” ν•΄λ‹Ή νŒŒλΌλ―Έν„°μ˜ 값이 λœλ‹€.

이름 μ§€μ • λ°”μΈλ”©μ—μ„œ 자주 μ‚¬μš©ν•˜λŠ” νŒŒλΌλ―Έν„°μ˜ μ’…λ₯˜λŠ” 크게 3κ°€μ§€κ°€ μžˆλ‹€.

  • Map
  • SqlParameterSource
    • MapSqlParameterSource
      Mapκ³Ό μœ μ‚¬ν•œλ°, SQL νƒ€μž…μ„ μ§€μ •ν•  수 μžˆλŠ” λ“± SQL에 μ’€ 더 νŠΉν™”λœ κΈ°λŠ₯을 μ œκ³΅ν•œλ‹€.
    • BeanPropertySqlParameterSource
      μžλ°” 빈 ν”„λ‘œνΌν‹° κ·œμ•½μ„ ν†΅ν•΄μ„œ μžλ™μœΌλ‘œ νŒŒλΌλ―Έν„° 객체λ₯Ό μƒμ„±ν•œλ‹€.
      예: getXxx() -> xxx, getItemName() -> itemName
      • key=itemName, value=μƒν’ˆλͺ… κ°’

BeanPropertyRowMapper

BeanPropertyRowMapperλŠ” ResultSet의 κ²°κ³Όλ₯Ό λ°›μ•„ μžλ°” 빈 κ·œμ•½μ— 맞좰 데이터λ₯Ό λ³€ν™˜ν•œλ‹€.
예λ₯Ό λ“€μ–΄, λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ μ‘°νšŒν•œ κ²°κ³Όκ°€ select id, price라고 ν•˜λ©΄ λ‹€μŒκ³Ό 같은 μ½”λ“œλ₯Ό μž‘μ„±ν•΄μ€€λ‹€.

Item item = new Item();
item.setId(rs.getLong("id"));
item.setPrice(rs.getInt("price"));

λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ μ‘°νšŒν•œ κ²°κ³Ό 이름을 기반으둜 setId(), setPrice()처럼 μžλ°” 빈 ν”„λ‘œνΌν‹° κ·œμ•½μ— 맞좘 λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜λŠ” 것이닀.

별칭

별칭 asλ₯Ό μ‚¬μš©ν•΄μ„œ SQL 쑰회 결과의 이름을 λ³€κ²½ν•  수 μžˆλ‹€.
λ°μ΄ν„°λ² μ΄μŠ€μ˜ 컬럼 이름과 객체 이름이 λ‹€λ₯Ό λ•Œ 별칭을 톡해 ν•΄κ²°ν•  수 μžˆλ‹€. 예λ₯Ό λ“€μ–΄, λ°μ΄ν„°λ² μ΄μŠ€μ—λŠ” member_name이라 λ˜μ–΄ μžˆλŠ”λ°, 객체에 username이라고 λ˜μ–΄ μžˆλ‹€λ©΄ λ‹€μŒκ³Ό 같이 ν•΄κ²°ν•  수 μžˆλ‹€.
select member_name as username

κ΄€λ‘€μ˜ 뢈일치

μžλ°” κ°μ²΄λŠ” 카멜 ν‘œκΈ°λ²•μ„ μ‚¬μš©ν•œλ‹€. 반면 κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œλŠ” 주둜 μŠ€λ„€μ΄ν¬ ν‘œκΈ°λ²•μ„ μ‚¬μš©ν•œλ‹€.
BeanPropertyRowMapperλŠ” μŠ€λ„€μ΄ν¬ ν‘œκΈ°λ²•μ„ 카멜둜 μžλ™ λ³€ν™˜ν•΄μ€€λ‹€. λ”°λΌμ„œ select item_name으둜 μ‘°νšŒν•΄λ„ setItemName()에 λ¬Έμ œμ—†μ΄ 값이 λ“€μ–΄κ°„λ‹€.

JdbcTemplate - SimpleJdbcInsert

JdbcTemplate은 INSERT SQL을 직접 μž‘μ„±ν•˜μ§€ μ•Šμ•„λ„ λ˜λ„λ‘ SimpleJdbcInsertλΌλŠ” νŽΈλ¦¬ν•œ κΈ°λŠ₯을 μ œκ³΅ν•œλ‹€.

  • withTableName: 데이터λ₯Ό μ €μž₯ν•  ν…Œμ΄λΈ” λͺ…을 μ§€μ •ν•œλ‹€.
  • usingGeneratedKeyColumns: keyλ₯Ό μƒμ„±ν•˜λŠ” PK 컬럼 λͺ…을 μ§€μ •ν•œλ‹€.
  • usingColumns: INSERT SQL에 μ‚¬μš©ν•  μ»¬λŸΌμ„ μ§€μ •ν•œλ‹€. νŠΉμ • κ°’λ§Œ μ €μž₯ν•˜κ³  싢을 λ•Œ μ‚¬μš©ν•œλ‹€. μƒλž΅ κ°€λŠ₯ν•˜λ‹€.

JdbcTemplate κΈ°λŠ₯ 정리

JdbcTemplate: μˆœμ„œ 기반 νŒŒλΌλ―Έν„° 바인딩을 μ§€μ›ν•œλ‹€.
NamedParameterJdbcTemplate: 이름 기반 νŒŒλΌλ―Έν„° 바인딩을 μ§€μ›ν•œλ‹€. (ꢌμž₯)
SimpleJdbcInsert: INSERT SQL을 νŽΈλ¦¬ν•˜κ²Œ μ‚¬μš©ν•  수 μžˆλ‹€.
SimpleJdbcCall: μŠ€ν† μ–΄λ“œ ν”„λ‘œμ‹œμ €λ₯Ό νŽΈλ¦¬ν•˜κ²Œ ν˜ΈμΆœν•  수 μžˆλ‹€.


κ°•μ˜ 및 ν† ν”½ 아직 λͺ» 끝낸 κ±° 정리

βœ”οΈ μŠ€ν”„λ§ DB 2편 - 데이터 μ ‘κ·Ό ν™œμš© 기술 μ„Ήμ…˜ 0~2 정리 μ™„λ£Œ
βœ”οΈ HTTP vs HTTPS 정리 μ™„λ£Œ (λ“œλ””μ–΄...)


ν”„λ‘œμ νŠΈ μš”κ΅¬μ‚¬ν•­ 정리

profile
김뉴비

0개의 λŒ“κΈ€