스프링 unique key 관리 방식

안유태·2023년 8월 7일
0

일일 방문자를 구해 db에 저장하는 로직을 구현하고 있던 중 궁금점이 생겨 구글링을 해보니 좋은 글이 있어 개인적으로 정리를 해보았다.
참고 - https://jaehoney.tistory.com/278

아래는 일일 방문자를 저장하는 간단한 엔티티이다.
unique key는 ip + create_at 으로 지정해주었다.

@Builder
@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Visitor {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long Id;
    private String ip;
    private String userAgent;
    private LocalDate create_at;

}

여기서 unique key 처리 방식은 두가지가 있다.

  • jpa existByIdAndCreateAt을 통해 존재 확인
  • db에서 unique key를 지정해주고 save 시 exception을 핸들링

첫번째 방식은 save 이전에 한번의 쿼리가 추가로 사용된다는 점과 동시성 문제가 발생할 수 있다는 단점이 존재한다.
두번째 방식은 exception 핸들링 과정에서 이 exception이 unique key로 인해 발생한 것인지 정확히 알 수 없다는 점이다. 이를 알기 위해 에러 메시지를 그대로 출력하게 되면 db 구조가 노출이 된다는 단점이 존재한다.


결론

결론은 첫번째 방식을 권장한다고 한다.
추가적인 쿼리가 발생한다고 하더라도 첫번째 방식의 경우 성능에 영향을 거의 미치지 않는다고 한다. 또한 대부분의 경우 조회가 많지 저장의 호출은 조회에 비해 매우 적기때문에 성능은 크게 고려하지 않아도 된다고 한다.

profile
반가워요

0개의 댓글