Skip to content

Conversation

@lsy1307
Copy link
Contributor

@lsy1307 lsy1307 commented Jul 1, 2025

관련 이슈

작업 내용

  • Application, Country, GpaScore, InterestedCountry/Region, LanguageTestScore, LikedUniversity. SiteUser, UnivApplyInfo 도메인의 연관관계 수정
  • 엔티티 생성자 parameter 수정으로 인한 Repository 수정 및 테스트 코드 수정 다수

특이 사항

  • 회의에서 결정된 내용을 기반으로 하였으나 university와 region, country의 연관관계는 리팩토링 과정에서 서비스 로직상 복잡해질 가능성이 매우 높아 유지하는 것이 좋겠다고 판단, 선제적으로 유지하였습니다. 추후 논의가 필요해 보입니다.

image

  • 다른 도메인은 모두 생성자의 parameter도 수정하였으나 siteUser같은 경우 연결된 코드가 많고 Id만을 사용하는 것이 아닌 Header에서 객체 형태로 추출하는 형태도 다수 존재하므로 생성자에서 받아온 SiteUser객체의 id를 추출하는 형식으로 구현하는 것이 기존 코드 호환성에서 더 낫다고 판단하였습니다.

image

  • 테스트 코드 수정사항이 있으므로 이전 PR에서 테스트 코드가 수정된 부분이 있다면 conflict를 해결해야할 것으로 보입니다.

리뷰 요구사항 (선택)

  • 두 번 확인하긴 했는데 빼먹은 도메인(community제외입니다!)이 있는지 확인 한 번만 해주시면 좋을 것 같고 테스트 코드 동작은 문제없는 것 확인 했는데 혹시 기존과 동작이 달라졌을 수 있는 부분이 있을 수 있으니 그 부분 중점적으로 확인해 주시면 좋을 것 같습니다. 또한 특이사항으로 기술한 부분에서 문제가 있는 것 같다고 하시면 말씀해주세요!

- Application, Country, GpaScore, InterestedCountry/Region, LanguageTestScore, LikedUniversity. SiteUser, UnivApplyInfo 도메인 수정
- 연관관계 삭제 및 생성자 parameter 수정으로 인한 쿼리 수정 다수
- test코드 수정
@lsy1307 lsy1307 self-assigned this Jul 1, 2025
@lsy1307 lsy1307 requested a review from wibaek as a code owner July 1, 2025 06:57
@coderabbitai
Copy link

coderabbitai bot commented Jul 1, 2025

"""

Walkthrough

  1. 엔티티 간 연관관계 단순화 및 ID 기반 매핑 전환
     - Application, InterestedCountry, InterestedRegion, GpaScore, LanguageTestScore, LikedUnivApplyInfo 등 여러 엔티티에서 기존의 @ManyToOne 등 객체 참조 필드를 제거하고, 해당 엔티티의 ID(예: siteUserId, countryCode, regionCode 등)만 보관하도록 변경되었습니다.
     - 이에 따라 각 엔티티의 생성자 및 내부 구현도 객체 참조 대신 ID 값을 할당하도록 수정되었습니다.

  2. 레포지토리 메서드 파라미터 및 쿼리 방식 변경
     - 여러 레포지토리(ApplicationRepository, InterestedCountryRepository, InterestedRegionRepository, GpaScoreRepository, LanguageTestScoreRepository, LikedUnivApplyInfoRepository 등)의 메서드 시그니처가 엔티티 객체 대신 ID(primitive type)로 파라미터를 받도록 일괄 변경되었습니다.
     - JPQL 및 QueryDSL 쿼리도 객체 조인에서 ID 기반 조건으로 수정되었습니다.

  3. 서비스 및 DTO 내부 로직 ID 기반으로 통일
     - 서비스 계층(ApplicationQueryService, ApplicationSubmissionService, ScoreService, UnivApplyInfoLikeService, UnivApplyInfoRecommendService, MyPageService)에서 엔티티 객체를 직접 주고받던 부분을 모두 ID로 교체하여, 레포지토리 호출과 도메인 생성 시 일관되게 ID를 사용하도록 변경되었습니다.
     - DTO 내부 비교 로직도 엔티티 객체 비교에서 ID 값 비교로 단순화되었습니다.

  4. 연관관계 필드 및 양방향 관계 관리 코드 제거
     - SiteUser 엔티티에서 점수 관련 리스트(languageTestScoreList, gpaScoreList) 필드가 삭제되었고,
     - GpaScore, LanguageTestScore 등에서는 양방향 연관관계 관리(setter 및 컬렉션 관리) 코드가 제거되었습니다.

  5. 테스트 코드 및 Fixture 빌더의 생성 방식 변경
     - 테스트 및 fixture 코드 전반에서 엔티티 객체 대신 ID를 사용하여 엔티티를 생성하거나 조회하도록 변경되었습니다.
     - 불필요해진 setter 호출 및 객체 참조 사용이 제거되었습니다.

  6. 쿼리 최적화 및 조인 방식 일부 변경
     - QueryDSL 및 JPQL 쿼리에서 조인 방식이 객체 참조 기반에서 ID 기반으로 변경되었으며, 필요에 따라 LEFT JOIN FETCH 등으로 fetch 전략이 일부 조정되었습니다.

  7. 기타
     - UnivApplyInfolanguageRequirements 필드에 cascade 및 orphanRemoval 옵션이 추가되었습니다.
     - SQL 데이터 파일의 컬럼명이 preparation_stage에서 exchange_status로 변경되었습니다.

Suggested reviewers

  • wibaek
  • nayonsoso
    """

📜 Recent review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 2dbb1ad and fbd6c97.

📒 Files selected for processing (1)
  • src/main/java/com/example/solidconnection/application/repository/ApplicationRepository.java (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • src/main/java/com/example/solidconnection/application/repository/ApplicationRepository.java
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: build
✨ Finishing Touches
  • 📝 Generate Docstrings

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Explain this complex logic.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai explain this code block.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and explain its main purpose.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Support

Need help? Create a ticket on our support page for assistance with any issues or questions.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR.
  • @coderabbitai generate sequence diagram to generate a sequence diagram of the changes in this PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🔭 Outside diff range comments (1)
src/main/java/com/example/solidconnection/university/repository/custom/UniversityFilterRepositoryImpl.java (1)

76-83: 사용하지 않는 region join 및 변수 제거

변경사항:

  1. QRegion region 변수가 선언되었지만 사용되지 않습니다
  2. line 83의 .join(university.region, region)도 더 이상 필요하지 않습니다
    • 이미 country.regionCode를 직접 사용하고 있기 때문입니다
-        QRegion region = QRegion.region;
         QUnivApplyInfo univApplyInfo = QUnivApplyInfo.univApplyInfo;

         List<UnivApplyInfo> filteredUnivApplyInfo = queryFactory
                 .selectFrom(univApplyInfo)
                 .join(univApplyInfo.university, university)
                 .join(university.country, country)
-                .join(university.region, region)
                 .where(regionCodeEq(country, regionCode)
🧹 Nitpick comments (9)
src/main/java/com/example/solidconnection/location/country/domain/Country.java (1)

3-3: 사용하지 않는 import를 제거해주세요.

Region 클래스가 더 이상 사용되지 않으므로 import 문을 제거하는 것이 좋겠습니다.

-import com.example.solidconnection.location.region.domain.Region;
src/main/java/com/example/solidconnection/siteuser/service/MyPageService.java (1)

11-11: 사용하지 않는 import를 제거해주세요.

LikedUniversity 클래스가 더 이상 사용되지 않습니다.

-import com.example.solidconnection.university.domain.LikedUniversity;
src/main/java/com/example/solidconnection/university/domain/LikedUniversity.java (1)

3-3: 사용하지 않는 import 제거 필요

SiteUser import는 더 이상 사용되지 않으므로 제거해 주세요.

-import com.example.solidconnection.siteuser.domain.SiteUser;
src/main/java/com/example/solidconnection/university/repository/custom/UniversityFilterRepositoryImpl.java (1)

4-4: 사용하지 않는 import 제거

QRegion은 더 이상 사용되지 않으므로 import를 제거해 주세요.

-import com.example.solidconnection.location.region.domain.QRegion;
src/main/java/com/example/solidconnection/score/domain/GpaScore.java (2)

15-15: 사용하지 않는 import 제거

ManyToOne은 더 이상 사용되지 않으므로 제거해 주세요.

-import jakarta.persistence.ManyToOne;

41-41: @column 애노테이션 추가 권장

다른 엔티티들과의 일관성을 위해 @Column 애노테이션을 추가하는 것이 좋겠습니다.

+    @Column(name = "site_user_id")
     private long siteUserId;
src/main/java/com/example/solidconnection/location/region/domain/InterestedRegion.java (1)

4-4: Wildcard import를 개별 import로 변경 권장

코드베이스의 다른 파일들과 일관성을 유지하기 위해 wildcard import 대신 필요한 클래스들을 개별적으로 import하는 것이 좋겠습니다.

-import jakarta.persistence.*;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.Table;
+import jakarta.persistence.UniqueConstraint;
src/main/java/com/example/solidconnection/score/repository/LanguageTestScoreRepository.java (1)

16-19: 리포지토리 메서드들이 ID 기반으로 일관성 있게 변경되었습니다

다음과 같은 개선사항들이 확인됩니다:

  1. 메서드명 업데이트: SiteUserSiteUserId 패턴으로 변경
  2. 파라미터 타입 변경: SiteUser 엔티티 → long siteUserId
  3. 새 메서드 추가: findBySiteUserId(Long siteUserId) 메서드로 기능성 확장

다만 파라미터 타입이 longLong으로 혼재되어 있는데, 전체 프로젝트에서 일관된 타입 사용을 고려해보시기 바랍니다 (예: 라인 16, 18은 long, 라인 19는 Long).

src/main/java/com/example/solidconnection/siteuser/repository/LikedUniversityRepository.java (1)

28-28: 유용한 존재 확인 메서드가 추가되었습니다

existsBySiteUserIdAndUnivApplyInfoId 메서드 추가로 좋아요 상태 확인이 더 효율적으로 가능해졌습니다. 다만 파라미터 타입이 Long으로 되어 있는데, 위의 다른 메서드들과 일관성을 위해 long 사용을 고려해보시기 바랍니다.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 45430c9 and b6037ab.

📒 Files selected for processing (33)
  • src/main/java/com/example/solidconnection/application/domain/Application.java (3 hunks)
  • src/main/java/com/example/solidconnection/application/dto/UniversityApplicantsResponse.java (1 hunks)
  • src/main/java/com/example/solidconnection/application/repository/ApplicationRepository.java (1 hunks)
  • src/main/java/com/example/solidconnection/application/service/ApplicationQueryService.java (2 hunks)
  • src/main/java/com/example/solidconnection/application/service/ApplicationSubmissionService.java (3 hunks)
  • src/main/java/com/example/solidconnection/location/country/domain/Country.java (1 hunks)
  • src/main/java/com/example/solidconnection/location/country/domain/InterestedCountry.java (2 hunks)
  • src/main/java/com/example/solidconnection/location/country/repository/InterestedCountryRepository.java (1 hunks)
  • src/main/java/com/example/solidconnection/location/region/domain/InterestedRegion.java (2 hunks)
  • src/main/java/com/example/solidconnection/location/region/repository/InterestedRegionRepository.java (1 hunks)
  • src/main/java/com/example/solidconnection/score/domain/GpaScore.java (1 hunks)
  • src/main/java/com/example/solidconnection/score/domain/LanguageTestScore.java (1 hunks)
  • src/main/java/com/example/solidconnection/score/repository/GpaScoreRepository.java (1 hunks)
  • src/main/java/com/example/solidconnection/score/repository/LanguageTestScoreRepository.java (1 hunks)
  • src/main/java/com/example/solidconnection/score/repository/custom/GpaScoreFilterRepositoryImpl.java (2 hunks)
  • src/main/java/com/example/solidconnection/score/repository/custom/LanguageTestScoreFilterRepositoryImpl.java (2 hunks)
  • src/main/java/com/example/solidconnection/score/service/ScoreService.java (1 hunks)
  • src/main/java/com/example/solidconnection/siteuser/domain/SiteUser.java (0 hunks)
  • src/main/java/com/example/solidconnection/siteuser/repository/LikedUniversityRepository.java (1 hunks)
  • src/main/java/com/example/solidconnection/siteuser/service/MyPageService.java (3 hunks)
  • src/main/java/com/example/solidconnection/university/domain/LikedUniversity.java (2 hunks)
  • src/main/java/com/example/solidconnection/university/domain/UnivApplyInfo.java (2 hunks)
  • src/main/java/com/example/solidconnection/university/repository/UniversityInfoForApplyRepository.java (1 hunks)
  • src/main/java/com/example/solidconnection/university/repository/custom/UniversityFilterRepositoryImpl.java (2 hunks)
  • src/main/java/com/example/solidconnection/university/service/UniversityLikeService.java (3 hunks)
  • src/main/java/com/example/solidconnection/university/service/UniversityRecommendService.java (1 hunks)
  • src/test/java/com/example/solidconnection/application/service/ApplicationSubmissionServiceTest.java (1 hunks)
  • src/test/java/com/example/solidconnection/location/country/fixture/CountryFixtureBuilder.java (1 hunks)
  • src/test/java/com/example/solidconnection/score/fixture/GpaScoreFixtureBuilder.java (0 hunks)
  • src/test/java/com/example/solidconnection/score/fixture/LanguageTestScoreFixtureBuilder.java (0 hunks)
  • src/test/java/com/example/solidconnection/siteuser/service/MyPageServiceTest.java (1 hunks)
  • src/test/java/com/example/solidconnection/university/repository/UniversityLikeRepositoryTest.java (1 hunks)
  • src/test/java/com/example/solidconnection/university/service/UniversityLikeServiceTest.java (3 hunks)
💤 Files with no reviewable changes (3)
  • src/test/java/com/example/solidconnection/score/fixture/GpaScoreFixtureBuilder.java
  • src/test/java/com/example/solidconnection/score/fixture/LanguageTestScoreFixtureBuilder.java
  • src/main/java/com/example/solidconnection/siteuser/domain/SiteUser.java
🧰 Additional context used
🧬 Code Graph Analysis (1)
src/main/java/com/example/solidconnection/score/repository/LanguageTestScoreRepository.java (1)
src/main/java/com/example/solidconnection/score/repository/custom/LanguageTestScoreFilterRepositoryImpl.java (1)
  • Repository (29-119)
⏰ Context from checks skipped due to timeout of 90000ms (1)
  • GitHub Check: build
🔇 Additional comments (40)
src/test/java/com/example/solidconnection/application/service/ApplicationSubmissionServiceTest.java (1)

87-87: 테스트 코드가 엔티티 리팩토링에 맞게 올바르게 업데이트되었습니다.

  1. 변경사항 확인: findBySiteUserAndTerm에서 findBySiteUserIdAndTerm으로 메서드 호출 변경
    • SiteUser 엔티티 객체 대신 사용자 ID를 사용하도록 수정
    • Application 엔티티의 siteUser 필드가 siteUserId로 변경된 것과 일치

테스트 로직과 검증 부분은 그대로 유지되어 기능적 일관성이 보장됩니다.

src/test/java/com/example/solidconnection/location/country/fixture/CountryFixtureBuilder.java (1)

40-40: 테스트 픽스처가 도메인 모델 리팩토링에 맞게 올바르게 업데이트되었습니다.

  1. 변경사항 확인: Country 생성자 파라미터 변경
    • Region 엔티티 객체 대신 지역 코드 문자열을 전달
    • Country 도메인의 region 필드가 regionCode로 변경된 것과 일치

테스트 데이터 생성 로직이 도메인 모델 변경사항을 정확히 반영하고 있습니다.

src/main/java/com/example/solidconnection/score/repository/custom/GpaScoreFilterRepositoryImpl.java (1)

73-73: QueryDSL 쿼리가 엔티티 리팩토링에 맞게 올바르게 업데이트되었습니다.

  1. 변경사항 확인: 조인 문법 변경

    • 기존: .join(gpaScore.siteUser, siteUser) (엔티티 연관관계 기반)
    • 변경: .join(siteUser).on(gpaScore.siteUserId.eq(siteUser.id)) (명시적 조인 조건)
  2. 일관성 확인:

    • 컨텐츠 조회 쿼리와 카운트 쿼리 모두 동일하게 적용
    • GpaScore 엔티티의 siteUser 필드가 siteUserId로 변경된 것과 일치

쿼리 로직과 필터링 조건은 그대로 유지되어 기능적 일관성이 보장됩니다.

Also applies to: 87-87

src/main/java/com/example/solidconnection/application/service/ApplicationQueryService.java (1)

59-59: 서비스 레이어가 엔티티 리팩토링에 맞게 올바르게 업데이트되었습니다.

  1. 변경사항 확인: repository 메서드 호출 변경

    • 기존: getApplicationBySiteUserAndTerm(siteUser, term) (엔티티 객체 전달)
    • 변경: getApplicationBySiteUserIdAndTerm(siteUser.getId(), term) (사용자 ID 전달)
  2. 적용 위치:

    • getApplicantsByUserApplications 메서드 (59번 줄)
    • validateSiteUserCanViewApplicants 메서드 (123번 줄)

비즈니스 로직은 그대로 유지되어 기능적 일관성이 보장됩니다.

Also applies to: 123-123

src/main/java/com/example/solidconnection/location/region/repository/InterestedRegionRepository.java (1)

12-12: Repository 인터페이스가 엔티티 리팩토링에 맞게 올바르게 업데이트되었습니다.

  1. 변경사항 확인: 메서드 시그니처 변경

    • 기존: findAllBySiteUser(SiteUser siteUser) (엔티티 객체 파라미터)
    • 변경: findAllBySiteUserId(long siteUserId) (primitive 타입 파라미터)
  2. 일관성 확인:

    • InterestedRegion 엔티티의 siteUser 필드가 siteUserId로 변경된 것과 일치
    • 다른 도메인의 유사한 repository 변경사항과 일관성 유지

Spring Data JPA의 명명 규칙에 따라 자동으로 올바른 쿼리가 생성됩니다.

src/main/java/com/example/solidconnection/score/repository/custom/LanguageTestScoreFilterRepositoryImpl.java (1)

73-73: 1. QueryDSL 조인 문법 변경 확인 완료

엔티티 연관관계 제거에 따라 QueryDSL 조인 문법이 올바르게 수정되었습니다.

  • 기존: 경로 기반 조인 (.join(languageTestScore.siteUser, siteUser))
  • 변경: 명시적 조인 조건 (.join(siteUser).on(languageTestScore.siteUserId.eq(siteUser.id)))

두 쿼리 모두 일관되게 적용되어 데이터 조회 로직에 문제가 없을 것으로 보입니다.

Also applies to: 87-87

src/test/java/com/example/solidconnection/university/repository/UniversityLikeRepositoryTest.java (1)

85-86: 2. 테스트 데이터 생성 로직 ID 기반으로 변경 확인

도메인 모델 리팩토링에 맞춰 테스트 헬퍼 메서드가 올바르게 수정되었습니다.

  • 기존: 전체 엔티티 객체 전달
  • 변경: 엔티티 ID 값 전달 (siteUser.getId(), univApplyInfo.getId())

테스트의 의도와 검증 로직은 그대로 유지되면서 새로운 도메인 모델과 일관성을 보장합니다.

src/main/java/com/example/solidconnection/university/service/UniversityRecommendService.java (1)

40-40: 3. 서비스 레이어 메서드 호출 ID 기반으로 변경 확인

리포지토리 메서드 시그니처 변경에 맞춰 서비스 레이어 호출이 올바르게 수정되었습니다.

  • 기존: 전체 SiteUser 엔티티 전달
  • 변경: 사용자 ID 추출 후 전달 (siteUser.getId())

메서드 호출 의도와 기능은 동일하게 유지되면서 새로운 리포지토리 인터페이스와 일관성을 보장합니다.

src/main/java/com/example/solidconnection/application/dto/UniversityApplicantsResponse.java (1)

27-27: 4. 사용자 비교 로직 ID 기반으로 변경 확인

도메인 모델 변경에 따라 사용자 식별 비교 로직이 올바르게 수정되었습니다.

  • 기존: 엔티티 참조 비교 (.equals())
  • 변경: 원시 타입 ID 비교 (==)

Application 엔티티가 siteUserId를 long 타입으로 저장하므로 원시 타입 비교가 적절합니다.

src/main/java/com/example/solidconnection/location/country/repository/InterestedCountryRepository.java (1)

12-12: 5. 리포지토리 메서드 시그니처 ID 기반으로 변경 확인

도메인 모델 리팩토링에 맞춰 리포지토리 메서드가 올바르게 수정되었습니다.

  • 기존: findAllBySiteUser(SiteUser siteUser) - 엔티티 파라미터
  • 변경: findAllBySiteUserId(long siteUserId) - 원시 타입 ID 파라미터

Spring Data JPA가 새로운 필드명(siteUserId)에 맞춰 자동으로 쿼리를 생성하므로 메서드명과 파라미터가 적절합니다.

src/main/java/com/example/solidconnection/application/service/ApplicationSubmissionService.java (2)

53-53: 리팩토링이 올바르게 적용되었습니다.

Repository 메서드가 엔티티 대신 ID를 사용하도록 변경된 것이 확인됩니다. 이는 PR의 전체적인 리팩토링 방향과 일치합니다.


81-81: ID 기반 조회로의 변경이 적절합니다.

GPA 점수와 어학 점수 조회 메서드가 모두 일관되게 ID 기반으로 변경되었습니다.

Also applies to: 91-91

src/test/java/com/example/solidconnection/siteuser/service/MyPageServiceTest.java (2)

196-198: 테스트 코드가 도메인 변경사항에 맞게 업데이트되었습니다.

LikedUniversity 생성자가 엔티티 대신 ID를 받도록 변경된 것이 올바르게 반영되었습니다.


203-203: Repository 메서드명 변경이 일관성 있게 적용되었습니다.

countBySiteUser_Id에서 countBySiteUserId로의 변경이 적절합니다.

src/main/java/com/example/solidconnection/location/country/domain/Country.java (1)

26-33: 연관관계 제거가 적절하게 수행되었습니다.

Region 엔티티 참조가 regionCode 문자열로 올바르게 변경되었습니다.

src/main/java/com/example/solidconnection/siteuser/service/MyPageService.java (2)

43-43: Repository 메서드 호출이 ID 기반으로 변경되었습니다.

일관된 리팩토링 패턴이 적용되었습니다.


99-103: 코드 간소화가 잘 이루어졌습니다.

LikedUniversity를 거치지 않고 직접 UnivApplyInfo 리스트를 조회하도록 변경되어 더 효율적입니다.

src/test/java/com/example/solidconnection/university/service/UniversityLikeServiceTest.java (2)

64-66: 테스트 검증 로직이 ID 기반으로 올바르게 변경되었습니다.

Repository 메서드 호출이 도메인 변경사항과 일치하게 업데이트되었습니다.

Also applies to: 96-98


156-157: 헬퍼 메서드가 적절히 수정되었습니다.

LikedUniversity 생성 시 ID를 사용하도록 변경된 것이 올바릅니다.

src/main/java/com/example/solidconnection/application/domain/Application.java (2)

77-78: 엔티티 연관관계를 ID 기반으로 성공적으로 변경했습니다

  1. @ManyToOne SiteUser siteUser 필드를 long siteUserId로 변경
  2. 데이터베이스 컬럼 매핑이 올바르게 설정됨
  3. 기존 인덱스가 이미 site_user_id 컬럼을 참조하고 있어 일관성이 유지됨

이 변경으로 JPA 연관관계의 복잡성이 줄어들고 쿼리 성능이 향상될 것으로 예상됩니다.


85-85: 생성자 로직이 올바르게 업데이트되었습니다

  1. 모든 생성자에서 siteUser.getId()를 사용하여 ID 추출
  2. 엔티티 객체 대신 ID 값만 저장하도록 일관되게 변경
  3. 기존 SiteUser 매개변수는 유지하여 호출부 변경을 최소화

생성자 시그니처를 유지하면서 내부 로직만 변경한 것이 좋은 접근입니다.

Also applies to: 103-103, 124-124

src/main/java/com/example/solidconnection/score/domain/LanguageTestScore.java (1)

41-41: 엔티티 연관관계 제거가 일관되게 적용되었습니다

  1. SiteUser siteUser 필드를 long siteUserId로 변경
  2. 생성자에서 siteUser.getId()를 사용하여 ID 추출
  3. 양방향 연관관계 관리 로직 제거로 도메인 모델 단순화

Application 도메인과 동일한 패턴으로 리팩토링되어 일관성이 확보되었습니다.

Also applies to: 46-46

src/main/java/com/example/solidconnection/university/service/UniversityLikeService.java (2)

20-20: 서비스 레이어가 ID 기반 쿼리로 올바르게 업데이트되었습니다

  1. 새로운 에러 코드 UNIVERSITY_INFO_FOR_APPLY_NOT_FOUND 추가
  2. existsBySiteUserIdAndUnivApplyInfoId로 중복 체크 로직 변경
  3. 대학교 존재 여부 검증 로직 추가로 안정성 향상

ID 기반 검증으로 변경하면서 데이터 무결성 체크가 강화된 점이 좋습니다.

Also applies to: 40-40, 44-46


49-50: 도메인 객체 생성과 조회 로직이 일관되게 변경되었습니다

  1. LikedUniversity.builder()에서 ID 필드 사용
  2. 모든 조회 메서드가 ID 기반 파라미터로 변경
  3. 엔티티 참조 대신 ID 값으로 통일

리포지토리 메서드 호출이 모두 ID 기반으로 일관되게 변경되어 유지보수성이 향상되었습니다.

Also applies to: 65-65, 80-80

src/main/java/com/example/solidconnection/score/repository/GpaScoreRepository.java (1)

9-9: 리포지토리 인터페이스가 ID 기반 쿼리로 완전히 전환되었습니다

  1. List 임포트 추가로 새로운 메서드 지원
  2. findGpaScoreBySiteUserfindGpaScoreBySiteUserId로 변경
  3. findGpaScoreBySiteUserAndIdfindGpaScoreBySiteUserIdAndId로 변경
  4. 새로운 findBySiteUserId 메서드 추가로 조회 기능 확장

메서드 시그니처가 모두 ID 기반으로 일관되게 변경되어 도메인 모델 리팩토링과 완벽하게 일치합니다.

Also applies to: 15-15, 17-18

src/main/java/com/example/solidconnection/university/domain/UnivApplyInfo.java (1)

14-14: JPA 연관관계 설정이 최적화되었습니다

  1. CascadeType 임포트 추가
  2. languageRequirementscascade = CascadeType.ALLorphanRemoval = true 추가
  3. university 필드의 fetch 타입을 LAZY로 변경

변경사항별 효과:
• Cascade 설정으로 자식 엔티티 생명주기 관리 자동화
• OrphanRemoval로 고아 객체 자동 삭제
• LAZY 로딩으로 불필요한 즉시 로딩 방지하여 성능 향상

엔티티 생명주기 관리와 성능 최적화가 동시에 개선된 좋은 변경입니다.

Also applies to: 80-80, 83-83

src/main/java/com/example/solidconnection/university/domain/LikedUniversity.java (1)

27-31: primitive long 타입 사용에 대한 검토

  1. univApplyInfoIdsiteUserId가 primitive long 타입으로 선언되어 있습니다
  2. 이는 null 값을 허용하지 않아 기본값 0을 가지게 됩니다
  3. 만약 nullable이 필요하다면 Long wrapper 타입 사용을 고려해 주세요

현재 구조에서는 ID가 항상 존재해야 하므로 primitive 타입이 적절해 보입니다.

src/main/java/com/example/solidconnection/location/region/domain/InterestedRegion.java (1)

24-32: 리팩토링이 잘 수행되었습니다

변경사항:

  1. 엔티티 참조를 ID 필드로 적절히 변경
  2. 생성자에서 ID만 추출하여 저장하는 방식이 깔끔합니다
  3. @Column 애노테이션으로 컬럼명을 명시한 것이 좋습니다
src/main/java/com/example/solidconnection/university/repository/UniversityInfoForApplyRepository.java (1)

33-48: 쿼리 리팩터링이 올바르게 적용되었습니다

다음과 같은 변경사항들이 확인됩니다:

  1. 메서드 시그니처 개선: SiteUser 엔티티 파라미터가 Long siteUserId로 변경되어 연관관계 제거 목표에 부합합니다
  2. 쿼리 로직 변경: 기존 JOIN 방식에서 서브쿼리 방식으로 변경하여 InterestedCountryInterestedRegion의 ID 기반 필드를 직접 활용합니다
  3. 일관성 확보: 다른 리포지토리들과 동일한 패턴으로 ID 기반 쿼리를 구현했습니다

다만 서브쿼리 방식으로 변경된 만큼 성능 테스트를 통해 기존 JOIN 방식 대비 성능 영향을 확인해보시는 것을 권장합니다.

</review_comment_end>

src/main/java/com/example/solidconnection/location/country/domain/InterestedCountry.java (3)

4-4: import 문 최적화가 적용되었습니다

개별 import에서 wildcard import로 변경되어 코드가 더 간결해졌습니다.


24-28: 연관관계 제거가 올바르게 구현되었습니다

다음과 같은 변경사항들이 확인됩니다:

  1. SiteUser 연관관계 제거: @ManyToOne SiteUser siteUser@Column long siteUserId
  2. Country 연관관계 제거: @ManyToOne Country country@Column String countryCode
  3. 컬럼 매핑 유지: 기존 테이블 스키마와 호환되는 컬럼명 사용

이 변경으로 JPA 연관관계 복잡성이 제거되고 더 단순한 구조가 되었습니다.


30-33: 생성자 로직이 정확하게 구현되었습니다

생성자에서 엔티티 객체로부터 ID 값을 추출하여 필드에 저장하는 방식으로 변경되었습니다:

  1. SiteUser ID 추출: siteUser.getId()로 사용자 ID 획득
  2. Country Code 추출: country.getCode()로 국가 코드 획득

이 방식으로 기존 API 호환성을 유지하면서도 내부적으로는 ID만 저장하게 됩니다.

src/main/java/com/example/solidconnection/application/repository/ApplicationRepository.java (3)

32-33: 쿼리 최적화가 적용되었습니다

JOIN FETCH a.siteUser 구문이 제거되어 불필요한 연관 엔티티 로딩이 제거되었습니다. Application 엔티티가 이제 siteUserId 필드를 직접 가지므로 이 변경이 적절합니다.


38-42: 메서드 시그니처가 일관성 있게 변경되었습니다

다음과 같은 개선사항들이 확인됩니다:

  1. 메서드명 변경: findBySiteUserAndTermfindBySiteUserIdAndTerm
  2. 파라미터 타입 변경: SiteUserLong siteUserId
  3. 쿼리 조건 변경: a.siteUserId = :siteUserId로 직접 ID 비교

ID 기반 쿼리로 변경되어 더 효율적이고 명확한 코드가 되었습니다.


44-45: default 메서드가 일관성 있게 업데이트되었습니다

getApplicationBySiteUserIdAndTerm 메서드명과 내부 호출이 새로운 repository 메서드와 일치하도록 올바르게 변경되었습니다.

src/main/java/com/example/solidconnection/score/repository/LanguageTestScoreRepository.java (1)

10-10: 필요한 import가 추가되었습니다

새로 추가된 findBySiteUserId 메서드의 반환 타입을 위해 List import가 추가되었습니다.

src/main/java/com/example/solidconnection/siteuser/repository/LikedUniversityRepository.java (4)

7-8: 새로운 JPQL 쿼리를 위한 import가 추가되었습니다

@Query@Param 어노테이션 사용을 위해 필요한 import들이 올바르게 추가되었습니다.


15-17: 기존 메서드들이 ID 기반으로 일관성 있게 변경되었습니다

다음과 같은 개선사항들이 확인됩니다:

  1. 메서드명 정리: findAllBySiteUser_IdfindAllBySiteUserId (underscore 제거)
  2. 파라미터 타입 통일: 모두 long siteUserId 사용

Spring Data JPA의 네이밍 컨벤션에 더 적합한 형태로 변경되었습니다.


19-19: 메서드 시그니처가 올바르게 변경되었습니다

findBySiteUserAndUnivApplyInfo에서 findBySiteUserIdAndUnivApplyInfoId로 변경되어 두 ID 기반 조회가 가능해졌습니다.


20-26: 효율적인 JPQL 쿼리가 추가되었습니다

새로운 findUnivApplyInfosBySiteUserId 메서드의 구현이 우수합니다:

  1. 직접 조회: UnivApplyInfo 엔티티를 직접 반환하여 매핑 로직 단순화
  2. 효율적인 JOIN: LikedUniversity와의 JOIN을 통한 정확한 데이터 조회
  3. 명확한 조건: siteUserId 기반 필터링

이 메서드로 MyPageService 등에서 더 간단한 로직 구현이 가능할 것입니다.

lsy1307 added 2 commits July 1, 2025 19:57
- 연관관계 변경에 따른 transaction 문제 해결
- 쿼리 일부 수정, 테스트 코드 일부 수정
- GeneralUniversityRecommendService 로직 수정
- ScoreService에서 siteUser정보를 다시 불러오는 로직 삭제
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

🧹 Nitpick comments (1)
src/main/java/com/example/solidconnection/university/service/GeneralUniversityRecommendService.java (1)

28-35: 지연 로딩 초기화 로직 성능 개선 제안

현재 각 대학교별로 개별적으로 연관관계를 초기화하고 있어 N+1 문제가 발생할 수 있습니다.

-        universities.forEach(univ -> {
-            Hibernate.initialize(univ.getLanguageRequirements());
-            Hibernate.initialize(univ.getUniversity());
-            if (univ.getUniversity() != null) {
-                Hibernate.initialize(univ.getUniversity().getCountry());
-                Hibernate.initialize(univ.getUniversity().getRegion());
-            }
-        });

레포지토리 레벨에서 fetch join을 사용하는 방식도 고려해보시기 바랍니다:

// Repository 메서드 예시
@Query("SELECT u FROM UnivApplyInfo u " +
       "LEFT JOIN FETCH u.languageRequirements " +
       "LEFT JOIN FETCH u.university univ " +
       "LEFT JOIN FETCH univ.country " +
       "LEFT JOIN FETCH univ.region " +
       "WHERE u.term = :term " +
       "ORDER BY RANDOM()")
List<UnivApplyInfo> findRandomByTermWithFetch(@Param("term") String term, Pageable pageable);
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between b6037ab and df10149.

📒 Files selected for processing (5)
  • src/main/java/com/example/solidconnection/university/repository/UniversityInfoForApplyRepository.java (2 hunks)
  • src/main/java/com/example/solidconnection/university/repository/custom/UniversityFilterRepositoryImpl.java (2 hunks)
  • src/main/java/com/example/solidconnection/university/service/GeneralUniversityRecommendService.java (2 hunks)
  • src/test/java/com/example/solidconnection/university/service/GeneralUniversityRecommendServiceTest.java (0 hunks)
  • src/test/java/com/example/solidconnection/university/service/UniversityRecommendServiceTest.java (2 hunks)
💤 Files with no reviewable changes (1)
  • src/test/java/com/example/solidconnection/university/service/GeneralUniversityRecommendServiceTest.java
🚧 Files skipped from review as they are similar to previous changes (2)
  • src/main/java/com/example/solidconnection/university/repository/UniversityInfoForApplyRepository.java
  • src/main/java/com/example/solidconnection/university/repository/custom/UniversityFilterRepositoryImpl.java
🔇 Additional comments (3)
src/test/java/com/example/solidconnection/university/service/UniversityRecommendServiceTest.java (2)

138-144: 관심사 미설정 사용자 테스트 로직 개선 확인

  1. 개인 추천과 일반 추천을 별도로 호출하여 비교하는 방식으로 변경

    • 기존 캐시된 리스트 방식에서 동적 조회 방식으로의 변경을 잘 반영
    • containsExactlyInAnyOrderElementsOf() 사용으로 순서에 관계없이 내용 비교 가능
  2. 테스트 의도가 명확해짐

    • 관심사가 없는 사용자는 일반 추천과 동일한 결과를 받아야 한다는 비즈니스 로직 검증

변경된 테스트 로직이 리팩토링 목표와 잘 부합합니다.


156-157: 일반 추천 테스트 검증 방식 개선

  1. 기존의 정확한 리스트 매칭에서 속성 기반 검증으로 변경

    • allMatch(univ -> univ.id() > 0): 유효한 ID 보장
    • allMatch(univ -> univ.koreanName() != null): 한국어 이름 필드 존재 확인
  2. 동적 조회 방식에 더 적합한 테스트 방식

    • 캐시된 고정 리스트가 아닌 동적 조회 결과의 품질 검증
    • 테스트의 안정성과 유연성 향상

속성 기반 검증으로 변경하여 동적 조회 방식에 더 적합한 테스트가 되었습니다.

src/main/java/com/example/solidconnection/university/service/GeneralUniversityRecommendService.java (1)

24-38: 동적 조회 방식으로의 리팩토링 구현 검토

  1. 트랜잭션 관리 적절히 추가

    • @Transactional(readOnly = true): 읽기 전용 트랜잭션으로 성능 최적화
    • 지연 로딩 초기화를 위한 트랜잭션 컨텍스트 보장
  2. 지연 로딩 연관관계 명시적 초기화

    • Hibernate.initialize(univ.getLanguageRequirements()): 언어 요구사항 초기화
    • Hibernate.initialize(univ.getUniversity()): 대학교 정보 초기화
    • 중첩된 연관관계까지 초기화 (country, region)
  3. 안전한 null 체크 포함

    • if (univ.getUniversity() != null): NPE 방지

캐시 방식에서 동적 조회로의 전환이 올바르게 구현되었고, 지연 로딩 문제도 적절히 해결되었습니다.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 32cb72f and 3ca8f4e.

📒 Files selected for processing (20)
  • src/main/java/com/example/solidconnection/application/dto/ApplicantsResponse.java (1 hunks)
  • src/main/java/com/example/solidconnection/application/repository/ApplicationRepository.java (1 hunks)
  • src/main/java/com/example/solidconnection/application/service/ApplicationQueryService.java (2 hunks)
  • src/main/java/com/example/solidconnection/application/service/ApplicationSubmissionService.java (3 hunks)
  • src/main/java/com/example/solidconnection/siteuser/domain/SiteUser.java (0 hunks)
  • src/main/java/com/example/solidconnection/siteuser/service/MyPageService.java (3 hunks)
  • src/main/java/com/example/solidconnection/university/domain/LikedUnivApplyInfo.java (2 hunks)
  • src/main/java/com/example/solidconnection/university/repository/LikedUnivApplyInfoRepository.java (1 hunks)
  • src/main/java/com/example/solidconnection/university/repository/UnivApplyInfoRepository.java (2 hunks)
  • src/main/java/com/example/solidconnection/university/repository/custom/UnivApplyInfoFilterRepositoryImpl.java (2 hunks)
  • src/main/java/com/example/solidconnection/university/service/GeneralUnivApplyInfoRecommendService.java (2 hunks)
  • src/main/java/com/example/solidconnection/university/service/UnivApplyInfoLikeService.java (3 hunks)
  • src/main/java/com/example/solidconnection/university/service/UnivApplyInfoRecommendService.java (1 hunks)
  • src/main/resources/data.sql (1 hunks)
  • src/test/java/com/example/solidconnection/application/service/ApplicationSubmissionServiceTest.java (1 hunks)
  • src/test/java/com/example/solidconnection/siteuser/service/MyPageServiceTest.java (1 hunks)
  • src/test/java/com/example/solidconnection/university/repository/LikedUnivApplyInfoRepositoryTest.java (1 hunks)
  • src/test/java/com/example/solidconnection/university/service/GeneralUnivApplyInfoRecommendServiceTest.java (0 hunks)
  • src/test/java/com/example/solidconnection/university/service/UnivApplyInfoLikeServiceTest.java (3 hunks)
  • src/test/java/com/example/solidconnection/university/service/UnivApplyInfoRecommendServiceTest.java (2 hunks)
💤 Files with no reviewable changes (2)
  • src/test/java/com/example/solidconnection/university/service/GeneralUnivApplyInfoRecommendServiceTest.java
  • src/main/java/com/example/solidconnection/siteuser/domain/SiteUser.java
🚧 Files skipped from review as they are similar to previous changes (6)
  • src/test/java/com/example/solidconnection/application/service/ApplicationSubmissionServiceTest.java
  • src/main/java/com/example/solidconnection/application/service/ApplicationQueryService.java
  • src/main/java/com/example/solidconnection/application/service/ApplicationSubmissionService.java
  • src/test/java/com/example/solidconnection/siteuser/service/MyPageServiceTest.java
  • src/main/java/com/example/solidconnection/siteuser/service/MyPageService.java
  • src/main/java/com/example/solidconnection/application/repository/ApplicationRepository.java
🧰 Additional context used
🧬 Code Graph Analysis (1)
src/main/java/com/example/solidconnection/university/repository/UnivApplyInfoRepository.java (1)
src/main/java/com/example/solidconnection/university/repository/custom/UnivApplyInfoFilterRepositoryImpl.java (1)
  • Repository (20-114)
⏰ Context from checks skipped due to timeout of 90000ms (1)
  • GitHub Check: build
🔇 Additional comments (21)
src/main/resources/data.sql (1)

44-47: 데이터베이스 스키마 변경이 올바르게 적용되었습니다.

preparation_stage 컬럼명을 exchange_status로 변경한 것이 도메인 모델 리팩토링과 일치합니다. 값은 동일하게 유지되어 기존 데이터와의 호환성을 보장합니다.

src/test/java/com/example/solidconnection/university/repository/LikedUnivApplyInfoRepositoryTest.java (1)

82-87: 엔티티 생성 방식이 ID 기반으로 올바르게 변경되었습니다.

  1. 연관관계 제거: SiteUserUnivApplyInfo 엔티티 참조를 제거하고 ID 필드를 사용하도록 변경
  2. 일관성 유지: 도메인 모델의 리팩토링과 일치하는 변경사항

이 변경으로 엔티티 간 결합도가 낮아지고 테스트 코드가 더 간결해집니다.

src/test/java/com/example/solidconnection/university/service/UnivApplyInfoRecommendServiceTest.java (1)

136-157: 테스트 검증 방식이 더 유연하고 견고하게 개선되었습니다.

  1. 동적 검증: 정확한 매칭 대신 속성 기반 검증으로 변경

    • koreanName이 null이 아님을 확인
    • id가 양수임을 확인
    • term이 예상 값과 일치함을 확인
  2. 테스트 안정성: 하드코딩된 예상 결과에서 벗어나 서비스 로직 변화에 더 유연하게 대응

이러한 변경으로 캐시된 결과 대신 동적으로 생성되는 추천 데이터를 적절히 검증할 수 있습니다.

src/test/java/com/example/solidconnection/university/service/UnivApplyInfoLikeServiceTest.java (2)

64-66: 리포지토리 메서드 호출이 ID 기반으로 올바르게 변경되었습니다.

  1. 메서드 시그니처 변경: findBySiteUserAndUnivApplyInfo에서 findBySiteUserIdAndUnivApplyInfoId로 변경
  2. 매개변수 단순화: 엔티티 객체 대신 ID 값을 직접 전달

이 변경으로 리포지토리 계층의 의존성이 줄어들고 쿼리가 더 명확해집니다.

Also applies to: 96-98


154-160: 헬퍼 메서드가 새로운 도메인 모델 구조에 맞게 업데이트되었습니다.

  1. ID 기반 생성: 엔티티 참조 대신 siteUserIdunivApplyInfoId 필드 사용
  2. 일관성 확보: 도메인 엔티티의 리팩토링과 일치하는 변경

테스트 데이터 생성 방식이 실제 도메인 모델의 변경사항을 정확히 반영합니다.

src/main/java/com/example/solidconnection/university/service/UnivApplyInfoRecommendService.java (1)

39-40: 리포지토리 메서드 호출이 ID 기반으로 올바르게 수정되었습니다.

  1. 매개변수 변경: siteUser 엔티티 전체 대신 siteUser.getId()를 전달
  2. 일관성 유지: 리포지토리 인터페이스의 메서드 시그니처 변경과 일치
  3. 기능 보존: 추천 로직의 동작은 그대로 유지

이 변경으로 서비스 계층과 리포지토리 계층 간의 결합도가 낮아집니다.

src/main/java/com/example/solidconnection/university/service/UnivApplyInfoLikeService.java (4)

41-41: 1. 좋아요 중복 체크 로직 개선
엔티티 객체 대신 ID 기반 조회로 변경되어 불필요한 JOIN을 피할 수 있어 성능이 향상됩니다.


47-48: 2. LikedUnivApplyInfo 생성 방식 단순화
엔티티 참조 대신 ID 값을 직접 설정하도록 개선되었습니다. 이는 영속성 컨텍스트 관리 측면에서 더 효율적입니다.


61-61: 3. 좋아요 취소 로직 일관성 확보
좋아요 등록과 동일한 ID 기반 조회 방식으로 통일되어 코드 일관성이 향상되었습니다.


76-76: 4. 좋아요 상태 확인 로직 최적화
ID 기반 존재 여부 확인으로 변경되어 데이터베이스 쿼리가 더 효율적으로 실행됩니다.

src/main/java/com/example/solidconnection/university/service/GeneralUnivApplyInfoRecommendService.java (1)

26-29: 1. 추천 서비스 로직 단순화
사전 로딩 및 캐싱 방식에서 요청 시점 조회 방식으로 변경되었습니다.

장점:
- 코드 복잡성 감소
- 메모리 사용량 최적화
- 최신 데이터 보장

고려사항: 매 요청마다 DB 조회가 발생하므로 호출 빈도가 높다면 성능 모니터링이 필요할 수 있습니다.
src/main/java/com/example/solidconnection/university/domain/LikedUnivApplyInfo.java (1)

29-33: 1. 엔티티 연관관계 단순화 완료
@manytoone 연관관계를 제거하고 ID 필드로 대체한 변경사항이 올바르게 적용되었습니다.

개선점:
- N+1 쿼리 문제 방지
- 지연 로딩 관련 이슈 해결
- 영속성 컨텍스트 관리 단순화

테이블 제약조건의 컬럼명과 @Column 어노테이션이 일치하여 데이터 무결성이 보장됩니다.
src/main/java/com/example/solidconnection/university/repository/custom/UnivApplyInfoFilterRepositoryImpl.java (2)

43-43: 1. 지역 코드 필터링 쿼리 최적화
Region 엔티티와의 조인을 제거하고 Country 엔티티의 regionCode 필드를 직접 사용하도록 개선되었습니다.

Also applies to: 87-87


51-56: 2. regionCodeEq 메서드 효율성 향상
불필요한 Region 엔티티 조인을 제거하고 Country의 regionCode 필드로 직접 비교하여 쿼리 성능이 개선되었습니다.

변경 후 이점:
- 조인 연산 감소로 쿼리 성능 향상
- 쿼리 복잡도 단순화
- 동일한 기능을 더 효율적으로 수행
src/main/java/com/example/solidconnection/university/repository/LikedUnivApplyInfoRepository.java (3)

15-19: 1. 리포지토리 메서드 시그니처 일관성 확보
모든 조회 메서드가 엔티티 객체 대신 ID 기반 파라미터를 사용하도록 일관되게 변경되었습니다.

개선점:
- 메서드 호출 시 불필요한 엔티티 로딩 방지
- 파라미터 전달 단순화
- 코드 가독성 향상

20-26: 2. JPQL 쿼리 메서드 추가
사용자가 좋아요한 대학 지원 정보를 직접 조회할 수 있는 편의 메서드가 추가되었습니다.

쿼리 구조:
- 명시적 JOIN을 사용한 명확한 연관관계 표현
- 파라미터 바인딩을 통한 안전한 쿼리 실행
- 결과 타입이 명확하게 지정됨

28-28: 3. 존재 여부 확인 메서드 추가
ID 기반 좋아요 관계 존재 여부를 효율적으로 확인할 수 있는 메서드가 추가되어 서비스 계층에서 활용도가 높아졌습니다.

src/main/java/com/example/solidconnection/university/repository/UnivApplyInfoRepository.java (4)

13-13: 1. 새로운 import 추가 승인 ✓

Collectors import가 추가되었는데, 이는 아래 새로 추가된 findRandomByTerm 기본 메서드에서 사용되는 것으로 보입니다. 적절한 변경사항입니다.


41-56: 3. 랜덤 조회 메서드 개선된 2단계 접근법 승인 ✓

기존 단일 메서드 방식에서 2단계 접근법으로 개선되었습니다:

① `findAllRandomByTerm`: 데이터베이스 레벨에서 RAND() 함수를 사용한 랜덤 정렬
② `findRandomByTerm` 기본 메서드: Java 스트림으로 결과 제한

이 접근법의 장점:

  • 데이터베이스에서 효율적인 랜덤 정렬 활용
  • 필요한 만큼만 메모리로 가져오는 지연 로딩 패턴
  • 모든 연관 엔티티에 대한 eager fetching으로 N+1 문제 해결

구현이 깔끔하고 성능상 이점이 명확합니다.


66-69: 4. ID 목록 기반 조회 메서드 조인 방식 개선 ✓

모든 조인이 LEFT JOIN FETCH로 변경되어 일관성 있는 데이터 조회가 보장됩니다:

① 이전: 일부 INNER JOIN 사용으로 연관 데이터 누락 가능성
② 현재: 모든 LEFT JOIN FETCH로 완전한 데이터 조회 보장
③ 성능: eager fetching으로 N+1 문제 방지

전체 repository의 조회 패턴이 일관되게 개선되었습니다.


20-39: 2. 사용자 관심 국가/지역 기반 조회 메서드 리팩토링 검토 완료 ✅
스크립트 실행 결과, InterestedCountry와 InterestedRegion 엔티티 모두 siteUserId 필드를 올바르게 사용하고 있음을 확인했습니다.

변경사항 요약:

  1. 메서드 시그니처 변경
    • SiteUser 대신 Long siteUserId 파라미터로 수정하여 PR 목표 달성
  2. 쿼리 최적화
    • 모든 연관관계에 LEFT JOIN FETCH 적용으로 N+1 문제 해결
    • 서브쿼리에서 siteUserId 기반 직접 조회로 성능 향상
  3. 중복 제거 보장
    • DISTINCT 키워드로 결과 중복을 확실히 방지

위 검증으로 추가 수정 없이 바로 머지하셔도 무방합니다.

Copy link
Contributor

@Gyuhyeok99 Gyuhyeok99 left a comment

Choose a reason for hiding this comment

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

고생하셨습니다! 혹시 수연님도 도메인쪽 수정 시 name을 붙인 것과 안붙인 것은 오류나는 것과 안나는 것으로 구분하신건가요?

@lsy1307
Copy link
Contributor Author

lsy1307 commented Jul 3, 2025

고생하셨습니다! 혹시 수연님도 도메인쪽 수정 시 name을 붙인 것과 안붙인 것은 오류나는 것과 안나는 것으로 구분하신건가요?

맞습니당!

Copy link
Member

@whqtker whqtker left a comment

Choose a reason for hiding this comment

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

일일히 연관 관계 끊는게 쉬운 일이 아닌데, 정말 고생하셨습니다 ..! 문제가 되는 부분은 없는 거 같아 approve합니다 !

Copy link
Collaborator

@nayonsoso nayonsoso left a comment

Choose a reason for hiding this comment

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

분량이 많았을텐데 수고 많으셨습니다!!!🥹


회의에서 결정된 내용을 기반으로 하였으나 university와 region, country의 연관관계는 리팩토링 과정에서 서비스 로직상 복잡해질 가능성이 매우 높아 유지하는 것이 좋겠다고 판단, 선제적으로 유지하였습니다. 추후 논의가 필요해 보입니다.

적절한 판단이라 생각합니다. 보니까 univApplyInfo & university & country & region 을 함께 조회하는 곳이 3군데나 있네요. 조회의 편의를 위해 연관관계 유지하는게 좋겠습니다!

다른 도메인은 모두 생성자의 parameter도 수정하였으나 siteUser같은 경우 연결된 코드가 많고 Id만을 사용하는 것이 아닌 Header에서 객체 형태로 추출하는 형태도 다수 존재하므로 생성자에서 받아온 SiteUser객체의 id를 추출하는 형식으로 구현하는 것이 기존 코드 호환성에서 더 낫다고 판단하였습니다.

이 부분에 대해서는 제가 설명을 드려야 할게 있는게,

Header에서 객체 형태로 추출하는 형태

이건 리팩터링 대상입니다..
도메인이 컨트롤러까지 올라가서 사용되는게 DIP 위반의 안티패턴이라 생각되어 바꿀예정이었어요😓 (#299)
컨트롤러나 서비스 코드에서 SiteUser 객체 자체를 함수 파라미터로 받는 곳이 많아서, 기존 코드와의 조화를 고려하여 그런 결정을 하신거라면 안그러셔도 될 것 같습니다. (제가 리팩터링을 빨리 못해서 혼란을 드린 점, 죄송합니다 ㅠ)

lsy1307 added 2 commits July 8, 2025 20:39
- Long타입 long으로 수정
- collect -> toList단독으로 변경
- 컨벤션 수정
- Recomment 변경사항 원복
- getGeneralRecommendsExcludingSelected함수 OutOfRange 방지 추가
Copy link
Collaborator

@nayonsoso nayonsoso left a comment

Choose a reason for hiding this comment

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

연관관계 관련하여 중요한 내용이 있어 RC 드립니다~
그리고 "리뷰 반영"을 하나의 커밋에서 하셨더라고요... 🥺
그렇게 하면 리뷰하는 입장에서 무엇이 어떻게 반영되었는지 파악하기 어렵고,
이 과정에서 실수가 나올 수 있으니, 커밋을 더 작게 작성해주시면 좋겠습니다!


❗️❗️❗️
지난 회의 때 GpaScore랑 InterestedCountry와 같은 도메인의 생성자에서
SiteUser 객체 대신 long siteUserId로 받기로 얘기했던 걸로 기억하는데,
이 변경 작업은 이번 PR이 아니라 다른 PR에서 진행하실 예정인가요?
리뷰 반영 코멘트에는 관련 내용이 보이지 않아서요~

답변 부탁드립니다! 🙇🏻‍♀️

Comment on lines 80 to 83
@OneToMany(mappedBy = "univApplyInfo", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER)
private Set<LanguageRequirement> languageRequirements = new HashSet<>();

@ManyToOne(fetch = FetchType.EAGER)
Copy link
Collaborator

Choose a reason for hiding this comment

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

Suggested change
@OneToMany(mappedBy = "univApplyInfo", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER)
private Set<LanguageRequirement> languageRequirements = new HashSet<>();
@ManyToOne(fetch = FetchType.EAGER)
@OneToMany(mappedBy = "univApplyInfo", cascade = CascadeType.ALL, orphanRemoval = true)
private Set<LanguageRequirement> languageRequirements = new HashSet<>();
@ManyToOne(fetch = FetchType.LAZY)
private University university;

회의에서 연관관계는 기본적으로 LAZY로 설정하기로 했었습니다~
회의에서 결정된 코드

그런데 추천 대학 서비스 원복하시다가 이것까지 포함해서 원복하신 것 같아요.
LAZY로 변경해주세요~
(OneToMany는 디폴트로 LAZY이므로 생략해도 될 것 같습니다.)

Copy link
Contributor Author

Choose a reason for hiding this comment

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

이 부분 반영하였습니다!

int needed = RECOMMEND_UNIV_APPLY_INFO_NUM - alreadyPicked.size();
return generalRecommend.subList(0, Math.min(needed, generalRecommend.size()));
}

Copy link
Collaborator

Choose a reason for hiding this comment

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

61번 라인 개행해주세요!

Copy link
Contributor Author

Choose a reason for hiding this comment

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

수정하였습니다!

@nayonsoso nayonsoso changed the title refactor: community 도메인 제외 연관관계 삭제 refactor: Community 도메인 제외 연관관계 삭제 Jul 9, 2025
- UnivApplyInfo University fetchType LAZY로 변경
- 컨벤션 수정
- findRandomByTerm함수 nativeQuery제거 및 Pageable로 LIMIT 구현
@lsy1307
Copy link
Contributor Author

lsy1307 commented Jul 9, 2025

연관관계 관련하여 중요한 내용이 있어 RC 드립니다~ 그리고 "리뷰 반영"을 하나의 커밋에서 하셨더라고요... 🥺 그렇게 하면 리뷰하는 입장에서 무엇이 어떻게 반영되었는지 파악하기 어렵고, 이 과정에서 실수가 나올 수 있으니, 커밋을 더 작게 작성해주시면 좋겠습니다!

확인하였습니다! 다음 PR부터는 좀 더 분리하겠습니다

❗️❗️❗️ 지난 회의 때 GpaScore랑 InterestedCountry와 같은 도메인의 생성자에서 SiteUser 객체 대신 long siteUserId로 받기로 얘기했던 걸로 기억하는데, 이 변경 작업은 이번 PR이 아니라 다른 PR에서 진행하실 예정인가요? 리뷰 반영 코멘트에는 관련 내용이 보이지 않아서요~

이 부분은 추가 PR에 반영하겠습니다!

lsy1307 added 2 commits July 9, 2025 23:04
- siteUser -> siteUserId로 변경
- Long -> long으로 변경
@lsy1307 lsy1307 force-pushed the refactor/358-refactor-delete-relationship branch from 2dbb1ad to fbd6c97 Compare July 9, 2025 14:11
Copy link
Collaborator

@nayonsoso nayonsoso left a comment

Choose a reason for hiding this comment

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

확인했습니다 😊
정말 수고 많으셨어요!!

@lsy1307 lsy1307 merged commit bfa7ba7 into solid-connection:develop Jul 10, 2025
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

refactor: 일부 연관관계 매핑 제거/수정 (Community 제외)

4 participants