RDBMS
๐ RDBMS
๋ฐ์ดํฐ๋ค์ ์งํฉ์ ๊ด๊ณํ์ผ๋ก ํํํ๋ ๊ฒ์ผ๋ก ํ๊ณผ ์ด์ ์งํฉ์ผ๋ก ๊ตฌ์ฑ๋ ํ ์ด๋ธ์ ๋ฌถ์ ํ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํ๋ค. ํ ์ด๋ธ ํ์์ ๋ฐ์ดํฐ๋ฅผ ์กฐ์ ํ ์ ์๋ ๊ด๊ณ ์ฐ์ฐ์๋ฅผ ์ ๊ณตํ๋ค.
๋ฐ์ดํฐ ๋ฒ ์ด์ค์ ํน์ฑ
- ์ค์๊ฐ ์ ๊ทผ์ฑ (Real-tiem Accessability)
- ๊ณ์์ ์ธ ๋ณํ (Continuous Evolution) - ์ ํํ ๊ฐ์ ์ ์งํ๊ธฐ์ํด ์ฝ์ ,์ญ์ ,์์ ๋ฑ์ ์ด์ฉํด ๋ฐ์ดํฐ๋ฅผ ์ง์์ ์ผ๋ก ๊ฐฑ์ ํ ์ ์๋ค.
- ๋์ ๊ณต์ ์ฑ (Concurrent Sharing)
- ๋ด์ฉ ์ฐธ์กฐ (Content Reference)
- ์ ์ฅํ ๋ฐ์ดํฐ ๋ ์ฝ๋์ ์์น๋ ์ฃผ์๊ฐ ์๋ ์ฌ์ฉ์๊ฐ ์๊ตฌํ๋ ๋ฐ์ดํฐ์ ๋ด์ฉ, ์ฆ ๋ฐ์ดํฐ ๊ฐ์ ๋ฐ๋ผ ์ฐธ์กฐํ ์ ์์ด์ผ ํ๋ค.
ํฌ์ธํฐ ๊ฐ์ ์ฃผ์ ๊ฐ๋ ์ด ์๋๋ผ, ๊ฒ์์์ง์ฒ๋ผ ํค์๋ ๋ด์ฉ์ ๊ฒ์ํ๋๊ฒ ์ฒ๋ผ ์๋ํ๋ค.
ORM๊ณผ JPA๊ทธ๋ฆฌ๊ณ Hibernate
๐ฅ ORM (Object Relational Mappin)
ORM
์ด๋ ๊ฐ์ฒด์ DB์ ํ ์ด๋ธ์ด ๋งคํ์ ์ด๋ฃจ๋ ๊ฒ์ ๋งํฉ๋๋ค. ์ฆ ๊ฐ์ฒด๊ฐ ํ ์ด๋ธ์ด ๋๋๋ก ๋งคํ ์์ผ์ฃผ๋ ๊ฒ์ ๋งํฉ๋๋ค. ORM์ ์ด์ฉํ๋ฉด SQL Query๊ฐ ์๋ ์ง๊ด์ ์ธ ์ฝ๋(๋ฉ์๋)๋ก์ ๋ฐ์ดํฐ๋ฅผ ์กฐ์ํ ์ ์์ต๋๋ค.
๐ JPA (Java Persistence API)
Mybatis์์๋ ํ ์ด๋ธ ๋ง๋ค ๋น์ทํ CRUD SQL์ ๊ณ์ ๋ฐ๋ณต์ ์ผ๋ก ์ฌ์ฉํ์์ต๋๋ค.
์๊ท๋ชจ๋ผ๋ Mybatis๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค์ด ๋ณด์ จ๋ค๋ฉด, DAO ๊ฐ๋ฐ์ด ๋งค์ฐ ๋ฐ๋ณต๋๋ ์์ ์ด๋ฉฐ, ์ด ์์ ์ด ๋งค์ฐ ๊ท์ฐฎ๋ค๋ ๊ฒฝํ์ ํด๋ณด์์ ๊ฒ์ ๋๋ค.
๋ํ ํ ์ด๋ธ์ ์นผ๋ผ์ด ํ๋ ์ถ๊ฐ๋๋ค๋ฉด ์ด์ ๊ด๋ จ๋ ๋ชจ๋ DAO์ SQL๋ฌธ์ ์์ ํด์ผ ํฉ๋๋ค. ์ฆ DAO์ ํ ์ด๋ธ์ ๊ฐํ ์์กด์ฑ์ ๊ฐ๊ณ ์์ต๋๋ค.
๊ฐ์ฒด ๋ชจ๋ธ๋ง๋ณด๋ค ๋ฐ์ดํฐ ์ค์ฌ ๋ชจ๋ธ๋ง(ํ ์ด๋ธ ์ค๊ณ)์ ์ฐ์ ์ ํ์ผ๋ฉฐ, ๊ฐ์ฒด์งํฅ์ ์ฅ์ (์ถ์ํ, ์บก์ํ, ์ ๋ณด์๋, ์์, ๋คํ์ฑ)์ ์ฌ์ฉํ์ง ์๊ณ ๊ฐ์ฒด๋ฅผ ๋จ์ํ ๋ฐ์ดํฐ ์ ๋ฌ ๋ชฉ์ ( VO, DTO )์๋ง ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋๋ค. - ๐ ORM๊ณผ JPA ๊ทธ๋ฆฌ๊ณ Hibernate
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ํด๋์ค ์ค๊ณ์ ์์ฐํ๋ DAO์ JPA๋ฅผ ์์๋ฐ์ ์ํ๋ก ๊ฐ์ฒด์ ์ ์ธ์ DAO์ ๋ฉ์๋๋ฅผ ํ์ฉํด ORM๊ณผ์ ์ ์ํํ๋ ๊ฒ์ด๋ค.
์ฝ๋๋ก ํํํด๋ณด์๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
public interface PostDAO extends JpaRepository<Post, Integer>{
Page<Post> findByCategoryId(int categoryId, Pageable pageable);
@Query("Select p from Post p where p.push >= 5")
public Page<Post> Push(Pageable pageable);
}
์์ฒ๋ผ JpaRepository<๊ฐ์ฒด, PK>
์ ํํ๋ก ์์๋ฐ์ ํ
@RequestMapping("/list/recommend")
public String Recommend(Model model, @RequestParam(value="category", required = false, defaultValue = "0") int categoryId,
@PageableDefault(sort = {"id"}, direction = Sort.Direction.DESC, size = 10) Pageable pageable) {
Page<Post> postPage;
postPage = postDAO.Push(pageable);
model.addAttribute("postPage", postPage);
...
}
์ ๊ฐ์ด JPA๋ DAO๋ฅผ ํตํด ORM์ ๊ฑฐ์น ํ
์ด๋ธ์ postPage
๋ผ๋ ๊ฐ์ฒด์ ํ ๋นํ์ฌ ์ฌ์ฉํ๋๊ฒ์ ๊ฐ๋ฅํ๊ฒ ํ๋ค.
Hibernate
Boss์์ ๊ฐ๋ฐํ ORM ํ๋ ์์ํฌ
Hibernate๋ ํ๋๋ถํฐ ์ด๊น์ง OR๋งคํ์ ํ๊ณ ์ ํ ๋ ๊ฐ์ฅ ์ข๋ค. ์ด๋ ์๋ฒฝํ ORM์๋ฃจ์ ์ ์ ๊ณตํ์ง๋ง ์ฟผ๋ฆฌ์ ๋ํ ์ ์ด๋ฅผ ์ด๋ ต๊ฒ ํ๋ค. Hibernate๋ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ฐ๊ฐ์ ๋ํ ์ค๊ณ์ ๋ํ ์๋ฒฝํ ํต์ ๊ฐ ๊ฐ๋ฅํ ์ํฉ์์ ์ด์์ ์ธ ์๋ฃจ์ ์ด๋ค. - ๐ Hibernate, JPA, and Mybatis Which is right for you?
๋ฐ์ดํฐ ๋ฒ ์ด์ค ๊ด๋ฆฌ์ ์ฅ์
- ๋ฐ์ดํฐ์ ์ผ๊ด์ฑ ๋ฐ ๋ฌด๊ฒฐ์ฑ ์ ์ง - ์ฐ๊ด์๋ ์ํธ๊ฐ์ ๋ฐ์ดํฐ๊ฐ ์ ์ง๋์ด์ผ ํ๋ ํน์ฑ๋์ ์์ ์ด๋ ์ญ์ ๊ฐ ํ๊ณณ์์๋ง ์ผ์ด๋ ๊ฒฝ์ฐ ์๋ฌ ๋ฐ์
- ๋ฐ์ดํฐ์ ์ค๋ณต ์ต์ํ
- ๋ฐ์ดํฐ ๋ณด์ ๋ณด์ฅ
๋ฐ์ดํฐ ๋ฒ ์ด์ค ๊ด๋ฆฌ์ ๋จ์
- ์ด์๋น๊ฐ ๋น์ธ๋ค
- ๋ฐฑ์ ๋ฐ ๋ณต๊ตฌ์ ๋ํ ๊ด๋ฆฌ๊ฐ ๋ณต์ก
- ๋ถ๋ถ์ ๋ฐ์ดํฐ ๋ฒ ์ด์ค ์์ค์ด ์ ์ฒด ์์คํ ์ ์ ์ง