# 서론 JPA와 MySQL 디비를 사용하면서 궁금했던 hibernate_sequence 테이블에 대하여 정리한다. # hibernate_sequence 의 정체 이 테이블의 정체는 칼럼값으로 예측 가능하듯, 디비의 PK를 생성해주는 테이블이다. 엔티티 제작시 @GenerateValue를 그냥 아무 값을 넣지 않으면, 생성 전략이 AUTO 로 설정된다. 이러면 hibernate_sequence 테이블이 생기고, 여기서 값을 하나씩 읽어가면서 PK를 생성한다. MySQL은 디비 내부적으로 auto increment를 지원하므로, 순서 기록용 테이블을 사용할 필요가 없다. @GenerateValue 전략을 IDENTITY로 설정하면 된다. 이렇게 하면 전역적으로 통용되던 PK 순서도 테이블 독립적으로 변경된..
# 테이블 별 PK (ID) 설정 시 주의점 ID는 테이블 별로 독립적으로 생성하는게 좋다 -> 서비스가 커질수록 공통으로 ID 값을 쓰면 관리하기 어렵기 때문이다. 비슷한 의미에서 ID 값은 Int 보다는 Long을 사용한다 -> Int 최대값 : 21억, Long 최대값 : 경단위. 나중에 서비스가 커지면 21억의 숫자는 나름 금방 채워지고, 이때 Int -> Long 마이그레이션 비용이 많이 발생한다. (실무팁) # 외래키의 주인은 '다' 쪽에서 관리한다 # @ManyToMany 다대다 JPA에서 다대다 옵션을 제공하긴 하지만, 실무에서는 사용하면 안 된다. 암묵적으로 테이블을 만들어줘서 관리하기 힘들기 때문이다. # 다대다 구현 일대다 + 다대일 관계로 풀어서 테이블을 설계한다. 암묵적 테이블을 ..
JPA Auditing 으로 생성일과 수정일을 삽입하는 용도의 super class인 BaseTimeEntity를 코틀린으로 작성하는 방법을 공유한다. 메인 어플리케이션 파일에 @EnableJpaAuditing 을 꼭 넣어줘야 한다. # 어노테이션 기반 @MappedSuperclass @EntityListeners(AuditingEntityListener::class) abstract class BaseTimeEntity1 { @CreatedDate lateinit var createTime: LocalDateTime @LastModifiedDate lateinit var updateTime: LocalDateTime } 이렇게하면 날짜 포맷팅을 지정할 순 없으나, 어노테이션으로 손 쉽게 구현이 가능하다..
# 서론 게시글이나 댓글 CRUD를 구성할때, 생성일과 수정일을 포함하고 싶은 경우가 있다. 이럴때 그냥 LocalDateTime을 엔티티 멤버변수로 넣어놔도 되지만 이러면 디비에 들어가는 양식이 이쁘지가 않다. (즉 포맷을 커스터마이징 하고 싶다.) 이를 편리하게 해주는게 하이버네이트에서 제공하는 EntityListener라는 기능을 알아보자 # EntityListener란? 하이버네이트가 DB에 어떤 행위를 하는 시점이나 그 이후 등 호출될 수 있는 콜백함수를 제공해주는 어노테이션이다. 즉, DB에 엔티티를 저장하기 전에 특정 행위를 할 수 있게 해준다. (MVC의 인터셉터와 비슷하다고 보면 된다.) 제공되는 콜백 옵션은 다음과 같다. @PrePersist manager persist 의해 처음 호출..
# Proxy는 왜 필요할까? Member를 조회할때 Team도 같이 조회해야할까? Team이 필요할때만 그때 되서 조회하면 된다 (지연로딩을 구현하기 위함) # Proxy 기초 em.find() vs em.getReference() em.find() : 데이터베이스를 통해서 실제 엔티티 객체 조회 em.getReference() : 데이터베이스 조회를 미루는 가짜(프록시) 엔티티 객체 조회 # Proxy 특징 실제 클래스를 상속 받아서 만들어짐 (실제 클래스와 모양이 같다) 사용자 입장에서는 진짜 객체인지 프록시 객체인지 구분하지 않고 사용하면 됨 (이론상) 프록시 객체는 실제 객체의 참조(target)를 보관 프록시 객체를 호출하면 프록시 객체는 실제 객체의 메소드를 호출함 프록시 객체는 처음 사용할..