SpringBoot
테스트 코드를 위해 실제 코드에 영향이 가도 될까??
테스트 코드를 위해 실제 코드에 영향이 가도 될까??
2022.12.26개발을 하며, "테스트 코드를 위해 프로덕션 코드에 영향을 줘도 될까?"라는 고민이 테스트 코드를 작성하다 보니 생겼습니다. 고민해본 예시는 다음과 같습니다. Querydsl을 사용하며 Projection을 사용할 때 Setter를 만들지 않고, field 주입을 이용해 객체를 생성할 수 있습니다. 팀 내에서 field 주입만 사용하고 있기에 Getter만 생성해서 사용했습니다. 문제는 테스트 코드를 작성하며, 모든 값을 채우는 All 생성자나 Setter가 없기에 객체를 생성한 후 Reflection을 이용해서 값을 채워야 했습니다. 결국 Builder나 All 생성자가 없어 Service 계층의 테스트 코드는 Reflection이 덕지덕지 붙고 말았습니다.. 어떤 상황이 있는지 알아봤고, 본론으로 테..
Spring Boot JPA 1차 캐시 정리
Spring Boot JPA 1차 캐시 정리
2022.12.21개요 우리는 JPA를 사용하며, 어떠한 이점을 누릴 수 있는지에 대한 질문을 받는다면, 1차 캐시를 빼고 말하기 어렵습니다. "1차 캐시가 어떻게 동작하는데??"라고 질문받는다면, "영속성 콘텍스트에 보관되고, 사용하면 돼!"라고만 답하는 사람이 있을 겁니다.. (저 역시도 얼마 전까지는..) 하지만 일을 하다 보니 느끼는 것이 어떻게 사용하는 것이 아닌 왜 사용하고, 어떻게 적용 돼 사이드 이펙트가 있을 것인지에 대해서 집중하게 됐습니다. 그래서 1차 캐시가 어떻게 동작하는지에 대해서 알아보겠습니다. (1차 캐시를 날리는 @Modfiying clearAutomatically를 사용하며, 부족함을 느끼게 돼 정리하게 됐습니다.) 1차 캐시란? 우선 동작을 알아보기 전에 1차 캐시가 무엇인지 알아보겠습니다..
Springboot JPA Querydsl 동적 정렬 OrderSpecifier
Springboot JPA Querydsl 동적 정렬 OrderSpecifier
2022.12.06SQL 동적 정렬이란? 하나의 API에서 정렬 조건을 동적으로 변경해, 정렬 혹은 정렬 + 페이징을 진행하는 것을 의미합니다. 예시를 보며, 필요한 상황이 언제이며, 어떻게 해결하는지 알아가 보겠습니다. 어떤 경우에 필요할까? 우리는 Querydsl만을 통해서가 아닌 Springboot Data JPA를 통해서도 쉽게, 페이징과 정렬을 할 수 있습니다. 하지만 문제 되는 경우는 같은 API 호출임에도 불구하고, 내림 차순 or 오름 차순과 같이 동적으로 정렬이 바뀌는 경우가 존재합니다. 물론 API를 2개 만들어 호출하면 문제없습니다. 하지만 리소스, 동작이 동일한데 API를 분리하는 것은 복잡성을 증가시킬 뿐입니다. 2가지의 방법으로 해결할 수 있습니다. 테스트 셋팅 Person이라는 Entity가 존..
Spring JPA @OneToOne N+1 문제 (Fetch = Lazy)
Spring JPA @OneToOne N+1 문제 (Fetch = Lazy)
2022.11.29N+1 문제란? 어떠한 값을 얻기 위해 JPA를 이용하여 1개의 쿼리를 사용하는 것을 의도했지만, 개발자의 의도와는 다르게 N개의 쿼리가 더발생하는 문제입니다. JPA를 공부한 적이 있는 사람이라면, @xxxToOne(fetch = FetchType.EAGER)로 설정돼 있는 것들을 @xxxToOne(fetch = FetchType.LAZY)로 설정하면 된다는 것을 들어보셨을 수도 있습니다. 저 역시도 이렇게 알고 있었지만, 프로젝트를 진행하며 겪은 N+1 문제를 살펴보겠습니다. 테이블 Parent와 Child가 1:1 관계를 가졌을 때 문제가 발생하므로 해당 케이스만 살펴보겠습니다. 여기서 연관관계의 주인은 Child로 설정하겠습니다. Parent @Entity @NoArgsConstructor(acc..
Springboot 모니터링 사용기[2] Prometheus, Grafana
Springboot 모니터링 사용기[2] Prometheus, Grafana
2022.06.14이전에 했던 Actuator만 가지고는 효율적인 모니터링을 진행할 수 없습니다. 그래서 Prometheus와 Grafana를 이용해서 모니터링을 해보겠습니다. 1. Prometheus란? 이벤트 모니터링 및 경고 용도로 사용하는 무료 소프트웨어 응용 프로그램입니다. PromQL이라는 유연한 쿼리와 실시간 경고가 가능합니다. 메트릭 이름 및 Key/Value 형태로 식별되는 시계열 데이터가 있는 다차원 모델입니다. 이것을 PromQL을 이용해서 분석이 가능합니다. 다양한 그래프와 대시보드 기능을 지원합니다. (그라파나 사용 예정) 저희는 Springboot Application의 메트릭 정보를 수집하여, 시각화를 진행할 예정입니다. 그렇기 위해선 Prometheus를 설치해야 합니다. 하지만 Docker를..
Springboot 모니터링 사용기[1] actuator
Springboot 모니터링 사용기[1] actuator
2022.06.121. Actuator란? 애플리케이션이 잘 동작하는지, 혹은 지금 상태가 어떤지 확인할 수 있고, 로그 레벨 같은 간단한 정보도 수정할 수 있는 기능을 제공합니다. 사용은 HTTP와 JMX을 활용해서 애플리케이션 외부에서 확인할 수 있습니다. 1-1. 디펜더시 추가 actuator를 사용하기 위해선 actuator 디펜던시를 추가해줘야 합니다. implementation 'org.springframework.boot:spring-boot-starter-actuator' 2. 엔드포인트 저희는 HTTP를 활용해서 접근할 예정입니다. 그렇다면 엔드포인트 즉 모니터링이나 수정을 할 수 있도록 애플리케이션과 연결해주는 연결지점입니다. 기본으로 제공되는 것들도 있고, 사용자가 직접 추가할 수도 있습니다. 기본 제..