Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[feat/CK-236] JdbcTemplate을 이용하여 bulk insert를 적용한다 #198

Merged
merged 2 commits into from
Dec 2, 2023

Conversation

miseongk
Copy link
Member

@miseongk miseongk commented Nov 8, 2023

📌 작업 이슈 번호

CK-236

✨ 작업 내용

  • 기존 골룸 시작 시 골룸 대기자에서 참여자로 변경되는 시점에 데이터 삽입, 삭제를 jdbcTemplate을 이용하여 bulk insert를 적용했습니다.

💬 리뷰어에게 남길 멘트

  • JPA에서 saveAll, deleteAll은 내부적으로 데이터 하나씩 쿼리가 나가기 때문에, 이를 개선하고자 JdbcTemplate을 사용해서 bulk insert를 적용했습니다.
  • JPA에서는 id 전략이 Identity이면 bulk insert가 지원이 안되고, Sequence나 Table 전략을 사용해야 가능합니다. 하지만 MySql은 Sequence를 지원하지 않고, Table 전략을 채택하기에는 테이블을 추가해야하는 점에서 부담이 되어 Identity 전략을 그대로 가되, JdbcTemplate을 사용하여 bulk insert를 적용하도록 했습니다.
  • 추가적으로, 로드맵 삭제 시 관련 데이터들이 모두 삭제되는데 이 부분도 단 건씩 삭제되어 개선이 필요합니다! 로드맵 삭제 부분은 비교적 중요한 부분이 아니고, 쿼리만 추가해주면 되기 때문에 바쁜 일정이 끝나는대로 수정해보겠습니다 🥲

🚀 요구사항 분석

  • 골룸 시작 부분 bulk insert 적용

Copy link

github-actions bot commented Nov 8, 2023

Unit Test Results

  79 files    79 suites   37s ⏱️
763 tests 763 ✔️ 0 💤 0
777 runs  777 ✔️ 0 💤 0

Results for commit 1d5ec46.

♻️ This comment has been updated with latest results.

Copy link

github-actions bot commented Nov 8, 2023

🪄 Test Coverage Report

File Coverage [100%] 🍏
GoalRoomScheduler.java 100% 🍏
GoalRoomQueryRepositoryImpl.java 100% 🍏
GoalRoomMemberDao.java 100% 🍏
Total Project Coverage 98.38% 🍏

Copy link
Collaborator

@younghoondoodoom younghoondoodoom left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

배치 인서트라니.. 생각도 못하고있었는데 밀리 폼 미쳤네요. 이전이랑 배치 적용 이후 성능 차이 비교하면 이력서에 좋은 양분이 되겠네요!
DAO 관련된 부분만 생각해주세요! 고생하셨습니다🙌

Comment on lines +119 to +120
.innerJoin(goalRoom.goalRoomPendingMembers.values, goalRoomPendingMember)
.fetchJoin()
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

join이 안되어있었네요..👍

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이미 Service가 Repository 계층에 의존하고 있으니 DAO 대신 Repository 계층을 만드는건 어떨까요?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이미 JpaRepository를 상속받는 GoalRoomMemberRepository가 존재해서 만들기가 애매했어요..!

그래서 기존 GoalRoomMemberRepositoryGoalRoomMemberJdbcRepository 라는 인터페이스를 상속받도록 했어요! GoalRoomMemberJdbcRepository 인터페이스는 saveAllInBatch라는 메서드를 구현하도록 했고, GoalRoomMemberJdbcRepositoryImpl 구현체를 만들어서 batch insert 작업해주었습니다.
구조가 조금 복잡한 것 같은데 괜찮은지 확인부탁드립니다!

Copy link
Collaborator

@Ohjintaek Ohjintaek left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

JPA는 진짜 잘 알고 써야겠네요... 뭔가 다 해 줄 거 같으면서도 모르고 쓰면 위험한 포인트들이 몇개씩 있는 거 같아요. 영속성 컨텍스트의 1차 캐시에 identity를 저장하는 것 때문에 한 번에 저장이 안 되는 줄을 처음 알았어요
이런 건 어디서 찾으셨는지 대단하네요 밀리👍👍

궁금한 점이 한 가지 있는데 saveAll도 delteAll처럼 @query로 해 주는 건 안 되는 건가요? 똑같은 문제가 발생하는지 궁금하네요. 추가적으로 Dao가 추가된다면 단위 테스트 요청해도 될까요? 안 된다구요?

@@ -28,4 +29,8 @@ Optional<GoalRoomPendingMember> findByGoalRoomAndMemberIdentifier(
+ "where g=:goalRoom "
+ "and gp.member = m")
List<GoalRoomPendingMember> findAllByGoalRoom(@Param("goalRoom") final GoalRoom goalRoom);

@Modifying
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Modifying을 붙여야 하는 이유가 JPA에서 동작을 추론가능한 메서드명일 경우라서 그런건가요?

Copy link

🪄 Test Coverage Report

File Coverage [100%] 🍏
GoalRoomScheduler.java 100% 🍏
GoalRoomQueryRepositoryImpl.java 100% 🍏
GoalRoomMemberJdbcRepositoryImpl.java 100% 🍏
Total Project Coverage 98.39% 🍏

@younghoondoodoom younghoondoodoom merged commit f79f929 into develop-backend Dec 2, 2023
3 checks passed
younghoondoodoom added a commit that referenced this pull request Dec 3, 2023
* [feat/CK-179] 로드맵 카테고리 생성을 구현한다 (#141)

* feat: 로드맵 카테고리 생성 인수테스트 작성

* feat: 로드맵 카테고리 생성 서비스 구현

* feat: 로드맵 카테고리 생성 api 구현

* docs: 로드맵 카테고리 생성 docs 작성

* refactor: 인수테스트 카테고리 생성 api로 수정

* feat: 로드맵 카테고리 앞뒤 공백 제거하도록 수정

* [feat/CK-190] 골룸 생성 시 투두리스트를 필수로 입력받는 로직을 제거한다 (#145)

* feat: 골룸 생성 시 투두리스트 필수 입력 로직 제거

* refactor: 사용하지 않는 메서드 제거

* [feat/CK-189] 네이버 OAuth 로그인 기능을 구현한다 (#144)

* feat: 회원 전화번호, 생년월일 삭제, 이메일 추가

* feat: naver oauth 구현 및 member field 변경

* feat: 네이버 로그인 uri 변경

* docs: 네이버 로그인 API 명세 작성

* feat: NaverOauthService 테스트코드 작성

* test: oauth 기능 테스트 코드 추가

* test: NaverOauthNetworkService 테스트 수정

* chore: git submodule 업데이트

---------

Co-authored-by: ChoiYoungHoon <[email protected]>
Co-authored-by: Ohjintaek <[email protected]>

* feat: MemberProfile email not null 및 Member salt nullable 설정

* feat: oauth 회원가입 시 아이디에 uuid 붙히도록 수정

* design: 네이버 로그인 버튼 구현

* feat: naver oauth API 통신 구현

* feat: 네이버 로그인 주소 반환 시 응답 코드 200으로 변경

* feat: 네이버 oauth 로그인 시 콜백 변경 및 auth code 받도록 수정

* feat: 네이버 oauth api 수정

* fix: 시작 날짜가 오늘 이전이면서 모집 중인 골룸도 자동으로 시작하도록 수정

* feat: 이미지 파일 get url 요청 시 cloud front로 내려주도록 수정

* fix: 로드맵 태그 여러개일시 데이터 조회 중복 문제 해결

* fix: 파일 경로 생성시 한글과 공백은 인코딩한다

* test: test coverage 수정

* fix: file 확장자 오류를 해결한다

* fix: file이름을 저장할때 uuid로만 저장한다

* feat: 로드맵 태그에 BatchSize 적용

* feat: 골룸 노드 목록 조회 시 노드 설명과 이미지 반환하도록 수정

* [feat/CK-227] 로드맵 골룸 조회 시 최신순일때는 모든 상태를, 마감임박 순일 땐 모집 중인 상태만 반환한다 (#185)

* chore: 패키지 경로 수정

* feat: 조건에 따른 로드맵 골룸 조회 시 쿼리 수정

* refactor: 1:N 문제 방지를 위해 @batchsize 설정

* feat: 로드맵 골룸 응답에 골룸 상태 추가

* chore: 서브모듈 업데이트

* chore: 패키지 경로 수정

* refactor: 메서드 네이밍 수정

* refactor: BaseEntity의 CreatedAt 스프링 의존성 끊기 (#191)

* refactor: MemberIdentifierArgumentResolver에서 Authenticated 어노테이션 확인하도록 수정 (#193)

* [feat/CK-232] 전역적으로 사용하는 Exception을 분리하고 AOP로 예외를 변환하는 기능을 구현한다. (#194)

* refactor: exception 패키지를 service 패키지 하위로 이동

* feat: 도메인 Exception을 서비스 Exception으로 변환해주는 AOP 구현

* [feat/CK-222] Redis를 도입하고 Refresh Token을 Redis에 저장하도록 변경한다 (#190)

* build: spring data redis 및 testcontainers 의존성 추가

* feat: RefreshToken 레디스에 저장하도록 변경

* test: Redis 테스트 설정 및 RefreshTokenRedisRepository 테스트

* chore: 서브모듈 업데이트

* refactor: JwtTokenProvider에서 RefreshToken 생성해서 반환하도록 수정

* refactor: 리뷰 반영

* refactor: RedisTemplate으로 변경

* test: JwtTokenProvider 테스트 추가

* test: test config에 redis 설정 추가

* test: test 추가

* chore: 기존 refresh token table을 drop하는 쿼리 추가

* refactor: ttl을 초단위로 변경하는 로직 변수 추출

* refactor: 변수명 변경

* refactor: 레디스 테스트 간 격리

* chore: git submodule 업데이트

* [feat/CK-235] Redis 캐시를 적용한다 (#197)

* test: test container에 의존하지 않도록 변경

* feat: redis cache 적용

* feat: redis config 설정 수정

* fix: RedisConfig를 test에서 비활성화 시킨다

* test: CacheKeyGenerator test code 작성

* feat: 수정 요구사항 반영

* chore: 서브모듈 최신화

* chore: 서브모듈 최신화

* chore: flyway v4 파일 제거

* chore: flyway v4 파일 복구

* [feat/CK-237] 골룸 참여 시 발생하는 동시성 이슈를 해결한다 (#199)

* refactor: 골룸 참여 시 발생하는 동시성 이슈를 비관적 락으로 해결

* test: 테스트 코드 수정

* [feat/CK-236] JdbcTemplate을 이용하여 bulk insert를 적용한다 (#198)

* refactor: 기존 saveAll, deleteAll을 bulk insert로 개선

* refactor: Dao 대신 Repository 계층에 의존하도록 수정 - JdbcRepository 추상화

* feat: amazon s3 접근 시 credentials 사용하도록 수정

---------

Co-authored-by: Miseong Kim <[email protected]>
Co-authored-by: Ohjintaek <[email protected]>
Co-authored-by: Miseong Kim <[email protected]>
Co-authored-by: Jungwoo <[email protected]>
Co-authored-by: 부엉이 <[email protected]>
Co-authored-by: Ohjintaek <[email protected]>
younghoondoodoom added a commit that referenced this pull request Dec 3, 2023
* feat: 골룸 노드 목록 조회 시 노드 설명과 이미지 반환하도록 수정

* [feat/CK-227] 로드맵 골룸 조회 시 최신순일때는 모든 상태를, 마감임박 순일 땐 모집 중인 상태만 반환한다 (#185)

* chore: 패키지 경로 수정

* feat: 조건에 따른 로드맵 골룸 조회 시 쿼리 수정

* refactor: 1:N 문제 방지를 위해 @batchsize 설정

* feat: 로드맵 골룸 응답에 골룸 상태 추가

* chore: 서브모듈 업데이트

* chore: 패키지 경로 수정

* refactor: 메서드 네이밍 수정

* refactor: BaseEntity의 CreatedAt 스프링 의존성 끊기 (#191)

* refactor: MemberIdentifierArgumentResolver에서 Authenticated 어노테이션 확인하도록 수정 (#193)

* [feat/CK-232] 전역적으로 사용하는 Exception을 분리하고 AOP로 예외를 변환하는 기능을 구현한다. (#194)

* refactor: exception 패키지를 service 패키지 하위로 이동

* feat: 도메인 Exception을 서비스 Exception으로 변환해주는 AOP 구현

* [feat/CK-222] Redis를 도입하고 Refresh Token을 Redis에 저장하도록 변경한다 (#190)

* build: spring data redis 및 testcontainers 의존성 추가

* feat: RefreshToken 레디스에 저장하도록 변경

* test: Redis 테스트 설정 및 RefreshTokenRedisRepository 테스트

* chore: 서브모듈 업데이트

* refactor: JwtTokenProvider에서 RefreshToken 생성해서 반환하도록 수정

* refactor: 리뷰 반영

* refactor: RedisTemplate으로 변경

* test: JwtTokenProvider 테스트 추가

* test: test config에 redis 설정 추가

* test: test 추가

* chore: 기존 refresh token table을 drop하는 쿼리 추가

* refactor: ttl을 초단위로 변경하는 로직 변수 추출

* refactor: 변수명 변경

* refactor: 레디스 테스트 간 격리

* chore: git submodule 업데이트

* [feat/CK-235] Redis 캐시를 적용한다 (#197)

* test: test container에 의존하지 않도록 변경

* feat: redis cache 적용

* feat: redis config 설정 수정

* fix: RedisConfig를 test에서 비활성화 시킨다

* test: CacheKeyGenerator test code 작성

* feat: 수정 요구사항 반영

* chore: 서브모듈 최신화

* chore: 서브모듈 최신화

* chore: flyway v4 파일 제거

* chore: flyway v4 파일 복구

* [feat/CK-237] 골룸 참여 시 발생하는 동시성 이슈를 해결한다 (#199)

* refactor: 골룸 참여 시 발생하는 동시성 이슈를 비관적 락으로 해결

* test: 테스트 코드 수정

* [feat/CK-236] JdbcTemplate을 이용하여 bulk insert를 적용한다 (#198)

* refactor: 기존 saveAll, deleteAll을 bulk insert로 개선

* refactor: Dao 대신 Repository 계층에 의존하도록 수정 - JdbcRepository 추상화

* [feat/CK-239] Amazon S3 접근 시 credential 정보를 이용하도록 수정한다 (#201)

* feat: amazon s3 접근 시 credentials 사용하도록 수정

* test: test application.yml에 credentials 추가

---------

Co-authored-by: Miseong Kim <[email protected]>
Co-authored-by: Ohjintaek <[email protected]>
Co-authored-by: Miseong Kim <[email protected]>
Co-authored-by: Ohjintaek <[email protected]>
@younghoondoodoom younghoondoodoom deleted the feature/CK-236 branch December 10, 2023 10:49
younghoondoodoom added a commit that referenced this pull request Dec 10, 2023
* [feat/CK-179] 로드맵 카테고리 생성을 구현한다 (#141)

* feat: 로드맵 카테고리 생성 인수테스트 작성

* feat: 로드맵 카테고리 생성 서비스 구현

* feat: 로드맵 카테고리 생성 api 구현

* docs: 로드맵 카테고리 생성 docs 작성

* refactor: 인수테스트 카테고리 생성 api로 수정

* feat: 로드맵 카테고리 앞뒤 공백 제거하도록 수정

* [feat/CK-190] 골룸 생성 시 투두리스트를 필수로 입력받는 로직을 제거한다 (#145)

* feat: 골룸 생성 시 투두리스트 필수 입력 로직 제거

* refactor: 사용하지 않는 메서드 제거

* [feat/CK-189] 네이버 OAuth 로그인 기능을 구현한다 (#144)

* feat: 회원 전화번호, 생년월일 삭제, 이메일 추가

* feat: naver oauth 구현 및 member field 변경

* feat: 네이버 로그인 uri 변경

* docs: 네이버 로그인 API 명세 작성

* feat: NaverOauthService 테스트코드 작성

* test: oauth 기능 테스트 코드 추가

* test: NaverOauthNetworkService 테스트 수정

* chore: git submodule 업데이트

---------

Co-authored-by: ChoiYoungHoon <[email protected]>
Co-authored-by: Ohjintaek <[email protected]>

* feat: MemberProfile email not null 및 Member salt nullable 설정

* feat: oauth 회원가입 시 아이디에 uuid 붙히도록 수정

* design: 네이버 로그인 버튼 구현

* feat: naver oauth API 통신 구현

* feat: 네이버 로그인 주소 반환 시 응답 코드 200으로 변경

* feat: 네이버 oauth 로그인 시 콜백 변경 및 auth code 받도록 수정

* feat: 네이버 oauth api 수정

* fix: 시작 날짜가 오늘 이전이면서 모집 중인 골룸도 자동으로 시작하도록 수정

* feat: 이미지 파일 get url 요청 시 cloud front로 내려주도록 수정

* fix: 로드맵 태그 여러개일시 데이터 조회 중복 문제 해결

* fix: 파일 경로 생성시 한글과 공백은 인코딩한다

* test: test coverage 수정

* fix: file 확장자 오류를 해결한다

* fix: file이름을 저장할때 uuid로만 저장한다

* feat: 로드맵 태그에 BatchSize 적용

* [Release] 골룸 대시보드 내의 노드 반환 데이터 추가 및 골룸 목록 조회 시 모든 상태의 골룸을 조회하도록 수정한다. (#188)

* feat: 골룸 노드 목록 조회 시 노드 설명과 이미지 반환하도록 수정

* [feat/CK-227] 로드맵 골룸 조회 시 최신순일때는 모든 상태를, 마감임박 순일 땐 모집 중인 상태만 반환한다 (#185)

* chore: 패키지 경로 수정

* feat: 조건에 따른 로드맵 골룸 조회 시 쿼리 수정

* refactor: 1:N 문제 방지를 위해 @batchsize 설정

* feat: 로드맵 골룸 응답에 골룸 상태 추가

* chore: 서브모듈 업데이트

* chore: 패키지 경로 수정

* refactor: 메서드 네이밍 수정

---------

Co-authored-by: Ohjintaek <[email protected]>

* [Release] 동시성 문제 해결 및 캐시를 적용하여 성능 개선을 한다. (#203)

* feat: 골룸 노드 목록 조회 시 노드 설명과 이미지 반환하도록 수정

* [feat/CK-227] 로드맵 골룸 조회 시 최신순일때는 모든 상태를, 마감임박 순일 땐 모집 중인 상태만 반환한다 (#185)

* chore: 패키지 경로 수정

* feat: 조건에 따른 로드맵 골룸 조회 시 쿼리 수정

* refactor: 1:N 문제 방지를 위해 @batchsize 설정

* feat: 로드맵 골룸 응답에 골룸 상태 추가

* chore: 서브모듈 업데이트

* chore: 패키지 경로 수정

* refactor: 메서드 네이밍 수정

* refactor: BaseEntity의 CreatedAt 스프링 의존성 끊기 (#191)

* refactor: MemberIdentifierArgumentResolver에서 Authenticated 어노테이션 확인하도록 수정 (#193)

* [feat/CK-232] 전역적으로 사용하는 Exception을 분리하고 AOP로 예외를 변환하는 기능을 구현한다. (#194)

* refactor: exception 패키지를 service 패키지 하위로 이동

* feat: 도메인 Exception을 서비스 Exception으로 변환해주는 AOP 구현

* [feat/CK-222] Redis를 도입하고 Refresh Token을 Redis에 저장하도록 변경한다 (#190)

* build: spring data redis 및 testcontainers 의존성 추가

* feat: RefreshToken 레디스에 저장하도록 변경

* test: Redis 테스트 설정 및 RefreshTokenRedisRepository 테스트

* chore: 서브모듈 업데이트

* refactor: JwtTokenProvider에서 RefreshToken 생성해서 반환하도록 수정

* refactor: 리뷰 반영

* refactor: RedisTemplate으로 변경

* test: JwtTokenProvider 테스트 추가

* test: test config에 redis 설정 추가

* test: test 추가

* chore: 기존 refresh token table을 drop하는 쿼리 추가

* refactor: ttl을 초단위로 변경하는 로직 변수 추출

* refactor: 변수명 변경

* refactor: 레디스 테스트 간 격리

* chore: git submodule 업데이트

* [feat/CK-235] Redis 캐시를 적용한다 (#197)

* test: test container에 의존하지 않도록 변경

* feat: redis cache 적용

* feat: redis config 설정 수정

* fix: RedisConfig를 test에서 비활성화 시킨다

* test: CacheKeyGenerator test code 작성

* feat: 수정 요구사항 반영

* chore: 서브모듈 최신화

* chore: 서브모듈 최신화

* chore: flyway v4 파일 제거

* chore: flyway v4 파일 복구

* [feat/CK-237] 골룸 참여 시 발생하는 동시성 이슈를 해결한다 (#199)

* refactor: 골룸 참여 시 발생하는 동시성 이슈를 비관적 락으로 해결

* test: 테스트 코드 수정

* [feat/CK-236] JdbcTemplate을 이용하여 bulk insert를 적용한다 (#198)

* refactor: 기존 saveAll, deleteAll을 bulk insert로 개선

* refactor: Dao 대신 Repository 계층에 의존하도록 수정 - JdbcRepository 추상화

* [feat/CK-239] Amazon S3 접근 시 credential 정보를 이용하도록 수정한다 (#201)

* feat: amazon s3 접근 시 credentials 사용하도록 수정

* test: test application.yml에 credentials 추가

---------

Co-authored-by: Miseong Kim <[email protected]>
Co-authored-by: Ohjintaek <[email protected]>
Co-authored-by: Miseong Kim <[email protected]>
Co-authored-by: Ohjintaek <[email protected]>

* chore: properties 버젼 변경

---------

Co-authored-by: Miseong Kim <[email protected]>
Co-authored-by: Ohjintaek <[email protected]>
Co-authored-by: Miseong Kim <[email protected]>
Co-authored-by: Jungwoo <[email protected]>
Co-authored-by: 부엉이 <[email protected]>
Co-authored-by: Ohjintaek <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
Status: Done
Development

Successfully merging this pull request may close these issues.

3 participants