⛅️ 들어가는 말
우아한테크코스 레벨2의 세번째 미션은 방탈출 예약 대기이다.
1~2단계는 JDBC에서 JPA로 전환하는 것이고,
3~4단계는 예약 대기 기능을 구현하는 것이었다.
JPA를 오랜만에 사용해서 그런지 구체적인 사용법이 잘 기억이 나지 않았다.
그래서 블로그나 공식문서를 계속 찾아보면서 미션을 진행했다.
현업에 가서도 어쩔 수 없을 것 같다는 생각이 든다.
⛅️ 미션에 대한 부분
JPA 관련해서 미션을 진행하면서 실제 query가 어떻게 날아가는지 자주 확인했던 것 같다. 예를 들어, findByXXX와 findByXXXId를 사용할 때 findByXXXId는 join이 걸려서 나간다는 것이다. 물론 최신 버전에서는 개선된 부분이다. 또는 join fetch를 사용하면 지연 로딩에서 한 번에 불러온다는 것들이 있다.
영속성 컨텍스트에 대해서 잘 모르기도 했고, 관심도 없었다. 하지만 query 나가는 것을 보고 어떤 것이 캐싱이 되고, 언제 commit이 되는지 확인해보니 굉장히 중요하다는 것을 느꼈다. JPA가 기본 생성해주는 deleteById나 delete 들도 실제 코드를 확인해보니 동작 방식을 알 것 같았다.
미션에서 인기 테마 조회나 이용 가능한 시간들을 조회하는 기능을 구현할 때 JPQL로 복잡하게 쿼리를 만들어서 사용했다. 하지만 서브쿼리를 사용해서 성능이 떨어지게 했다. 찾아보니까 최적화가 안된다고 한다. 또한 개발의 관점에서는 복잡한 쿼리를 읽기가 힘들어서 지양하는 것 같다. 나도 며칠 전에 작성한 코드인데 이해하느라 시가이 들었다. 재사용의 관점에서도 최소한의 가공할만한 수준의 데이터만 불러오고 애플리케이션 코드로 처리해준다고 한다.
⛅️ 미션 외 개선에 대한 부분
미션 외적으로 이전부터 하지 못했던 것들을 해보고 싶었다.
도메인이나 애플리케이션 코드에서 표준 예외를 던지고 GlobalExceptionHandler에서 그것들을 처리해줬다. 하지만 자바나 스프링에서 던지는 내가 알지 못하는 예외 메세지가 나간다는 단점이 있었다. 그래서 도메인 패키지에서 DomainException을 만들고, 그것을 상속받아 DomainNotFoundException, DomainValidationException을 만들어서 도메인에 관련된 예외를 처리해줬다.
JwtTokenProvider나 CookiAuthorizationExtractor같은 구현체나 TokenProvider, AuthorizationExtractor같은 인터페이스의 위치를 어디에 둘 지 잘 몰랐다. 그래서 서비스나 컨트롤러에 같이 두는 방식으로 사용했었다. 하지만 의존 방향이 맞지 않다는 것을 알게 되었고, 인터페이스는 서비스나 컨트롤러에 두고, 구현체를 infra 폴더에 두었다. 점점 의존 방향이 맞춰지는 것 같다.
레벨2 미션 1-3동안 테스트에 대해서 초기 데이터를 sql로 하는 것과 실제 코드로 작성하는 것의 장단점에 대해서 많은 사람들에게 물어봤었다. sql은 편하지만 최소한의 검증이 되지 않고, 테스트 실패 시 오류를 찾기가 힘들다는 단점이 있다. 하지만 아주 아주 편하다는 장점이 있다. 현업에서는 실제 코드로 테스트 초기 데이터를 사용한다고 한다. 그래서 Fixture를 잘 활용한다고 한다.
이 부분에 대해서 어떻게 바꾸면 좋을지 잘 몰라서 못해왔다.
내가 지금 생각하는 문제는 테스트를 잘 하고자 너무 많은 불필요한 크기의 데이터를 사용해온 것 같다. 그래서 테스트 데이터를 최소한으로 줄이는 방식으로 갔다. 이후에 fixture를 활용해서 알 필요 없는 부분에 대한 데이터를 처리해줬다. 이렇게 함으로써 메인의 초기 데이터를 sql에서 코드로 변경하고, 테스트에서 사용하는 sql 데이터를 fixture로 변경해줬다.
⛅️ 끝내며
질문하는 방법에 대해
요즘 드는 생각은 잘 질문하는 방법을 잘 모른다는 것이다.
레벨1을 지나면서 잘 질문하는 배웠어야 했는데 그걸 놓쳤던 것 같다.
질문을 제대로 하지 못하니까 돌아오는 답변도 내가 원하는 것 같지 않고, 의사소통에 드는 비용이 큰 것 같다. 개선에 힘을 써봐야겠다.
JPA에 개념에 대해
JPA는 편하지만 사용법을 잘 알지 못하면 오히려 별로인 것 같다는 생각이 든다.
모르는 어노테이션도 많고, 제대로 알 지 못하고 사용하는 어노테이션도 많다.
또한 영속성에 대한 개념도 계속 헷갈려서 작동만하게 사용하는 것 같다.
JPA 책이나 강의를 보고 개념을 확실히 익혀야겠다.
스키마 설계에 대해
미션을 보고 스키마를 작성하면서 나 스스로 문제가 많다는 것을 느꼈다.
작동은 하니까 문제가 없겠지만 확장에 대해서 깊게 고민하지 않는 것 같다.
리뷰어가 말하길 시스텀 설계가 우선되고 후에 데이터 설계를 한다고 한다.
추천해주신 "가상 면접 사례로 배우는 대규모 시스템 설계 기초" 책을 보고 학습해봐야겠다.
앞으로
다음은 배포에 관련된 미션이다. 인프라에 대해서 사용하지 않은지가 좀 됐는데 걱정이 된다. 갈 길이 멀다. 파이팅!