Weekly I Learned/2023's(1. ~ 12.) WIL

2023년 11월 3주차(11/20 ~ 11/24) Weekly I Learned "내실을 다져야 할 때! ✍"

ikjo 2023. 11. 25. 03:56

지난 한 주 되돌아보기

11월 3주차는 오랜만에 큰 무리 없이 보낼 수 있었던 한 주였다. 아울러, 11월 2주차에 개발 작업을 마무리한 부분이 QA 도 통과되서 production 으로 배포까지 마무리도 되었다. 앞으로는 다음 작업 사이클을 대비하여 Spring, Database 등 내실을 다지고자 한다. 💪

 

JPA 의 N + 1 에 대해 놓치고 있었던 부분을 잡다!

동기로부터 JPA 의 N + 1 이슈에 대한 질문을 받았는데, 그 질문에 대해 답을 하면서 그동안 제대로 인지하지 못하고 있었던 부분에 대해 바로 잡을 수 있었다. ⭐

 

1 : N 관계에서 1 을 driving table 로 하여 fetch join 없이 단건 조회(findById)했을 때 1 에 연관된 N 의 엔티티들은 하이버네이트가 생성한 프록시 객체가 주입되는데, 이때 lazy initial 을 하게 된다면 쿼리가 몇 번 나가는지에 대한 질문이었다. 결론적으로는 처음에 1 을 조회했을 때 쿼리가 한 번 나가고 N 에 해당하는 엔티티의 데이터에 접근하는 순간, 하나의 쿼리로서 N 을 driving table 로 하여 1 의 식별자로 해당되는 N 엔티티들을 조회하게 된다. 즉, 2개의 쿼리가 나가는 것이다.

 

하지만, 처음 질문을 받았을 때는 N + 1 이닌까, N 개의 엔티티를 건건이 조회하여 N 개의 쿼리가 나가는 것으로 착각하고 있었다. 👀 하지만 실제 N + 1 의 의미는 1 전체를 조회(findAll)하는 쿼리 1개가 나가고 이 쿼리로 조회된 엔티티의 개수가 N 일 경우 각각에 연관된 엔티티들을 조회하기 위해 N 개의 쿼리가 나가는 것이었다.

 

Kafka 에 대한 관심과 학습 ✍

11월 3주차에 배정받은 업무를 처리하면서, Kafka 와 연동하는 부분이 있었는데, 개인적으로 Kafka 를 활용하여 프로젝트를 해보거나 따로 깊게 학습했었던 적이 없었기에, 이번 기회에 Kafka 의 동작 원리 등에 대해 관심이 갔고 이론적으로 학습하는 시간들을 가졌다. 아울러, grpc 와 kafka 의 차이에 대해서도 알아보았다. 🛒

 

현재 서비스 상에서는 이미 Kafka Cluster 가 구축되어있고, Spring boot 프로젝트에서도 Kafka 관련 기본 설정들(Producer, Consumer)이 setting 되있었던 터라 내가 추가적으로 Kafka 와 관련해서 개발해야 할 것은 당장에는 없었지만, Kafka 기반의 개발과 서비스 운영을 하면서 Kafka 에 대해 어느정도 이해도를 갖추어야 할 필요성을 느껴 충분한 학습을 하고자 한다. 🍺

 

Spring 설정 파일 profile 에 대해 제대로 이해해보았다!

작업을 수행하면서 Spring 의 설정 파일과 관련해서 제대로 이해하지 못하고 있다는 것을 느껴, Spring 의 설정 파일(application.yml) 사용 시 막연하게 사용하고 있었던 profile 에 대해 제대로 알아보는 시간을 가지기도 했다. 그동안 spring.profiles.active, spring.profiles.include, spring.config.activate.on-profile, spring.profiles.group 각각의 profile 설정과 관련해서 명확하게 이해하지 못한채 사용하고 있었는데, 이번 기회에 각각에 대한 차이에 대해 꼼꼼하게 학습해보았다.

 

그동안 놓치고 있었던 Spring Validator 동작 케이스

String json 데이터를 객체로 파싱하는 과정에서 Spring 에서 제공하는 Validator 기능을 활용할 수 있는데, 하나 놓치고 있었던 부분이 object inside object 인 상황이었다. 나의 경우 하위 object 에서 검증할 필드에만 Validator 관련 애노테이션(@Length 등)을 붙여줬었는데, 상위 object 의 하위 object 필드에 @Valid 애노테이션도 붙여줘야 했던 것이다. 😅 팀원들의 코드를 리뷰할 때에도 종종 관련 검증을 위한 애노테이션이 하나씩 누락된 것들을 볼 수 있었는데, 개인적으로 나중에 시간 될 때 케이스별로 Spring Validator 동작을 위한 애노테이션 설정 방법들을 정리해보고자 한다. ✍

 

(백준 1일 1커밋 운동은 계속되고 있다..👋)