내가 작업하는 개발물에 대해 시니어 개발자 분이 리뷰를 달아주셨다. 너무나도 감사하다.
다음과 같은 사항이었다. 나도 피드백을 받은 즉시 공부해서 벨로그에 업로드 하여서 내용이 남아있지만 한번에 한번 더 정리하고 싶어서 로그를 남긴다.
변수를 굳이 만들지 않고 if 절을 사용해 한번에 return 하기
ResponseEntity로 굳이 감쌀 필요가 없는 것에는 감싸지 않기. 그냥 List 를 반환해도 ResponseEntity로 감싼것과 같은 효과가 난다.
(가장 복병이었던.. ) getAll을 할때 나중에 데이터가 많아지면 응답 데이터가 엄청 커질 것 같으니 최대 제한 수를 정해놓는게 좋은 것
내가 짠 쿼리는 다음과 같다.
@Query(value = "SELECT * FROM lesson l WHERE l.category = ?1 AND l.id <> ?2 ORDER BY RAND() LIMIT 3", nativeQuery = true)
이렇게 쿼리를 짠다면, 일단 다 불러 온 다음에, 조건에 맞게 선별을 한 후, 랜덤으로 정렬을 한 다음에 그 중에 3개를 가져온다.
그렇게 되면 불필요하게 다 불러오고 정렬을 하게 되는 정말 효율적이지 않은 쿼리가 된다.
무작위로 3개를 뽑아오는 코드라면 DB에서 무작위 함수를 돌려 뽑게되면 인덱스를 타지 않아 scope이 많아질 수록 성능 이슈가 있으니 충분히 scope를 조절할 수 있는 게 아니라면 무작위 지정은 서버에서 하는 것이 좋아보입니다. 라는 피드백을 즉각 수용하여 무작위 지정을 서버에서 하도록 구현하였다.
Enum 과 String 사이에 Converter가 필요한 순간이 있다고 하셔서 피드백을 받은 즉시 구현을 하였다.
( 근데 내 로직에서는 컨버터가 필요없어서,, 그래도 좋은 경험이었다)
이건 어제 따끈따끈하게 받은 피드백!! 아직 벨로그에 정리하지 않았다.
ddl-auto: validate
으로 설정하는게 크리티컬하지 않다.
나는 전에 create으로 하였다가 배포 직전에 DB를 날려버린.. ㅜㅜㅜ 정말 끔찍한 기억이 있기 때문에 update으로 설정하고 작업을 진행하곤하였다.
근데 그렇게 되면 타입이 바뀌고 User을 건들일 수 있다고 하셨다.
그래서 운영단계에서는 무조건 validate을 쓰는게 좋다고 하셨다.
DB조작은 직접 DB 들어가서 하는 것이고, 서버에서는 읽기 모드처럼만 사용하는게 가능하고 이게 좋다고 하셨다.
Page를 쓰는 것에 대해
nativeQuery 에 대해
ORM에 대해
커서기반페이지네이션 -> 쿼리 날릴때 필터링 할 수 있다
페이지네이션 : offset vs cursor-based-pagenation
PageRequest 에 대해
나도 언젠간 성현님 같은 멋진 시니어 개발자로 성장하길!