์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- ๊ฒฝ์ ์งํ
- ํฌ์
- ํ์ด์ฌ
- ๊ตญ๋ด์ฌํ
- ๋ง์ง
- ์งํ
- ํธ๋ ์ด๋
- ๋ฐ์ดํฐ๋ถ์
- cpp
- ์ด๋๋ฆฌ์
- ํ์จ
- ๊ธ๋ฆฌ
- ๋งค๋งค์ ๋ต
- ๋ถ๋์ฐ
- ์ฃผ์
- ๋ฏธ๊ตญ์ฌํ
- ์๋ฆฌ์ดํธํ๋
- ์ผ์
- C++
- ์ฐจํธ๋ถ์
- ๊ฒฝ์
- ํธ๋ ์ด๋ฉ
- ์ธ๊ณ๊ฒฝ์
- ๋นํธ์ฝ์ธ
- ์ํธํํ
- ๋ฐ์ด๋ธ์ค
- ํด์ธ์ฌํ
- ์ฌํ
- ํ๋ก๊ทธ๋๋ฐ
- Python
- Today
- Total
์ถ์ ๊ณต์
[Spring] Spring Data JPA — ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ ์ ๊ฐํธํ๊ฒ ๋ง๋๋ ๊ธฐ์ ๋ณธ๋ฌธ
[Spring] Spring Data JPA — ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ ์ ๊ฐํธํ๊ฒ ๋ง๋๋ ๊ธฐ์
dkrehd 2025. 5. 9. 01:25๐ Spring Data JPA — ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ ์ ๊ฐํธํ๊ฒ ๋ง๋๋ ๊ธฐ์
์๋ ํ์ธ์, ๊ฐ๋ฐ์ ์ฌ๋ฌ๋ถ! ์ฐ๋ฆฌ๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ๋, ์ฌ์ฉ์์ ์ ๋ณด, ๊ฒ์๊ธ, ์ํ ๋ชฉ๋ก ๋ฑ ์๋ง์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ๊ด๋ฆฌํด์ผ ํฉ๋๋ค. ์ด๋ฌํ ๋ฐ์ดํฐ๋ ๋ณดํต ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ผ๋ ์ฒด๊ณ์ ์ธ ์ ์ฅ์์ ๋ณด๊ด๋์ฃ .
๊ทธ๋ฐ๋ฐ ์๋ฐ์ ๊ฐ์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ง์ '๋ํ'ํ๋ ค๋ฉด SQL์ด๋ผ๋ ํน๋ณํ ์ธ์ด๋ฅผ ์ฌ์ฉํด์ผ ํ๊ณ , ๋๋ก๋ ์ด ๊ณผ์ ์ด ๊ฝค ๋ณต์กํ๊ณ ๋ฐ๋ณต์ ์ธ ์์ ์ด ๋ ์ ์์ต๋๋ค. ๋ง์น ์ธ๊ตญ์ด๋ฅผ ์ฌ์ฉํ์ฌ ์ ํด์ง ์์์ ๋ง์ถฐ ์๋ฅ๋ฅผ ์์ฑํ๋ ๊ฒ๊ณผ ๋น์ทํ๋ค๊ณ ํ ์ ์์ฃ .
์ด๋ฌํ ๋ฒ๊ฑฐ๋ก์์ ์ค์ฌ์ฃผ๊ณ , ๊ฐ๋ฐ์๊ฐ ์ข ๋ ์๋ฐ ์ฝ๋ ์์ฒด์ ์ง์คํ ์ ์๋๋ก ๋์์ฃผ๋ ๋ฉ์ง ๋๊ตฌ๊ฐ ๋ฐ๋ก Spring Data JPA์ ๋๋ค. ์ค๋์ ์ด Spring Data JPA๊ฐ ๋ฌด์์ด๊ณ , ์ด๋ป๊ฒ ์ฐ๋ฆฌ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ ์ ํธ๋ฆฌํ๊ฒ ๋ง๋ค์ด์ฃผ๋์ง ํต์ฌ ์๋ฆฌ๋ฅผ ์ค์ฌ์ผ๋ก ์ฝ๊ฒ ์์๋ณด๊ฒ ์ต๋๋ค.
๐ข 1. Spring Data JPA๋?
๐ ๋จผ์ , Spring Data๋ถํฐ!
- Spring Data๋ ์ฌ๋ฌ ์ข ๋ฅ์ ๋ฐ์ดํฐ ์ ์ฅ์(์: MySQL, MongoDB, Redis)๋ฅผ ์ผ๊ด๋๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ๋์์ฃผ๋ ๋๊ตฌ์์.
- ์ฆ, ์ ์ฅ์๊ฐ ๋ฌ๋ผ๋ ์ฌ์ฉ๋ฒ์ ๊ฑฐ์ ๋๊ฐ๊ฒ ๋ง๋ค์ด์ค์.
๐ ๊ทธ์ค์์๋ ๊ฐ์ฅ ๋ง์ด ์ฐ๋ ๊ฑด?
๋ฐ๋ก Spring Data JPA์ ๋๋ค!
- ์ด๊ฑด JPA๋ผ๋ ๊ธฐ์ ์ ๊ธฐ๋ฐ์ผ๋ก ๋ง๋ค์ด์ก์ด์.
- JpaRepository ๊ฐ์ ์ธํฐํ์ด์ค๋ฅผ ์์๋ฐ๊ธฐ๋ง ํด๋, ์ ์ฅ, ์กฐํ, ์์ , ์ญ์ ๊ฐ ๋ค ๋ผ์!
๐ฎ ์ฆ, ๋ณต์กํ SQL ์ ์ฐ๊ณ ๋ DB๋ ๋ํํ ์ ์๋ ๋ง๋ฒ ๊ฐ์ ๋๊ตฌ!
๐ 2. CRUDRepository: ๊ธฐ๋ณธ ๊ธฐ๋ฅ์ ์ฌ๊ธฐ ๋ค ์์ด์!
Spring Data JPA๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ์ฅ ๋จผ์ ๋ง๋๊ฒ ๋๋ ์น๊ตฌ ์ค ํ๋๊ฐ ๋ฐ๋ก CrudRepository ์ธํฐํ์ด์ค์ ๋๋ค. ์ด๋ฆ์์ ์ ์ ์๋ฏ์ด, ๋ฐ์ดํฐ ์ฒ๋ฆฌ์ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ด๊ณ ํ์์ ์ธ CRUD ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
- Create (์์ฑ - ๋ฐ์ดํฐ ์ ์ฅ)
- Read (์ฝ๊ธฐ - ๋ฐ์ดํฐ ์กฐํ)
- Update (๊ฐฑ์ - ๋ฐ์ดํฐ ์์ )
- Delete (์ญ์ - ๋ฐ์ดํฐ ์ญ์ )
๋๋ผ์ด ์ ์, ๊ฐ๋ฐ์๊ฐ ์ด CrudRepository ์ธํฐํ์ด์ค๋ฅผ ์์๋ฐ๋ ์๋ก์ด ์ธํฐํ์ด์ค๋ฅผ ๋ง๋ค๊ธฐ๋ง ํ๋ฉด, Spring Data JPA๊ฐ ์๋์ผ๋ก ๊ธฐ๋ณธ์ ์ธ CRUD ๋ฉ์๋ ๊ตฌํ์ฒด๋ฅผ ๋ง๋ค์ด์ค๋ค๋ ๊ฒ์ ๋๋ค! ๊ฐ๋ฐ์๋ ์ง์ SQL์ ์์ฑํ๊ฑฐ๋ ๋ณต์กํ JPA ์ฝ๋๋ฅผ ๊ตฌํํ ํ์๊ฐ ๊ฑฐ์ ์์ต๋๋ค.
๋ฑ ๋ ๊ฐ์ง๋ง ๋ช ์ํด์ฃผ๋ฉด ๋ฉ๋๋ค:
- ์ด๋ค ์ํฐํฐ(Entity, ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ๊ณผ ๋งคํ๋ ์๋ฐ ๊ฐ์ฒด) ๋ฅผ ๋ค๋ฃฐ ๊ฒ์ธ์ง (์: Board ํด๋์ค)
- ๊ทธ ์ํฐํฐ์ ID(์๋ณ์) ํ์ ์ด ๋ฌด์์ธ์ง (์: Long ํ์ )
๐ CRUD๋?
์กฐํ | ๋ฐ์ดํฐ ์ฝ๊ธฐ | findById(), findAll() |
์ ์ฅ/์์ | ๋ฐ์ดํฐ ๋ฃ๊ธฐ ๋๋ ๋ฐ๊พธ๊ธฐ | save() |
์ญ์ | ๋ฐ์ดํฐ ์์ ๊ธฐ | deleteById(), delete() |
BoardRepository (๊ฒ์ํ ๋ฐ์ดํฐ ์ ๊ทผ ์ธํฐํ์ด์ค) ์์:
import org.springframework.data.repository.CrudRepository;
// Board ์ํฐํฐ๋ฅผ ๋ค๋ฃจ๊ณ , Board์ ID ํ์
์ Long์ด๋ค.
public interface BoardRepository extends CrudRepository<Board, Long> {
// ๊ธฐ๋ณธ์ ์ธ CRUD ๋ฉ์๋๋ค์ ์ด๋ฏธ ์ฌ๊ธฐ์ ์ค๋น๋์ด ์์ด์!
// ํน๋ณํ ์กฐํ ์กฐ๊ฑด์ด ํ์ํ๋ฉด ์ฌ๊ธฐ์ ๋ฉ์๋๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค.
}
์ ๋ง ๊ฐ๋จํ์ฃ ? ์ด ์ธํฐํ์ด์ค๋ง ์ ์ํ๋ฉด, Spring Data JPA๊ฐ ๋ด๋ถ์ ์ผ๋ก ์ค์ ์๋ํ๋ ์ฝ๋๋ฅผ ์์ฑํด์ค๋๋ค.
CrudRepository์ ์ฃผ์ ๊ธฐ๋ณธ ์ ๊ณต ๋ฉ์๋ ๐
์์ฑ/์์ | save(S entity) | "์ด ์ํฐํฐ(๋ฐ์ดํฐ)๋ฅผ ์ ์ฅํด์ค!" (ID๊ฐ ์๊ฑฐ๋ DB์ ์์ผ๋ฉด ์๋ก ์ ์ฅ, ID๊ฐ DB์ ์ด๋ฏธ ์กด์ฌํ๋ฉด ํด๋น ๋ฐ์ดํฐ ์์ ) |
์กฐํ | findById(ID id) | "์ด ID๋ฅผ ๊ฐ์ง ์ํฐํฐ ํ๋๋ง ์ฐพ์์ค!" (๊ฒฐ๊ณผ๋ Optional<S> ํ์ ์ผ๋ก ๋ฐํ๋์ด null ์ฒ๋ฆฌ๊ฐ ์ฉ์ด) |
findAll() | "ํด๋น ํ์ ์ ๋ชจ๋ ์ํฐํฐ๋ฅผ ๋ค ๋ณด์ฌ์ค!" | |
count() | "์ํฐํฐ๊ฐ ์ด ๋ช ๊ฐ ์๋์ง ์๋ ค์ค!" | |
existsById(ID id) | "์ด ID๋ฅผ ๊ฐ์ง ์ํฐํฐ๊ฐ ์ค์ ๋ก ์กด์ฌํ๋์ง ํ์ธํด์ค!" (์กด์ฌํ๋ฉด true, ์์ผ๋ฉด false) | |
์ญ์ | deleteById(ID id) | "์ด ID๋ฅผ ๊ฐ์ง ์ํฐํฐ๋ฅผ ์ญ์ ํด์ค!" |
delete(S entity) | "์ด ์ํฐํฐ ๊ฐ์ฒด ์์ฒด๋ฅผ ์ญ์ ํด์ค!" | |
deleteAll() | "ํด๋น ํ์ ์ ๋ชจ๋ ์ํฐํฐ๋ฅผ ์ญ์ ํด์ค! (์ฃผ์ํด์ ์ฌ์ฉํด์ผ ํฉ๋๋ค!)" | |
deleteAll(Iterable<? extends S> entities) | "์ด ๋ชฉ๋ก์ ์๋ ์ํฐํฐ๋ค๋ง ๊ณจ๋ผ์ ์ญ์ ํด์ค!" |
- S๋ ์ํฐํฐ ํ์ ์, ID๋ ํด๋น ์ํฐํฐ์ ID ํ์ ์ ์๋ฏธํฉ๋๋ค.
ํ ๋จ๊ณ ๋: PagingAndSortingRepository ๐๐
๋ง์ฝ ๋ค๋ฃจ์ด์ผ ํ ๋ฐ์ดํฐ๊ฐ ์์ฒ, ์๋ง ๊ฑด์ด๋ผ๋ฉด ํ ๋ฒ์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ ํ๋ฉด์ ๋ณด์ฌ์ฃผ๋ ๊ฒ์ ๋นํจ์จ์ ์ ๋๋ค. ๋ง์น ๋๊บผ์ด ๋ฐฑ๊ณผ์ฌ์ ์ ํ ํ์ด์ง์ฉ ๋๊ฒจ๋ณด๊ฑฐ๋, ์ํ๋ ๋ด์ฉ์ ์ฐพ๊ธฐ ์ํด ํน์ ์์๋ก ์ ๋ ฌํ๋ ๊ฒ๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ด ํ์ํ์ฃ .
PagingAndSortingRepository ๋ CrudRepository์ ๊ธฐ๋ฅ์ ๋ชจ๋ ๊ฐ์ง๋ฉด์, ์ถ๊ฐ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ ์ ์ฉํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ์ธํฐํ์ด์ค์ ๋๋ค.
- ํ์ด์ง (Paging): ๋๋์ ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฌ ํ์ด์ง๋ก ๋๋์ด ์กฐํํ๋ ๊ธฐ๋ฅ (์: 10๊ฐ์ฉ ๋์ด์ 1ํ์ด์ง, 2ํ์ด์ง ๋ณด๊ธฐ)
- ์ ๋ ฌ (Sorting): ๋ฐ์ดํฐ๋ฅผ ํน์ ๊ธฐ์ค(์: ์์ฑ์ผ ์, ์ด๋ฆ ์)์ผ๋ก ์ ๋ ฌํ์ฌ ์กฐํํ๋ ๊ธฐ๋ฅ
PagingAndSortingRepository๋ CrudRepository๋ฅผ ์์(ํ์ฅ) ํ๊ธฐ ๋๋ฌธ์, CrudRepository์ ๋ชจ๋ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์์ ๋ฟ๋ง ์๋๋ผ ํ์ด์ง๊ณผ ์ ๋ ฌ ๊ด๋ จ ๋ฉ์๋๋ ์ถ๊ฐ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
import org.springframework.data.repository.PagingAndSortingRepository;
// Board ์ํฐํฐ๋ฅผ ๋ค๋ฃจ๊ณ ID๋ Long ํ์
์ด๋ฉฐ, ํ์ด์ง๊ณผ ์ ๋ ฌ ๊ธฐ๋ฅ๋ ์ฌ์ฉํ๋ค.
public interface BoardPagingRepository extends PagingAndSortingRepository<Board, Long> {
// CrudRepository์ ๋ฉ์๋ + ํ์ด์ง/์ ๋ ฌ ๊ด๋ จ ๋ฉ์๋ ์ฌ์ฉ ๊ฐ๋ฅ!
}
โ๏ธ 3. ๊ฒ์ํ ์์ - Board ํด๋์ค
1. Board.java (๊ฒ์๊ธ ์ ๋ณด๋ฅผ ๋ด๋ ์ํฐํฐ ํด๋์ค)
๋จผ์ , ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ๊ณผ ๋งคํ๋ Board ํด๋์ค(์ํฐํฐ)๋ฅผ ์ ์ํฉ๋๋ค.
import jakarta.persistence.Entity; // ๋๋ javax.persistence.*;
import jakarta.persistence.Id;
import jakarta.persistence.Temporal;
import jakarta.persistence.TemporalType;
import java.util.Date;
@Entity // ์ด ํด๋์ค๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ
์ด๋ธ๊ณผ ์ฐ๊ฒฐ๋ ์ํฐํฐ์์ ๋ํ๋
๋๋ค.
public class Board {
@Id // bno ํ๋๊ฐ ์ด ์ํฐํฐ์ ๊ณ ์ ์๋ณ์(PK)์์ ๋ํ๋
๋๋ค.
// @GeneratedValue // ID ์๋ ์์ฑ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ค๋ฉด ์ฃผ์์ ํด์ ํ์ธ์.
private Long bno; // ๊ฒ์๋ฌผ ๋ฒํธ
private String title; // ์ ๋ชฉ
private String writer; // ์์ฑ์
private String content; // ๋ด์ฉ
private Long viewCnt; // ์กฐํ์
@Temporal(value= TemporalType.DATE) // ๋ ์ง ์ ๋ณด๋ง ์ ์ฅ (์๊ฐ ์ ์ธ)
private Date inDate; // ์์ฑ์ผ
@Temporal(value= TemporalType.DATE)
private Date upDate; // ์์ ์ผ
// toString(), Getters, Setters ...
// (์ ๊ณตํด์ฃผ์ ์ฝ๋์ ๋์ผํฉ๋๋ค)
}
- @Entity: ์ด Board ํด๋์ค๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํน์ ํ ์ด๋ธ์ ๋์๋๋ '์ค์ฒด'์์ JPA์๊ฒ ์๋ ค์ค๋๋ค.
- @Id: bno ํ๋๊ฐ ๊ฐ ๊ฒ์๊ธ์ ์ ์ผํ๊ฒ ๊ตฌ๋ถํ๋ ๊ธฐ๋ณธ ํค(Primary Key)์์ ๋ช ์ํฉ๋๋ค.
- @Temporal: Date ํ์ ํ๋๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ด๋ค ํ์(๋ ์ง, ์๊ฐ, ๋ ์ง+์๊ฐ)์ผ๋ก ์ ์ฅํ ์ง ์ง์ ํฉ๋๋ค.
๐พ 4. BoardRepository ์ธํฐํ์ด์ค
์์ ๋ณธ ๊ฒ์ฒ๋ผ ๋งค์ฐ ๊ฐ๋จํ๊ฒ ์ ์ํฉ๋๋ค.
import org.springframework.data.repository.CrudRepository;
public interface BoardRepository extends CrudRepository<Board, Long> {
// ํ์ฌ๋ ๊ธฐ๋ณธ CRUD ๊ธฐ๋ฅ๋ง ์ฌ์ฉํ๋ฏ๋ก ์ถ๊ฐ ๋ฉ์๋ ์ ์๋ ์์ต๋๋ค.
}
์ด๋ ๊ฒ ํ ์ค๋ง ์์ฑํด๋,
save, findById, deleteById, findAll ๋ฑ ๊ธฐ๋ณธ ๊ธฐ๋ฅ์ด ์๋์ผ๋ก ์๊น๋๋ค!
โ 5. ๊ธฐ๋ฅ๋ณ ํ ์คํธ ์ฝ๋ ๋ฐ๋ผํด๋ณด๊ธฐ!
์ด์ BoardRepository๊ฐ ์ ๋๋ก ์๋ํ๋์ง JUnit ํ ์คํธ๋ฅผ ํตํด ํ์ธํด๋ด ๋๋ค.
import org.junit.jupiter.api.MethodOrderer;
import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestMethodOrder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.Date;
import static org.junit.jupiter.api.Assertions.assertTrue; // ํ
์คํธ ๊ฒฐ๊ณผ ํ์ธ์ฉ
@SpringBootTest // ์คํ๋ง ๋ถํธ ํ๊ฒฝ์์ ํ
์คํธ๋ฅผ ์คํํฉ๋๋ค.
@TestMethodOrder(MethodOrderer.OrderAnnotation.class) // @Order ์ด๋
ธํ
์ด์
์์๋๋ก ํ
์คํธ ์คํ
class BoardRepositoryTest {
@Autowired // ์คํ๋ง ์ปจํ
์ด๋๊ฐ BoardRepository ๊ตฌํ์ฒด๋ฅผ ์๋์ผ๋ก ์ฃผ์
ํด์ค๋๋ค.
private BoardRepository boardRepository;
@Test
@Order(1) // ์ฒซ ๋ฒ์งธ๋ก ์คํ๋ ํ
์คํธ: ๋ฐ์ดํฐ ์ฝ์
public void insertTest() {
System.out.println("๋ฐ์ดํฐ ์ฝ์
ํ
์คํธ ์์...");
Board board = new Board(); // ์๋ก์ด Board ๊ฐ์ฒด ์์ฑ
board.setBno(1L); // ID๋ฅผ ์ง์ ์ค์ (์๋ ์์ฑ์ ์ฌ์ฉํ์ง ์์ ๊ฒฝ์ฐ)
board.setTitle("์ฒซ ๋ฒ์งธ ๊ฒ์๊ธ");
board.setContent("Spring Data JPA ํ
์คํธ ์ค์
๋๋ค.");
board.setWriter("๊ฐ๋ฐ์A");
board.setViewCnt(0L);
board.setInDate(new Date());
board.setUpDate(new Date());
boardRepository.save(board); // CrudRepository์ save ๋ฉ์๋๋ก ๋ฐ์ดํฐ ์ ์ฅ!
System.out.println("ID 1๋ฒ ๊ฒ์๊ธ ์ ์ฅ ์๋ฃ.");
}
@Test
@Order(2) // ๋ ๋ฒ์งธ๋ก ์คํ๋ ํ
์คํธ: ๋ฐ์ดํฐ ์กฐํ
public void selectTest() {
System.out.println("\n๋ฐ์ดํฐ ์กฐํ ํ
์คํธ ์์...");
// ID๊ฐ 1์ธ Board๋ฅผ ์กฐํ. orElse(null)์ ํด๋น ID์ ๋ฐ์ดํฐ๊ฐ ์์ผ๋ฉด null์ ๋ฐํ.
Board board = boardRepository.findById(1L).orElse(null);
System.out.println("์กฐํ๋ ๊ฒ์๊ธ: " + board);
assertTrue(board != null, "1๋ฒ ๊ฒ์๊ธ์ด ์กฐํ๋์ด์ผ ํฉ๋๋ค."); // board๊ฐ null์ด ์๋๋ฉด ํ
์คํธ ์ฑ๊ณต
}
@Test
@Order(3) // ์ธ ๋ฒ์งธ๋ก ์คํ๋ ํ
์คํธ: ๋ฐ์ดํฐ ์์
public void updateTest() {
System.out.println("\n๋ฐ์ดํฐ ์์ ํ
์คํธ ์์...");
Board board = boardRepository.findById(1L).orElse(null);
assertTrue(board != null, "์์ ํ 1๋ฒ ๊ฒ์๊ธ์ด ์กด์ฌํด์ผ ํฉ๋๋ค.");
board.setTitle("์ ๋ชฉ ์์ ๋จ - Spring Data JPA"); // ์ ๋ชฉ ์์
boardRepository.save(board); // ๋ค์ save ๋ฉ์๋ ํธ์ถ. ID(bno)๊ฐ ์กด์ฌํ๋ฏ๋ก ์์ (UPDATE)๋จ.
Board updatedBoard = boardRepository.findById(1L).orElse(null);
System.out.println("์์ ํ ์กฐํ๋ ๊ฒ์๊ธ: " + updatedBoard);
assertTrue(updatedBoard != null && "์ ๋ชฉ ์์ ๋จ - Spring Data JPA".equals(updatedBoard.getTitle()), "์ ๋ชฉ์ด ์ฑ๊ณต์ ์ผ๋ก ์์ ๋์ด์ผ ํฉ๋๋ค.");
System.out.println("๊ฒ์๊ธ ์์ ์๋ฃ.");
}
@Test
@Order(4) // ๋ค ๋ฒ์งธ๋ก ์คํ๋ ํ
์คํธ: ๋ฐ์ดํฐ ์ญ์
public void deleteTest() {
System.out.println("\n๋ฐ์ดํฐ ์ญ์ ํ
์คํธ ์์...");
boardRepository.deleteById(1L); // ID๊ฐ 1์ธ Board ์ญ์
Board board = boardRepository.findById(1L).orElse(null); // ์ญ์ ํ ๋ค์ ์กฐํ
System.out.println("์ญ์ ํ ์กฐํ๋ ๊ฒ์๊ธ: " + board);
assertTrue(board == null, "1๋ฒ ๊ฒ์๊ธ์ด ์ฑ๊ณต์ ์ผ๋ก ์ญ์ ๋์ด null์ด์ด์ผ ํฉ๋๋ค."); // board๊ฐ null์ด๋ฉด ํ
์คํธ ์ฑ๊ณต
System.out.println("๊ฒ์๊ธ ์ญ์ ์๋ฃ.");
}
}
- @SpringBootTest: ํ ์คํธ ์ ์ค์ ์คํ๋ง ์ ํ๋ฆฌ์ผ์ด์ ์ปจํ ์คํธ๋ฅผ ๋ก๋ํ์ฌ ํตํฉ ํ ์คํธ๋ฅผ ์งํํฉ๋๋ค.
- @Autowired: BoardRepository ํ์ ์ ๋น(Spring Data JPA๊ฐ ์๋์ผ๋ก ์์ฑํ ๊ตฌํ์ฒด)์ ์คํ๋ง์ด ์ฐพ์์ ์ฃผ์ ํด์ค๋๋ค.
- @Order(์ซ์): ํ ์คํธ ๋ฉ์๋์ ์คํ ์์๋ฅผ ์ง์ ํฉ๋๋ค. ๋ฐ์ดํฐ์ ์ํ์ ์์กด์ ์ธ CRUD ํ ์คํธ์์๋ ์์๊ฐ ์ค์ํฉ๋๋ค.
- save() ๋ฉ์๋์ ์ง๋ฅ์ ์ธ ๋์: insertTest์์๋ ID๊ฐ ์๋ ์๋ก์ด Board ๊ฐ์ฒด๋ฅผ save() ํ์ผ๋ฏ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์๋ก์ด ํ์ด ์ฝ์ (INSERT)๋ฉ๋๋ค. ๋ฐ๋ฉด, updateTest์์๋ findById()๋ก ๊ธฐ์กด ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ ์์ ํ ํ save()๋ฅผ ํธ์ถํ์ต๋๋ค. ์ด๋ Board ๊ฐ์ฒด๋ ์ด๋ฏธ ID(bno)๋ฅผ ๊ฐ์ง๊ณ ์๊ณ , ์ด ID๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์กด์ฌํ๋ฏ๋ก Spring Data JPA๋ ์ด๋ฅผ ๊ฐ์งํ์ฌ ์๋ก์ด ํ์ ์ฝ์ ํ๋ ๋์ ๊ธฐ์กด ํ์ ๋ด์ฉ์ ๊ฐฑ์ (UPDATE)ํฉ๋๋ค.
๐ ์์ฝ ์ ๋ฆฌ
Spring Data | ์ ์ฅ์ ์ข ๋ฅ์ ์๊ด์์ด ๋๊ฐ์ด ๋ค๋ฃจ๊ธฐ |
Spring Data JPA | JPA๋ฅผ ์ฝ๊ฒ ์ฐ๊ฒ ํด์ฃผ๋ ๋๊ตฌ |
CrudRepository | ๊ธฐ๋ณธ ์ ์ฅ/์กฐํ/์์ /์ญ์ ๊ธฐ๋ฅ ์ ๊ณต |
PagingAndSortingRepository | ํ์ด์ง๊ณผ ์ ๋ ฌ ๊ธฐ๋ฅ๊น์ง ์ง์ |
save() | ์ ์ฅ๋ ๋๊ณ ์์ ๋ ๋จ |
findById() | ID๋ก ํ๋ ์กฐํ |
deleteById() | ID๋ก ํ๋ ์ญ์ |
findAll() | ์ ์ฒด ์กฐํ |
๐ฏ ๋ง๋ฌด๋ฆฌ
์ค๋์ Spring Data JPA๊ฐ ๋ฌด์์ธ์ง, ๊ทธ๋ฆฌ๊ณ CrudRepository์ ๊ฐ์ ํธ๋ฆฌํ ์ธํฐํ์ด์ค๋ฅผ ํตํด ์ผ๋ง๋ ์ฝ๊ฒ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ ์ ์ฒ๋ฆฌํ ์ ์๋์ง ์ดํด๋ณด์์ต๋๋ค. ๋ณต์กํ SQL ๋ฌธ์ฅ์ด๋ JPA์ ๋ด๋ถ ๋์์ ๊น์ด ์์ง ๋ชปํด๋, Spring Data JPA๊ฐ ์ ๊ณตํ๋ ์ ์ ์๋ ๋ฉ์๋๋ค์ ํ์ฉํ๋ฉด ๊ธฐ๋ณธ์ ์ธ ๋ฐ์ดํฐ ๊ด๋ฆฌ๋ ์ ๋ง ๊ฐํธํด์ง๋๋ค.
'Web Dev > BackEnd' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring]JPQL๊ณผ ๋ค์ดํฐ๋ธ ์ฟผ๋ฆฌ ์ฝ๊ฒ ๋ฐฐ์ฐ๊ธฐ โ SQL ์์ด JPA๋ก ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ! (0) | 2025.05.10 |
---|---|
[Spring] ์ฟผ๋ฆฌ ๋ฉ์๋! โ JPA์์ SQL ์์ด ์กฐํํ๊ธฐ (0) | 2025.05.09 |
[Spring] JPA, Entity, EntityManager ์ ๋๋ก ์ดํดํ๊ธฐ (1) | 2025.05.06 |
[Spring] ๋ฐ์ดํฐ ๋ชจ๋ธ๋ง ์๋ฒฝ ๊ฐ์ด๋ (0) | 2025.05.02 |
[Spring] AOP ์๋ฒฝ ๊ฐ์ด๋ (0) | 2025.04.30 |