mysql๊ณผ ํฌํธ๋ฒํธ๊ฐ ๊ฒน์ณ ๊ตฌ๊ธ๋ง ํ์
์๊ทผ ๋ณต์กํ์
Java์ธ์ด๋ฅผ ํตํด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ฐ์ ์์ ๊ณ์ธต์ ์ฒ๋ฆฌํ๊ณ ์ ํ๋ ์คํ
(object-relational mapping)-๊ฐ์ฒด์งํฅ
๊ฐ์ฒด์งํฅ ํจ๋ฌ๋ค์์ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ณด์กดํ๋ ๊ธฐ์ (mapping)
ORM์ด JPA๋ณด๋ค ์ข ๋ ์์ ๊ฐ๋ , JPA๋ ์๋ฐ์ ๊ตญํ๋ ๊ฐ๋
memo class๋ ์ํฐํฐ ํด๋์ค๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํ
์ด๋ธ ๊ฐ์ ๊ตฌ์กฐ๋ฅผ ์ง๋
์ํฐํฐ ํด๋์ค๋ @Entity ์ด๋
ธํ
์ด์
์ ๋ฌด์กฐ๊ฑด ์ถ๊ฐํด์ค์ผํจ
ํด๋น ํด๋์ค์ ์ธ์คํด์ค๋ค์ด jpa๋ก ๊ด๋ฆฌ๋๋ ์ํฐํฐ ๊ฐ์ฒด๋ผ๋ ์๋ฏธ
์๋์ผ๋ก ํ
์ด๋ธ ์์ฑ ๊ฐ๋ฅ, ๋ฉค๋ฒ๋ณ์์ ๋ฐ๋ผ ์๋์ผ๋ก ์นผ๋ผ๋ค๋ ์์ฑ
๋ฐ์ดํฐ๋ฒ ์ด์ค์์์ ์ํฐํฐ ํด๋์ค๋ฅผ ์ด๋ค ํ ์ด๋ธ๋ก ์์ฑํ ์ง์ ๋ํ ์ ๋ณด๋ฅผ ๋ด๊ธฐ ์ํ ์ด๋ ธํ ์ด์
@Table(name="t_memo")
์์ฑ๋๋ ํ ์ด๋ธ์ ์ด๋ฆ์ด 't_memo'ํ ์ด๋ธ๋ก ์์ฑ
(์ด ์ธ์๋ ์ธ๋ฐ์ค ์์ฐํ๋ ์ค์ ๋ ๊ฐ๋ฅ)
@Entity๊ฐ ๋ถ์ ํด๋์ค๋ primary key์ ํด๋นํ๋ ํ๋๋ฅผ @Id๋ก ์ง์ ํด์ค์ผ ํจ
์๋์ผ๋ก ์์ฑ๋๋ ๋ฒํธ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ @GeneratedValue ์ด๋
ธํ
์ด์
์ฌ์ฉ
@GeneratedValue(strategy = GenerationType.IDENTITY)
pk ์๋ ์์ฑ ์ ๋ต
Getter ๋ฉ์๋๋ฅผ ์์ฑ
๊ฐ์ฒด ์์ฑ
@Builder ์ฐ๋ ค๋ฉด @AllArgsConstructor, @NoArgsConstructor ๋๋ค ์จ์ผ์ง ์๋ฌ ์๋ธ
spring.jpa.hibernate.ddl-auto=update spring.jpa.properties.hibernate.format_sql =true spring.jpa.show-sql=true
์ฒซ๋ฒ์งธ ์ค์ ์๋์ผ๋ก DDL(create,alter,drop๋ฑ)์ ์์ฑํ๋์ง ๊ฒฐ์ ํ๋ ์ค์
๋๋ฒ์งธ ์ค์ ๋ฐ์ํ๋ sql์ ํฌ๋งทํ ํด์ ์ถ๋ ฅํด์ค
์ธ๋ฒ์งธ ์ค์ jpa ์ฒ๋ฆฌ์ ๋ฐ์ํ๋ sql์ ๋ณด์ฌ์ค์ง ๊ฒฐ์
MemoRepository ์์ฑ-> JpaRepository๋ฅผ ์์ํ๊ธฐ๋ง ํ๋ฉด ๋!
JpaRepository ์ฌ์ฉํ ๋๋ ์ํฐํฐ ํ์
(Memo๋ก), @Id (Long์ผ๋ก) ํ์
์ง์ ํด์ค์ผํจ
public interface MemoRepository extends JpaRepository<Memo, Long> { }
์ธํฐํ์ด์ค ์ ์ธ๋ง์ผ๋ก๋ ์๋์ผ๋ก ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋ก๋จ
Memo Repository๋ฅผ ํตํด์ sql์์ด CRUD ์์ ์ ํ ์คํธ ํ ์ ์์
(save๋ ๊ฐ์ฒด ๋น๊ตํด๋ณด๊ณ ์์ผ๋ฉด insert, ์์ผ๋ฉด update ํ๋ ๋ฐฉ์)
์คํ๋ง์ด ๋ด๋ถ์ ์ผ๋ก ํด๋น ํด๋์ค๋ฅผ ์๋์ผ๋ก ์์ฑํจ ์ด๋ ํด๋์ค ์ด๋ฆ์ ๋ณด๋ test๋ฅผ ํ๋ฉด class ์ด๋ฆ์ด jdk.proxy3.$Proxy111 ์ด๋ ๊ฒ ์ถ๋ ฅ๋๋ ๊ฒ์ ๋ณผ ์ ์์(์๋ฌ ์๋จ๊ณ ์ ๋์๊ฐ)
๋ฑ๋ก ์์
Test:
100๊ฐ์ ์๋ก์ด memo ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ณ memorepository๋ฅผ ์ด์ฉํด์ insert ํด์ค
์กฐํ ์์
Test:
findById()์ ๊ฒฝ์ฐ, Optional ํ์
์ผ๋ก ๋ฐํ๋๊ธฐ ๋๋ฌธ์ ๊ฒฐ๊ณผ๊ฐ ์กด์ฌํ๋์ง ์ฒดํฌํ๋ ํํ๋ก ์์ฑ๋จ, sql์ ์ด๋ฏธ ๋ค ์ฒ๋ฆฌ๋จ
getOne()์ ๊ฒฝ์ฐ, @Transactional ์ด๋
ธํ
์ด์
์ด ์ถ๊ฐ๋ก ํ์ํจ, ์ค์ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ์๊ฐ์ sql์ด ๋์ํจ
์์ ์์
Test:
100๋ฒ์ memo ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ณ save๋ฅผ ํธ์ถํจ -> ๊ฒฐ๊ณผ: select์ฟผ๋ฆฌ๋ก ํด๋น ๋ฒํธ์ ๊ฐ์ฒด๋ฅผ ํ์ธํ๊ณ updateํจ
JPA์ mariadb๋ ์๋์ผ๋ก ์ฒ๋ฆฌํด์ค (findAll())
Pageable pageable = PageRequest.of(0,10);
ํ์ด์ง ์ฒ๋ฆฌ๋ 0 ํ์ด์ง๋ถํฐ ์์, ํ ํ์ด์ง์ 10๊ฐ size ๋ด๋๋ค๋ ๋ง
=>test ์คํํ๋ฉด limit๊ตฌ๋ฌธ์ด ์ฌ์ฉ๋๋ ๊ฒ์ ๋ณผ์ ์์
Page<Memo> result= memoRepository.findAll(pageable);
์ด๋ ๊ฒ ์คํํ๋ฉด findAll()์ pageable ํ์
์ ํ๋ผ๋ฏธํฐ๋ฅผ ์ ๋ฌํ๋ฉด ํ์ด์ง ์ฒ๋ฆฌ์ ๊ด๋ จ๋ ์ฟผ๋ฆฌ๋ค์ ์คํํ๊ณ ๊ฒฐ๊ณผ๋ค๋ก ๋ฆฌํดํ์
์ผ๋ก ์ง์ ๋ page<entity ํ์
> ๊ฐ์ฒด๋ก ์ ์ฅ๋๋ค.
page<์ํฐํฐ ํ์
>์ ์ฌ๋ฌ ๋ฉ์๋๋ฅผ ์ง์ํจ
Ex): result.getTotalPages()...๋ฑ๋ฑ
getContent()๋ ์ค์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ณ list<>์ผ๋ก ์ฒ๋ฆฌ ๊ฐ๋ฅ
์ ๋ ฌ์ ์์ฐจ์ ์ธ ์์
์ญ์์ผ๋ก ์ ๋ ฌํ ๋ ค๊ณ ํ๋ฉด testSort()์ด์ฉํด์ descending()์ฐ๋ฉด ๋จ
@Commit
@Transactional
@Test
public void testDeleteQueryMethods(){
memoRepository.deleteMemoByMnoLessThan(10L);
}
-> @Transactional๊ณผ @Commit์ด๋ผ๋ ์ด๋ ธํ ์ด์ ์จ์ค์ผํจ ์๋๋ฉด ์๋ฌ๋ฌ๋ค
ํด๋น ์ํฐํฐ ๊ฐ์ฒด๋ค์ ๊ฐ์ ธ์ค๋ ์์ ๊ณผ ๊ฐ ์ํฐํฐ๋ฅผ ์ญ์ ํ๋ ์์ ์ด ๊ฐ์ด ์ด๋ค์ง๊ธฐ ๋๋ฌธ์ !
์ต์ข
๊ฒฐ๊ณผ๋ฅผ ์ปค๋ฐํ๊ธฐ ์ํด์ ์ฌ์ฉ
์์ฐ๋ฉด ํ
์คํธ์ฝ๋์ deleteBy๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ๋กค๋ฐฑ์ด ์ฒ๋ฆฌ๋์ด์ ๊ฒฐ๊ณผ์ ๋ฐ์๋์ง ์๊ธฐ ๋๋ฌธ์ด๋ค.
(๋กค๋ฐฑ:๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์
๋ฐ์ดํธ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ๋, ์ด์ ์ํ๋ก ๋๋๋ฆฌ๋ ๊ฒ์ ๋งํ๋ค)