์๋ ํ์ธ์ ! ๋ฐฑ์๋ ๊ฐ๋ฐ์ ํ๋ฏผ์ ์ ๋๋ค :) ๐ซง
์ํฉ์ ๋ฐ๋ผ ์ ์ ํ ๊ธฐ์ ์ ์ฌ์ฉํ๊ธฐ ์ํด ๊ธฐ์ ๋ฐ ๋์์ ๋ํ ์ดํด๊ฐ ํ์ํ๋ค๊ณ ์๊ฐํ์ฌ ์ด๋ค์ ์ฐจ์ด์ ์ด ๊ถ๊ธํ๊ฒ ๋์์ต๋๋ค.
๋๋ฌธ์ ์ค๋์ 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 |