TIL 53 [ JPA 심화 플러스 과제 ( Lv2 ) ]

2025. 5. 9. 23:26·[내일배움캠프-Sparta]/Spring 6기
반응형

1️⃣ JPA 플러스 과제 ( Lv 2 )

요구사항 ➡ 원인 ➡ 해결 순으로 작성 ( 단, 원인/해결 자율 양식 )

✅ 1. JPA Cascade 

🤔 앗❗ 실수로 코드를 지웠어요!

  • 할 일을 새로 저장할 시, 할 일을 생성한 유저는 담당자로 자동 등록되어야 합니다.
  • JPA의 cascade 기능을 활용해 할 일을 생성한 유저가 담당자로 등록될 수 있게 해주세요.

영속성 전이 개념으로, Cascade를 추가해줌으로써 orphanRemoval = true 까지 추가해주면, 영속성 전이 최고의 조합으로 부모가 없는 고아 객체는 자동으로 삭제하게 하는 기능을 추가하여 이제 manager필드는 todo라는 엔티티가 삭제되면 manager도 삭제 되는 영속성 관계를 나타나게 되며, 이 역시 todo가 생성되면 manager도 생성된다. 

➡ 부모가 있으면, 자식도 있다 개념 ⭐

✅ 2. N + 1

  • CommentController 클래스의 getComments() API를 호출할 때 N+1 문제가 발생하고 있어요. N+1 문제란, 데이터베이스 쿼리 성능 저하를 일으키는 대표적인 문제 중 하나로, 특히 연관된 엔티티를 조회할 때 발생해요.
  • 해당 문제가 발생하지 않도록 코드를 수정해주세요.
더보기

연관된 엔티티를 조회할 때마다 쿼리 성능 저하를 일으키는 N+1 문제가 발생하고 있다. 이를 해결하기 위해 JPQL에 Fetch를 추가하거나 @EntityGraph를 활용하여 해결할 수 있다. 여기서는 Fetch를 함수를 사용하여 해결하도록 하였다.

JPQL에 JOIN FETCH를 추가 해주면서 연관된 엔티티를 조회할 때, 1번만 로그에 잡혀 SQL 쿼리 성능 저하 문제를 일으키던 N+1 문제를 해결 하였다.

✅ 3. QueryDSL

  • JPQL로 작성된 findByIdWithUser 를 QueryDSL로 변경합니다.
  • 7번과 마찬가지로 N+1 문제가 발생하지 않도록 유의해 주세요

필자는 처음으로 QueryDSL라는 라이브러리를 사용해보았다. 해당 라이브러리는 JPQL의 문자열 오타를 방지 할수 있고, 테이블이 복잡해질때 JOIN 많다는등 이 있으면 쿼리를 좀더 효율적으로 쓸수 있다는 장점이 있고, QueryDSL을 의존성 주입을 하면 빌드시 엔티티마다 Q객체라는 것이 생성된다. 이를 활용해 Repository에서 직접 코드로 작성해 SQL문을 작성 할 수 있다.

먼저 QuesyDSL를 사용하기 위해선 빈을 등록해주어야 한다. EntityManger 클래스를 주입 받고 JPAQueryFactory라는 클래스를 통해 주입 해준다.

이후 바꿔야할 JPQL문을 주석처리하고 Q객체를 활용한 Repository를 만든다.

 

JPAQueryFactory 클래스를 주입받고, Q객체를 통해 엔티티를 가져와 변수에 저장하고, 동일한 SQL문 쿼리가 되게 작성을 하며, fecthOne() 은 단일 결과를 가져오는데 사용된다. 이로써 JPQL ➡ QueryDSL 으로 변경을 해결하였다.

✅ 4. Spring Security ⚡

Spring Security를 도입하기로 결정했어요!

  • 기존 Filter와 Argument Resolver를 사용하던 코드들을 Spring Security로 변경해주세요.
    • 접근 권한 및 유저 권한 기능은 그대로 유지해주세요.
    • 권한은 Spring Security의 기능을 사용해주세요.
  • 토큰 기반 인증 방식은 유지할 거예요. JWT는 그대로 사용해주세요.

Spring Security를 도입하기 위해선 우선 프로젝트 내에 의존성을 주입 해주어야 한다.

Spring Security 없이 인증/인가를 구현해본 경험은 있지만, 처음으로 해당 라이브러리를 적용하니 많은 시행착오를 겪었다.

이제 Security가 적용됨에 따라 요구사항에 맞게 코드들을 변경해주어야 하는데 그 전에 빈을 등록해주어야 한다. 

SecurityConfig을 프로젝트에 등록해줌으로써, 프로젝트 내의 서버가 보안 기능이 설정된다.

@EnableWebSecurity는 Spring Security의 웹 보안 기능을 활성화하는 어노테이션 이다.

 

https://sjh9708.tistory.com/83

 

[SpringBoot] Spring Security JWT 인증과 인가 - (1) 회원 가입

이번 포스팅에서는 Spring Boot에서 JWT를 이용한 인증과 인가를 다루기 이전, 사용자를 회원가입시키는 API 로직을 작성하고, 비밀번호를 해시처리하는 작업을 우선적으로 진행해보도록 하겠다. JWT

sjh9708.tistory.com

해당 블로그를 참고하면서 프로젝트 요구사항에 맞게 작성하였다.

 

Filter 부분도 코드는 Securiy 라이브러리에 맞게 구성하였다.

특히 security를 적용함으로 써 OncePerRequestFilter 라는 것을 상속 받고 있다. ( 한번 실행하면 보장한다는 의미이다 )

https://sjh9708.tistory.com/170

 

[Spring Boot] Spring Security : JWT Auth (SpringBoot 3 버전)

작년 말, Spring 2점대 버전의 지원이 공식 중단되면서, 이제 웬만하면 Spring 3 버전대를 사용할 것을 Spring 진영에서 권장하고 있다.그 중 Spring Security의 경우 변화한 내용이 조금 있는 편이라 이 참

sjh9708.tistory.com

기존 JwtFilter 클래스명에서 JwtAuthFilter로 변경되었다.

반응형

'[내일배움캠프-Sparta] > Spring 6기' 카테고리의 다른 글

Redis 기초 ( 챌린지반 )  (0) 2025.05.11
테스트 코드 (단위 테스트) ( 스탠다드 )  (0) 2025.05.11
TIL 52 [⚓ Spring Security + 💡 Tip ( H2, Intelij http ) ]  (0) 2025.05.08
TIL 51 [ JPA 심화 플러스 과제( Lv 1 ), AWS (입문, IAM) ]  (0) 2025.05.07
테스트 코드 ( 베이직 )  (0) 2025.05.06
'[내일배움캠프-Sparta]/Spring 6기' 카테고리의 다른 글
  • Redis 기초 ( 챌린지반 )
  • 테스트 코드 (단위 테스트) ( 스탠다드 )
  • TIL 52 [⚓ Spring Security + 💡 Tip ( H2, Intelij http ) ]
  • TIL 51 [ JPA 심화 플러스 과제( Lv 1 ), AWS (입문, IAM) ]
dimenshun
dimenshun
한 소년의 개발 일기
    반응형
  • dimenshun
    Dev Life Notes
    dimenshun
  • 전체
    오늘
    어제
    • 분류 전체보기 (268)
      • CS (23)
        • 자료구조 (0)
        • 알고리즘 (0)
        • 컴퓨터 구조 (8)
        • 네트워크 (6)
        • 운영체제 (3)
        • DB ( + SQLD ) (5)
        • SW공학 (1)
      • 프로그래밍 (3)
        • Java (0)
        • Spring (0)
        • HTML,CSS (3)
        • JavaScript (0)
      • 개발 툴 (7)
        • Git(버전관리) (1)
        • Docker (3)
        • AWS (2)
        • JSP (1)
      • 코딩테스트(Algorithm) (125)
        • 백준 (6)
        • 프로그래머스 (119)
      • [내일배움캠프-Sparta] (110)
        • Spring 6기 (106)
        • KPT 회고 (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    내일배움캠프
    Testcode
    It
    컴퓨터구조
    백엔드
    SQL
    Python
    운영체제
    SQLD
    KPT
    개발자
    web
    AWS
    세션
    알고리즘
    OS
    네트워크
    spring
    cs
    웹
    Java
    CPU
    배포
    코딩테스트
    트랜잭션
    docker
    Til
    메모리
    network
    db
  • hELLO· Designed By정상우.v4.10.3
dimenshun
TIL 53 [ JPA 심화 플러스 과제 ( Lv2 ) ]
상단으로

티스토리툴바