Skip to content

feat: 어드민 국가 crud 추가#656

Merged
whqtker merged 2 commits intosolid-connection:developfrom
Gyuhyeok99:feat/584-admin-country
Mar 8, 2026
Merged

feat: 어드민 국가 crud 추가#656
whqtker merged 2 commits intosolid-connection:developfrom
Gyuhyeok99:feat/584-admin-country

Conversation

@Gyuhyeok99
Copy link
Contributor

관련 이슈

작업 내용

어드민 국가 관련 crud 기능을 추가했습니다.

특이 사항

리뷰 요구사항 (선택)

@coderabbitai
Copy link

coderabbitai bot commented Feb 14, 2026

Walkthrough

이 변경사항은 국가 관리를 위한 완전한 어드민 기능을 추가합니다. 다음과 같이 구성되어 있습니다:

  1. REST 컨트롤러 계층: 국가 조회, 생성, 수정, 삭제를 위한 CRUD 엔드포인트를 제공하는 AdminCountryController 추가
  2. 데이터 전송 객체: 요청/응답 처리를 위한 AdminCountryCreateRequest, AdminCountryUpdateRequest, AdminCountryResponse DTO 생성
  3. 비즈니스 로직 계층: 트랜잭션 관리, 유효성 검증(코드 중복성, 한글명 중복성, 지역 존재 여부), 에러 처리를 포함하는 AdminCountryService 구현
  4. 도메인 엔티티 확장: Country 엔티티에 updateKoreanName, updateRegionCode 메서드 추가
  5. 에러 코드: COUNTRY_ALREADY_EXISTS 에러 코드 추가
  6. 테스트 커버리지: 전체 CRUD 시나리오와 에러 케이스에 대한 포괄적인 테스트 작성

.gitignore에 .serena/ 디렉토리 무시 설정도 함께 포함되어 있습니다.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Suggested reviewers

  • wibaek
  • whqtker
  • Hexeong
  • lsy1307
🚥 Pre-merge checks | ✅ 5 | ❌ 1
❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed 풀 리퀘스트 제목은 어드민 국가 CRUD 추가라는 주요 변경사항을 명확하고 간결하게 요약하고 있습니다.
Description check ✅ Passed 풀 리퀘스트 설명은 필수 섹션인 '관련 이슈'와 '작업 내용'을 포함하고 있으며, 이슈 #584를 명시하고 어드민 국가 CRUD 기능 추가를 설명합니다.
Linked Issues check ✅ Passed 풀 리퀘스트의 모든 코드 변경사항(컨트롤러, DTO, 서비스, 엔티티, 테스트)은 이슈 #584에서 명시한 'country 관련 관리 기능 추가' 목표를 충족합니다.
Out of Scope Changes check ✅ Passed 모든 변경사항은 어드민 국가 CRUD 구현과 직접 관련되어 있으며, .gitignore의 Serena 섹션 추가는 프로젝트 설정으로 적절합니다.
Merge Conflict Detection ✅ Passed ✅ No merge conflicts detected when merging into develop

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

Tip

Issue Planner is now in beta. Read the docs and try it out! Share your feedback on Discord.


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

Comment @coderabbitai help to get the list of available commands and usage tips.

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: 2

🤖 Fix all issues with AI agents
In
`@src/main/java/com/example/solidconnection/admin/location/country/service/AdminCountryService.java`:
- Around line 92-98: Add referential-integrity checks before deleting a Country:
add a method in HostUniversityRepository like existsByCountry_Code(String code)
(or similar) to detect any HostUniversity referencing the country; implement a
validateNoReferences(String code) helper in AdminCountryService that uses that
repository method and throws the same CustomException (with an appropriate
ErrorCode, e.g., ErrorCode.COUNTRY_STILL_REFERENCED) following the pattern used
in AdminHostUniversityService; finally, call validateNoReferences(code) at the
start of deleteCountry(String code) before fetching/deleting the Country to
prevent DataIntegrityViolationException.

In
`@src/test/java/com/example/solidconnection/admin/location/country/service/AdminCountryServiceTest.java`:
- Around line 215-237: The delete flow lacks a pre-delete reference check for
HostUniversity references; update AdminCountryService.deleteCountry to call a
validation method (reuse or mirror
AdminHostUniversityService.validateNoReferences semantics) that queries
HostUniversityRepository for any entities referencing the Country and throws new
CustomException(ErrorCode.COUNTRY_HAS_REFERENCES) if any exist, then proceed
with deletion only if validation passes; also add a unit test in
AdminCountryServiceTest (in the 국가_삭제 nested class) that sets up a
HostUniversity referencing the Country and asserts that calling
adminCountryService.deleteCountry(...) throws CustomException with
ErrorCode.COUNTRY_HAS_REFERENCES, keeping the existing success and not-found
tests.
🧹 Nitpick comments (2)
src/main/java/com/example/solidconnection/location/country/domain/Country.java (1)

32-39: koreanName 변경 시 equals/hashCode 계약 위반 가능성이 있습니다.

Line 12의 @EqualsAndHashCode(of = {"code", "koreanName"})koreanName이 포함되어 있는데, updateKoreanName으로 해당 필드를 변경하면 HashSet이나 HashMap 키로 사용될 경우 동작이 깨질 수 있습니다.

@EqualsAndHashCode에서 koreanName을 제거하고 불변 식별자인 code만 사용하는 것을 권장합니다.

♻️ 수정 제안
-@EqualsAndHashCode(of = {"code", "koreanName"})
+@EqualsAndHashCode(of = {"code"})
src/test/java/com/example/solidconnection/admin/location/country/service/AdminCountryServiceTest.java (1)

118-118: 테스트 데이터의 국가 코드가 실제 제약 조건과 불일치합니다.

"NEW_CODE"는 8자이지만, Country 엔티티의 @Column(length = 2)AdminCountryCreateRequest@Size(min = 2, max = 2) 제약과 맞지 않습니다. 현재 테스트는 koreanName 중복 검증이 먼저 실패하므로 통과하지만, 실제 도메인 규칙에 부합하는 코드(예: "NW")를 사용하면 테스트의 의도가 더 명확해집니다.

♻️ 수정 제안
-            AdminCountryCreateRequest request = new AdminCountryCreateRequest("NEW_CODE", "일본", region.getCode());
+            AdminCountryCreateRequest request = new AdminCountryCreateRequest("NW", "일본", region.getCode());

Comment on lines +92 to +98
@Transactional
public void deleteCountry(String code) {
Country country = countryRepository.findByCode(code)
.orElseThrow(() -> new CustomException(ErrorCode.COUNTRY_NOT_FOUND));

countryRepository.delete(country);
}
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# 1. Country를 참조하는 엔티티 찾기
echo "=== Country 참조 엔티티 검색 ==="
rg -n 'private Country|@ManyToOne.*Country|@JoinColumn.*country' --type=java -g '!*Test*' | head -20

# 2. AdminCountryService의 전체 구조 확인
echo -e "\n=== AdminCountryService 구조 ==="
rg -n 'class AdminCountryService|public void|private' src/main/java/com/example/solidconnection/admin/location/country/service/AdminCountryService.java | head -30

# 3. 예외 처리 패턴 확인
echo -e "\n=== DataIntegrityViolationException 처리 ==="
rg -n 'DataIntegrityViolationException|catch.*Exception' --type=java -g '!*Test*' | grep -i country

# 4. HOST_UNIVERSITY_HAS_REFERENCES 사용 위치
echo -e "\n=== HOST_UNIVERSITY_HAS_REFERENCES 검색 ==="
rg -n 'HOST_UNIVERSITY_HAS_REFERENCES' --type=java

Repository: solid-connection/solid-connect-server

Length of output: 1845


🏁 Script executed:

#!/bin/bash
# 1. HostUniversity 엔티티의 Country 관계 설정 확인
echo "=== HostUniversity 엔티티 구조 ==="
sed -n '50,70p' src/main/java/com/example/solidconnection/university/domain/HostUniversity.java

# 2. AdminHostUniversityService의 deleteHostUniversity 메서드 구현
echo -e "\n=== AdminHostUniversityService deleteHostUniversity 메서드 ==="
rg -n 'public void deleteHostUniversity|private void validateHostUniversity' -A 15 src/main/java/com/example/solidconnection/admin/university/service/AdminHostUniversityService.java | head -50

# 3. Country 엔티티의 정의와 cascade 설정
echo -e "\n=== Country 엔티티 정의 ==="
cat -n src/main/java/com/example/solidconnection/common/domain/Country.java

# 4. UnivApplyInfo 또는 다른 엔티티에서 Country 참조 여부 확인
echo -e "\n=== UnivApplyInfo와 Country 관계 ==="
rg -n 'Country' src/main/java/com/example/solidconnection/university/domain/UnivApplyInfo.java | head -10

Repository: solid-connection/solid-connect-server

Length of output: 1457


🏁 Script executed:

#!/bin/bash
# 1. Country 엔티티 파일 위치 찾기
echo "=== Country 엔티티 파일 검색 ==="
find . -name 'Country.java' -type f | grep -v target | head -5

# 2. CountryRepository 메서드 확인
echo -e "\n=== CountryRepository 구조 ==="
cat -n src/main/java/com/example/solidconnection/common/repository/CountryRepository.java

# 3. HostUniversityRepository에서 Country 참조 확인 메서드
echo -e "\n=== HostUniversityRepository 메서드 ==="
rg -n 'existsByCountry|countByCountry|findByCountry' src/main/java/com/example/solidconnection/university/repository/HostUniversityRepository.java

# 4. AdminCountryService 전체 코드
echo -e "\n=== AdminCountryService 전체 ==="
cat -n src/main/java/com/example/solidconnection/admin/location/country/service/AdminCountryService.java

Repository: solid-connection/solid-connect-server

Length of output: 5027


🏁 Script executed:

#!/bin/bash
# 1. 모든 Repository 파일 찾기
echo "=== Repository 파일 위치 ==="
find . -name '*Repository.java' -path '*/repository/*' -type f | grep -E 'Country|HostUniversity'

# 2. Country 엔티티 구조
echo -e "\n=== Country 엔티티 ==="
cat -n src/main/java/com/example/solidconnection/location/country/domain/Country.java

# 3. HostUniversityRepository 내용
echo -e "\n=== HostUniversityRepository 메서드들 ==="
rg -n 'interface HostUniversityRepository|boolean exists|List<' src/main/java/com/example/solidconnection/university/repository/HostUniversityRepository.java

Repository: solid-connection/solid-connect-server

Length of output: 1971


🏁 Script executed:

#!/bin/bash
# 1. HostUniversityRepository 전체 내용
echo "=== HostUniversityRepository 전체 ==="
cat -n src/main/java/com/example/solidconnection/university/repository/HostUniversityRepository.java

# 2. CountryRepository 전체 내용
echo -e "\n=== CountryRepository 전체 ==="
cat -n src/main/java/com/example/solidconnection/location/country/repository/CountryRepository.java

# 3. HostUniversityFilterRepository에서 Country 관련 메서드
echo -e "\n=== HostUniversityFilterRepository ==="
rg -n 'Country|country' src/main/java/com/example/solidconnection/university/repository/custom/HostUniversityFilterRepository.java

Repository: solid-connection/solid-connect-server

Length of output: 2275


🏁 Script executed:

#!/bin/bash
# HostUniversityFilterRepository 전체 내용
echo "=== HostUniversityFilterRepository 전체 ==="
cat -n src/main/java/com/example/solidconnection/university/repository/custom/HostUniversityFilterRepository.java

Repository: solid-connection/solid-connect-server

Length of output: 690


Country 삭제 시 참조 무결성 검증을 추가하세요.

HostUniversity가 Country를 참조하고 있으므로, 삭제 전 다음 사항을 처리해야 합니다:

  1. HostUniversityRepository에 참조 확인 메서드 추가
    현재는 Country를 참조하는 HostUniversity를 확인할 방법이 없습니다.

  2. AdminCountryService에 validateNoReferences 메서드 구현
    AdminHostUniversityService의 삭제 로직을 참고하여 동일한 패턴을 적용하세요. 해당 Country를 참조하는 HostUniversity가 존재하면 예외를 발생시켜야 합니다.

  3. deleteCountry 메서드 수정
    실제 삭제 전에 validateNoReferences()를 호출하여 참조 여부를 검증하세요. 검증 없이 진행하면 DataIntegrityViolationException이 발생할 수 있습니다.

🤖 Prompt for AI Agents
In
`@src/main/java/com/example/solidconnection/admin/location/country/service/AdminCountryService.java`
around lines 92 - 98, Add referential-integrity checks before deleting a
Country: add a method in HostUniversityRepository like
existsByCountry_Code(String code) (or similar) to detect any HostUniversity
referencing the country; implement a validateNoReferences(String code) helper in
AdminCountryService that uses that repository method and throws the same
CustomException (with an appropriate ErrorCode, e.g.,
ErrorCode.COUNTRY_STILL_REFERENCED) following the pattern used in
AdminHostUniversityService; finally, call validateNoReferences(code) at the
start of deleteCountry(String code) before fetching/deleting the Country to
prevent DataIntegrityViolationException.

Comment on lines +215 to +237
@Nested
class 국가_삭제 {

@Test
void 존재하는_국가를_삭제하면_성공한다() {
// given
Country country = countryFixture.미국();

// when
adminCountryService.deleteCountry(country.getCode());

// then
assertThat(countryRepository.findByCode(country.getCode())).isEmpty();
}

@Test
void 존재하지_않는_국가를_삭제하면_예외_응답을_반환한다() {
// when & then
assertThatCode(() -> adminCountryService.deleteCountry("NOT_EXIST"))
.isInstanceOf(CustomException.class)
.hasMessage(ErrorCode.COUNTRY_NOT_FOUND.getMessage());
}
}
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

# 1. Country 엔티티가 다른 엔티티에서 어떻게 참조되는지 확인
rg -n "class Country" --type=java -A 20 | head -40

Repository: solid-connection/solid-connect-server

Length of output: 4833


🏁 Script executed:

# 2. AdminCountryService의 deleteCountry 메서드 구현 확인
rg -n "deleteCountry" --type=java -B 2 -A 15

Repository: solid-connection/solid-connect-server

Length of output: 4776


🏁 Script executed:

# 3. HOST_UNIVERSITY_HAS_REFERENCES 에러 코드 확인
rg -n "HOST_UNIVERSITY_HAS_REFERENCES" --type=java -B 2 -A 2

Repository: solid-connection/solid-connect-server

Length of output: 3360


🏁 Script executed:

# 4. University 엔티티에서 Country 참조 확인
rg -n "@ManyToOne|@JoinColumn" --type=java -B 2 -A 2 | rg -A 5 -B 5 "country|Country" | head -50

Repository: solid-connection/solid-connect-server

Length of output: 958


🏁 Script executed:

# Country 관련 에러 코드가 이미 존재하는지 확인
rg -n "COUNTRY.*REFERENCE" --type=java

Repository: solid-connection/solid-connect-server

Length of output: 63


🏁 Script executed:

# Country를 참조하는 모든 엔티티 찾기
rg -n "@ManyToOne" --type=java -B 2 -A 2 | rg -B 5 -A 1 "Country"

Repository: solid-connection/solid-connect-server

Length of output: 709


🏁 Script executed:

# AdminCountryService 전체 코드 확인
cat -n src/main/java/com/example/solidconnection/admin/location/country/service/AdminCountryService.java

Repository: solid-connection/solid-connect-server

Length of output: 4688


Country 삭제 시 참조 무결성 검증 및 테스트 케이스를 추가해야 합니다.

현재 deleteCountry 메서드는 Country를 참조하는 HostUniversity가 있을 때의 상황을 처리하지 않습니다. 다음 항목들을 확인하고 개선해 주세요:

  1. 참조 무결성 검증 로직 추가

    • AdminHostUniversityServicevalidateNoReferences 메서드처럼 삭제 전에 HostUniversity의 참조 여부를 확인하는 로직이 필요합니다.
    • 참조가 있으면 CustomException으로 적절한 에러 코드(예: COUNTRY_HAS_REFERENCES)를 던져야 합니다.
  2. 테스트 케이스 추가

    • HostUniversity가 참조하는 Country를 삭제하려 할 때 예외가 발생하는 시나리오를 테스트해야 합니다.
    • 기존의 정상 케이스와 미존재 국가 케이스와 함께 참조 무결성 케이스도 포함되어야 합니다.

DataIntegrityViolationException이 발생하기 전에 서비스 레벨에서 명확한 에러 메시지와 함께 처리하는 것이 좋은 사용자 경험을 제공합니다.

🤖 Prompt for AI Agents
In
`@src/test/java/com/example/solidconnection/admin/location/country/service/AdminCountryServiceTest.java`
around lines 215 - 237, The delete flow lacks a pre-delete reference check for
HostUniversity references; update AdminCountryService.deleteCountry to call a
validation method (reuse or mirror
AdminHostUniversityService.validateNoReferences semantics) that queries
HostUniversityRepository for any entities referencing the Country and throws new
CustomException(ErrorCode.COUNTRY_HAS_REFERENCES) if any exist, then proceed
with deletion only if validation passes; also add a unit test in
AdminCountryServiceTest (in the 국가_삭제 nested class) that sets up a
HostUniversity referencing the Country and asserts that calling
adminCountryService.deleteCountry(...) throws CustomException with
ErrorCode.COUNTRY_HAS_REFERENCES, keeping the existing success and not-found
tests.

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.

고생하셨습니다 ~!

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;
Copy link
Member

Choose a reason for hiding this comment

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

import문 순서 관련해서 한 번 리포매팅 해주세요 !

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
Copy link
Member

Choose a reason for hiding this comment

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

마찬가지로 리포매팅 해주세요 !

.stream()
.findFirst()
.ifPresent(country -> {
throw new CustomException(ErrorCode.COUNTRY_ALREADY_EXISTS);
Copy link
Member

Choose a reason for hiding this comment

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

현재 단일 조회임에도 findXXXIn 을 사용하고 있습니다. findByKoreanName 메서드를 사용하는 것이 좋을 거 같아요 !

}

private void validateKoreanNameNotDuplicated(String koreanName, String excludeCode) {
countryRepository.findAllByKoreanNameIn(List.of(koreanName))
Copy link
Member

Choose a reason for hiding this comment

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

여기도 마찬가지로 단일 조회 메서드를 사용하면 좋을 거 같아요 AdminRegionService와 일관성 있기도 하고요 !

@whqtker whqtker dismissed their stale review March 8, 2026 05:55

브랜치 전략 재수립을 위해 머지합니다.

@whqtker whqtker merged commit 3a7e3c9 into solid-connection:develop Mar 8, 2026
1 of 3 checks passed
whqtker added a commit that referenced this pull request Mar 8, 2026
* feat: 파견 대학 테이블명 변경 및 협정 대학 테이블 추가하는 DDL 작성 (#620)

* feat: 파견 대학 테이블명 변경 및 협정 대학 테이블 추가하는 DDL 작성

* refactor: 테이블명 변경 및 추가에 따른 엔티티 생성

- 또한 목데이터 생성 로직 수정

* test: 테스트 코드에서 University -> HostUniversity로 변경

* chore: 중복 인덱스 생성 방지를 위해 인덱스 생성 제거

- FK 제약조건을 추가할 때 인덱스가 없다면 알아서 추가하기 때문

* chore: home_university 테이블에 created/updated_at 추가

* refactor: 잘못 설정되었던 테이블 간 연관 관계 재설정 (#622)

* refactor: home_university와 university_info_for_apply가 FK 관계를 가지도록

* chore: FK 변경에 따른 목데이터 수정

* test: 테스트 픽스터 수정

* refactor: 대학 검색 응답 수정 (#624)

* refactor: home_university와 university_info_for_apply가 FK 관계를 가지도록

* chore: FK 변경에 따른 목데이터 수정

* refactor: 필터 검색 엔드포인트 삭제

* refactor: 필터 검색 관련 서비스 로직 삭제

* refactor: 필터 검색 관련 레포지토리 메서드 삭제

* refactor: 필터 검색 관련 DTO 삭제

* test: 필터 검색 관련 테스트 코드 삭제

* refactor: 지원 대학 관련 응답에 협정 대학 이름 추가

* test: 지원 대학 응답 수정에 따른 테스트 수정

* refactor: 간접 참조 대신 연관관계 추가

- N+1 방지를 위해 fetch join도 추가

* test: 간접 참조 방식에서 연관 관계 설정으로 따른 테스트 코드 수정

* chore: 목데이터에서 지원 대학 테이블에 협정 대학 ID를 설정하도록

* test: home university fixture 추가

* refactor: home university에 대한 fetch join 추가

* refactor: s3 버전 업그레이드 및 로직 수정 (#608)

* refactor: s3 sdk 버전 업그레이드
- 의존성 수정
- 버전 업그레이드에 따른 코드 수정

* refactor: 이미지 이외의 파일 관리를 위해 ImgType 의미 명확하도록 수정
- ImgType에서 UploadType으로 변경
- 해당되는 파일 모두 수정

* refactor: s3 테스트 코드 추가

* fix: s3 access-key, secret-key 최신화, 버킷 명칭 올바르게 수정

* fix: ChatService Test 변경점 반영, S3ServiceTest 단위 테스트로 변경
- images->files로 디렉토리 경로 수정

* fix: 이중 비동기 실행문제 해결
- @async에 전적으로 위임

* refactor: S3Service error 메시지 NPE 가능성 제거

* refactor: 수정사항 반영
- UploadType -> UploadPath로 명칭변경
- 컨벤션 수정(미사용 변수 삭제, 들여쓰기, 명칭변경)

* fix: 테스트 코드 오류 수정
- 내부 로직에서 사용하는 fileUploadService 정의

* refactor: 수정사항 반영
- 파일 확장자 상수화
- 확장자 확인로직, 채팅이면 모든 파일 허용, 이미지 확인까지 모두 enum에서 관리
- MultipartFile이 비동기 과정에서 유실되지 않도록 byte로 변환해서 전달
- UrlPrefixResponse PascalCase로 변경

* refactor: 컨벤션 수정
- 사용하지 않는 import문 삭제

* refactor: 리프레시 토큰 만료시 쿠키 삭제 (#628)

* refactor: 리프레시 토큰 만료시 쿠키 삭제

* refactor: 인증 전용 예외 생성

* refactor: 멘토링 조회 응답에 mentoringId 필드 추가 (#638)

* feat: WebSocket 로깅 인터셉터 작성 (#635)

* feat: WebSocket 로깅 인터셉터 작성

* refactor: Principal 명시적 형 변환 대신 null 체크하여 형 변환

* feat: 어드민에서 파견 대학을 관리하도록 (#633)

* feat: 파견 대학 CRUD 관련 ErrorCode 추가

- HOST_UNIVERSITY_HAS_REFERENCES : 파견 대학 삭제 시 해당 대학을 참조하는 UnivApplyInfo가 존재하는 경우

* feat: 파견 대학 관련 정보를 업데이트하는 도메인 메서드 작성

* feat: 조회 관련 Repository 메서드 구현

* feat: 파견 대학 검색 관련 QueryDSL로 구현

* feat: 어드민 파견 대학 CRUD 관련 DTO 작성

* feat: country 조회 관련 로직 추가 및 ErrorCode 추가

* feat: 어드민 파견 대학 CRUD 관련 서비스 로직 작성

* feat: 어드민 파견 대학 관련 컨트롤러 작성

* test: 어드민 파견 대학 관리 관련 테스트 작성

* refactor: 엔드포인트의 path variable 이름 변경

- id -> host-university-id

* refactor: PageResponse 응답 객체를 사용하도록

* test: 응답 변경에 따른 테스트 코드 수정

* fix: host_university 테이블의 korean_name 필드에 unique key 추가 (#645)

* fix: host_university 테이블의 korean_name 필드에 unique key 쿠가

* test: test용 hostUniversityRepository 생성

* test: 고유한 korean_name을 가진 host university 객체를 사용하도록

* fix: 멘토 지원서 승인 시 유저 Role 을 Mentor로 승격 (#639)

* fix: 멘토 지원서 승인 시 유저 Role 을 Mentor로 승격

* fix: 멘토 지원서 승인 시 멘토 생성

* fix: 멘토의 introduction, passTip null 허용하도록 수정

- not null 인 필드에 빈문자열로 값을 채우는 것 보다, null 허용이 더 의미
  있다 판단하여 null 을 허용하도록 하였습니다.

* fix: 사용하지 않는  멘토 생성 api 제거

- 멘토 생성의 주체가 어드민으로 변경되어 Mentor 도메인의 Mentor 생성 api 를 제거

* feat: 멘토 지원서 승인 예외처리 추가

- 중복 멘토 생성 예외 처리 및 테스트 추가

* refactor: Mentor 생성 시 null 전달 제거

* refactor: 멘토 지원서 승낙 시, 검증 후 승격 및 멘토 생성

* chore: 스크립트 버전 수정 (#651)

* chore: 스크립트 버전 수정

* test: korean_name 컬럼 UK 관련 테스트 코드 수정

* feat: test skill 추가 (#647)

* feat: serena MCP 추가

* feat: test skill 추가

* feat: hook 추가

- 응답 대기시 알람발송
- 컨벤션 어겼을 때 훅 작동

* feat: 안쓰는 파일 제거

* fix: 게시글 중복 생성 방지 (#649)

* fix: 게시글 중복 생성 방지

- Redis 패키지 및 로직 정리

* fix: 게시글 중복 생성 방지

- 게시글 중복 요청 방지 Redis 로직 추가

* refactor: 게시글 중복 생성 방지

* chore: testcontainer 버전 업 (#659)

* chore: windows에서도 hook이 동작하도록 (#655)

* refactor: 오래된 이미지 삭제 후 이미지 pull하도록 변경 (#653)

refactor: 오래된 이미지 삭제 후 이미지 pull하도록 변경 (#653)

- 추가로 이미지는 5개 -> 2개 보관하도록 변경

* refactor: 멘토 도메인 응답의 사용자 id를 siteUserId로 통일 (#665)

* refactor: 멘토 관련 id응답은 모두 site-user-id가 되도록 수정

* test: 멘토 관련 테스트 코드 수정

* refactor: 채팅 도메인 응답의 사용자 관련 id를 siteUserId로 통일 (#666)

* refactor: 채팅 관련 응답에서 사용자 관련 Id를 siteUserId로 통일

* refactor: siteUserId를 포함하도록 서비스 코드 수정

* test: 사용자 id로 응답 통일 관련 테스트 수정

* feat: 전체 뉴스를 조회하는 API 구현 (#674)

* feat: 전체 news 조회 API 구현

- 기존 API에 author-id를 선택적으로 받도록

* test: 전체 news 조회 관련 테스트 코드 작성

* refactor: 날짜 오름차순으로 news 조회하는 JPA 메서드 추가

* refactor: 뉴스 조회 API를 하나로 통합

- 서비스 계층에서 siteUserId == null을 기준으로 분기하도록

* refactor: 컨트롤러 계층에서 분기문 제거

- 분기를 서비스 계층에게 위임했음

* test: 뉴스 조회 관련 테스트 코드 수정

* chore: 누락된 제약 조건을 추가하는 스크립트 작성 (#676)

* chore: pr을 리뷰하는 SKILL.md 작성 (#669)

* chore: pr을 리뷰하는 SKILL.md 작성

* chore: vscode extension으로 claude를 사용하는 경우에도 알림이 뜨도록

* feat: Parameter Store 기반 설정 관리 전환 및 loadtest 프로필 추가 (#670)

* feat: Parameter Store 설정 전환

- secret 서브모듈 제거 및 설정 파일 분리

- 프로필별 Parameter Store import와 loadtest 프로필 추가

* feat: Parameter Store 연동 설정 추가

- Spring Cloud AWS Parameter Store 의존성 추가

- config 분리와 profile별 import/loadtest 프로필 설정

* feat: 배포 파이프라인 Parameter Store 대응

- dev/prod workflow에서 submodule checkout 제거

- compose 환경변수에 AWS_REGION 주입

* feat: S3 인증을 IAM Role 체인으로 전환

- 정적 access key/secret key 주입 제거

- DefaultCredentialsProvider 기반 S3Client 구성

* feat: 리뷰 반영 설정 보완

- local 프로필 refresh cookie-domain을 localhost로 수정

- loadtest outbound thread pool에 queue-capacity 추가

* refactor: 환경별 설정 fail-fast 정리

- websocket outbound queue-capacity 누락 보완

- prod/dev/local OAuth redirect-url fallback 제거

- yml placeholder 빈 기본값(:) 제거

- dev CORS admin 도메인 변경 반영

* chore: Parameter Store import를 fail-fast로 전환

- common/local/dev/prod/loadtest aws-parameterstore import에서 optional 제거

* refactor: cloud 설정을 SSM 단일 소스로 정리

- env placeholder(CLOUD_AWS_*) 제거

- cloud.aws.* 값은 /solid-connection/common 경로에서 주입

* refactor: DB/Flyway 설정을 프로퍼티 키 기반으로 정리

- datasource/flyway env placeholder 제거

- prod/dev baseline-on-migrate를 false로 변경

- local 빈 redis 블록 제거

* chore: 공통 변수 설정 보안/컨벤션 정리

- OAuth/JWT/Sentry/News/Loki placeholder 제거

- kakao user-info-url 키를 kebab-case로 통일

- sentry 기본 PII 비활성화 및 prod traces 샘플링 0.1 설정

- dev admin CORS origin 문자열 변경 반영

* fix: dev admin CORS origin trailing slash 제거

* feat: review comments 반영

- loadtest 프로필에 spring.flyway.enabled=false 명시

- test 설정의 kakao user-info 키를 user-info-url로 통일

* refactor: docker-compose.dev.yml에 mysql 컨테이너 추가 (#690)

* refactor: docker-compose.dev.yml에 mysql 컨테이너 추가

* fix: 코드래빗 반영(MYSQL_ALLOW_EMPTY_PASSWORD: 'yes' 추가)

* fix: term 테이블의 is_current 필드에 UK 설정 (#650)

* fix: is_current 필드에 UK 설정

* test: UK 설정에 따른 테스트 코드 불일치성 해결

* chore: 스크립트 버전 수정

* refactor: 미사용 코드 제거

* feat: 어드민 유저 관리 기능 추가 (#686)

* feat: 어드민 유저 관리 기능

- 차단 기능 rebase 및 충돌 해결

* test: 어드민 유저 관리 기능

* feat: 어드민 유저 관리 기능

* feat: 어드민 유저 관리 기능

- University -> HostUniversity 변경

* refactor: 어드민 유저 관리 기능

* chore: 스크립트 버전 수정 (#691)

* chore: stage admin 도메인 추가 (#692)

* refactor: 응답에서 refresh token은 제외하여 전달하도록 (#646)

* refactor: 응답에서 refresh token은 제외하여 전달하도록

* refactor: 미사용 응답 필드 제거

* refactor: 쿠키 설정용, HTTP 응답용 DTO 변경

* test: result 객체 추가에 따른 테스트 코드 수정

* feat: 어드민 국가 crud 추가 (#656)

* feat: 국가 관련 어드민 crud 추가

* test: 국가 관련 어드민 crud 테스트 추가

* refactor: 대학 캐시 무효화 정책 추가 (#660)

* refactor: 대학 캐시 무효화 정책 추가

* test: 대학 캐시 무효화 정책 테스트 추가

* chore: master hotfix를 develop에 sync (#694)

* fix: /applications 중복 활성 지원서 조회 시 500 오류 방지

- 활성 지원서 조회를 최신 1건 기준 메서드로 변경

- 지원서 제출 로직과 테스트 코드를 변경된 조회 메서드명에 맞춰 동기화

* fix: 활성 지원서 중복 문제의 근본 해결 TODO 명시

- 최신 1건 선택 로직이 임시 회피임을 주석으로 명확화

- DB 유일성 제약 도입 후 우회 조회 제거 필요사항을 기록

* hotfix: 대학 조회 캐싱 임시 제거

* hotfix: 대학 조회 캐싱 임시 제거

---------

Co-authored-by: Wibaek Park <34394229+devMuromi@users.noreply.github.com>
Co-authored-by: 이세원 <107756067+leesewon00@users.noreply.github.com>
Co-authored-by: Wibaek Park <34394229+wibaek@users.noreply.github.com>
Co-authored-by: Yeongseo Na <panda0329@naver.com>
Co-authored-by: Wibaek Park <devmuromi@gmail.com>
Co-authored-by: 황규혁 <126947828+Gyuhyeok99@users.noreply.github.com>
Co-authored-by: Gyuhyeok99 <ghkdrbgur13@naver.com>
Co-authored-by: Yeon <84384499+lsy1307@users.noreply.github.com>
Co-authored-by: hyungjun <115551339+sukangpunch@users.noreply.github.com>
Co-authored-by: 정재희 <y2hjjh@naver.com>
Co-authored-by: Yeonri <lsy1307@inha.edu>

---------

Co-authored-by: Yeon <84384499+lsy1307@users.noreply.github.com>
Co-authored-by: 황규혁 <126947828+Gyuhyeok99@users.noreply.github.com>
Co-authored-by: hyungjun <115551339+sukangpunch@users.noreply.github.com>
Co-authored-by: 정재희 <y2hjjh@naver.com>
Co-authored-by: in seong Park <74069492+Hexeong@users.noreply.github.com>
Co-authored-by: Wibaek Park <34394229+devMuromi@users.noreply.github.com>
Co-authored-by: 이세원 <107756067+leesewon00@users.noreply.github.com>
Co-authored-by: Wibaek Park <34394229+wibaek@users.noreply.github.com>
Co-authored-by: Yeongseo Na <panda0329@naver.com>
Co-authored-by: Wibaek Park <devmuromi@gmail.com>
Co-authored-by: Gyuhyeok99 <ghkdrbgur13@naver.com>
Co-authored-by: Yeonri <lsy1307@inha.edu>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat: country 관련 관리 기능 추가

2 participants