์คํ๋ง ๋ฐ์ดํฐ JPA์์ ์ถ์ํ์ ์ค์ฌ์ด ๋๋ ์ธํฐํ์ด์ค๋ Repository ์ ๋๋ค.
Repository๋ ๊ด๋ฆฌํ ๋๋ฉ์ธ ํด๋์ค์, ๋๋ฉ์ธ ํด๋์ค์ ID(์๋ณ์)๋ฅผ ํ์ ์ธ์๋ก ์ฌ์ฉํฉ๋๋ค.
์ค์ ๊ตฌํ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
@NoRepositoryBean
public interface CrudRepository<T, ID> extends Repository<T, ID> {
<S extends T> S save(S entity);
<S extends T> Iterable<S> saveAll(Iterable<S> entities);
Optional<T> findById(ID id);
boolean existsById(ID id);
Iterable<T> findAll();
Iterable<T> findAllById(Iterable<ID> ids);
long count();
void deleteById(ID id);
void delete(T entity);
void deleteAllById(Iterable<? extends ID> ids);
void deleteAll(Iterable<? extends T> entities);
void deleteAll();
}
๊ทธ๋ฆฌ๊ณ ์ด๋ฌํ CrudRepository๋ฅผ ์์๋ฐ์ ์์์ฑ ๊ธฐ์ ๊ณผ ๊ด๋ จ๋ ์ถ์ํ๋ฅผ ์ ๊ณตํ๋๋ฐ,
์์๋ก๋ JpaRepository์ MongoRepository ๋ฑ์ด ์์ต๋๋ค.
์ธํฐํ์ด์ค ๋ถ์
JpaRepository
org.springframework.data:spring-data-jpa ํ๋ก์ ํธ์ ์ํฉ๋๋ค.
PagingAndSortingRepository, CrudRepository, Repository
org.springframework.data:spring-data-commons ํ๋ก์ ํธ์ ์ํฉ๋๋ค.
์ฆ JpaRepository๋ JPA์ ๋ ์์กด์ ์ด๊ฒ ๋๋ฉฐ, ๋ง์ฝ JPA๊ฐ ์๋ Mongo๋ฑ์ ๋ค๋ฅธ ํ๋ก์ ํธ์ ๊ธฐ์ ์ ์ฌ์ฉํ๊ฒ ๋๋ค๋ฉด ์ฝ๋๋ฅผ ์์ ํด์ผ ํ๋ ์ํฉ์ด ๋ฐ์ํฉ๋๋ค.
๊ทธ๋ฌ๋ CrudRepository ๋ฑ์ commons ํ๋ก์ ํธ์ ์ํ์ฌ, JPA์ ์์กด์ ์ด์ง ์๊ณ ๊ณตํต์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
์ฌ์ฉ ๋ฐฉ๋ฒ
๋ค์๊ณผ ๊ฐ์ด ์ํฐํฐ ํด๋์ค๋ฅผ ํ๋ ์์ฑํ์์ต๋๋ค.
PK๋ Long ํ์ ์ ๋๋ค.
@Entity
@Table(name = "member")
class Member(
@Id @Column(name = "member_id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
var id: Long = 0,
var username: String,
var age: Int,
) {
}
์๋์ ๊ฐ์ด ์ ์ธํฉ๋๋ค.
interface MemberRepository : JpaRepository<Member, Long> {}
์ด์ ํด๋น ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
@SpringBootTest
@Transactional
internal class MemberRepositoryTest(
@Autowired val memberRepository: MemberRepository,
) {
@Test
fun testMember() {
//given
val member = Member(username = "username" , age = 1)
//when
memberRepository.save(member)
//then
val find = memberRepository.findByIdOrNull(member.id) ?: throw IllegalStateException("์์")
Assertions.assertThat(find?.id).isEqualTo(member.id)
Assertions.assertThat(find?.username).isEqualTo(member.username)
Assertions.assertThat(find).isEqualTo(member)
}
}
์ฐธ๊ณ - @EnableJpaRepositories
๋ง์ฝ ์คํ๋ง ๋ถํธ๋ฅผ ์ฌ์ฉํ์ง ์๊ณ JPA๋ง ์ฌ์ฉํ๋ค๋ฉด, @EnableJpaRepositories๋ฅผ ์ฌ์ฉํด ์ฃผ์ด์ผ ํฉ๋๋ค.
๊ทธ๋ฌ๋ ์คํ๋ง๋ถํธ๋ฅผ ์ฌ์ฉํ์ ๋ค๋ฉด ์ด๋ฌํ ์ค์ ์์ด ๋ฐ๋ก Data JPA์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ค ์ ์์ต๋๋ค.
Reference
https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.core-concepts
Spring Data JPA - Reference Documentation
Example 109. Using @Transactional at query methods @Transactional(readOnly = true) interface UserRepository extends JpaRepository { List findByLastname(String lastname); @Modifying @Transactional @Query("delete from User u where u.active = false") void del
docs.spring.io