이번 포스팅에서는 model과 repository를 작성해보겠습니다
각각 패키지를 생성하고 자바클래스와 인터페이스로 생성하였습니다.
Member.java -> class / MemberRepository.java -> Interface
Member.java
package com.example.practice.model;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@NoArgsConstructor
@AllArgsConstructor
@Data
@Entity
@Table(name="member")
public class Member {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer memNum; // 회원 고유 번호
private String memName; // 회원 이름
private String memId; // 회원 아이디
private Integer memPwd; // 회원 비밀번호
}
위 코드에 사용된 어노테이션들
@NoArgsConstructor
- 파라미터가 없는 생성자를 자동 생성해준다
@AllArgsConstructor
- 클래스에 존재하는 모든 필드에 대한 생성자를 자동으로 생성해준다
@Data
- @Getter, @Setter, @RequiredArgsConstructor, @EqualsAndHashCode, @ToString이 포함되어 있다
- 클래스 안의 모든 private 필드에 대해 @Getter, @Setter를 적용하여 getter,setter를 생성해준다
- 클래스내에 @ToString, @EqualsAndHashCode를 적용시켜 메소드를 오버라이드 해주며
@RequiredArgsConstructor를 지정해준다
@Entity
- 객체와 테이블을 매핑해준다
- 클래스 내의 필드를 테이플의 컬럼으로 매핑하여 테이블을 생성한다
- 기본 생성자는 필수로 있어야 한다
- final 클래스, enum, interface, inner class에는 사용할 수 없다
- 함께 사용되는 속성 : Name
- Name : JPA에서 사용할 엔티티 이름을 지정해준다
Table(name="member")
- 엔티티와 매핑할 테이블을 지정해준다
- 생략 시 매핑한 엔티티 이름이 테이블의 이름이 된다
- 함게 사용되는 속성 : Name, Catalog, Schemal, uniqueConstraints
- Name : 메핑할 테이블 이름, defaul=엔티티 이름
- Catalog : catalog 기능이 있는 DB에서 catalog를 매핑, default=DB이름
- Schema : schema 기능이 있는 DB에서 schema를 매핑
- uniqueConstraints : 데이터베이스 생성 시 유니크 제약조건을 만들어 줍니다
스키마 자동 생성 기능을 사용해서 데이터베이스를 만들 때만 사용
@Id
- 기본키를 직접 지정할 때 사용합니다
@GeneratedValue(strategy = GenerationType.IDENTITY)
- 키 생성 전략을 사용하려면 pom.xml 혹은 application.properties에
hibernate.id.new_generator_mappings = true 을 설정해주어야 합니다.
- 기본키 생성을 DB에 위임하도록 한 것이다 (MySQL - Auto_Increment)
- @GeneratedValue(strategy = GenerationType.SEQUENCE)
: 데이터베이스 시퀀스 오브젝트 사용 (ORACLE, @SequenceGenerator 필요)
- @GeneratedValue(strategy = GenerationType.TABLE)
: 키 생성용 테이블 사용, 모든 DB에 사용, @TableGenerator 필요
- @GeneratedValue(strategy = GenerationType.AUTO)
: 방언(DB)에 따라 자동 지정, 기본값
예상되는 Error
- private String memName, private String memId, private Integer memPwd에
노란 밑줄이 생겨요~~
-> Lombok 설치를 확인해 주세요~ getter와 setter가 생성되지 않아서 생기는 문제입니다~
이클립스를 켜둔 상태에서 설치를 하셨다면 이클립스 재시작이 필요합니다~
lombok이 import가 된다고 해서 설치가 된 것은 아니기 때문에 에러가 발생할 수 있습니다^^
MemberRepository.java
package com.example.practice.repository;
import java.util.List;
import org.springframework.data.jpa.repository.JpaRepository;
import com.example.practice.model.Member;
public interface MemberRepository extends JpaRepository<Member, Integer>{
List<Member> findBymemNumBetween(int memNum1, int memNnum2);
// 쿼리 메소드, 메소드 이름으로 자동으로 SELECT 쿼리 생성
// JPA에서 자동으로 생성하는 쿼리는 다음과 같다
// select
// member0_.memNum as memNum1_0_,
// member0_.memName as memName2_0_,
// member0_.memId as memId3_0_,
// member0_.memPwd as memPwd4_0_
// from
// member member0_
// where
// member0_.memNum between ? and ?
}
자동으로 SELECT 문을 생성해줍니다
위의 쿼리문은 회원번호로 회원리스트를 출력하는 쿼리문입니다
스프링부트에서는 Entity의 기본적인 CRUD가 가능하도록 JpaRepository 인터페이스를 제공합니다.
JpaRepository 인터페이스를 상속하시면 해도 되며, 상속받을 때 사용된 Entity 클래스와 ID 값이 들거가게 됩니다.
JpaRepository<T(Entity Class), ID(값)>
JpaRepository 인터페이스를 상속하여 제공되는 기능
method | 기능 |
save() | 저장기능(insert, update) |
findOne() | primary key로 데이터 찾기 |
findAll() | 전체 데이터 불러오기, 정렬/페이징도 가능 |
count() | 데이터 갯수 확인하기 |
delete() | 데이터 삭제하기 |
기본기능을 제외한 조회 기능을 추가하고 싶으면 규칙에 맞는 메서드를 추가해주어야 합니다
또한 Query 메소드에 포함할 수 있는 키워드도 함께 활용하여 다양한 쿼리문을 사용하실 수 있습니다
기능을 추가하기 위한 규칙
method | 기능 및 설명 |
findBy로 시작 | 쿼리를 요청하는 메서드 |
countBy로 시작 | 쿼리 결과의 데이터 수를 요청하는 메서드 |
Query 메소드에 포함할 수 있는 키워드
method / Keyword | example | 설명 |
And | findByMemNameAndMemId(String memName, String memId) | 여러 필드를 and로 검색 |
Or | findByMemNameOrMemId(String memName, String memId) | 여러 필드를 or로 검색 |
Between | findBymemNumBetween(int memNum1, int memNnum2) | 필드 두 값 사이에 있는 항목을 검색 |
LessThan | findByMemNumLessThan(int memNum) | 작은 항목 검색 |
GreaterThanEqual | findByMemNumGreaterThanEqual(int memNum) | 크거나 같은 항목 검색 |
Like | findByMemNameLike(String memName) | 비슷한 항목 검색, like 검색 |
IsNull | findByMemNameIsNull() | 빈(null) 값인 항목 검색 |
In | findByMemId(String ... memIds) | 여러 값 중에 하나인 항목 검색 |
OrderBy | findByMemNameOrderByMemIdAsc(String memName) | 검색 결과를 정렬하여 전달 |
페이징과 정렬
페이징과 정렬을 하려면 Pageable 객체를 통해 페이징과 정렬을 위한 파라미터를 전달해야 합니다.
전달할 때 사용되는 파라미터 3가지가 있습니다.
query parameter | 설명 |
page | 몇번째 페이지 인지 결정 |
size | 한 페이지에 몇 개의 항목을 보여줄 것인지 결정 |
sort | 정렬 정보를 전달, 어떠한 순서로 정렬할지 결정 정렬 정보를 전달할 때의 포멧 : 필드이름, 정렬방향 여러 필드를 순차적으로 정렬할 수도 있습니다. ex) sort=memName,desc&sort=memId,asc |
더 많은 키워드와 쿼리를 알고 싶다면 아래 링크 클릭~!
이렇게 Member.java 와 MemberRepository를 작성해 보았습니다.
다음 포스팅에서는 service와 예외처리 코드를 작성해 보겠습니다.
다음으로 고고~ -> https://amy-ming.tistory.com/16
'Programing > JPA' 카테고리의 다른 글
JPA 실습하기 (6) (0) | 2021.06.21 |
---|---|
JPA 실습하기 (5) (0) | 2021.06.16 |
JPA 실습하기 (3) (0) | 2021.06.14 |
JPA 실습하기 (2) (0) | 2021.06.14 |
JPA 실습하기 (1) (0) | 2021.06.14 |