메서드 Save Save 메서드를 사용하면 엔티티를 DB에 저장할 수 있습니다. Save 메서드를 사용할 때 flush 또는 commit 메서드에 대한 명시적인 호출이 이루어지기 전까지는 저장 작업과 관련된 데이터가 DB에 반영되지 않습니다. Flush Flush는 영속성 컨텍스트에 존재하는 엔티티의 변경 내용을 DB에 반영하는 것을 말합니다. Transaction commit 이 일어날 때, flush 가 동작하고 이때 쓰기 지연 저장소에 쌓아 놨던 insert, update, delete 쿼리들이 실행됩니다. SaveAndFlush Save 메서드와 다르게 실행 중(트랜잭션)에 즉시 데이터를 flush 합니다. 쓰기 쿼리의 호출 시점 차이 Save @Transactional public void sa..
save 메서드 동작 원리 save 메서드는 DB에 존재하는 엔티티라면 persist 메서드를 호출하고, 존재하지 않는 데이터라면 merge 메서드를 호출합니다. public S save(S entity) { Assert.notNull(entity, "Entity must not be null."); if (entityInformation.isNew(entity)) { em.persist(entity); return entity; } else { return em.merge(entity); } } org.springframework.data.jpa.repository.support.SimpleJpaRepository isNew 메서드는 save 메서드를 호출하시는 시점에 엔티티의 ID 값의 null 여부..
RequestBody의 값을 검증하기 위해서 @Valid를 사용합니다. 대부분의 예시를 보면, Validator 를 커스텀해서 어노테이션 형태로 사용합니다. 저는 ChannelTypeValidator 를 만들어서 사용했습니다. APP, PC, MOBILE 등 다양한 채널로 유저가 유입될 수 있습니다. 세가지의 채널을 모두 검사할 수도 있지만, 1~2 종류의 채널만 허용할 수도 있습니다. 그런 상황일 때 Validator 를 추가로 생성하지 않고 구현 클래스 안에서 분기 처리를 하도록 커스텀했습니다. 예시 Validator Interface @Retention(RetentionPolicy.RUNTIME) @Constraint(validatedBy = ChannelTypeValidator.class) pub..
용어 정리 옵티마이저 옵티마이저는 통계 정보를 기반으로 여러 방법의 비용을 계산합니다. 그 중 가장 비용이 적은 최적의 처리 방식을 최종적으로 선택합니다. 실행 계획 옵티마이저가 쿼리를 어떻게 처리할 것인지 계산해낸 결과입니다. 쿼리 앞에 EXPLAIN, EXMPLAIN ANALYZE 을 붙이면 확인할 수 있습니다. explain select * from product_info order by sale_cnt desc; explain analyze select * from product_info order by sale_cnt desc; 실행 계획을 확인하는 이유 우리의 의도대로 MySQL이 동작하는지 점검한다. 성능 병목이 있는 부분을 해소한다.(인덱스, 쿼리, 시스템 변수 튜닝 등) Type 종류 c..