[JPA기초] JPA 활용 설계
JPA를 이용한 DB 연동 방법 및 엔티티 설계, 인터페이스 등에 대해서 알아보겠다.
이전 포스팅에서 JPA가 무엇인지를 알아보았고 이제 실제로 동작하는 기능 및 설계를 알아보자
[JPA기초]JPA란❔
JPA란❔국내의 서비스 업체중 Spring 프레임워크를 사용하는 많은 기업들이 JPA를 표준으로 하여 서비스를 개발하고 있다.그럼 JPA가 무엇인지 어떤 특징이 있는지를 알아보기 위해서 먼저 JPA가 어
developer-dodo.tistory.com
1. 데이터베이스 연동
먼저 스프링 부트 프로젝트를 생성한다.
라이브러리는 다음과 같이 추가한다.
- Dev Tool : Lombok, Spring Configuration Processor
- Web : Spring Web
- SQL : Spring Data JPA, 사용 DB
빌드 툴은 원하는 빌드 툴을 선택한다.
필자의 경우 현재 배우는 KDT 교육이나 강의 에서는 Maven을 많이 쓰지만, 빌드 속도 때문에 주로 Gradle을 사용한다.
Maven은 Gradle로 Migration이 가능하니 Gradle을 모른다면 써보는 것을 추천한다.
2. 엔티티 설계 & 기본 어노테이션
JPA를 사용하면 가장 큰 이점 중 하나는 기본 CRUD 등에 대한 쿼리를 직접 작성하지 않아도 된다.
이 기능을 수행하는 것이 바로 엔티티이다.
엔티티는 DB에 테이블에 대응되는 클래스이며, 엔티티에는 DB에 쓰일 테이블과 컬럼을 정의한다.
이는 어노테이션을 이용한다.
먼저 어노테이션의 종류를 한번 알아보자
◾ @Entity
해당 클래스가 엔티티임을 명시한다.
클래스 자체는 테이블과 일대일 맵핑, 해당 클래스 인스턴스는 하나의 레코드를 의미
◾ @Table
테이블 어노테이션을 사용할때는 클래스의 이름과 테이블 이름이 다른 경우 사용
코드 컨벤션등으로 테이블이름과 클래스 명이 다를때 사용
◾ @Id
@Id 필드는 테이블의 PK 역할로 사용
모든 엔티티는 PK가 필요!
◾ @GeneratedValue
일반적으로 @Id 와 함께 사용
해당 필드 값을 어떤 방식으로 자동 생성할지 사용
- 직접 할당
- 해당 어노테이션을 사용하지 않고 고유 기본값을 생성하는 경우
- 내부 규칙에 의해서 정의된다
- AUTO
- 기본 설정 값으로 DB에 맞게 자동 생성
- IDENTITY
- 기본값 생성을 DB로 위임하는 경우, DB에서는 AUTO_INCREMENT 사용
- SEQUENCE
- @SequenceGenerator 어노테이션으로 식별자 생성기를 설정하고 이를 통해 값 주입
- SequenceGenerator 정의 시 name, sequenceName, allocationSize 를 활용
- TABLE
- DBMS를 사용해도 동일하게 동작하는 경우 사용
- 식별자로 사용할 숫자 보관 테이블을 별도 생성, 엔티티 생성마다 값 갱신 사용
- @TableGenerator 어토네이션으로 테이블 정보 설정
◾ @Column
엔티티는 자동으로 테이블 컬럼과 매핑
하지만 컬럼명과 필드명이 다를때 등 새로운 옵션을 지정할때 사용
여러 옵션들이 있는데 일반적으로 사용되는 옵션은 다음과 같다.
- name : 컬럼명을 설정
- nullable : 레코드 생성시 null 여부를 결정
- length : 데이터베이스 저장 데이터 최대 길이
- unique : 해당 컬럼을 유니크로 설정
◾ @Transient
엔티티에 선언된 필드 값중 DB 테이블과 맵핑될 필요가 없을 경우에 사용
이렇게 상품에 대한 엔티티를 설계하면 다음과 같이 만들 수 있다.
@Entity
@Table(name="product")
@Getter
@Setter
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long Id;
@Column(nullable = false)
private String name;
@Column(nullable = false)
private Integer price;
@Column(nullable = false)
private Integer stock;
private LocalDateTime createAt;
private LocalDateTime updateAt;
}
3. 리포지토리 인터페이스 설계
Spring Data JPA는 JpaRepository 기반으로 더욱 쉽게 DB에 사용하는 아키텍처를 제공한다.
JpaRepository 상속하는 인터페이스를 생성하면 기존의 다양한 메서드를 상속해서 사용 가능
리포지토리의 인터페이스를 먼저 생성해보자
상품에 대한 엔티티를 만들었고 이 엔티티가 DB에 접근하도록 리포지토리를 만들어보자
public interface ProductRepository extends JpaRepository<Product,Long> {
}
이처럼 상속받은 상태로 인터페이스를 정의해준다.
실제로 JpaRepository에 정의된 메서드를 확인해보면 기본적으로 CRUD에 대한 기능이 정의되어있다.
그렇기 때문에 상속한 리포지토리에서도 이 기능을 모두 사용할 수 있는 것이다.
◼ 리포지토리 메서드 생성 규칙
리포지토리의 메서드는 막 생성하는게 아니라 명명 규칙을 따라서 새로운 메서드도 생성가능하다.
일반적으로 Read에 대한 메서드만 새롭게 만들어서 사용한다.
JPA는 기본적으로 단일 조회를 하거나 전체 조회를 하기에 새로운 조건에 따른 조회 메서드가 필요한 경우 만들어야 한다.
기본적으로 카멜케이스로 작성해야 JPA가 인식이 가능하기 때문에 이를 준수해야하며 다음과 같은 조건이 가능하다.
- FindBy : where 절을 수행하는 구문 , findBy 뒤에 엔티티의 필드값을 입력해서 사용 (findByName(String name))
- AND,OR : 조건을 여러개 설정하는 방법(findByNameOrEmail)
- Like,NotLike : like와 비슷한 역할로 특정 문자열을 포함 비포함을 하는 쿼리
- StartWith/StartingWith : 특정 키워드로 시작하는 문자열 조건
- EndWith/EndingWith : 특정 키워드로 끝나는 문자열
- IsNull/IsNotNull : 레코드 값이 Null이거나 아니거나
- True/False : 타입이 Boolean인 레코드
- Before/After : 시간을 기준으로 값 검색
- LessThan/GreaterThan : 특정 값을 기준으로 대소 비교를 할때 사용
- Between : 두 값 사이의 데이터 조회
- OrderBy : 값 정렬
- countBy : count 와 동일한 효과 결과값의 갯수를 반환
다음 시간에는 DAO를 설계하고 DAO 및 서비스, 컨트롤러를 어떻게 구성해야하는지 한번 알아보자
'JPA' 카테고리의 다른 글
[JPA] 엔티티 클래스와 요청/응답 클래스 (0) | 2024.05.23 |
---|---|
[JPA기초]JPA란❔ (0) | 2024.04.27 |