๐Ÿ“–์Šคํ”„๋ง ๋ถ€ํŠธ 2ํŽธ๐Ÿ“–

๊ทธ๋…•ยท2023๋…„ 3์›” 4์ผ
0
post-thumbnail

์ฝ”๋“œ ๋งํฌ

Maria ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ spring data jpa

๐Ÿ‘ฉโ€๐Ÿ’ปmaria db ์„ค์น˜

mysql๊ณผ ํฌํŠธ๋ฒˆํ˜ธ๊ฐ€ ๊ฒน์ณ ๊ตฌ๊ธ€๋ง ํ–ˆ์Œ

๐Ÿ‘ฉโ€๐Ÿ’ปspring data jpa ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ

์€๊ทผ ๋ณต์žกํ–ˆ์Œ

JPA๋ž€?

Java์–ธ์–ด๋ฅผ ํ†ตํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ๊ฐ™์€ ์˜์† ๊ณ„์ธต์„ ์ฒ˜๋ฆฌํ•˜๊ณ ์ž ํ•˜๋Š” ์ŠคํŽ™

ORM๋ž€?

(object-relational mapping)-๊ฐ์ฒด์ง€ํ–ฅ
๊ฐ์ฒด์ง€ํ–ฅ ํŒจ๋Ÿฌ๋‹ค์ž„์„ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ณด์กดํ•˜๋Š” ๊ธฐ์ˆ (mapping)

ORM์ด JPA๋ณด๋‹ค ์ข€ ๋” ์ƒ์œ„ ๊ฐœ๋…, JPA๋Š” ์ž๋ฐ”์— ๊ตญํ•œ๋œ ๊ฐœ๋…

๐Ÿ‘ฉโ€๐Ÿ’ปEntity class ์ž‘์„ฑ

memo class๋Š” ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํ…Œ์ด๋ธ” ๊ฐ™์€ ๊ตฌ์กฐ๋ฅผ ์ง€๋‹˜
์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค๋Š” @Entity ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ฌด์กฐ๊ฑด ์ถ”๊ฐ€ํ•ด์ค˜์•ผํ•จ

@Entity

ํ•ด๋‹น ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋“ค์ด jpa๋กœ ๊ด€๋ฆฌ๋˜๋Š” ์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด๋ผ๋Š” ์˜๋ฏธ
์ž๋™์œผ๋กœ ํ…Œ์ด๋ธ” ์ƒ์„ฑ ๊ฐ€๋Šฅ, ๋ฉค๋ฒ„๋ณ€์ˆ˜์— ๋”ฐ๋ผ ์ž๋™์œผ๋กœ ์นผ๋Ÿผ๋“ค๋„ ์ƒ์„ฑ

@Table

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์ƒ์—์„œ ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค๋ฅผ ์–ด๋–ค ํ…Œ์ด๋ธ”๋กœ ์ƒ์„ฑํ• ์ง€์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋‹ด๊ธฐ ์œ„ํ•œ ์–ด๋…ธํ…Œ์ด์…˜

@Table(name="t_memo")

์ƒ์„ฑ๋˜๋Š” ํ…Œ์ด๋ธ”์˜ ์ด๋ฆ„์ด 't_memo'ํ…Œ์ด๋ธ”๋กœ ์ƒ์„ฑ
(์ด ์™ธ์—๋„ ์ธ๋ฐ์Šค ์ƒ์‚ฐํ•˜๋Š” ์„ค์ •๋„ ๊ฐ€๋Šฅ)

@Id

@Entity๊ฐ€ ๋ถ™์€ ํด๋ž˜์Šค๋Š” primary key์— ํ•ด๋‹นํ•˜๋Š” ํ•„๋“œ๋ฅผ @Id๋กœ ์ง€์ •ํ•ด์ค˜์•ผ ํ•จ
์ž๋™์œผ๋กœ ์ƒ์„ฑ๋˜๋Š” ๋ฒˆํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” @GeneratedValue ์–ด๋…ธํ…Œ์ด์…˜ ์‚ฌ์šฉ

@GeneratedValue

@GeneratedValue(strategy = GenerationType.IDENTITY)

pk ์ž๋™ ์ƒ์„ฑ ์ „๋žต

@Getter

Getter ๋ฉ”์†Œ๋“œ๋ฅผ ์ƒ์„ฑ

@Builder

๊ฐ์ฒด ์ƒ์„ฑ
@Builder ์“ฐ๋ ค๋ฉด @AllArgsConstructor, @NoArgsConstructor ๋‘˜๋‹ค ์จ์•ผ์ง€ ์—๋Ÿฌ ์•ˆ๋œธ

application.properties

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์„ ๋ณด์—ฌ์ค„์ง€ ๊ฒฐ์ •

๐Ÿ‘ฉโ€๐Ÿ’ปJpa Repository ์‚ฌ์šฉ

MemoRepository ์ž‘์„ฑ-> JpaRepository๋ฅผ ์ƒ์†ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋!
JpaRepository ์‚ฌ์šฉํ• ๋•Œ๋Š” ์—”ํ‹ฐํ‹ฐ ํƒ€์ž…(Memo๋กœ), @Id (Long์œผ๋กœ) ํƒ€์ž… ์ง€์ •ํ•ด์ค˜์•ผํ•จ

public interface MemoRepository extends JpaRepository<Memo, Long> {
}

์ธํ„ฐํŽ˜์ด์Šค ์„ ์–ธ๋งŒ์œผ๋กœ๋„ ์ž๋™์œผ๋กœ ์Šคํ”„๋ง ๋นˆ์œผ๋กœ ๋“ฑ๋ก๋จ

Memo Repository๋ฅผ ํ†ตํ•ด์„œ sql์—†์ด CRUD ์ž‘์—…์„ ํ…Œ์ŠคํŠธ ํ• ์ˆ˜ ์žˆ์Œ

  • insert-> save ์—”ํ‹ฐํ‹ฐ๊ฐ์ฒด
  • select-> findByIdํ‚ค, getOne ํ‚ค
  • update-> save ์—”ํ‹ฐํ‹ฐ๊ฐ์ฒด
  • delete-> deleteById ํ‚ค, delete ์—”ํ‹ฐํ‹ฐ๊ฐ์ฒด

(save๋Š” ๊ฐ์ฒด ๋น„๊ตํ•ด๋ณด๊ณ  ์—†์œผ๋ฉด insert, ์žˆ์œผ๋ฉด update ํ•˜๋Š” ๋ฐฉ์‹)

MemoRepositoryTest๋ฅผ ๋งŒ๋“ค์–ด์„œ test ํ•ด์คŒ

์Šคํ”„๋ง์ด ๋‚ด๋ถ€์ ์œผ๋กœ ํ•ด๋‹น ํด๋ž˜์Šค๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•จ ์ด๋•Œ ํด๋ž˜์Šค ์ด๋ฆ„์„ ๋ณด๋Š” 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()์“ฐ๋ฉด ๋จ

  • DeleteQuery
	@Commit
    @Transactional
    @Test
    public void testDeleteQueryMethods(){
        memoRepository.deleteMemoByMnoLessThan(10L);
    }

-> @Transactional๊ณผ @Commit์ด๋ผ๋Š” ์–ด๋…ธํ…Œ์ด์…˜ ์จ์ค˜์•ผํ•จ ์•„๋‹ˆ๋ฉด ์—๋Ÿฌ๋œฌ๋‹ค

@Transactional

ํ•ด๋‹น ์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด๋“ค์„ ๊ฐ€์ ธ์˜ค๋Š” ์ž‘์—…๊ณผ ๊ฐ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์‚ญ์ œํ•˜๋Š” ์ž‘์—…์ด ๊ฐ™์ด ์ด๋ค„์ง€๊ธฐ ๋•Œ๋ฌธ์— !

@Commit

์ตœ์ข… ๊ฒฐ๊ณผ๋ฅผ ์ปค๋ฐ‹ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉ
์•ˆ์“ฐ๋ฉด ํ…Œ์ŠคํŠธ์ฝ”๋“œ์˜ deleteBy๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋กค๋ฐฑ์ด ์ฒ˜๋ฆฌ๋˜์–ด์„œ ๊ฒฐ๊ณผ์— ๋ฐ˜์˜๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
(๋กค๋ฐฑ:๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์—…๋ฐ์ดํŠธ์— ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ, ์ด์ „ ์ƒํƒœ๋กœ ๋˜๋Œ๋ฆฌ๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค)

0๊ฐœ์˜ ๋Œ“๊ธ€