Spring
[JPA] JPQL, QueryDsl, Spring Data의 exists
queryDsl의 exists 이슈에 대해서 알게된 계기가 있었는데, 바로 [우아콘2020] 수십억건에서 QUERYDSL 사용하기 이다. @Override public boolean exists(Predicate predicate) { return createQuery(predicate).fetchCount() > 0; } 기존 queryDsl에서 exists 함수를 사용하게 되면 내부적으로 count 함수, 정확히는 fetchCount 함수를 실행하여 반환하게 된다는 이야기이다. fetchCount는 exists query를 발생시키지 않고 count query를 발생시킨다. exists는 첫번째 결과 값을 만나면 반환하는 반면 count 함수는 전체 결과 값을 조회해야 하기 때문에 성능 이슈가 발생하..
[Spring] Log4j2를 이용해 로깅해보자
시스템이 실행되면서 필연적으로 에러가 발생하게 되는데, 시스템이 동작하는 과정을 하루종일 모니터링하고 있을 순 없다. 그렇기 때문에 로깅을 통해 시스템의 상태와 정보를 기록해두어야 한다. 너무 세세한 정보를 기록하면 방대한 양의 로그가 쌓여 원하는 정보를 얻기 힘들기 때문에 적절한 포맷과 정보를 로깅하는 것이 중요하다. Log4j? Logback? Log4j2? Spring에 로깅 구현체를 검색하다보면 해당 3가지의 구현체가 가장 많이 나온다. Log4j는 2015년에 지원이 중단된 오래된 프레임워크이고, Logback은 Spring의 spring-boot-starter-logging에서 지원해주는 디폴트 구현체이다. Logback 이후 Log4j2가 나오게 되었는데, 다른 로깅 프레임워크보다 많은 처리..
[JPA] Spring Jpa Repository의 영속성 컨텍스트 동작방식
개발을 하다보면 Root 도메인에 종속적인 Sub 도메인을 어떻게 처리할지 고민이 될 때가 있다. 예를 들면, 재생 목록의 음악들은 재생 목록이라는 Root 도메인에 종속적인 Sub 도메인 들이다. Delete And Insert 방식을 실행할 수도 있고, Update 방식을 사용할 수도 있다. 그러다보니 JPA를 사용했을때, 각 개발 방식이 어떻게 동작하는지 알고 싶어서 직접 엔티티를 생성하며 테스트 코드를 작성해 보았다. 코드는 모두 깃허브에 작성해두었다. private SimpleEntity create(String name) { SimpleEntity entity = SimpleEntity.builder() .name(name) .build(); return repository.save(entit..