Just do IT
article thumbnail
Published 2021. 6. 15. 15:01
JPA 실습하기 (4) Programing/JPA

이번 포스팅에서는 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

더 많은 키워드와 쿼리를 알고 싶다면 아래 링크 클릭~!

     -> https://docs.spring.io/spring-data/jpa/docs/1.10.1.RELEASE/reference/html/#jpa.sample-app.finders.strategies

 

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

 

이렇게 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
profile

Just do IT

@AmyG

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!