Repository
리포지터리는 엔티티에 의해 생성된 데이터베이스 테이블에 접근하는 메서드들(예: findAll, save 등)을 사용하기 위한 인터페이스이다. 데이터 처리를 위해서는 테이블에 어떤 값을 넣거나 값을 조회하는 등의 CRUD(Create, Read, Update, Delete)가 필요하다. 이 때 이러한 CRUD를 어떻게 처리할지 정의하는 계층이 바로 리포지터리이다.
생성하는법
repository디렉터리에 클래스이름그대로쓰고 그 뒤에 Repository만 붙여서 Interface를 하나 생성해준다
그러면 이렇게 생성이된다
그리고 그뒤에
extends JpaRepository<클래스이름,기본키타입>
이걸 붙여서 JpaRepository를 상속한다
이제 MoneyBoardRepository를 이용하여 MoneyBoard 테이블에 데이터를 저장하거나 조회할 수 있다.
안에 들어가는 내용은 나중에다시 작성하겠다
MoneyMemberReposotory도 만들어주자
Repository 구현하는 규칙
JPA는 메소드 이름만으로 쿼리를 생성할 수 있다.
List<Comment> findAllByPostId(Long post_id); 이런식으로 작성해주면 JPA가 알아서 SQL문을 생성해준다.
Method
method | 기능 |
save() | 레코드 저장 (insert, update) |
findOne() | primary key로 레코드 한건 찾기 |
findAll() | 전체 레코드 불러오기. 정렬(sort), 페이징(pageable) 가능 |
count() | 레코드 갯수 |
delete() | 레코드 삭제 |
Keyword
메서드 이름 키워드 | 샘플 | 설명 |
And | findByEmailAndUserId(String email, String userId) | 여러필드를 and 로 검색 |
Or | findByEmailOrUserId(String email, String userId) | 여러필드를 or 로 검색 |
Between | findByCreatedAtBetween(Date fromDate, Date toDate) | 필드의 두 값 사이에 있는 항목 검색 |
LessThan | findByAgeGraterThanEqual(int age) | 작은 항목 검색 |
GreaterThanEqual | findByAgeGraterThanEqual(int age) | 크거나 같은 항목 검색 |
Like | findByNameLike(String name) | like 검색 |
IsNull | findByJobIsNull() | null 인 항목 검색 |
In | findByJob(String … jobs) | 여러 값중에 하나인 항목 검색 |
OrderBy | findByEmailOrderByNameAsc(String email) | 검색 결과를 정렬하여 전달 |
이 정도만 알고있으면 우리가 사용하려는 대부분의 쿼리문은 이런식으로 작성이 가능하다고 하다.
그리고 외우지 않아도 IDE에 자동완성 기능이 있기 때문에 훨씬 수월하게 개발을 할 수 있게 도와준다.
여기서 컬럼명이나 해당 개체의 필드명들은 파스칼로 적어주는게 좋다고 한다.
위 표말고도 JPA 참조문서를 찾아보면 더 많은 예시를 볼 수 있다.
https://docs.spring.io/spring-data/jpa/docs/1.10.1.RELEASE/reference/html
Spring Data JPA - Reference Documentation
Example 11. Repository definitions using Domain Classes with mixed Annotations interface JpaPersonRepository extends Repository { … } interface MongoDBPersonRepository extends Repository { … } @Entity @Document public class Person { … } This example
docs.spring.io
쿼리문도 사용가능
public interface UserRepository extends JpaRepository<User, Long> {
@Query("select u from User u where u.emailAddress = ?1")
User findByEmailAddress(String emailAddress);
}
SQL문이 복잡해서 메소드 이름만으로 해결이 안될때는 이런식으로 직접 쿼리하는 방법도 있다.
아래내용은 상식으로 알고있으면 좋다
# ORM이란?
- Object-Relational Mapping (객체와 관계형데이터베이스 매핑, 객체와 DB의 테이블이 매핑을 이루는 것)
- 객체가 테이블이 되도록 매핑 시켜주는 프레임워크 이다.
- 프로그램의 복잡도를 줄이고 자바 객체와 쿼리를 분리할 수 있으며 트랜잭션 처리나 기타 데이터베이스 관련 작업들을 좀 더 편리하게 처리할 수 있는 방법
- SQL Query가 아닌 직관적인 코드(메서드)로서 데이터를 조작할 수 있다.
ex) 기존쿼리 : SELECT * FROM MEMBER; 이를 ORM을 사용하면 Member테이블과 매핑된 객체가 member라고 할 때, member.findAll()이라는 메서드 호출로 데이터 조회가 가능하다.
# JPA란?
- Java Persistence API (자바 ORM 기술에 대한 API 표준 명세)
- 한마디로 ORM을 사용하기 위한 인터페이스를 모아둔 것 이라고 볼 수 있다.
- 자바 어플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스이다.
- ORM에 대한 자바 API 규격이며 Hibernate, OpenJPA 등이 JPA를 구현한 구현체 이다. (ORM을 사용하기 위한 인터페이스를 모아둔 것)
- Hibernate 이외에도 EcipseLink, DataNucleus, OpenJPA, TopLink 등이 있습니다.
※결국 인터페이스이기 때문에 JPA를 사용하기 위해서는 JPA를 구현한 Hibernate, EclipseLink, DataNucleus 같은 ORM 프레임워크를 사용해야 한다.
# Hibernate?
- JPA를 사용하기 위해서 JPA를 구현한 ORM 프레임워크중 하나.
(자바를 위한 오픈소스 ORM(Object-relational mapping) 프레임워크를 제공한다.)
- Hibernate는 JPA 명세의 구현체이다. javax.persistence.EntityManager와 같은 JPA의 인터페이스를 직접 구현한 라이브러리이다.
우리가 알고 있는 Hibernate가 JPA의 구현체 인 것이다.
![](https://blog.kakaocdn.net/dn/beNVH3/btsbmYwwuk7/trbL7keg8pqdjlgzeJQ5v1/img.png)
JPA Interface : 인터페이스
↓ 상속
Hibernate, EcipseLink, DataNucleus 등 : 구현체
'웹 개발 > 🍃 SpringBoot' 카테고리의 다른 글
SpringBoot | application.yml (0) | 2023.04.30 |
---|---|
SpringBoot | CRUD 준비,Header<T>,service,apicontroller (0) | 2023.04.30 |
SpringBoot | model(entity) with JPA Auditing (0) | 2023.04.19 |
SpringBoot | ModelAndView에 데이터얹기 + Thymeleaf (0) | 2023.04.15 |
SpringBoot | Controller - PageController (0) | 2023.03.27 |