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