[16] Spring - JPA-Plus 과제 필수레벨_2

2024. 11. 19. 10:40Spring/JPA-Plus 과제

728x90

📁️ 과제 요구사항)

[레벨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 전달할 파일)

 

2-8 아래의 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정상적으로 접근 및 호출 가능하도록 진행.

 

 📗 간단 회고)

최종 commit 내역

: QueryDSL과 Spring Security에서 시간을 엄청 많이 소요했다. 처음하는 부분이었고 설정하는 부분에서 애를 먹었던 것 같다. 필수 기능들이었는데 여태껏 진행했던 과제들 중 가장 고민을 많이하고 시간도 많이 소요되었던 것 같다.

두가지는 새로운 기능으로 따로 깊게 다루어야 한다고 생각이 되어 자세하게 포스팅 할 예정이다.

 

728x90