2024. 11. 19. 10:40ㆍSpring/JPA-Plus 과제
📁️ 과제 요구사항)
[레벨2]
2-6) JPA Cascade
- 할일을 새로 저장할 때 할일을 생성한 유저는 담당자로 자동 등록되도록 해야한다.
- JPA의 cascade 기능을 활용해서 구현해야한다.
2-7) N+1 문제
- CommentController 클래스의 getComments() API를 호출할 때 N+1 문제가 발생하고있음.
- user정보를 조인으로 처리하면되는데 댓글 조회시 유저테이블까지 따로 조회해서 불필요한 쿼리를 조회하는 것을 말함.
- 위 캡쳐본처럼 테이블 조회를 하지 않도록 처리하기.
2-8) QueryDSL
- JPQL로 작성된 findByIdWithUser를 QueryDSL로 변경해야한다.
- N+1문제가 발생하지 않도록 주의!
2-9) Spring Security
- 기존 Filter와 Argument Resolver을 사용하던 코드들을 Spring Security로 변경
🛠️ 과제 해결 및 코드)
2-6) JPA Cascade
- CascadeType.PERSIST 기능을 사용해 담당자 자동등록 완료
- 할일 6,7번을 등록할때 1번 회원이 담당자로 등록된 것을 확인할 수 있다.
2-7) N+1 문제
- 주석에서 설명한대로 entity에서 FETCHTYPE이 LAZY인데도 불필요한 쿼리를 조회하고 있었다.
- JPQL에 JOIN 뒤에 'FETCH'를 넣어서 해결해준다.
- 정상적으로 JOIN되고 user테이블은 불러오지 않고 있다.
2-8) QueryDSL
※ 트러블 슈팅 및 추후 QueryDSL 포스팅때 더 자세하게 적도록 하겠다.
작업과정)
- gradle에 의존성 추가 및 buile/clean, other/compileJava 2가지 실행해서 Q클래스를 생성한다.
- config에 JPAQueryFactory 빈등록 진행, EntityManager 선언
- 엔티티명Repository, 엔티티명RepositoryCustom, 엔티티명RepositoryImpl 세팅
- QueryImpl에서 QueryDSL사용한 문법으로 변경
- TodoRepositoryCustom 파일 (TodoRepositoryImpl 파일에서 사용할 QueryDSL 전달할 파일)
- TodoRepositoryImpl 파일 (QueryDSL로 변경)
- fetchJoin을 활용해서 N+1문제 해결
- QueryDSL로 변경한 쿼리 출력확인 N+1문제도 해결된 것을 확인할 수 있다.
2-9) Spring Security
※ 핵심으로 생각했던 부분은 Argument Resolver를 기반으로 커스텀 어노테이션으로 User정보를 관리하는 형태를 바꾸는 것이다. 해당 부분을 교체하는것이 핵심이며, 일반적인 Spring Security로 진행되는 로직과 다를 수 있다.
작업과정)
- gradle파일에서 Spring-Security 의존성 추가
- config패키지에 WebSecurityConfig파일 세팅
- 로그인, 회원가입 Spring-Security 제외시키기
- JwtRequestFilter파일생성 (WebSecurityConfig와 상호작용할 파일)
- JwtRequestFilter파일 @Component로 자동 Bean등록 진행
※ 로그인, 회원가입 제외한 나머지 API들의 검증은 Header에서 토큰을 가져와서 해당 토큰에서 userId 회원의 고유번호를 추출해서 예외처리 진행
- 토큰과 고유번호로 검증이 되었다면 API정상적으로 접근 및 호출 가능하도록 진행.
📗 간단 회고)
: QueryDSL과 Spring Security에서 시간을 엄청 많이 소요했다. 처음하는 부분이었고 설정하는 부분에서 애를 먹었던 것 같다. 필수 기능들이었는데 여태껏 진행했던 과제들 중 가장 고민을 많이하고 시간도 많이 소요되었던 것 같다.
두가지는 새로운 기능으로 따로 깊게 다루어야 한다고 생각이 되어 자세하게 포스팅 할 예정이다.
'Spring > JPA-Plus 과제' 카테고리의 다른 글
[19] Spring - Spring Security 트러블 슈팅 (0) | 2024.11.21 |
---|---|
[17] Spring - QueryDSL 트러블슈팅 (11) | 2024.11.19 |
[15] Spring - JPA-Plus 과제 필수레벨_1 (0) | 2024.11.18 |