백엔드/스프링부트

JpaRepository 인터페이스 (SQL 구문 쓰지 않아도 삽입되는 것을 알 수 있다)

민밥통 2024. 1. 9. 16:41

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도 삭제했는데 중간에 존재하지 않는 아이디더라도 삭제가 된다. 

역시..인텔리제이 너무 좋다..