JpaRepository 인터페이스 (SQL 구문 쓰지 않아도 삽입되는 것을 알 수 있다)
JpaRepository 인터페이스
개발자가 가장 많이 사용할 것이 JpaRepository 이다
일반적인 기능만을 사용할 때는 CrudRepository를 사용하는 것이 좋고
모든 JPA관련 기능을 사용하고 싶을 때는 JpaRepository를 이용*특별한 경우가 아니라면* 하는 것이 가장 무난한 선택
JpaRepository 는 인터페이스고 Spring Data JPA는 이를 상속하는 인터페이스를 선언하는 것만으로도 모든 처리가 끝나는 마법같은 일이 벌어진다.
프로젝트내에 repository 패키지 생성 후 MemoRepositoy 인터페이스를 추가한다.
package org.zerock.ex2.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import org.zerock.ex2.entity.Memo;
public interface MemoRepository extends JpaRepository<Memo, Long> {
}
인터페이스 로 추가
이것은 인터페이스 자체이고 JpaRepository 인터페이스를 상속하는 것만으로 모든 작업이 끝났다.
JpaRepository 를 사용할 떄는 엔티티의 타입 정보 (Memo 클래스 타입)과 @Id 타입을 지정
package org.zerock.ex2.repository;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class MemoRepositoryTests {
@Autowired
MemoRepository memoRepository;
@Test
public void testClass(){
System.out.println(memoRepository.getClass().getName());
}
}
test에 추가
Explicitly configure spring.jpa.open-in-view to disable this warning
저 테스트 재생모양을 눌러야 프록시 가 뜬다.
빨간거는 비동기? 라고 되어있따.
jdk.proxy3.$Proxy114======
@Test
public void testClass(){
System.out.println(memoRepository.getClass().getName().toString()+"hello");
jdk.proxy3.$Proxy114hello
프록시 뒤에 나온다.
등록작업 테스트
package org.zerock.ex2.repository;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.zerock.ex2.entity.Memo;
import java.util.stream.IntStream;
@SpringBootTest
public class MemoRepositoryTests {
@Autowired
MemoRepository memoRepository;
//
// @Test
// public void testClass(){
// System.out.println(memoRepository.getClass().getName().toString()+"hello");
@Test
public void testIntertDummies(){
IntStream.rangeClosed(1,100).forEach(i -> {
Memo memo = Memo.builder().memoText("Sample..."+i).build();
memoRepository.save(memo);
});
}
}
@Test
public void testIntertDummies(){
IntStream.rangeClosed(1,100).forEach(i -> {
Memo memo = Memo.builder().memoText("Sample..."+i).build();
memoRepository.save(memo);
});
}
이게 100개정도 채워져있다.
SQL 문자 안써도 들어가는 것을 알 수 있게 된다.
인텔리에서 System.out.println(); 자동화하는 법
sout 및 soutv 이다.
soutv는 심화된 것 하나의 변수를 자동으로 출력
System.out.printf();
는 so 로 하면 된다.
조회 작업 테스트
// 조회작업
@Test
public void testSelect(){
//데이터베이스에 존재하는 mno
Long mno = 100L;
Optional<Memo> result = memoRepository.findById(mno);
System.out.println("=======================================");
if(result.isPresent()){
Memo memo = result.get();
System.out.println(memo);
}
}
findById(mno); 를 실행하는 순간에 이미 SQL은 처리가 되었고, "===" 부분은 SQL 처리 이후에 실행 된 것을 볼 수 있따.
수정 작업 테스트
package org.zerock.ex2.repository;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.zerock.ex2.entity.Memo;
import java.util.Optional;
import java.util.stream.IntStream;
@SpringBootTest
public class MemoRepositoryTests {
@Autowired
MemoRepository memoRepository;
//
// @Test
// public void testClass(){
// System.out.println(memoRepository.getClass().getName().toString()+"hello");
// 등록작업
// @Test
// public void testIntertDummies(){
// IntStream.rangeClosed(1,100).forEach(i -> {
// Memo memo = Memo.builder().memoText("Sample..."+i).build();
// memoRepository.save(memo);
// });
// }
// 조회작업
// @Test
// public void testSelect(){
// //데이터베이스에 존재하는 mno
// Long mno = 100L;
//
// Optional<Memo> result = memoRepository.findById(mno);
//
// System.out.println("=======================================");
//
// if(result.isPresent()){
// Memo memo = result.get();
// System.out.println(memo);
// }
//
// }
// 수정 작업 테스트
@Test
public void testUpdate(){
Memo memo = Memo.builder().mno(100L).memoText("Update Text").build();
System.out.println(memoRepository.save(memo));
}
}
삭제 작업 테스트
// 삭제 작업 테스트
@Test
public void testDelete(){
Long mno = 100L;
memoRepository.deleteById(mno);
}
100이 삭제 된 것을 볼 수 있다.
@Test
public void testDelete(){
Long mno = 100L;
IntStream.rangeClosed(1,97).forEach(i->{
memoRepository.deleteById((long) i);
});
}
for each 활용해서 1~97까지의 아이디를 지웠다 내가 중간에 10도 삭제했는데 중간에 존재하지 않는 아이디더라도 삭제가 된다.
역시..인텔리제이 너무 좋다..