JPA๊ฐ ๋ฌด์์ผ๊น ?
JPA๋ ์ด์ ์ ์ ๋ฆฌํด๋ณด์์ผ๋ ์ด๋ฒ์๋ JPA Repository์ ๋ํด ์์๋ณด๊ณ ์ ํ๋ค.
JAVA | JPA ์์๋ณด๊ธฐ (JPA, JDBC, Hibernate & JPA)
1. JPA Java Persistence API์ ์ฝ์๋ก, ์๋ฐ ์ง์์์ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋ ๋ฐ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋งคํํ๊ณ ๊ด๋ฆฌํ๊ธฐ ์ํ ํ์ค ์ธํฐํ์ด์ค Persistence -> ์๊ตฌ์ ์ธ ๋ฐ์ดํฐ ๊ด๋ฆฌ๋ฅผ ์ํ
codingdialee.tistory.com
JPA Repository
- Java ์ธ์ด๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ํธ ์์ฉํ๋ ๋ฐ ๋์์ ์ฃผ๋ ์ธํฐํ์ด์ค
- ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ํธ ์์ฉํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ฉฐ, ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ์ ๋ํ CRUD(Create, Read, Update, Delete) ์์ ์ ์ํ
์์๋ฅผ ๋ค์๋ฉด, ๊ฐ์ฒด์ ์๋ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๊ฑฐ๋ ์์ , ์ ์ฅ, ์ญ์ ๋ฑ์ ์์ ์ ์ํํ ๋ Spring JPA์์ ์ ๊ณตํ๋ Repository๋ผ๋ ์ธํฐํ์ด์ค๋ฅผ ์ ์ํด ํด๋น Entity์ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ๋์์ฃผ๋ ์ญํ ์ ํ๋ค.
JPA Repository๋ ๋ด๋ถ์ ์ผ๋ก EntityManager๊ฐ ์ง์ ๋์ Entity์ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ๋๋ฌธ์ Repository ์ธํฐํ์ด์ค๋ฅผ ์ ์ํ์ง ์๊ณ ๋ ์ง์ EntityManger๋ฅผ ์ฌ์ฉํด Persistance Layer๋ฅผ ๊ตฌํ ํ ์ ์์ง๋ง Spring JPA์์ Repository์ ๋ด๋ถ ๊ตฌํ์ฒด๋ฅผ ์๋์ผ๋ก ์์ฑ์์ผ ์ฃผ๊ธฐ ๋๋ฌธ์ ๋ณ๋์ ๊ตฌํ์ฒด๋ฅผ ๋ฐ๋ก ์์ฑํ์ง ์์๋ ๋๋ค.
* persistance layer : ํ๋ก๊ทธ๋จ์ ์ํคํ ์ฒ์์, ๋ฐ์ดํฐ์ ์์์ฑ์ ๋ถ์ฌํด์ฃผ๋ ๊ณ์ธต
๐ repository๋ฅผ ์ฌ์ฉํ๋ ์ด์
- ๊ฐ์ฒด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ฐ์ ๋งคํ ๊ด๋ฆฌ : JPA ๋ฆฌํฌ์งํ ๋ฆฌ๋ ORM(Object-Relational Mapping)์ ํตํด ๊ฐ์ฒด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ฐ์ ๋งคํ์ ์ฒ๋ฆฌํ๋ฏ๋ก, ๊ฐ์ฒด ์งํฅ์ ์ธ ํ๋ก๊ทธ๋๋ฐ ๋ชจ๋ธ์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์กฐ์ํ ์ ์๋ค.
- CRUD ์์ ๊ฐ์ํ : JPA ๋ฆฌํฌ์งํ ๋ฆฌ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ CRUD(Create, Read, Update, Delete) ์์ ์ ๋ฉ์๋ ํธ์ถ์ ํตํด ๊ฐ๋จํ๊ฒ ์ํํ ์ ์๋๋ก ๋๋๋ค. JPA๋ ์ฟผ๋ฆฌ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ฉ์๋ ์ด๋ฆ์ ๋ฐ๋ผ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์กฐํ๋ฅผ ์๋์ผ๋ก ์์ฑํ๊ณ ์คํํ ์ ์์ด ๊ฐ๋ฐ์๋ SQL ์ฟผ๋ฆฌ ์์ฑ์ ์ ๊ฒฝ์ฐ์ง ์๊ณ ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ ์ ์ํํ ์ ์๋ค.
- ์ ์ฐํ ๊ฒ์ ๊ธฐ๋ฅ : JPA ๋ฆฌํฌ์งํ ๋ฆฌ๋ ์ฟผ๋ฆฌ ๋ฉ์๋์ @Query ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ์ฌ ๋์ ์ธ ๊ฒ์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.๊ฐ๋ฐ์๋ ๋ฉ์๋ ์๊ทธ๋์ฒ๋ฅผ ์กฐํฉํ์ฌ ๋ณต์กํ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๊ณ ์คํํ ์ ์๋ค. ์ด๋ฅผ ํตํด ํ์ํ ๊ฒ์ ์กฐ๊ฑด์ ๋ง๊ฒ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๊ณ ํํฐ๋งํ ์ ์๋ค.
- ํธ๋์ญ์ ๊ด๋ฆฌ : JPA ๋ฆฌํฌ์งํ ๋ฆฌ๋ ํธ๋์ญ์ ์ ๊ด๋ฆฌํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ ์ ์ผ๊ด์ฑ๊ณผ ์์ ์ฑ์ ๋ณด์ฅํ๋ค. ํธ๋์ญ์ ๋ด์์ JPA ๋ฆฌํฌ์งํ ๋ฆฌ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด, ๋ณ๊ฒฝ๋ ๋ฐ์ดํฐ๋ ํธ๋์ญ์ ์ด ์ปค๋ฐ๋ ๋๊น์ง ์์์ฑ ์ปจํ ์คํธ์ ์ ์ฅ๋๋ฉฐ, ๋กค๋ฐฑ์ด ๋ฐ์ํ๋ฉด ๋ณ๊ฒฝ ์ฌํญ๋ ๋กค๋ฐฑ๋๋ค. ์ด๋ฅผ ํตํด ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ ์ ์งํ๊ณ ๋ฐ์ดํฐ ์กฐ์์ ๋ฐฉ์งํ ์ ์๋ค.
- ์ฝ๋ ์ฌ์ฌ์ฉ๊ณผ ์ ์ง๋ณด์์ฑ : JPA ๋ฆฌํฌ์งํ ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ ๊ณผ ๊ด๋ จ๋ ๋ก์ง์ ๋ณ๋์ ๋ฆฌํฌ์งํ ๋ฆฌ ํด๋์ค๋ก ๋ถ๋ฆฌํ ์ ์๋ค. ์ด๋ฅผ ํตํด ์ฝ๋ ์ฌ์ฌ์ฉ์ฑ์ด ํฅ์๋๊ณ , ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ด๋ จ ๋ก์ง์ ์ค์ ์ง์คํํ์ฌ ์ ์ง๋ณด์์ฑ์ ํฅ์์ํฌ ์ ์๋ค.
JPA Repository๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ ์ ์ถ์ํํ๊ณ , ๊ฐ์ฒด ์งํฅ์ ์ธ ํ๋ก๊ทธ๋๋ฐ ๋ชจ๋ธ์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ํธ ์์ฉํ ์ ์๋ ํธ๋ฆฌํ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ค. ์ด๋ฅผ ํตํด ๊ฐ๋ฐ์๋ ๋ ๊ฐํธํ๊ณ ์์ฐ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ค๋ฃฐ ์ ์์ผ๋ฉฐ, ์ฝ๋์ ๊ฐ๋ ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ๋ ํฅ์์ํฌ ์ ์๋ค.
1. JpaRepository ์์ฑ ๊ท์น
package com.mysite.sbb;
import org.springframework.data.jpa.repository.JpaRepository;
public interface QuestionRepository extends JpaRepository<Question, Integer> {
}
์์๋ก QuestionRepository๋ฅผ ์์ฑํ์์ ๋, ๋ฆฌํฌ์งํฐ๋ฆฌ๋ฅผ ๋ง๋ค๊ธฐ ์ํด JpaRepository ์ธํฐํ์ด์ค๋ฅผ ์์ํ์๋ค. JpaRepository๋ฅผ ์์ํ ๋๋ ์ ๋ค๋ฆญ์ค ํ์ ์ผ๋ก <Question, Integer> ์ฒ๋ผ ๋ฆฌํฌ์งํฐ๋ฆฌ์ ๋์์ด ๋๋ ์ํฐํฐ์ ํ์ (Question)๊ณผ ํด๋น ์ํฐํฐ์ PK์ ์์ฑ ํ์ (Integer)์ ์ง์ ํด์ผ ํ๋ค. ์ด๊ฒ์ JpaRepository๋ฅผ ์์ฑํ๊ธฐ ์ํ ๊ท์น์ด๋ค.
pulibc interface [Repository ์ด๋ฆ] extends JpaRepository<[๊ฐ์ฒด ํ์ ], [๊ฐ์ฒด PK ์์ฑ ํ์ ]> {}
2. ๋ฐ์ดํฐ ์ ์ฅํ๊ธฐ - save()
์์ฑํ repository๋ฅผ ํ ์คํธ ํ๊ธฐ ์ํด JUnit ๊ธฐ๋ฐ์ ์คํ๋ง๋ถํธ์ ํ ์คํธ ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ๋ค.
import java.time.LocalDateTime;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class SbbApplicationTests {
@Autowired
private QuestionRepository questionRepository;
@Test
void testJpa() {
Question q1 = new Question();
q1.setSubject("sbb๊ฐ ๋ฌด์์ธ๊ฐ์?");
q1.setContent("sbb์ ๋ํด์ ์๊ณ ์ถ์ต๋๋ค.");
q1.setCreateDate(LocalDateTime.now());
this.questionRepository.save(q1); // ์ฒซ๋ฒ์งธ ์ง๋ฌธ ์ ์ฅ
Question q2 = new Question();
q2.setSubject("์คํ๋ง๋ถํธ ๋ชจ๋ธ ์ง๋ฌธ์
๋๋ค.");
q2.setContent("id๋ ์๋์ผ๋ก ์์ฑ๋๋์?");
q2.setCreateDate(LocalDateTime.now());
this.questionRepository.save(q2); // ๋๋ฒ์งธ ์ง๋ฌธ ์ ์ฅ
}
}
์์ ๋ฉ์๋๋ q1, q2 ๋ผ๋ Question ์ํฐํฐ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ , QuestionRepository๋ฅผ ์ด์ฉํ์ฌ ๊ทธ ๊ฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ๋ ์ฝ๋์ด๋ค.
Line 20์ ๋ณด๋ฉด, save() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ํฐํฐ๋ฅผ ์ ์ฅํ ๊ฒ์ ์ ์ ์๋ค. insert()์ update() ๊ธฐ๋ฅ์ ๊ตฌํํ๊ณ ์ ํ ๋ ์ฌ์ฉํ๋ค.
@Autowired ์ ๋ํ ์ด์ : ์คํ๋ง์ DI ๊ธฐ๋ฅ์ผ๋ก questionRepository ๊ฐ์ฒด๋ฅผ ์คํ๋ง์ด ์๋์ผ๋ก ์์ฑํด ์ค๋ค.
@Test ์ ๋ํ ์ด์ : testJpa ๋ฉ์๋๊ฐ ํ ์คํธ ๋ฉ์๋์์ ๋ํ๋ธ๋ค. ์ ํด๋์ค๋ฅผ JUnit์ผ๋ก ์คํํ๋ฉด @Test ์ ๋ํ ์ด์ ์ด ๋ถ์ ๋ฉ์๋๊ฐ ์คํ๋๋ค.
@Autowired
๊ฐ์ฒด๋ฅผ ์ฃผ์ ํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ์คํ๋ง์ ์ ๋ํ ์ด์ ์ด๋ค. ๊ฐ์ฒด๋ฅผ ์ฃผ์ ํ๋ ๋ฐฉ์์๋ @Autowired ์ธ์ Setter ๋๋ ์์ฑ์๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ์์ด ์๋ค. ์ํ์ฐธ์กฐ ๋ฌธ์ ์ ๊ฐ์ ์ด์ ๋ก @Autowired ๋ณด๋ค๋ ์์ฑ์๋ฅผ ํตํ ๊ฐ์ฒด ์ฃผ์ ๋ฐฉ์์ด ๊ถ์ฅ๋๋ค. ํ์ง๋ง ํ ์คํธ ์ฝ๋์ ๊ฒฝ์ฐ์๋ ์์ฑ์๋ฅผ ํตํ ๊ฐ์ฒด์ ์ฃผ์ ์ด ๋ถ๊ฐ๋ฅํ๋ฏ๋ก ํ ์คํธ ์ฝ๋ ์์ฑ์์๋ง @Autowired๋ฅผ ์ฌ์ฉํ๊ณ ์ค์ ์ฝ๋ ์์ฑ์์๋ ์์ฑ์๋ฅผ ํตํ ๊ฐ์ฒด ์ฃผ์ ๋ฐฉ์์ ์ฌ์ฉํ๊ฒ ๋ค.
* DI(Dependency Injection) - ์คํ๋ง์ด ๊ฐ์ฒด๋ฅผ ๋์ ์์ฑํ์ฌ ์ฃผ์ ํ๋ค.
3. ๋ฐ์ดํฐ ์กฐํํ๊ธฐ - findAll()
์ด๋ฒ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ์กฐํํด ๋ณด์.
import static org.junit.jupiter.api.Assertions.assertEquals;
import java.util.List;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class SbbApplicationTests {
@Autowired
private QuestionRepository questionRepository;
@Test
void testJpa() {
List<Question> all = this.questionRepository.findAll();
assertEquals(2, all.size()); // JUnit method
Question q = all.get(0);
assertEquals("sbb๊ฐ ๋ฌด์์ธ๊ฐ์?", q.getSubject());
}
}
question ํ ์ด๋ธ์ ์ ์ฅ๋ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๊ธฐ ์ํด์ ๋ฆฌํฌ์งํฐ๋ฆฌ์ findAll ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ค.
findAll : DB์์ ์ ์ฒด๊ฐ์ list๋ก ๋ถ๋ฌ์ด
JUnit & ๋ฉ์๋ ์ค๋ช
>> ์ด 2๊ฑด์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ์ ์ฌ์ด์ฆ๋ 2๊ฐ ๋์ด์ผ ํ๋ค. ๋ฐ์ดํฐ ์ฌ์ด์ฆ๊ฐ 2์ธ์ง ํ์ธํ๊ธฐ ์ํด JUnit์ assertEquals ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ค. assertEquals๋ assertEquals(๊ธฐ๋๊ฐ, ์ค์ ๊ฐ)์ ๊ฐ์ด ์ฌ์ฉํ๊ณ ๊ธฐ๋๊ฐ๊ณผ ์ค์ ๊ฐ์ด ๋์ผํ์ง๋ฅผ ์กฐ์ฌํ๋ค. ๋ง์ฝ ๊ธฐ๋๊ฐ๊ณผ ์ค์ ๊ฐ์ด ๋์ผํ์ง ์๋ค๋ฉด ํ ์คํธ๋ ์คํจ๋ก ์ฒ๋ฆฌ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ ์ฅํ ์ฒซ๋ฒ์งธ ๋ฐ์ดํฐ์ ์ ๋ชฉ์ด "sbb๊ฐ ๋ฌด์์ธ๊ฐ์?"์ ์ผ์นํ๋์ง๋ ํ ์คํธํ๋ค.
findBy__()
์ด๋ฒ์๋ Question ์ํฐํฐ์ Id๊ฐ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์กฐํํด ๋ณด์.
import static org.junit.jupiter.api.Assertions.assertEquals;
import java.util.Optional;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class SbbApplicationTests {
@Autowired
private QuestionRepository questionRepository;
@Test
void testJpa() {
Optional<Question> oq = this.questionRepository.findById(1);
if(oq.isPresent()) {
Question q = oq.get();
assertEquals("sbb๊ฐ ๋ฌด์์ธ๊ฐ์?", q.getSubject());
}
}
}
id ๊ฐ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๊ธฐ ์ํด์๋ ๋ฆฌํฌ์งํฐ๋ฆฌ์ findById ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ค. ํ์ง๋ง findById์ ๋ฆฌํด ํ์ ์ Question์ด ์๋ Optional์์ ์ฃผ์ํ์. Optional์ null ์ฒ๋ฆฌ๋ฅผ ์ ์ฐํ๊ฒ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ํด๋์ค๋ก ์์ ๊ฐ์ด isPresent๋ก null์ด ์๋์ง๋ฅผ ํ์ธํ ํ์ get์ผ๋ก ์ค์ Question ๊ฐ์ฒด ๊ฐ์ ์ป์ด์ผ ํ๋ค.
๋ค์๊ณผ ๊ฐ์ด findBy__์์ ๋ท๋ถ๋ถ์ ์ ์ํ Entity ์ด๋ฆ์ ๋ถ์ด๋ฉด ํน์ entity์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ ์ ์๋ค.
ex) findByProductId()
findBySubject
๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณตํ์ง ์๋ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ๋ค์๊ณผ ๊ฐ์ด QuestionRepository ์ธํฐํ์ด์ค๋ฅผ ๋ณ๊ฒฝํด์ผ ํ๋ค.
public interface QuestionRepository extends JpaRepository<Question, Integer> {
Question findBySubject(String subject);
}
๊ทธ๋ฌ๋ฉด ๋ค์์ฒ๋ผ ์ ๋ชฉ์ผ๋ก ํ ์ด๋ธ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ ์ ์๋ค.
import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class SbbApplicationTests {
@Autowired
private QuestionRepository questionRepository;
@Test
void testJpa() {
Question q = this.questionRepository.findBySubject("sbb๊ฐ ๋ฌด์์ธ๊ฐ์?");
assertEquals(1, q.getId());
}
}
์ด๋ฌํ ์ฝ๋๋ฅผ ์์ฑํ๊ณ ํ ์คํธ๋ฅผ ์งํํ๋ฉด ํ ์คํธ๋ ์ ํต๊ณผ๋๋ค. ๊ทธ๋ฐ๋ฐ ์ฝ๋๋ฅผ ๋ณด๋ค๋ณด๋ฉด "์ธํฐํ์ด์ค์ findBySubject ๋ผ๋ ๋ฉ์๋๋ฅผ ์ ์ธ๋ง ํ๊ณ ๊ตฌํ์ ํ์ง ์์๋๋ฐ ๋๋์ฒด ์ด๋ป๊ฒ ์คํ์ด ๋๋ ๊ฑฐ์ง?"๋ผ๋ ์๋ฌธ์ด ์๊ธด๋ค.
์ด๋ JpaRepository๋ฅผ ์์ํ QuestionRepository ๊ฐ์ฒด ๋๋ฌธ์ ๊ฐ๋ฅํ ์ผ์ด๋ค. (DI์ ์ํด ์คํ๋ง์ด ์๋์ผ๋ก QuestionRepository ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค. ์ด ๋ ํ๋ก์ ํจํด์ด ์ฌ์ฉ๋๋ค๊ณ ํ๋ค.) ๋ฆฌํฌ์งํฐ๋ฆฌ ๊ฐ์ฒด์ ๋ฉ์๋๊ฐ ์คํ๋ ๋ JPA๊ฐ ํด๋น ๋ฉ์๋๋ช ์ ๋ถ์ํ์ฌ ์ฟผ๋ฆฌ๋ฅผ ๋ง๋ค๊ณ ์คํํ๋ค.
์ฆ, findBy + ์ํฐํฐ์ ์์ฑ๋ช (์:findBySubject)๊ณผ ๊ฐ์ ๋ฆฌํฌ์งํฐ๋ฆฌ ๋ฉ์๋๋ฅผ ์์ฑํ๋ฉด ํด๋น ์์ฑ์ ๊ฐ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์กฐํํ ์ ์๋ค. findBySubject ๋ฉ์๋๋ฅผ ํธ์ถํ ๋ ์ค์ ๋ก ์คํ๋๋ ์ฟผ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ๋ค.
์ด์ธ์๋ ์ฟผ๋ฆฌ์ ์กฐ๊ฑด์ ๋ณ๊ฒฝํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ ์๋ ์๋๋ฐ, ์ด๋ฌํ ๋ฉ์๋์ ๋ช ๋ช ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ด ์ ๋ฆฌํ ์ ์๋ค.
ํญ๋ชฉ | ์ค๋ช | ์์ |
And | ์ฌ๋ฌ ์ปฌ๋ผ์ and ์กฐ๊ฑด์ผ๋ก ๊ฒ์ | findBySubjectAndContetnt(Stringsubject, String content) |
Or | ์ฌ๋ฌ ์ปฌ๋ผ์ or ์กฐ๊ฑด์ผ๋ก ๊ฒ์ | findBySubjectOrContent(Stringsubject, String content) |
Between | ์ปฌ๋ผ์ between์ผ๋ก ๊ฒ์ | findByCreateDateBetween(LocalDateTime fromData, LocalDateTime toDate) |
LessThan | ์์ ํญ๋ชฉ ๊ฒ์ | findByIdLessThan(Integer id) |
GreaterThanEqual | ํฌ๊ฑฐ๋ ๊ฐ์ ํญ๋ชฉ ๊ฒ์ | findByIdGreaterThanEqual(Integer id) |
Like | like ๊ฒ์ | findBySubjectLike(String subject) |
In | ์ฌ๋ฌ ๊ฐ ์ค์ ํ๋์ธ ํญ๋ชฉ ๊ฒ์ | findBySubjectIn(String[] subjects) |
OrderBy | ๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ ์ ๋ ฌํ์ฌ ์ ๋ฌ | findBySubjectOrderByCreateDateAsc(String subject) |
4. ๋ฐ์ดํฐ ์์ ํ๊ธฐ
์ด๋ฒ์๋ ์ง๋ฌธ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๋ ํ ์คํธ ์ฝ๋๋ฅผ ์์ฑํด ๋ณด์.
import static org.junit.jupiter.api.Assertions.assertTrue;
import java.util.Optional;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class SbbApplicationTests {
@Autowired
private QuestionRepository questionRepository;
@Test
void testJpa() {
Optional<Question> oq = this.questionRepository.findById(1);
assertTrue(oq.isPresent());
Question q = oq.get();
q.setSubject("์์ ๋ ์ ๋ชฉ");
this.questionRepository.save(q);
}
}
์ง๋ฌธ ๋ฐ์ดํฐ๋ฅผ ์กฐํ(findById)ํ ๋ค์ subject๋ฅผ "์์ ๋ ์ ๋ชฉ" ์ด๋ผ๋ ๊ฐ์ผ๋ก ์์ ํ๋ค. ๋ณ๊ฒฝ๋ Question ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ธฐ ์ํด์๋ this.questionRepository.save(q) ์ฒ๋ผ ๋ฆฌํฌ์งํฐ๋ฆฌ์ save ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ค. (์ ์ฅ๊ณผ ๋์ผ)
5. ๋ฐ์ดํฐ ์ญ์ ํ๊ธฐ
์ด์ด์ ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ๋ ๊ฒ๋ ์ค์ตํด ๋ณด์.
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
import java.util.Optional;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class SbbApplicationTests {
@Autowired
private QuestionRepository questionRepository;
@Test
void testJpa() {
assertEquals(2, this.questionRepository.count());
Optional<Question> oq = this.questionRepository.findById(1);
assertTrue(oq.isPresent());
Question q = oq.get();
this.questionRepository.delete(q);
assertEquals(1, this.questionRepository.count());
}
}
๋ฆฌํฌ์งํฐ๋ฆฌ์ count() ๋ฉ์๋๋ ํด๋น ๋ฆฌํฌ์งํฐ๋ฆฌ์ ์ด ๋ฐ์ดํฐ๊ฑด์๋ฅผ ๋ฆฌํดํ๋ค.
Question ๋ฆฌํฌ์งํฐ๋ฆฌ์ delete ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ๋ค. ์ญ์ ํ๊ธฐ ์ ์๋ ๋ฐ์ดํฐ ๊ฑด์๊ฐ 2, ์ญ์ ํ ํ์๋ ๋ฐ์ดํฐ ๊ฑด์๊ฐ 1์ธ์ง๋ฅผ ํ ์คํธํ๋ค.
(ํ๋์ ํ์ : ๊ณต๋ถํด์ผํ ๋ถ๋ถ)
์ฐธ๊ณ ์๋ฃ
https://akdl911215.tistory.com/307
JPA Repository๋ฅผ ์ฌ์ฉํ๋ ์ด์
ํ์๋ ๋ฉด์ ์ ๋ณด๊ณ ์๋ค. ๋ง์ ์ง๋ฌธ๊ณผ ์ด์ผ๊ธฐ๊ฐ ์ค๊ณ ๊ฐ์ง๋ง, ๊ทธ ์ค ํ๊ฐ๋ JPA Repository๋ฅผ ์ฌ์ฉํ๋ ์ด์ ๊ฐ ๋ฌด์์ธ๊ฐ? ๋ผ๋ ์ง๋ฌธ์ด ๊ธฐ์ต์ ๋จ์์ ๊ธฐ๋กํด๋๋ค. ํ์๋ JPA Repository๋ฅผ ์ฌ์ฉํ๋ ์ด
akdl911215.tistory.com
https://wikidocs.net/160890#_1
2-05 ๋ฆฌํฌ์งํฐ๋ฆฌ
* `[์์ฑ ์์ค]` : [https://github.com/pahkey/sbb3/tree/2-05](https://github.com/pahkey/sbb3/tree/2-05) …
wikidocs.net
https://zara49.tistory.com/130
[JPA] JPA Repository ๋ฉ์๋ ๋ช ๋ช ๊ท์น
JPA๋ ์ฐ๋ฆฌ๊ฐ ์ฟผ๋ฆฌ๋ฅผ ์ด์ฌํ ์ง๋๊ฒ์ ๋์ ํด ๊ฐ๋จํ๊ฒ ํํํ์ฌ ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ํด์ค๋ค. ๊ทธ๋ ๋ค๋ฉด ์ด๋ค ํํ๋ก ๋ฉ์๋ ์ด๋ฆ์ ๋ถ์ด๋ฉด ๋๋์ง, ๋ช ๋ช ๊ท์น์ ๋ํด ๊ฐ๋ตํ๊ฒ ์ ๋ฆฌํด๋์.
zara49.tistory.com
'๐ต java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
JAVA | ์ฌ์น ์ฐ์ฐ ๊ณ์ฐ๊ธฐ ์ค์ต - (1) (0) | 2023.08.15 |
---|---|
JAVA | STREAM์ด๋ ? (์ฌ์ฉ๋ฒ, ๋ฐฑ์ค ๋ฌธ์ ๊น์ง ๊ฐ์ด ํ์ด๋ณด๊ธฐ) (5) | 2023.08.10 |
JAVA | JPA ์์๋ณด๊ธฐ (JPA, JDBC, Hibernate & JPA) (0) | 2023.07.10 |
JAVA | DTO๋ (0) | 2023.07.07 |
JAVA | ๋ฆฌํ๋ ์ (Reflection) ์๊ธฐ (3) | 2023.07.05 |