๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Study/Spring

[Spring] JDBC์™€ JPA

by hong- 2022. 10. 23.

์•ˆ๋…•ํ•˜์„ธ์š” ! ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž ํ™๋ฏผ์ •์ž…๋‹ˆ๋‹ค :) ๐Ÿซง

์ƒํ™ฉ์— ๋”ฐ๋ผ ์ ์ ˆํ•œ ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๊ธฐ์ˆ  ๋ฐ ๋™์ž‘์— ๋Œ€ํ•œ ์ดํ•ด๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์—ฌ ์ด๋“ค์˜ ์ฐจ์ด์ ์ด ๊ถ๊ธˆํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋•Œ๋ฌธ์— ์˜ค๋Š˜์€ JDBC์™€ JPA์˜ ์ฐจ์ด์— ๋Œ€ํ•ด ํฌ์ŠคํŒ…ํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.


์šฐ์„ , ์ด ๋‘˜์˜ ์ฐจ์ด์ ์„ ์•Œ๊ธฐ์œ„ํ•ด ์˜์†์„ฑ์— ๋Œ€ํ•œ ์ดํ•ด๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค !

๐Ÿ’ก ์˜์†์„ฑ(Persistence) ?

 - ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•œ ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒ๋˜๋”๋ผ๋„ ์‚ฌ๋ผ์ง€์ง€ ์•Š๋Š” ๋ฐ์ดํ„ฐ์˜ ํŠน์„ฑ

 - Persistence Layer๋Š” ํ”„๋กœ๊ทธ๋žจ ์•„ํ‚คํ…์ฒ˜์—์„œ ๋ฐ์ดํ„ฐ์— ์˜์†์„ฑ์„ ๋ถ€์—ฌํ•ด์ฃผ๋Š” ๊ณ„์ธต์„ ๋งํ•˜๋ฉฐ, Persistence framework๋ฅผ ์ฃผ๋กœ ์ด์šฉํ•จ

 - Persistence Framework๋Š” JDBC ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๋ณต์žกํ•จ์ด๋‚˜ ๋ฒˆ๊ฑฐ๋กœ์›€ ์—†์ด ๊ฐ„๋‹จํ•œ ์ž‘์—…๋งŒ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์—ฐ๋™๋˜๋Š” ์‹œ์Šคํ…œ์„

    ๋น ๋ฅด๊ฒŒ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๊ณ  ์•ˆ์ •์ ์ธ ๊ตฌ๋™์„ ๋ณด์žฅํ•จ

 

 ์ด๋Ÿฌํ•œ ์˜์†์„ฑ ํ”„๋ ˆ์ž„์›Œํฌ๋กœ๋Š” SQL Mapper์™€ ORM์œผ๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค.

 โœ”๏ธ SQL Mapper

 - SQL Query๋ฌธ์œผ๋กœ ์ง์ ‘ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋‹ค๋ฃธ

 - ๋‹จ์ˆœํžˆ ํ•„๋“œ๋ฅผ ๋งคํ•‘์‹œํ‚ค๋Š” ๊ฒƒ์ด ๋ชฉ์ 

 - ex) MyBatis, JdbcTemplate ๋“ฑ

 โœ”๏ธ ORM

 - ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ๊ฐ„์ ‘์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋‹ค๋ฃธ

 - ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฐ์ฒด๋ฅผ ์ž๋ฐ” ๊ฐ์ฒด๋กœ ๋งคํ•‘

 - ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๊ด€๊ณ„๋ฅผ ๊ฐ์ฒด์— ๋ฐ˜์˜ํ•˜๋Š” ๊ฒƒ์ด ๋ชฉ์ 

 - ex) JPA, Hibernate ๋“ฑ


์œ„์™€ ๊ฐ™์€ ์˜์†์„ฑ์˜ ์„ฑ๊ฒฉ์„ ๊ฐ–๋Š” ๋Œ€ํ‘œ์ ์ธ ํ”„๋ ˆ์ž„์›Œํฌ๋กœ JDBC, JPA, Mybatis ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋จผ์ €, JDBC์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

โ‘  JDBC (Java Database Connectivity)

 - DB์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก Java ์—์„œ ์ œ๊ณตํ•˜๋Š” API๋กœ Plain JDBC์™€ Spring JDBC๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค๋‹ค.

  โœ”๏ธ Plain JDBC

   1) ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ „๊ณผ ํ›„์— ๋งŽ์€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•จ

   2) ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋กœ์ง์—์„œ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ์ฝ”๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•จ

   3) ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ ํ•ด์•ผ ํ•จ

   4) ์ฝ”๋“œ๋ฐ˜๋ณตํ•˜์—ฌ ๋น„ํšจ์œจ์ ์ž„

  โœ”๏ธ Spring JDBC 

   - Spring JDBC๊ฐ€ Connection์˜ ์—ด๊ณ  ๋‹ซ๊ธฐ, ์˜ˆ์™ธ์ฒ˜๋ฆฌ, ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์—

      ๊ฐœ๋ฐœ์ž๋Š” datasource์„ค์ •, SQL ์ž‘์„ฑ, ๊ฒฐ๊ณผ์ฒ˜๋ฆฌ ์ˆ˜ํ–‰์—๋งŒ ์ง‘์ค‘ํ•  ์ˆ˜์žˆ์–ด Plain JDBC์— ๋น„ํ•ด ์ฝ”๋“œ๊ฐ€ ํ›จ์”ฌ ๊ฐ„๊ฒฐ

private final JdbcTemplate jdbcTemplate;

public ProductRepostiory(Datasource datasource) {
	jdbcTempalte = new JdbcTemplate();
}

public Optional<Product> findByName(String name) {
	List<Product> findProducts = jdbcTemplate.query("select * from product where name = ?", productRowMapper(), name);
    return findProducts;
}

 

 ๊ทธ๋Ÿฌ๋‚˜, ์ฝ”๋“œ๊ฐ€ ๊ฐ„๊ฒฐํ•ด์กŒ์Œ์—๋„ SQL ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ์ฒด ์ง€ํ–ฅ ๊ฐœ๋ฐœ์ด ์–ด๋ ต๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 ์ด๋Ÿฌํ•œ ๋‹จ์ ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด JPA๊ฐ€ ๋“ฑ์žฅํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 โ‘ก JPA

 - ์ž๋ฐ” ORM ๊ธฐ์ˆ ์— ๋Œ€ํ•œ ํ‘œ์ค€๋ช…์„ธ๋กœ Java์—์„œ ์ œ๊ณตํ•˜๋Š” API

 - ORM์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ์„ค๋ช…ํ•˜๋ฉด ์ง์ ‘์ ์ธ SQL ๋ฌธ ์—†์ด๋„ ๊ฐ์ฒด๊ฐ€ DB์™€ ์—ฐ๋™๋จ

 - JPA๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ JDBC ์‚ฌ์ด์—์„œ ๋™์ž‘ํ•จ

    - ์ฆ‰, ๊ฐœ๋ฐœ์ž๊ฐ€ JPA๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด JPA ๋‚ด๋ถ€์—์„œ JDBC API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ SQL๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ DB์™€ ํ†ต์‹ 

 - JPA๋Š” ์ธํ„ฐํŽ˜์ด์Šค์ด๋ฏ€๋กœ ์–ด๋–ค ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ๊ตฌํ˜„ํ•ด์•ผ๋งŒ ํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ๊ทœ์ •ํ•˜๋Š” ์—ญํ• 

 - ๋Œ€ํ‘œ์ ์œผ๋กœ Hibernate๊ฐ€ JPA์˜ ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„์ฒด

private ProductRepository productRepository;

@Transactional
publc Product findProduct(String name) {
	Product products = productRepostory.findByName(name);
}

โœ… Spring Data JPA

 - Spring ์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ชจ๋“ˆ์ด์ž Framework๋กœ ๊ฐœ๋ฐœ์ž๊ฐ€ JPA๋ฅผ ๋”์šฑ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•จ

 - JPA๋ฅผ ํ•œ ๋‹จ๊ณ„ ์ถ”์ƒํ™”์‹œํ‚จ Repository๋ผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ Repository์ธํ„ฐํŽ˜์ด์Šค์— ๋ฉ”์†Œ๋“œ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด

    Spring์ด ์•Œ์•„์„œ ํ•ด๋‹น ๋ฉ”์†Œ๋“œ ์ด๋ฆ„์— ์ ํ•ฉํ•œ ์ฟผ๋ฆฌ๋ฅผ ๋‚ ๋ฆฌ๋ฅผ ๊ตฌํ˜„์ฒด๋ฅผ ๋งŒ๋“ค์–ด Bean์œผ๋กœ ๋“ฑ๋กํ•ด์คŒ

    → ์ฆ‰, Spring Boot ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์ด์šฉํ•œ ํ”„๋กœ์ ํŠธ์—์„œ Repository๋ฅผ ์ž‘์„ฑํ•˜๋ฉด JPA๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋Š” ์˜๋ฏธ

 

JPA๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ๋งŽ์€ ์žฅ์ ์ด ์žˆ์ง€๋งŒ ์–ด๋ ค์šฐ๋ฉฐ ์ œ๋Œ€๋กœ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•  ์‹œ ๋ฐ์ดํ„ฐ ์†์‹ค์ด ์žˆ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

JPA๊ฐ€ ๋“ฑ์žฅํ•˜๊ธฐ ์ด์ „์—๋Š” Mybatis๋ผ๋Š” ๊ธฐ์ˆ ์„ ์ด์šฉํ–ˆ๋Š”๋ฐ ์ด๋Š” Java ์ฝ”๋“œ์™€ ์ง์ ‘ ์ž‘์„ฑํ•œ SQL์„ ๋งคํ•‘ ์‹œ์ผœ์ฃผ์–ด์•ผ๋งŒ ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ฐ˜๋ฉด JPA์™€ ๊ฐ™์€ ๊ธฐ์ˆ ์€ ๊ฐ์ฒด๊ฐ€ DB์™€ ์—ฐ๊ฒฐ๋˜๊ธฐ ๋•Œ๋ฌธ์— SQL์„ ์ง์ ‘ ์ž‘์„ฑํ•˜์ง€ ์•Š๊ณ  ํ‘œ์ค€ ์ธํ„ฐํŽ˜์ด์Šค ๊ธฐ๋ฐ˜์œผ๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

 

๋งˆ์ง€๋ง‰์œผ๋กœ MyBatis์— ๋Œ€ํ•ด ๊ฐ„๋‹จํžˆ ์„ค๋ช…ํ•˜๊ณ  ๋ณธ ํฌ์ŠคํŒ…์„ ๋งˆ์น˜๊ฒ ์Šต๋‹ˆ๋‹ค.

โ‘ข MyBatis

 - SQL Mapping์„ ์‚ฌ์šฉํ•˜๋Š” ์˜์†์„ฑ ํ”„๋ ˆ์ž„์›Œํฌ

 - ๊ฐœ๋ฐœ์ž๊ฐ€ Native SQL ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ฒด์™€ ๋งคํ•‘ํ•˜๋Š” ๊ฒƒ๊นŒ์ง€ ์ง์ ‘ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•จ

 - ํ…Œ์ด๋ธ” ๋ฐ DTO๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ๋งคํ•‘์— ๋Œ›๋‚˜ ๋ถ€๋ถ„์„ ๋‹ค์‹œ ์ˆ˜์ •ํ•ด์•ผ ํ•˜๋Š” ๋‹จ์ ์ด ์žˆ์Œ

 - SQL์„ ์ž‘์„ฑํ•  ์ค„ ์•„๋Š” ๊ฐœ๋ฐœ์ž๋ผ๋ฉด ๊ธฐ์ˆ ์  ๋‚œ์ด๋„๊ฐ€ ์ƒ๋Œ€์ ์œผ๋กœ ๋‚ฎ์•„ ์‰ฝ๊ฒŒ ์ ‘ํ•  ์ˆ˜๋Š” ์žˆ์ง€๋งŒ ํ•ด์•ผํ•  ์ผ์ด ๋งŽ์•„์ง€๋Š” ์•ฝ์ ์ด ์žˆ์Œ

โœ… MyBatis์™€ JPA์˜ ํฐ ์ฐจ์ด์ 

 - Mybatis๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ ๊ฐœ๋ฐœ์ž๊ฐ€ SQL ์ฟผ๋ฆฌ๋ฅผ ์ง์ ‘ ์ž‘์„ฑํ•ด์„œ ์•Œ๋ ค์ฃผ์–ด์•ผ ํ•˜์ง€๋งŒ

    Spring Data JPA๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด SQL ์ฟผ๋ฆฌ๋Š” JPA์˜ ๊ตฌํ˜„์ฒด์ธ Hibernate๊ฐ€ ์ž‘์„ฑํ•ด์„œ ์‚ฌ์šฉํ•จ

'Study > Spring' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Spring] DAO / DTO / VO / Entity  (0) 2022.11.21
[Spring] ModelAndView ๊ฐ์ฒด  (0) 2022.11.18
[Spring] Annotation  (0) 2022.10.24
[Spring] Spring Data JPA์™€ QueryDSL  (1) 2022.10.08
[Spring] DTO, Entity, Mapper  (1) 2022.09.06