[JPA] JpaRepository

LDB·2024년 11월 11일
0

JPA 기본

목록 보기
4/10
post-thumbnail

JpaRepository

JpaRepository는 Spring Data JPA에서 지원하는 인터페이스 중에 하나로 데이터베이스의 기본적인 CRUD작업을 지원해준다. JPA는 주로 Hibernate, Eclipse Link를 사용하여 entitymanagerfactory, entitymanager등 구현체를 생성하여 DB와 통신을 하지만 Spring Data JPA를 사용하면 구현체를 직접 생성하지않아도 다룰수 있다는 장점이 있다, 기본 CRUD뿐만 아니라 구체적으로 조건을 정하여 CRUD를 작성할 수 있다.

@Query 어노테이션 게시글을 작성할 때 사용한 예시문 일부를 그대로 사용했습니다.
https://velog.io/@half-phycho/JPA-Query-어노테이션


JpaRepository 사용준비

(해당 예시는 Spring Boot로 작성했고 빌드도구는 gradle로 했다.)

build.gradle 파일

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    compileOnly 'org.projectlombok:lombok'
    
    runtimeOnly 'org.mariadb.jdbc:mariadb-java-client'
    
    annotationProcessor 'org.projectlombok:lombok'
}

application.properties 파일

spring.datasource.driverClassName=org.mariadb.jdbc.Driver
spring.datasource.url=
spring.datasource.username=
spring.datasource.password=

entity 파일

@Entity
@Getter
@NoArgsConstructor
@Table(name="member")
public class Member{
	@Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    private String name;
    private int age;
}

(JpaRepository 및 JPA는 Entity로 데이터베이스 매핑을 하기때문에 Entity클래스가 필요하다.)

사용예시

Repository 선언하여 JpaRepository 확장하기

public interface memberRepository extends JpaRepository<Member, Integer> {
	
}

JpaRepository를 확장하는 과정에서 제너릭을 <Memeber, Integer>로 한 이유는 현재 JpaRepository의 규칙이라고도 할 수 있는데 <엔티티 클래스, 엔티티 클래스의 기본키 타입> 으로 선언하는게 규칙이다.

JpaRepository안에는 JpaRepository말고도 다른 인터페이스들이 확장되어있다, JpaRepositry의 메서드와 참조된 인터페이스중에 많이 쓰는 메서드를 설명하겠다.

CRUD 기본 메서드

@Service
public class memberService {
	
    @Autowired
    private memberRepository memberrepository;
	
	public List<Member> findAll(){ // 테이블의 모든 행 조회
    	return memberrepository.findAll();
    }
    
    public Member findById(int id){ // 테이블의 특정 값 조회
    	return memberrepository.findById(id).get();
    }
    
    public void save(Member member){ // 엔터티에 있는 값을 테이블에 저장
        memberrepository.save(member);
    }

    public void saveAll(List<Member> member){ // 엔터티 리스트의 모든 값을 테이블에 저장
        memberrepository.saveAll(member);
    }

    public void delete(Member member){ // 엔터티와 동일한 값을 테이블에서 삭제
        memberrepository.delete(member);
    }

    public void deleteAll(){ // 엔터티에 매핑 되어있는 테이블의 전체내용 삭제
        memberrepository.deleteAll();
    }

    public void deleteById(int id){ // 테이블의 특정 아이디와 동일한 내용 삭제
        memberrepository.deleteById(id);
    }

    public void deleteAllById(List<Integer> id){ // 리스트에 있는 아이디와 동일한 내용들 삭제
        memberrepository.deleteAllById(id);
    }
}

JpaRepository 메서드

JpaRepository는 다른 인터페이스들이 확장되어있다라고 설명을 했는데 정확이 아래의 그림으로 표현 할 수 있다.

JpaRepository : CrudRepository에 존재하는 기능들중에 생성, 수정, 삭제를 영속성 컨텍스트를 안거치고 바로 DB에 저장하는 메서드들이 존재한다.
(saveAndFlush, saveAllAndFlush, deleteInBatch등이 있다.)

CrudRepository : JpaRepository를 사용하는데 기본적으로 CRUD메서드들은 모두 여기에 있는 것들이라고 보면된다.
(findAll, findById, save, saveAll, count, delete등이 있다.)

ListPagingAndSortingRepository : 내용을 조회하는 것에 더불어 페이지네이션 기능을 지원하는 저장소이다.
(findAll의 매개변수에 sort, pageable이 있다.)


다른 추가적인 메서드는 공식문서를 참고하는게 좋을거 같다.

https://docs.spring.io/spring-data/jpa/docs/current/api/org/springframework/data/jpa/repository/JpaRepository.html


궁금한점

JpaRepository는 일반적인 JPA 사용법과 다른점이 있는데 그것은 Repository로 스프링 Bean에 등록하지 않았는데 잘되는 것을 볼 수 있다. 그 이유는 JpaRepository 인터페이스는 기본설정으로 @EnableJpaRepositories 어노테이션이 등록이 되는데

이 어노테이션의 주석설명을 해석하면 "Spring Data에 대한 주석이 달린 구성 클래스 패키지를 스캔합니다." 라고 해석이 된다. 그리고 중간에 JpaRepositoriesRegistrar.class를 import하는 것을 볼 수 있는데

이는 JpaRepository들을 bean으로 등록하는 역할을 한다는 것을 알 수 있다.


참고 사이트

https://docs.spring.io/spring-data/jpa/docs/current/api/org/springframework/data/jpa/repository/JpaRepository.html

https://velog.io/@minju0426/JPARepository에-대해-알아보자사용법-Method

https://m.blog.naver.com/hj_kim97/222780110215

https://velog.io/@wonizizi99/Spring-JpaRepository-NoRepositoryBean-사용-이유-사용자-정의-레포지토리

profile
가끔은 정신줄 놓고 멍 때리는 것도 필요하다.

0개의 댓글

관련 채용 정보