참고로 findAllById 같은 경우에는
id는 pk라서 색인이 되있어서 성능상 문제가 없지만
findAllByPost, findAllByUser 같은 경우에는 인덱싱이 걸려있지 않아서 인덱스를 걸어줘야한다.
인덱싱을 걸지 않으면 일일이 테이블을 스캔하면서 post나 user를 찾아야하는데
인덱싱을 걸면 인덱스 한것만 찾으면 된다.
다음과 같이 인덱싱을 한다.
@Entity
@Table(name = "\"comment\"", indexes = {
@Index(name = "post_id_idx", columnList = "post_id")
// name : 인덱스 이름, columnList : 인덱스를 어떤 컬럼에 걸건지
})
@Getter
@Setter
@SQLDelete(sql = "UPDATE \"comment\" SET deleted_at = NOW() where id =?") // delete 쿼리가 날라왔을 때 delete된 시간을 처리해줌
@Where(clause = "deleted_at is NULL") // deleted_At이 NULL 인것만 가져온다.
public class CommentEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@ManyToOne
@JoinColumn(name = "user_id")// 외래키가 있는 주인쪽에서 상대방한테 JoinColumn을 건다.
private UserEntity user;
@ManyToOne
@JoinColumn(name = "post_id")// 외래키가 있는 주인쪽에서 상대방한테 JoinColumn을 건다.
private PostEntity post;
@Column(name = "comment")
private String comment;
@Column(name = "registered_at")
private Timestamp registeredAt;
@Column(name = "updated_at")
private Timestamp updatedAt;
@Column(name = "deleted_at")
private Timestamp deletedAt;
// 매번 엔티티를 만들어 줄때마다 업데이트하고 귀찮으니까 어노테이션으로 자동으로 넣을 수 있도록한다.
@PrePersist
void registeredAt() {
this.registeredAt = Timestamp.from(Instant.now());
}
@PreUpdate
void updateAt() {
this.updatedAt = Timestamp.from(Instant.now());
}
}
인덱스를 적용하는 이유는 db테이블의 검색 속도를 향상 시키기 위해 사용한다.
만약 인덱스를 적용하지 않는다면 테이블의 모든 데이터를 다 찾아야 하는데 인덱스를 적용하면 테이블에 있는 모든 데이터를 일일이 다 찾아보지 않고 index가 있는 곳만 찾으면 시간이 단축된다는 장점이 있다.
즉, 검색하는 속도와 성능이 향상된다.
하지만 단점으로는 인덱스를 정렬된 상태로 유지해야하기 때문에 인덱스가 적용된 컬럼에 삽입,삭제,수정 작업을 수행하면 추가 작업을 해줘야한다.
즉, 인덱스의 수정이 추가적으로 필요하기 때문에 데이터의 수정이 빈번한 경우 성능이 낮아질 수 있다.
또한 인덱스를 제거하는 것이 아니라 사용하지 않는 상태로 남겨두기 때문에 수정 작업이 많은 경우 실제 데이터에 비해 인덱스가 과도하게 커질 수 있다.
즉, 인덱스를 관리하기 위한 추가 저장공간이 필요하게 된다.
'개발일지 > JPA' 카테고리의 다른 글
JPA 사용 시 쿼리 방식 선택 권장 순서(컬렉션 조회 할 때) (0) | 2022.08.14 |
---|---|
JPA 사용 시 쿼리 방식 선택 권장 순서(컬렉션 조회 안할 때) (0) | 2022.08.03 |
@JsonIgnore 사용과 지연로딩 에러 (0) | 2022.08.01 |
다양한 연관관계 매핑 (0) | 2022.07.07 |
JPA에서 엔티티 설계 시 주의 사항 (0) | 2022.04.27 |