DB/JPA

JPA @Entity

코딩딩코 2023. 1. 6.

 

@Entity
@Builder
@Getter
@Table(name = "postMst")
public class Post {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long postCode;

    @NotNull
    @Column(name = "postContent")
    private String content;

    @Temporal(TemporalType.TIMESTAMP)
    private Date createDate;

    @Temporal(TemporalType.TIMESTAMP)
    private Date updateDate;
}

 

  1. @Table
    1. 엔티티와 매핑할 테이블을 지정합니다.
    2. 생략하면 매핑한 엔티티의 이름을 테이블 이름으로 사용합니다.
  2. @Entity
    • 테이블과 링크될 클래스임을 의미합니다.
    • JPA가 관리하는 것을 의미합니다.
    • 기본값으로 클래스의 카멜케이스 표기법이 스네이크 표기법으로 테이블 이름을 매칭합니다.
    • ex) UserManager.java -> user_manager (table)
    • 기본 생성자가 필요합니다. (JPA가 엔티티 객체 생성 시 기본 생성자를 사용합니다.)
  3. @GeneratedValue
    • PK 생성 규칙
      • Identity: MySQL, MariaDB에서의 Auto_Increament입니다.
      • Sequence: OracleDB, PostgreSQL 에서의 Auto_Increament입니다.
      • Auto (Default): DB에 따라 자동으로 선택해줍니다.
  4. @Id
    • 해당 테이블의 PK 필드를 의미합니다.
  5. @Column
    • 객체 필드를 테이블 컬럼에 매핑합니다.
    • 생략하더라도 @Entity의 모든 필드는 모두 @Column이 적용되어 있습니다.
      • name: 필드와 매핑할 테이블 컬럼 이름 (default: 객체의 필드 이름)
  6. @Temporal
    1. 날짜 타입을 매핑할 때 사용합니다.
      1. TemporalType.DATE: 날짜, DB에서 date 타입과 매핑 (2023-01-01)
      2. TemporalType.TIME: 시간, DB에서 time 타입과 매핑 (23:10:00)
      3. TemporalType.TIMESTAMP: 날짜와 시간, DB에서 timestamp 타입과 매핑 (2023-01-01 23:10:00)
  7. @Transient
    1. 해당 어노테이션이 선언된 필드는 매핑하지 않습니다.

 

 

 

JPA에서는 DB 스키마를 자동으로 생성해주는 기능을 지원해 줍니다.

애플리케이션 실행 시점에 데이터베이스 테이블을 자동으로 생성합니다.

 

hibernate.hbm2ddl.auto

create: 기존 테이블을 삭제하고 새로 생성합니다. (DROP + CREATE)

create-drop: CREATE 속성에 추가로 애플리케이션을 종료할 때 생성한 DDL을 제거합니다. (DROP + CREATE + DROP)

update: DB 테이블과 엔티티 매핑 정보를 비교해서 변경 사항만 수정합니다.

validate: DB 테이블과 엔티티 매핑정보를 비교해서 차이가 있으면 경고를 남기고 애플리케이션을 실행하지 않습니다.

DDL을 수행하지 않습니다.

none: 자동 생성 기능을 사용하지 않습니다.

 

 

 

- 개발 초기 단계는 create 또는 update

- 초기화 상태로 자동화된 테스트를 진행하는 개발자 환경과 CI서버는 create 또는 create-drop

- 테스트 서버는 update 또는 validate

- 스테이징과 운영 서버는 validate 또는 none

 

 

테스트 코드로 Post Entity 저장해 보기

@SpringBootTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
class PostServiceTest {

    @Autowired
    private PostService postService;

    @Test
    void savePostTest() {
        // given
        Post post = Post.builder()
                .content("게시글3")
                .createDate(new Date())
                .updateDate(new Date())
                .build();
        // when
        postService.savePost(post);
        
        // then

    }
}
@RequiredArgsConstructor
@Service
public class PostService {

    private PostRepository postRepository;

    @PersistenceContext
    private EntityManager entityManager;

    @Transactional
    public void savePost(Post post) {
        entityManager.persist(post);
    }
}

 

 

생성된 테이블과 저장된 값입니다.

 

 

키 값을 Long으로 사용하는 이유

int 자료형 보다 long 자료형이 표현 범위가 넓습니다.

 

Primitive 타입인 long은 기본적으로 0으로 초기화가 됩니다.

long 타입인 id가 없을 경우 0으로 초기화가 됩니다.

하지만 추후에 누군가 봤을 때 의도해서 0으로 만든 것인지 아닌지 판별하기가 어렵습니다.

반면에 Wrapper 클래스는 id가 없을 경우 null이 되기 때문에 0으로 값이 들어가 있다면 의도한 것이라고 명확하게 알 수 있기 때문에 Wrapper 클래스를 사용합니다.

 

 

 

참조

감사합니다.

 

https://data-make.tistory.com/610

 

 

'DB > JPA' 카테고리의 다른 글

JPA 즉시 로딩, 지연 로딩  (0) 2023.01.20
@PrePersist...  (0) 2023.01.14
JPA Auditing  (0) 2023.01.07
JPA DTO Mapping  (0) 2022.12.29
JPA 더티 체킹(Dirty Checking)  (0) 2022.12.25

댓글