본문 바로가기

개발스터디/스프링부트 JPA 스터디 (21년)

[JPA] 3. 엔티티 클래스와 어노테이션

이번시간에는 실습을 통해서 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 복습해봅시다.

 

  1. Entity : JPA를 쓰겠다는 뜻, Entity 클래스라는 뜻, 자동 테이블 생성, 자동 컬럼 생성
  2. Table : 말 그대로 데이터베이스 상 어떠한 테이블을 생성할 것인지의 정보를 담는 어노테이션 테이블 이름뿐만아니라 인덱스 등을 생성하는것도 가능
  3. Id : PK를 뜻함 (필수 조건임) 
  4. 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

 

해당 블로그는 빌더 패턴에 대해서 잘 설명한 포스팅입니다.

 

https://using.tistory.com/71

 

[Effective Java] 생성자의 매개변수가 많을 때는 빌더(builder)를 고려하자

이번에 정리하고자하는 내용은 챕터 2의 2항목인 "생성자의 매개변수가 많을 때는 빌더(builder)를 고려하자"이다. 블로그 작성 목적은 복습과 이 책을 다 읽고자하는 다짐으로 시작한다. 1. 생성자

using.tistory.com

 

 

 

# 별첨 

@ Transient 컬럼 : 데이터베이스 테이블에 생성되지 않게하고 싶은 필드의 경우