이번시간에는 실습을 통해서 JPA를 어떤 방식으로 사용하면 되는가에 대해서 알아보겠습니다.
JPA에서는 이 2가지 요건만 생각하면 됩니다.
- jpa를 통해서 관리하게 되는 객체를 위한 엔티티 클래스
- 엔티티 객체들을 처리하는 기능을 가진 repository
이중에서 repository는 JPA에서 제공하는 인터페이스로 설계하는데 스프링 내부에서 자동으로 객체를 생성하고 실행하는 구조라 개발자 입장에서는 단순히 인터페이스를 하나 정의하는 작업만으로 충분합니다.
3-1. 엔티티 클래스 작성
예제 프로젝트에
'member' 패키지를 추가하고, Member라는 클래스를 만듭니다
package com.jojoldu.webservice.domain.member;
import javax.persistence.*;
@Entity
@Table(name="MEMBER")
public class Member {
@Id
@Column( name= "ID" )
private Long id;
@Column(name = "NAME")
private String username;
private Integer age;
}
지난 시간에 배운 Annotation 복습해봅시다.
- Entity : JPA를 쓰겠다는 뜻, Entity 클래스라는 뜻, 자동 테이블 생성, 자동 컬럼 생성
- Table : 말 그대로 데이터베이스 상 어떠한 테이블을 생성할 것인지의 정보를 담는 어노테이션 테이블 이름뿐만아니라 인덱스 등을 생성하는것도 가능
- Id : PK를 뜻함 (필수 조건임)
- Generated Value : 사용자가 입력하는 값을 PK로 사용하는것이 아니라 자동 생성 되는 번호를 사용하기 위해 쓰는 전략 즉 Autoincrement 같이 (키생성전략)
# 키생성 전략
1. Auto ( default ) - JPA 구현체가 생성방식을 결정
2. identity - 사용하는 데이터베이스에 맞게 키 생성 (mysql, mariadb- auto increment)
3. sequence - 데이터베이스의 시퀀스를 이용해서 키를 생성
4. Table - 키생성 전용 테이블을 생성해서 키 생성 ( oracle은 이 방식임)
# h2 console 접속 http://localhost:8080/h2-console # url jdbc:h2:mem:testdb |
3-2. Entity 클래스의 자동 Table , Column 생성 기능 확인
지난시간에 말한듯이 , h2 콘솔로 접속하여 JPA에서 만들어준 table과 column을 확인하겠다.
오케이 확인 그럼 더 진행해보자
3-3. Column에 대해 좀더 자세히 알아보자
만일 추가적인 (필드,컬럼) 가 필요한 경우 마찬가지로 어노테이션을 더 활용합니다.
기본적으로 nullable, name , length 같은 필요한 정보들을 제공할수 있고, 속성중에 columnDefinition을 이용하면
기본값도 지정할수 있습니다.
아까 Member 클래스를 다시 조금 수정해봅니다.
package com.jojoldu.webservice.domain.member;
import lombok.*;
import javax.persistence.*;
@Entity
@Table(name="MEMBER")
@ToString
@Getter
@Builder
@AllArgsConstructor
@NoArgsConstructor
class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column( name= "ID" )
private Long id;
@Column(name = "NAME")
private String username;
@Column(length = 200,nullable = false)
private Long meberDesc;
private Integer age;
}
@Column의 특성
1. length
2. nullable
3. columnDefiniton : 기본값을 지정할때 씁니다.
# 아래 4가지 어노테이션은 롬복 라이브러리 관련 어노테이션입니다.
@Getter
@Builder
@AllArgsConstructor
@NoArgsConstructor
- @NoArgsConstructor : 기본 생성자 자동 추가
- access = AccessLevel.PROTECTED : 기본생성자의 접근 권한을 protected로 제한
- 생성자로 protected Posts() {}와 같은 효과
- Entity 클래스를 프로젝트 코드상에서 기본생성자로 생성하는 것은 막되, JPA에서 Entity 클래스를 생성하는것은 허용하기 위해 추가
- @Getter : 클래스내 모든 필드의 Getter 메소드를 자동생성
- @Builder : 해당 클래스의 빌더패턴 클래스를 생성
- 생성자 상단에 선언시 생성자에 포함된 필드만 빌더에 포함
이 부분은 다음 포스팅에서 Builder에 역할에 대해서 조금 자세히 다룰필요가 있어보입니다.
그 이유는 저뿐만 아니라 여러 개발자들이 생성자에 대해 조금 생소 하게 느낄수 있기 때문입니다.
우선 참고자료를 첨부드립니다.
해당 블로그는 생성자에 대해서 잘 설명한 포스팅입니다.
https://magpienote.tistory.com/26
해당 블로그는 빌더 패턴에 대해서 잘 설명한 포스팅입니다.
# 별첨
@ Transient 컬럼 : 데이터베이스 테이블에 생성되지 않게하고 싶은 필드의 경우
'개발스터디 > 스프링부트 JPA 스터디 (21년)' 카테고리의 다른 글
[JPA] 5. JPA Repository 인터페이스 (0) | 2021.07.09 |
---|---|
[JPA] 4. JPA와 DB의 동작 관계 (0) | 2021.07.01 |
[JPA] 2. 객체 매핑이란? (0) | 2021.06.29 |
[JPA] 1. JPA란 어떤것인가? (0) | 2021.06.27 |
[4주차] 진행사항 (0) | 2021.01.17 |