diff --git a/.claude/skills/review-pr/SKILL.md b/.claude/skills/review-pr/SKILL.md index 695db1278..8a50da5ed 100644 --- a/.claude/skills/review-pr/SKILL.md +++ b/.claude/skills/review-pr/SKILL.md @@ -15,6 +15,7 @@ args: (예: /review-pr 666) ``` **예제:** + ```bash /review-pr 666 ``` @@ -34,6 +35,7 @@ gh pr checks <번호> -R solid-connection/solid-connect-server # CI/CD 상태 ``` **수집할 정보:** + - PR 제목 및 설명 - 관련 이슈 번호 - 변경된 파일 목록 @@ -44,13 +46,13 @@ gh pr checks <번호> -R solid-connection/solid-connect-server # CI/CD 상태 **도구 우선순위:** 1. **Serena MCP** (Java 코드 분석에 최적화) - - `mcp__serena__get_symbols_overview <파일경로>` - 파일의 클래스/메서드 구조 파악 - - `mcp__serena__find_symbol <심볼명>` - 특정 심볼 검색 - - `mcp__serena__search_for_pattern <패턴>` - 컨벤션 위반 패턴 검색 + - `mcp__serena__get_symbols_overview <파일경로>` - 파일의 클래스/메서드 구조 파악 + - `mcp__serena__find_symbol <심볼명>` - 특정 심볼 검색 + - `mcp__serena__search_for_pattern <패턴>` - 컨벤션 위반 패턴 검색 2. **Read/Grep** (보조 분석) - - `Read <파일경로>` - 파일 전체 읽기 - - `Grep --pattern <패턴>` - 패턴 검색 + - `Read <파일경로>` - 파일 전체 읽기 + - `Grep --pattern <패턴>` - 패턴 검색 ### 3단계: 체크리스트 검증 @@ -65,6 +67,7 @@ gh pr checks <번호> -R solid-connection/solid-connect-server # CI/CD 상태 ### 1. 아키텍처 및 계층 구조 **검증 항목:** + - 계층형 아키텍처 준수 (Controller → Service → Repository) - 역계층 참조 금지 - 순환 의존성 없음 @@ -76,6 +79,7 @@ gh pr checks <번호> -R solid-connection/solid-connect-server # CI/CD 상태 ### 2. 네이밍 컨벤션 **검증 항목:** + - API 엔드포인트: kebab-case 사용 (예: `/user-profile`) - DTO 변환 메서드: 단일 파라미터 `from()`, 다중 파라미터 `of()` - Request/Response: `XXXRequest`, `XXXResponse` 형식 @@ -88,6 +92,7 @@ gh pr checks <번호> -R solid-connection/solid-connect-server # CI/CD 상태 ### 3. 코드 스타일 **검증 항목:** + - 와일드카드(`*`) import 금지 - 클래스 선언 전 빈 줄 존재 - private 메서드는 호출하는 public 메서드 바로 아래 위치 @@ -96,6 +101,7 @@ gh pr checks <번호> -R solid-connection/solid-connect-server # CI/CD 상태 - 파일 끝 개행 문자 **패턴 검색 예제:** + ```bash mcp__serena__search_for_pattern "import.*\\*" # 와일드카드 import 검색 ``` @@ -107,6 +113,7 @@ mcp__serena__search_for_pattern "import.*\\*" # 와일드카드 import 검색 ### 4. Entity 및 JPA **검증 항목:** + - 모든 필드에 `@Column` 어노테이션 존재 - `name` 속성으로 컬럼명 명시 - `nullable` 속성 명시 @@ -121,6 +128,7 @@ mcp__serena__search_for_pattern "import.*\\*" # 와일드카드 import 검색 ### 5. 데이터베이스 마이그레이션 **검증 항목:** + - 스키마 변경 시 Flyway 마이그레이션 파일 추가 - 파일명 형식: `V{VERSION}__{DESCRIPTION}.sql` - 위치: `src/main/resources/db/migration/` @@ -134,6 +142,7 @@ mcp__serena__search_for_pattern "import.*\\*" # 와일드카드 import 검색 ### 6. 테스트 코드 **검증 항목:** + - 새로운 Service/Repository 메서드에 대한 테스트 존재 - 예외 케이스 테스트 포함 - `@TestContainerSpringBootTest` 어노테이션 사용 @@ -149,6 +158,7 @@ mcp__serena__search_for_pattern "import.*\\*" # 와일드카드 import 검색 ### 7. 커밋 메시지 **검증 항목:** + - `: ` 형식 - Type: `feat`, `fix`, `refactor`, `test`, `chore`, `docs`, `perf` - 간결하고 명확한 설명 @@ -160,6 +170,7 @@ mcp__serena__search_for_pattern "import.*\\*" # 와일드카드 import 검색 ### 8. 코드 품질 및 잠재적 이슈 **검증 항목:** + - 비즈니스 로직은 Service 계층에만 - Controller는 요청/응답 처리만 - `@Transactional` 적절하게 사용 (읽기 전용: `readOnly = true`) diff --git a/.claude/skills/test/SKILL.md b/.claude/skills/test/SKILL.md index c23122578..7fd7e4c58 100644 --- a/.claude/skills/test/SKILL.md +++ b/.claude/skills/test/SKILL.md @@ -18,6 +18,7 @@ class ChatServiceTest { ``` **제공 기능:** + - MySQL, Redis 자동 실행 - Spring Boot 컨텍스트 로드 - 테스트 후 자동 DB 초기화 diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 2b503786a..1d326c3af 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -12,7 +12,9 @@ assignees: '' > 문제가 되는 부분에 대해 설명해주세요 ## 재현 방법(선택) + 버그를 재현할 수 있는 과정을 설명해주세요(필요하다면 사진을 첨부해주세요) + 1. Go to '...' 2. Click on '....' 3. Scroll down to '....' diff --git a/.github/ISSUE_TEMPLATE/refactor_request.md b/.github/ISSUE_TEMPLATE/refactor_request.md index 38aa8ef03..0996e7f42 100644 --- a/.github/ISSUE_TEMPLATE/refactor_request.md +++ b/.github/ISSUE_TEMPLATE/refactor_request.md @@ -12,10 +12,12 @@ assignees: '' > 리팩터링하려는 부분에 대해 간결하게 설명해주세요 ### AS-IS + - as-is - as-is ### TO-BE + - to-be - to-be diff --git a/.github/workflows/prod-cd.yml b/.github/workflows/prod-cd.yml index aed7b4077..f0832907d 100644 --- a/.github/workflows/prod-cd.yml +++ b/.github/workflows/prod-cd.yml @@ -2,7 +2,7 @@ name: "[PROD] Build Gradle and Deploy" on: release: - types: [published] + types: [ published ] workflow_dispatch: inputs: diff --git a/.serena/project.yml b/.serena/project.yml index 2f196bdbc..953222158 100644 --- a/.serena/project.yml +++ b/.serena/project.yml @@ -26,7 +26,7 @@ project_name: "solid-connect-server" # The first language is the default language and the respective language server will be used as a fallback. # Note that when using the JetBrains backend, language servers are not used and this list is correspondingly ignored. languages: -- java + - java # the encoding used by text files in the project # For a list of possible encodings, see https://docs.python.org/3.11/library/codecs.html#standard-encodings @@ -37,7 +37,7 @@ ignore_all_files_in_gitignore: true # list of additional paths to ignore in all projects # same syntax as gitignore, so you can use * and ** -ignored_paths: [] +ignored_paths: [ ] # whether the project is in read-only mode # If set to true, all editing tools will be disabled and attempts to use them will result in an error @@ -83,14 +83,14 @@ read_only: false # * `think_about_task_adherence`: Thinking tool for determining whether the agent is still on track with the current task. # * `think_about_whether_you_are_done`: Thinking tool for determining whether the task is truly completed. # * `write_memory`: Writes a named memory (for future reference) to Serena's project-specific memory store. -excluded_tools: [] +excluded_tools: [ ] # list of tools to include that would otherwise be disabled (particularly optional tools that are disabled by default) -included_optional_tools: [] +included_optional_tools: [ ] # fixed set of tools to use as the base tool set (if non-empty), replacing Serena's default set of tools. # This cannot be combined with non-empty excluded_tools or included_optional_tools. -fixed_tools: [] +fixed_tools: [ ] # list of mode names to that are always to be included in the set of active modes # The full set of modes to be activated is base_modes + default_modes. diff --git a/claude.md b/claude.md index fb2d436a1..b0534492d 100644 --- a/claude.md +++ b/claude.md @@ -1,4 +1,3 @@ - # CLAUDE.md 이 파일은 Claude Code가 solid-connect-server 저장소에서 작업할 때 참고하는 가이드입니다. @@ -145,15 +144,18 @@ Controller → Service → Repository/Domain ```java // DTO 변환 // 다중 파라미터: of() 메서드 -public static UserDto of(User user, Profile profile) { ... } +public static UserDto of(User user, Profile profile) { ...} // 단일 파라미터: from() 메서드 -public static UserDto from(User user) { ... } +public static UserDto from(User user) { ...} // API 요청/응답 // XXXRequest, XXXResponse 형식 -public class UserCreateRequest { ... } -public class UserCreateResponse { ... } +public class UserCreateRequest { ... +} + +public class UserCreateResponse { ... +} // REST API 엔드포인트 // kebab-case 사용 @@ -278,6 +280,7 @@ V3__add_user_role_column.sql ### JPA Entity ```java + @Entity @Table(name = "chat_room") public class ChatRoom { @@ -296,6 +299,7 @@ public class ChatRoom { ``` **규칙:** + - `@Column` 필수 (모든 필드) - 필드명과 DB 컬럼명 일치 - nullable 명시 @@ -304,7 +308,9 @@ public class ChatRoom { ```java public interface ChatRoomRepository extends JpaRepository { + Optional findByMentoringId(Long mentoringId); + List findByIsGroup(boolean isGroup); } ``` @@ -313,18 +319,19 @@ public interface ChatRoomRepository extends JpaRepository { ## 주요 파일 위치 -| 파일/폴더 | 설명 | -|----------|------| -| `src/main/java/com/example/solidconnection/` | 메인 소스 코드 | -| `src/test/java/com/example/solidconnection/` | 테스트 코드 | -| `src/main/resources/db/migration/` | Flyway 마이그레이션 | -| `src/main/resources/application.yml` | 공통 설정 | -| `docker-compose.*.yml` | 환경별 도커 설정 | -| `build.gradle` | Gradle 빌드 설정 | +| 파일/폴더 | 설명 | +|----------------------------------------------|---------------| +| `src/main/java/com/example/solidconnection/` | 메인 소스 코드 | +| `src/test/java/com/example/solidconnection/` | 테스트 코드 | +| `src/main/resources/db/migration/` | Flyway 마이그레이션 | +| `src/main/resources/application.yml` | 공통 설정 | +| `docker-compose.*.yml` | 환경별 도커 설정 | +| `build.gradle` | Gradle 빌드 설정 | --- ### 프로필 + - **local**: Development with embedded Tomcat - **dev**: Development server (stage.solid-connection.com) - **prod**: Production server (solid-connection.com) @@ -372,7 +379,6 @@ public interface ChatRoomRepository extends JpaRepository { --- - ## 주의사항 1. **Flyway 마이그레이션은 되돌릴 수 없음** - 신중하게 작성 diff --git a/docs/code-style/solid-connection-intellij-scheme.xml b/docs/code-style/solid-connection-intellij-scheme.xml index 3bcaefe90..47e7f5d92 100644 --- a/docs/code-style/solid-connection-intellij-scheme.xml +++ b/docs/code-style/solid-connection-intellij-scheme.xml @@ -15,260 +15,226 @@ * Modified on: 2025-07-13 --> - - + \ No newline at end of file diff --git a/src/main/java/com/example/solidconnection/admin/controller/AdminMentorApplicationController.java b/src/main/java/com/example/solidconnection/admin/controller/AdminMentorApplicationController.java index c30a9620f..aa2ef1d84 100644 --- a/src/main/java/com/example/solidconnection/admin/controller/AdminMentorApplicationController.java +++ b/src/main/java/com/example/solidconnection/admin/controller/AdminMentorApplicationController.java @@ -28,6 +28,7 @@ @RestController @Slf4j public class AdminMentorApplicationController { + private final AdminMentorApplicationService adminMentorApplicationService; @GetMapping @@ -79,7 +80,7 @@ public ResponseEntity assignUniversity( @GetMapping("/{site-user-id}/history") public ResponseEntity> getMentorApplicationHistory( @PathVariable("site-user-id") Long siteUserId - ){ + ) { List response = adminMentorApplicationService.findMentorApplicationHistory(siteUserId); return ResponseEntity.ok(response); } diff --git a/src/main/java/com/example/solidconnection/admin/controller/AdminUserBanController.java b/src/main/java/com/example/solidconnection/admin/controller/AdminUserBanController.java index f0a699b13..87a1cf99d 100644 --- a/src/main/java/com/example/solidconnection/admin/controller/AdminUserBanController.java +++ b/src/main/java/com/example/solidconnection/admin/controller/AdminUserBanController.java @@ -1,5 +1,10 @@ package com.example.solidconnection.admin.controller; +import com.example.solidconnection.admin.dto.UserBanRequest; +import com.example.solidconnection.admin.service.AdminUserBanService; +import com.example.solidconnection.common.resolver.AuthorizedUser; +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PatchMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -8,28 +13,22 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import com.example.solidconnection.admin.dto.UserBanRequest; -import com.example.solidconnection.admin.service.AdminUserBanService; -import com.example.solidconnection.common.resolver.AuthorizedUser; - -import jakarta.validation.Valid; -import lombok.RequiredArgsConstructor; - @RequiredArgsConstructor @RequestMapping("/admin/users") @RestController public class AdminUserBanController { - private final AdminUserBanService adminUserBanService; - @PostMapping("/{user-id}/ban") - public ResponseEntity banUser( - @AuthorizedUser long adminId, - @PathVariable(name = "user-id") long userId, - @Valid @RequestBody UserBanRequest request - ) { - adminUserBanService.banUser(userId, adminId, request); - return ResponseEntity.ok().build(); - } + private final AdminUserBanService adminUserBanService; + + @PostMapping("/{user-id}/ban") + public ResponseEntity banUser( + @AuthorizedUser long adminId, + @PathVariable(name = "user-id") long userId, + @Valid @RequestBody UserBanRequest request + ) { + adminUserBanService.banUser(userId, adminId, request); + return ResponseEntity.ok().build(); + } @PatchMapping("/{user-id}/unban") public ResponseEntity unbanUser( diff --git a/src/main/java/com/example/solidconnection/admin/controller/AdminUserController.java b/src/main/java/com/example/solidconnection/admin/controller/AdminUserController.java index 841ef901e..edd4af415 100644 --- a/src/main/java/com/example/solidconnection/admin/controller/AdminUserController.java +++ b/src/main/java/com/example/solidconnection/admin/controller/AdminUserController.java @@ -1,13 +1,5 @@ package com.example.solidconnection.admin.controller; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; import com.example.solidconnection.admin.dto.RestrictedUserInfoDetailResponse; import com.example.solidconnection.admin.dto.RestrictedUserSearchCondition; import com.example.solidconnection.admin.dto.RestrictedUserSearchResponse; @@ -18,6 +10,14 @@ import com.example.solidconnection.common.response.PageResponse; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; @RequiredArgsConstructor @RequestMapping("/admin/users") @@ -37,7 +37,7 @@ public ResponseEntity> searchAllUsers( @GetMapping("/{user-id}") public ResponseEntity getUserInfoDetail( - @PathVariable(name = "user-id") long userId + @PathVariable(name = "user-id") long userId ) { UserInfoDetailResponse response = adminUserService.getUserInfoDetail(userId); return ResponseEntity.ok(response); @@ -54,7 +54,7 @@ public ResponseEntity> searchRestrict @GetMapping("/restricted/{user-id}") public ResponseEntity getRestrictedUserInfoDetail( - @PathVariable(name = "user-id") long userId + @PathVariable(name = "user-id") long userId ) { RestrictedUserInfoDetailResponse response = adminUserService.getRestrictedUserInfoDetail(userId); return ResponseEntity.ok(response); diff --git a/src/main/java/com/example/solidconnection/admin/dto/BannedHistoryResponse.java b/src/main/java/com/example/solidconnection/admin/dto/BannedHistoryResponse.java index de3ab7a53..da4ceee05 100644 --- a/src/main/java/com/example/solidconnection/admin/dto/BannedHistoryResponse.java +++ b/src/main/java/com/example/solidconnection/admin/dto/BannedHistoryResponse.java @@ -3,7 +3,7 @@ import java.time.ZonedDateTime; public record BannedHistoryResponse( - ZonedDateTime createdAt + ZonedDateTime createdAt ) { } diff --git a/src/main/java/com/example/solidconnection/admin/dto/BannedInfoResponse.java b/src/main/java/com/example/solidconnection/admin/dto/BannedInfoResponse.java index 0aa257f42..13ca50503 100644 --- a/src/main/java/com/example/solidconnection/admin/dto/BannedInfoResponse.java +++ b/src/main/java/com/example/solidconnection/admin/dto/BannedInfoResponse.java @@ -4,8 +4,8 @@ import com.fasterxml.jackson.annotation.JsonProperty; public record BannedInfoResponse( - @JsonProperty("isBanned") boolean isBanned, - UserBanDuration duration + @JsonProperty("isBanned") boolean isBanned, + UserBanDuration duration ) { } diff --git a/src/main/java/com/example/solidconnection/admin/dto/MatchedInfoResponse.java b/src/main/java/com/example/solidconnection/admin/dto/MatchedInfoResponse.java index d3b5c6f68..fa393d912 100644 --- a/src/main/java/com/example/solidconnection/admin/dto/MatchedInfoResponse.java +++ b/src/main/java/com/example/solidconnection/admin/dto/MatchedInfoResponse.java @@ -3,8 +3,8 @@ import java.time.ZonedDateTime; public record MatchedInfoResponse( - String nickname, - ZonedDateTime matchedDate + String nickname, + ZonedDateTime matchedDate ) { } diff --git a/src/main/java/com/example/solidconnection/admin/dto/MenteeInfoResponse.java b/src/main/java/com/example/solidconnection/admin/dto/MenteeInfoResponse.java index f4e6cffff..ced6717fc 100644 --- a/src/main/java/com/example/solidconnection/admin/dto/MenteeInfoResponse.java +++ b/src/main/java/com/example/solidconnection/admin/dto/MenteeInfoResponse.java @@ -3,8 +3,8 @@ import java.util.List; public record MenteeInfoResponse( - UnivApplyInfoResponse univApplyInfo, - List mentorInfos + UnivApplyInfoResponse univApplyInfo, + List mentorInfos ) { } diff --git a/src/main/java/com/example/solidconnection/admin/dto/MentorInfoResponse.java b/src/main/java/com/example/solidconnection/admin/dto/MentorInfoResponse.java index bd3dad8d5..24b7198fd 100644 --- a/src/main/java/com/example/solidconnection/admin/dto/MentorInfoResponse.java +++ b/src/main/java/com/example/solidconnection/admin/dto/MentorInfoResponse.java @@ -3,8 +3,8 @@ import java.util.List; public record MentorInfoResponse( - List menteeInfos, - List mentorApplicationHistory + List menteeInfos, + List mentorApplicationHistory ) { } diff --git a/src/main/java/com/example/solidconnection/admin/dto/ReportedHistoryResponse.java b/src/main/java/com/example/solidconnection/admin/dto/ReportedHistoryResponse.java index d7fbaa94c..d8a653d20 100644 --- a/src/main/java/com/example/solidconnection/admin/dto/ReportedHistoryResponse.java +++ b/src/main/java/com/example/solidconnection/admin/dto/ReportedHistoryResponse.java @@ -1,12 +1,11 @@ package com.example.solidconnection.admin.dto; -import java.time.ZonedDateTime; - import com.example.solidconnection.report.domain.ReportType; +import java.time.ZonedDateTime; public record ReportedHistoryResponse( - ZonedDateTime reportedDate, - ReportType reportType + ZonedDateTime reportedDate, + ReportType reportType ) { } diff --git a/src/main/java/com/example/solidconnection/admin/dto/ReportedInfoResponse.java b/src/main/java/com/example/solidconnection/admin/dto/ReportedInfoResponse.java index 95d7f20a3..8e423f3c8 100644 --- a/src/main/java/com/example/solidconnection/admin/dto/ReportedInfoResponse.java +++ b/src/main/java/com/example/solidconnection/admin/dto/ReportedInfoResponse.java @@ -1,14 +1,13 @@ package com.example.solidconnection.admin.dto; -import java.time.ZonedDateTime; - import com.example.solidconnection.report.domain.ReportType; import com.example.solidconnection.report.domain.TargetType; +import java.time.ZonedDateTime; public record ReportedInfoResponse( - ZonedDateTime reportedDate, - TargetType targetType, - ReportType reportType + ZonedDateTime reportedDate, + TargetType targetType, + ReportType reportType ) { } diff --git a/src/main/java/com/example/solidconnection/admin/dto/RestrictedUserInfoDetailResponse.java b/src/main/java/com/example/solidconnection/admin/dto/RestrictedUserInfoDetailResponse.java index 1c9cc40bb..21eaa02fc 100644 --- a/src/main/java/com/example/solidconnection/admin/dto/RestrictedUserInfoDetailResponse.java +++ b/src/main/java/com/example/solidconnection/admin/dto/RestrictedUserInfoDetailResponse.java @@ -3,8 +3,8 @@ import java.util.List; public record RestrictedUserInfoDetailResponse( - List reportedHistoryResponses, - List bannedHistoryResponses + List reportedHistoryResponses, + List bannedHistoryResponses ) { } diff --git a/src/main/java/com/example/solidconnection/admin/dto/RestrictedUserSearchCondition.java b/src/main/java/com/example/solidconnection/admin/dto/RestrictedUserSearchCondition.java index 2f9db3309..44a9cfdc0 100644 --- a/src/main/java/com/example/solidconnection/admin/dto/RestrictedUserSearchCondition.java +++ b/src/main/java/com/example/solidconnection/admin/dto/RestrictedUserSearchCondition.java @@ -4,9 +4,9 @@ import com.example.solidconnection.siteuser.domain.UserStatus; public record RestrictedUserSearchCondition( - Role role, - UserStatus userStatus, - String keyword + Role role, + UserStatus userStatus, + String keyword ) { } diff --git a/src/main/java/com/example/solidconnection/admin/dto/RestrictedUserSearchResponse.java b/src/main/java/com/example/solidconnection/admin/dto/RestrictedUserSearchResponse.java index cc7227916..65e74d201 100644 --- a/src/main/java/com/example/solidconnection/admin/dto/RestrictedUserSearchResponse.java +++ b/src/main/java/com/example/solidconnection/admin/dto/RestrictedUserSearchResponse.java @@ -4,12 +4,12 @@ import com.example.solidconnection.siteuser.domain.UserStatus; public record RestrictedUserSearchResponse( - Long id, - String nickname, - Role role, - UserStatus userStatus, - ReportedInfoResponse reportedInfoResponse, - BannedInfoResponse bannedInfoResponse + Long id, + String nickname, + Role role, + UserStatus userStatus, + ReportedInfoResponse reportedInfoResponse, + BannedInfoResponse bannedInfoResponse ) { } diff --git a/src/main/java/com/example/solidconnection/admin/dto/UnivApplyInfoResponse.java b/src/main/java/com/example/solidconnection/admin/dto/UnivApplyInfoResponse.java index 225991d64..b56b49f53 100644 --- a/src/main/java/com/example/solidconnection/admin/dto/UnivApplyInfoResponse.java +++ b/src/main/java/com/example/solidconnection/admin/dto/UnivApplyInfoResponse.java @@ -1,9 +1,9 @@ package com.example.solidconnection.admin.dto; public record UnivApplyInfoResponse( - String firstChoiceUnivName, - String secondChoiceUnivName, - String thirdChoiceUnivName + String firstChoiceUnivName, + String secondChoiceUnivName, + String thirdChoiceUnivName ) { } diff --git a/src/main/java/com/example/solidconnection/admin/dto/UserBanRequest.java b/src/main/java/com/example/solidconnection/admin/dto/UserBanRequest.java index eaf57df20..16443918e 100644 --- a/src/main/java/com/example/solidconnection/admin/dto/UserBanRequest.java +++ b/src/main/java/com/example/solidconnection/admin/dto/UserBanRequest.java @@ -1,11 +1,11 @@ package com.example.solidconnection.admin.dto; import com.example.solidconnection.siteuser.domain.UserBanDuration; - import jakarta.validation.constraints.NotNull; public record UserBanRequest( - @NotNull(message = "차단 기간을 입력해주세요.") - UserBanDuration duration + @NotNull(message = "차단 기간을 입력해주세요.") + UserBanDuration duration ) { + } diff --git a/src/main/java/com/example/solidconnection/admin/dto/UserInfoDetailResponse.java b/src/main/java/com/example/solidconnection/admin/dto/UserInfoDetailResponse.java index 9c2dd637d..53d0e3765 100644 --- a/src/main/java/com/example/solidconnection/admin/dto/UserInfoDetailResponse.java +++ b/src/main/java/com/example/solidconnection/admin/dto/UserInfoDetailResponse.java @@ -3,9 +3,9 @@ import java.util.List; public record UserInfoDetailResponse( - MentorInfoResponse mentorInfoResponse, // 멘티일 경우 null - MenteeInfoResponse menteeInfoResponse, // 멘토일 경우 null - List reportedHistoryResponses + MentorInfoResponse mentorInfoResponse, // 멘티일 경우 null + MenteeInfoResponse menteeInfoResponse, // 멘토일 경우 null + List reportedHistoryResponses ) { } diff --git a/src/main/java/com/example/solidconnection/admin/dto/UserSearchCondition.java b/src/main/java/com/example/solidconnection/admin/dto/UserSearchCondition.java index 9d6bc1bd8..f2bdfdaf6 100644 --- a/src/main/java/com/example/solidconnection/admin/dto/UserSearchCondition.java +++ b/src/main/java/com/example/solidconnection/admin/dto/UserSearchCondition.java @@ -3,8 +3,8 @@ import com.example.solidconnection.siteuser.domain.Role; public record UserSearchCondition( - Role role, - String keyword + Role role, + String keyword ) { - + } diff --git a/src/main/java/com/example/solidconnection/admin/dto/UserSearchResponse.java b/src/main/java/com/example/solidconnection/admin/dto/UserSearchResponse.java index a1150db90..3b4995d1d 100644 --- a/src/main/java/com/example/solidconnection/admin/dto/UserSearchResponse.java +++ b/src/main/java/com/example/solidconnection/admin/dto/UserSearchResponse.java @@ -4,11 +4,11 @@ import com.example.solidconnection.siteuser.domain.UserStatus; public record UserSearchResponse( - Long id, - String nickname, - String email, - Role role, - UserStatus userStatus + Long id, + String nickname, + String email, + Role role, + UserStatus userStatus ) { } diff --git a/src/main/java/com/example/solidconnection/admin/location/country/controller/AdminCountryController.java b/src/main/java/com/example/solidconnection/admin/location/country/controller/AdminCountryController.java index 6b4a39e21..7b2bfc4ff 100644 --- a/src/main/java/com/example/solidconnection/admin/location/country/controller/AdminCountryController.java +++ b/src/main/java/com/example/solidconnection/admin/location/country/controller/AdminCountryController.java @@ -5,6 +5,7 @@ import com.example.solidconnection.admin.location.country.dto.AdminCountryUpdateRequest; import com.example.solidconnection.admin.location.country.service.AdminCountryService; import jakarta.validation.Valid; +import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -17,8 +18,6 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import java.util.List; - @RequiredArgsConstructor @RequestMapping("/admin/countries") @RestController diff --git a/src/main/java/com/example/solidconnection/admin/location/country/service/AdminCountryService.java b/src/main/java/com/example/solidconnection/admin/location/country/service/AdminCountryService.java index 279fcfc97..27d444f93 100644 --- a/src/main/java/com/example/solidconnection/admin/location/country/service/AdminCountryService.java +++ b/src/main/java/com/example/solidconnection/admin/location/country/service/AdminCountryService.java @@ -8,12 +8,11 @@ import com.example.solidconnection.location.country.domain.Country; import com.example.solidconnection.location.country.repository.CountryRepository; import com.example.solidconnection.location.region.repository.RegionRepository; +import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.List; - @Service @RequiredArgsConstructor public class AdminCountryService { diff --git a/src/main/java/com/example/solidconnection/admin/service/AdminUserService.java b/src/main/java/com/example/solidconnection/admin/service/AdminUserService.java index b2051b46d..2d3a7e86b 100644 --- a/src/main/java/com/example/solidconnection/admin/service/AdminUserService.java +++ b/src/main/java/com/example/solidconnection/admin/service/AdminUserService.java @@ -2,10 +2,6 @@ import static com.example.solidconnection.common.exception.ErrorCode.USER_NOT_FOUND; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; import com.example.solidconnection.admin.dto.RestrictedUserInfoDetailResponse; import com.example.solidconnection.admin.dto.RestrictedUserSearchCondition; import com.example.solidconnection.admin.dto.RestrictedUserSearchResponse; @@ -15,35 +11,38 @@ import com.example.solidconnection.common.exception.CustomException; import com.example.solidconnection.siteuser.domain.SiteUser; import com.example.solidconnection.siteuser.repository.SiteUserRepository; -import com.example.solidconnection.siteuser.repository.custom.SiteUserFilterRepository; import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; @RequiredArgsConstructor @Service public class AdminUserService { - private final SiteUserRepository siteUserRepository; + private final SiteUserRepository siteUserRepository; - @Transactional(readOnly = true) + @Transactional(readOnly = true) public Page searchAllUsers(UserSearchCondition searchCondition, Pageable pageable) { return siteUserRepository.searchAllUsers(searchCondition, pageable); } - @Transactional(readOnly = true) + @Transactional(readOnly = true) public Page searchRestrictedUsers(RestrictedUserSearchCondition searchCondition, Pageable pageable) { return siteUserRepository.searchRestrictedUsers(searchCondition, pageable); } - @Transactional(readOnly = true) + @Transactional(readOnly = true) public UserInfoDetailResponse getUserInfoDetail(long userId) { - SiteUser siteUser = siteUserRepository.findById(userId) + SiteUser siteUser = siteUserRepository.findById(userId) .orElseThrow(() -> new CustomException(USER_NOT_FOUND)); return siteUserRepository.getUserInfoDetailByUserId(siteUser); } - @Transactional(readOnly = true) + @Transactional(readOnly = true) public RestrictedUserInfoDetailResponse getRestrictedUserInfoDetail(long userId) { - SiteUser siteUser = siteUserRepository.findById(userId) + SiteUser siteUser = siteUserRepository.findById(userId) .orElseThrow(() -> new CustomException(USER_NOT_FOUND)); return siteUserRepository.getRestrictedUserInfoDetail(siteUser.getId()); } diff --git a/src/main/java/com/example/solidconnection/application/domain/Application.java b/src/main/java/com/example/solidconnection/application/domain/Application.java index 9421f6df4..14c138868 100644 --- a/src/main/java/com/example/solidconnection/application/domain/Application.java +++ b/src/main/java/com/example/solidconnection/application/domain/Application.java @@ -18,6 +18,7 @@ import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; +import org.hibernate.annotations.ColumnDefault; import org.hibernate.annotations.DynamicInsert; import org.hibernate.annotations.DynamicUpdate; @@ -40,6 +41,7 @@ public class Application extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id") private Long id; @Embedded @@ -49,6 +51,7 @@ public class Application extends BaseEntity { private LanguageTest languageTest; @Setter + @ColumnDefault("'PENDING'") @Column(name = "verify_status", nullable = false) @Enumerated(EnumType.STRING) private VerifyStatus verifyStatus = VerifyStatus.PENDING; @@ -56,13 +59,15 @@ public class Application extends BaseEntity { @Column(length = 100, name = "nickname_for_apply") private String nicknameForApply; - @Column(columnDefinition = "int not null default 1", name = "update_count") - private Integer updateCount; + @ColumnDefault("1") + @Column(name = "update_count", nullable = false) + private Integer updateCount = 1; @Column(nullable = false, name = "term_id") private long termId; - @Column(name = "is_delete") + @ColumnDefault("false") + @Column(name = "is_delete", nullable = false) private boolean isDelete = false; @Column(nullable = false, name = "first_choice_university_info_for_apply_id") @@ -74,7 +79,7 @@ public class Application extends BaseEntity { @Column(name = "third_choice_university_info_for_apply_id") private Long thirdChoiceUnivApplyInfoId; - @Column(name = "site_user_id") + @Column(name = "site_user_id", nullable = false) private long siteUserId; public Application( diff --git a/src/main/java/com/example/solidconnection/auth/dto/SignUpRequest.java b/src/main/java/com/example/solidconnection/auth/dto/SignUpRequest.java index 81991fd90..c769d073d 100644 --- a/src/main/java/com/example/solidconnection/auth/dto/SignUpRequest.java +++ b/src/main/java/com/example/solidconnection/auth/dto/SignUpRequest.java @@ -17,4 +17,5 @@ public record SignUpRequest( @NotBlank(message = "닉네임을 입력해주세요.") String nickname) { + } diff --git a/src/main/java/com/example/solidconnection/auth/dto/oauth/KakaoUserInfoDto.java b/src/main/java/com/example/solidconnection/auth/dto/oauth/KakaoUserInfoDto.java index fbd975b50..510b26bf4 100644 --- a/src/main/java/com/example/solidconnection/auth/dto/oauth/KakaoUserInfoDto.java +++ b/src/main/java/com/example/solidconnection/auth/dto/oauth/KakaoUserInfoDto.java @@ -7,19 +7,6 @@ public record KakaoUserInfoDto( @JsonProperty("kakao_account") KakaoAccountDto kakaoAccountDto) implements OAuthUserInfoDto { - @JsonIgnoreProperties(ignoreUnknown = true) - public record KakaoAccountDto( - @JsonProperty("profile") KakaoProfileDto profile, - String email) { - - @JsonIgnoreProperties(ignoreUnknown = true) - public record KakaoProfileDto( - @JsonProperty("profile_image_url") String profileImageUrl, - String nickname) { - - } - } - @Override public String getEmail() { return kakaoAccountDto.email; @@ -34,4 +21,17 @@ public String getProfileImageUrl() { public String getNickname() { return kakaoAccountDto.profile.nickname; } + + @JsonIgnoreProperties(ignoreUnknown = true) + public record KakaoAccountDto( + @JsonProperty("profile") KakaoProfileDto profile, + String email) { + + @JsonIgnoreProperties(ignoreUnknown = true) + public record KakaoProfileDto( + @JsonProperty("profile_image_url") String profileImageUrl, + String nickname) { + + } + } } diff --git a/src/main/java/com/example/solidconnection/auth/token/config/TokenProperties.java b/src/main/java/com/example/solidconnection/auth/token/config/TokenProperties.java index cf8a6e9b4..ba239dc9a 100644 --- a/src/main/java/com/example/solidconnection/auth/token/config/TokenProperties.java +++ b/src/main/java/com/example/solidconnection/auth/token/config/TokenProperties.java @@ -19,6 +19,14 @@ public record TokenProperties( private static Map, TokenConfig> tokenConfigs; + public static Duration getExpireTime(Class tokenClass) { + return tokenConfigs.get(tokenClass).expireTime(); + } + + public static String getStorageKeyPrefix(Class tokenClass) { + return tokenConfigs.get(tokenClass).storageKeyPrefix(); + } + @PostConstruct public void init() { tokenConfigs = Map.of( @@ -27,12 +35,4 @@ public void init() { SignUpToken.class, signUp ); } - - public static Duration getExpireTime(Class tokenClass) { - return tokenConfigs.get(tokenClass).expireTime(); - } - - public static String getStorageKeyPrefix(Class tokenClass) { - return tokenConfigs.get(tokenClass).storageKeyPrefix(); - } } diff --git a/src/main/java/com/example/solidconnection/chat/domain/ChatAttachment.java b/src/main/java/com/example/solidconnection/chat/domain/ChatAttachment.java index da9c917ba..73d98ef10 100644 --- a/src/main/java/com/example/solidconnection/chat/domain/ChatAttachment.java +++ b/src/main/java/com/example/solidconnection/chat/domain/ChatAttachment.java @@ -7,7 +7,6 @@ import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; -import jakarta.persistence.JoinColumn; import jakarta.persistence.ManyToOne; import lombok.AccessLevel; import lombok.Getter; @@ -20,15 +19,16 @@ public class ChatAttachment extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id") private Long id; - @Column(nullable = false) + @Column(name = "is_image", nullable = false) private Boolean isImage; - @Column(nullable = false, length = 500) + @Column(name = "url", nullable = false, length = 500) private String url; - @Column(length = 500) + @Column(name = "thumbnail_url", length = 500) private String thumbnailUrl; @ManyToOne(fetch = FetchType.LAZY, optional = false) @@ -45,7 +45,9 @@ public ChatAttachment(boolean isImage, String url, String thumbnailUrl, ChatMess } protected void setChatMessage(ChatMessage chatMessage) { - if (this.chatMessage == chatMessage) return; + if (this.chatMessage == chatMessage) { + return; + } if (this.chatMessage != null) { this.chatMessage.getChatAttachments().remove(this); diff --git a/src/main/java/com/example/solidconnection/chat/domain/ChatMessage.java b/src/main/java/com/example/solidconnection/chat/domain/ChatMessage.java index f2ec4d820..1a4fdeff2 100644 --- a/src/main/java/com/example/solidconnection/chat/domain/ChatMessage.java +++ b/src/main/java/com/example/solidconnection/chat/domain/ChatMessage.java @@ -15,6 +15,7 @@ import lombok.AccessLevel; import lombok.Getter; import lombok.NoArgsConstructor; +import org.hibernate.annotations.ColumnDefault; import org.hibernate.annotations.Where; @Entity @@ -23,24 +24,22 @@ @Where(clause = "is_deleted = false") public class ChatMessage extends BaseEntity { + @OneToMany(mappedBy = "chatMessage", cascade = CascadeType.ALL, orphanRemoval = true) + private final List chatAttachments = new ArrayList<>(); @Id @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id") private Long id; - - @Column(nullable = false, length = 500) + @Column(name = "content", nullable = false, length = 500) private String content; - + @Column(name = "sender_id", nullable = false) private long senderId; // chat_participant의 id - @ManyToOne(fetch = FetchType.LAZY) private ChatRoom chatRoom; - - @Column(name = "is_deleted", columnDefinition = "boolean default false", nullable = false) + @ColumnDefault("false") + @Column(name = "is_deleted", nullable = false) private boolean isDeleted = false; - @OneToMany(mappedBy = "chatMessage", cascade = CascadeType.ALL, orphanRemoval = true) - private final List chatAttachments = new ArrayList<>(); - public ChatMessage(String content, long senderId, ChatRoom chatRoom) { this.content = content; this.senderId = senderId; diff --git a/src/main/java/com/example/solidconnection/chat/domain/ChatParticipant.java b/src/main/java/com/example/solidconnection/chat/domain/ChatParticipant.java index 60fc6b795..70ab514e6 100644 --- a/src/main/java/com/example/solidconnection/chat/domain/ChatParticipant.java +++ b/src/main/java/com/example/solidconnection/chat/domain/ChatParticipant.java @@ -27,9 +27,10 @@ public class ChatParticipant extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id") private Long id; - @Column(name = "site_user_id") + @Column(name = "site_user_id", nullable = false) private long siteUserId; @ManyToOne(fetch = FetchType.LAZY) diff --git a/src/main/java/com/example/solidconnection/chat/domain/ChatReadStatus.java b/src/main/java/com/example/solidconnection/chat/domain/ChatReadStatus.java index 8c731738c..a09b51fa0 100644 --- a/src/main/java/com/example/solidconnection/chat/domain/ChatReadStatus.java +++ b/src/main/java/com/example/solidconnection/chat/domain/ChatReadStatus.java @@ -25,12 +25,13 @@ public class ChatReadStatus extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id") private Long id; - @Column(name = "chat_room_id") + @Column(name = "chat_room_id", nullable = false) private long chatRoomId; - @Column(name = "chat_participant_id") + @Column(name = "chat_participant_id", nullable = false) private long chatParticipantId; public ChatReadStatus(long chatRoomId, long chatParticipantId) { diff --git a/src/main/java/com/example/solidconnection/chat/domain/ChatRoom.java b/src/main/java/com/example/solidconnection/chat/domain/ChatRoom.java index fc159c2cd..6d63b4d7e 100644 --- a/src/main/java/com/example/solidconnection/chat/domain/ChatRoom.java +++ b/src/main/java/com/example/solidconnection/chat/domain/ChatRoom.java @@ -14,28 +14,28 @@ import lombok.Getter; import lombok.NoArgsConstructor; import org.hibernate.annotations.BatchSize; +import org.hibernate.annotations.ColumnDefault; @Entity @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) public class ChatRoom extends BaseEntity { + @OneToMany(mappedBy = "chatRoom", cascade = CascadeType.ALL) + @BatchSize(size = 10) + private final List chatParticipants = new ArrayList<>(); + @OneToMany(mappedBy = "chatRoom", cascade = CascadeType.ALL) + private final List chatMessages = new ArrayList<>(); @Id @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id") private Long id; - + @ColumnDefault("false") + @Column(name = "is_group", nullable = false) private boolean isGroup = false; - @Column(name = "mentoring_id", unique = true) private Long mentoringId; - @OneToMany(mappedBy = "chatRoom", cascade = CascadeType.ALL) - @BatchSize(size = 10) - private final List chatParticipants = new ArrayList<>(); - - @OneToMany(mappedBy = "chatRoom", cascade = CascadeType.ALL) - private final List chatMessages = new ArrayList<>(); - public ChatRoom(boolean isGroup) { this.isGroup = isGroup; } diff --git a/src/main/java/com/example/solidconnection/chat/repository/ChatMessageRepository.java b/src/main/java/com/example/solidconnection/chat/repository/ChatMessageRepository.java index ae81a3341..4111e6741 100644 --- a/src/main/java/com/example/solidconnection/chat/repository/ChatMessageRepository.java +++ b/src/main/java/com/example/solidconnection/chat/repository/ChatMessageRepository.java @@ -52,17 +52,17 @@ SELECT MAX(cm2.id) @Modifying(clearAutomatically = true, flushAutomatically = true) @Query(value = """ - UPDATE chat_message cm SET cm.is_deleted = :isDeleted - WHERE cm.id IN (SELECT r.target_id FROM report r WHERE r.target_type = 'CHAT') - AND cm.sender_id IN (SELECT cp.id FROM chat_participant cp WHERE cp.site_user_id = :siteUserId) - """, nativeQuery = true) + UPDATE chat_message cm SET cm.is_deleted = :isDeleted + WHERE cm.id IN (SELECT r.target_id FROM report r WHERE r.target_type = 'CHAT') + AND cm.sender_id IN (SELECT cp.id FROM chat_participant cp WHERE cp.site_user_id = :siteUserId) + """, nativeQuery = true) void updateReportedChatMessagesIsDeleted(@Param("siteUserId") long siteUserId, @Param("isDeleted") boolean isDeleted); @Modifying(clearAutomatically = true, flushAutomatically = true) @Query(value = """ - UPDATE chat_message cm SET cm.is_deleted = :isDeleted - WHERE cm.id IN (SELECT r.target_id FROM report r WHERE r.target_type = 'CHAT') - AND cm.sender_id IN (SELECT cp.id FROM chat_participant cp WHERE cp.site_user_id IN :siteUserIds) - """, nativeQuery = true) + UPDATE chat_message cm SET cm.is_deleted = :isDeleted + WHERE cm.id IN (SELECT r.target_id FROM report r WHERE r.target_type = 'CHAT') + AND cm.sender_id IN (SELECT cp.id FROM chat_participant cp WHERE cp.site_user_id IN :siteUserIds) + """, nativeQuery = true) void bulkUpdateReportedChatMessagesIsDeleted(@Param("siteUserIds") List siteUserIds, @Param("isDeleted") boolean isDeleted); } diff --git a/src/main/java/com/example/solidconnection/common/BaseEntity.java b/src/main/java/com/example/solidconnection/common/BaseEntity.java index b3b597350..5da8a67a2 100644 --- a/src/main/java/com/example/solidconnection/common/BaseEntity.java +++ b/src/main/java/com/example/solidconnection/common/BaseEntity.java @@ -3,6 +3,7 @@ import static java.time.ZoneOffset.UTC; import static java.time.temporal.ChronoUnit.MICROS; +import jakarta.persistence.Column; import jakarta.persistence.EntityListeners; import jakarta.persistence.MappedSuperclass; import jakarta.persistence.PrePersist; @@ -20,7 +21,10 @@ @DynamicInsert public abstract class BaseEntity { + @Column(name = "created_at") private ZonedDateTime createdAt; + + @Column(name = "updated_at") private ZonedDateTime updatedAt; @PrePersist diff --git a/src/main/java/com/example/solidconnection/common/config/datasource/DataSourceProxyConfig.java b/src/main/java/com/example/solidconnection/common/config/datasource/DataSourceProxyConfig.java index 2b567df41..603346503 100644 --- a/src/main/java/com/example/solidconnection/common/config/datasource/DataSourceProxyConfig.java +++ b/src/main/java/com/example/solidconnection/common/config/datasource/DataSourceProxyConfig.java @@ -16,20 +16,17 @@ @Configuration public class DataSourceProxyConfig { - private final QueryMetricsListener queryMetricsListener; - // Driver public static final String FLYWAY_MYSQL_DRIVER = "com.mysql.cj.jdbc.Driver"; - // Pool Name public static final String FLYWAY_POOL_NAME = "FlywayPool"; - // Connection Pool Settings public static final int FLYWAY_MINIMUM_IDLE = 0; // 유휴 커넥션을 0으로 설정하면 사용하지 않을 때 커넥션을 즉시 반납 public static final int FLYWAY_MAXIMUM_POOL_SIZE = 2; public static final long FLYWAY_CONNECTION_TIMEOUT = 10000L; public static final long FLYWAY_IDLE_TIMEOUT = 60000L; // 1분 public static final long FLYWAY_MAX_LIFETIME = 300000L; // 5분 + private final QueryMetricsListener queryMetricsListener; @Bean @Primary diff --git a/src/main/java/com/example/solidconnection/common/config/web/WebMvcConfig.java b/src/main/java/com/example/solidconnection/common/config/web/WebMvcConfig.java index 1d99274db..8d12032af 100644 --- a/src/main/java/com/example/solidconnection/common/config/web/WebMvcConfig.java +++ b/src/main/java/com/example/solidconnection/common/config/web/WebMvcConfig.java @@ -1,8 +1,8 @@ package com.example.solidconnection.common.config.web; -import com.example.solidconnection.common.interceptor.BannedUserInterceptor; import com.example.solidconnection.common.filter.HttpLoggingFilter; import com.example.solidconnection.common.interceptor.ApiPerformanceInterceptor; +import com.example.solidconnection.common.interceptor.BannedUserInterceptor; import com.example.solidconnection.common.interceptor.RequestContextInterceptor; import com.example.solidconnection.common.resolver.AuthorizedUserResolver; import com.example.solidconnection.common.resolver.CustomPageableHandlerMethodArgumentResolver; @@ -36,7 +36,7 @@ public void addArgumentResolvers(List resolvers) } @Override - public void addInterceptors(InterceptorRegistry registry){ + public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(apiPerformanceInterceptor) .addPathPatterns("/**") .excludePathPatterns("/actuator/**"); diff --git a/src/main/java/com/example/solidconnection/common/constant/FileConstants.java b/src/main/java/com/example/solidconnection/common/constant/FileConstants.java index 1f20b502e..a65eca567 100644 --- a/src/main/java/com/example/solidconnection/common/constant/FileConstants.java +++ b/src/main/java/com/example/solidconnection/common/constant/FileConstants.java @@ -4,22 +4,21 @@ import java.util.stream.Stream; public final class FileConstants { - private FileConstants() {} public static final List IMAGE_EXTENSIONS = List.of( "jpg", "jpeg", "png", "webp", "avif", "heic", "heif", "tiff" ); - public static final List DOCUMENT_EXTENSIONS = List.of( "doc", "docx", "xls", "xlsx", "ppt", "pptx", "hwp", "hwpx", "pdf", "txt" ); - public static final List ARCHIVE_EXTENSIONS = List.of( "zip", "7z", "rar" ); - public static final List ALL_ALLOWED_EXTENSIONS = Stream.of( IMAGE_EXTENSIONS, DOCUMENT_EXTENSIONS, ARCHIVE_EXTENSIONS) .flatMap(List::stream) .toList(); + + private FileConstants() { + } } diff --git a/src/main/java/com/example/solidconnection/common/exception/ErrorCode.java b/src/main/java/com/example/solidconnection/common/exception/ErrorCode.java index 84a6a8d00..5f65329e7 100644 --- a/src/main/java/com/example/solidconnection/common/exception/ErrorCode.java +++ b/src/main/java/com/example/solidconnection/common/exception/ErrorCode.java @@ -132,7 +132,7 @@ public enum ErrorCode { MENTORING_NOT_FOUND(HttpStatus.NOT_FOUND.value(), "해당 멘토링 신청을 찾을 수 없습니다."), UNAUTHORIZED_MENTORING(HttpStatus.FORBIDDEN.value(), "멘토링 권한이 없습니다."), MENTORING_ALREADY_CONFIRMED(HttpStatus.BAD_REQUEST.value(), "이미 승인 또는 거절된 멘토링입니다."), - MENTOR_APPLICATION_ALREADY_EXISTED(HttpStatus.CONFLICT.value(),"멘토 승격 요청이 이미 존재합니다."), + MENTOR_APPLICATION_ALREADY_EXISTED(HttpStatus.CONFLICT.value(), "멘토 승격 요청이 이미 존재합니다."), INVALID_EXCHANGE_STATUS_FOR_MENTOR(HttpStatus.BAD_REQUEST.value(), "멘토 승격 지원 가능한 교환학생 상태가 아닙니다."), UNIVERSITY_ID_REQUIRED_FOR_CATALOG(HttpStatus.BAD_REQUEST.value(), "목록에서 학교를 선택한 경우 학교 정보가 필요합니다."), UNIVERSITY_ID_MUST_BE_NULL_FOR_OTHER(HttpStatus.BAD_REQUEST.value(), "기타 학교를 선택한 경우 학교 정보를 입력할 수 없습니다."), diff --git a/src/main/java/com/example/solidconnection/common/filter/HttpLoggingFilter.java b/src/main/java/com/example/solidconnection/common/filter/HttpLoggingFilter.java index ae0535a7d..0df39c9a2 100644 --- a/src/main/java/com/example/solidconnection/common/filter/HttpLoggingFilter.java +++ b/src/main/java/com/example/solidconnection/common/filter/HttpLoggingFilter.java @@ -12,8 +12,8 @@ import lombok.extern.slf4j.Slf4j; import org.slf4j.MDC; import org.springframework.http.HttpStatus; -import org.springframework.stereotype.Component; import org.springframework.http.server.PathContainer; +import org.springframework.stereotype.Component; import org.springframework.web.filter.OncePerRequestFilter; import org.springframework.web.util.pattern.PathPattern; import org.springframework.web.util.pattern.PathPatternParser; @@ -98,7 +98,7 @@ private String buildDecodedRequestUri(HttpServletRequest request) { String path = request.getRequestURI(); String query = request.getQueryString(); - if(query == null || query.isBlank()){ + if (query == null || query.isBlank()) { return path; } @@ -109,7 +109,7 @@ private String buildDecodedRequestUri(HttpServletRequest request) { } private String decodeQuery(String rawQuery) { - if(rawQuery == null || rawQuery.isBlank()){ + if (rawQuery == null || rawQuery.isBlank()) { return rawQuery; } @@ -125,23 +125,23 @@ private String maskSensitiveParams(String decodedQuery) { String[] params = decodedQuery.split("&"); StringBuilder maskedQuery = new StringBuilder(); - for(int i = 0; i < params.length; i++){ + for (int i = 0; i < params.length; i++) { String param = params[i]; - if(!param.contains("=")){ + if (!param.contains("=")) { maskedQuery.append(param); - }else{ + } else { int equalIndex = param.indexOf("="); String key = param.substring(0, equalIndex); - if(isSensitiveParam(key)){ + if (isSensitiveParam(key)) { maskedQuery.append(key).append("=").append(MASK_VALUE); - }else{ + } else { maskedQuery.append(param); } } - if(i < params.length - 1){ + if (i < params.length - 1) { maskedQuery.append("&"); } } @@ -150,8 +150,8 @@ private String maskSensitiveParams(String decodedQuery) { } private boolean isSensitiveParam(String paramKey) { - for (String sensitiveParam : EXCLUDE_QUERIES){ - if(sensitiveParam.equalsIgnoreCase(paramKey)){ + for (String sensitiveParam : EXCLUDE_QUERIES) { + if (sensitiveParam.equalsIgnoreCase(paramKey)) { return true; } } diff --git a/src/main/java/com/example/solidconnection/common/interceptor/ApiPerformanceInterceptor.java b/src/main/java/com/example/solidconnection/common/interceptor/ApiPerformanceInterceptor.java index 50a95f937..4eed033b5 100644 --- a/src/main/java/com/example/solidconnection/common/interceptor/ApiPerformanceInterceptor.java +++ b/src/main/java/com/example/solidconnection/common/interceptor/ApiPerformanceInterceptor.java @@ -13,6 +13,7 @@ @RequiredArgsConstructor @Component public class ApiPerformanceInterceptor implements HandlerInterceptor { + private static final String START_TIME_ATTRIBUTE = "startTime"; private static final String REQUEST_URI_ATTRIBUTE = "requestUri"; private static final int RESPONSE_TIME_THRESHOLD = 3_000; @@ -41,7 +42,7 @@ public void afterCompletion( Exception ex ) throws Exception { Long startTime = (Long) request.getAttribute(START_TIME_ATTRIBUTE); - if(startTime == null) { + if (startTime == null) { return; } @@ -56,8 +57,7 @@ public void afterCompletion( "type=API_Performance method_type={} uri={} response_time={} status={}", method, uri, responseTime, status ); - } - else { + } else { API_PERF.info( "type=API_Performance method_type={} uri={} response_time={} status={}", method, uri, responseTime, status diff --git a/src/main/java/com/example/solidconnection/common/interceptor/RequestContext.java b/src/main/java/com/example/solidconnection/common/interceptor/RequestContext.java index 1f4d2790c..d66d8100f 100644 --- a/src/main/java/com/example/solidconnection/common/interceptor/RequestContext.java +++ b/src/main/java/com/example/solidconnection/common/interceptor/RequestContext.java @@ -4,6 +4,7 @@ @Getter public class RequestContext { + private final String httpMethod; private final String bestMatchPath; diff --git a/src/main/java/com/example/solidconnection/common/interceptor/RequestContextHolder.java b/src/main/java/com/example/solidconnection/common/interceptor/RequestContextHolder.java index 0c786bf10..c35210c9c 100644 --- a/src/main/java/com/example/solidconnection/common/interceptor/RequestContextHolder.java +++ b/src/main/java/com/example/solidconnection/common/interceptor/RequestContextHolder.java @@ -1,6 +1,7 @@ package com.example.solidconnection.common.interceptor; public class RequestContextHolder { + private static final ThreadLocal CONTEXT = new ThreadLocal<>(); public static void initContext(RequestContext requestContext) { @@ -12,7 +13,7 @@ public static RequestContext getContext() { return CONTEXT.get(); } - public static void clear(){ + public static void clear() { CONTEXT.remove(); } } diff --git a/src/main/java/com/example/solidconnection/common/listener/QueryMetricsListener.java b/src/main/java/com/example/solidconnection/common/listener/QueryMetricsListener.java index 8f3258b6b..2e94202ec 100644 --- a/src/main/java/com/example/solidconnection/common/listener/QueryMetricsListener.java +++ b/src/main/java/com/example/solidconnection/common/listener/QueryMetricsListener.java @@ -38,16 +38,26 @@ public void afterQuery(ExecutionInfo exec, List queries) { "sql_type", type, "http_method", httpMethod, "http_path", httpPath - ).record(elapsedMs, TimeUnit.MILLISECONDS); + ).record(elapsedMs, TimeUnit.MILLISECONDS); } private String guessType(String sql) { - if (sql == null) return "OTHER"; + if (sql == null) { + return "OTHER"; + } String s = sql.trim().toUpperCase(); - if (s.startsWith("SELECT")) return "SELECT"; - if (s.startsWith("INSERT")) return "INSERT"; - if (s.startsWith("UPDATE")) return "UPDATE"; - if (s.startsWith("DELETE")) return "DELETE"; + if (s.startsWith("SELECT")) { + return "SELECT"; + } + if (s.startsWith("INSERT")) { + return "INSERT"; + } + if (s.startsWith("UPDATE")) { + return "UPDATE"; + } + if (s.startsWith("DELETE")) { + return "DELETE"; + } return "UNKNOWN"; } } diff --git a/src/main/java/com/example/solidconnection/community/board/domain/Board.java b/src/main/java/com/example/solidconnection/community/board/domain/Board.java index 4f93e9801..c9a80a3ac 100644 --- a/src/main/java/com/example/solidconnection/community/board/domain/Board.java +++ b/src/main/java/com/example/solidconnection/community/board/domain/Board.java @@ -12,10 +12,10 @@ public class Board { @Id - @Column(length = 20) + @Column(name = "code", length = 20) private String code; - @Column(nullable = false, length = 20) + @Column(name = "korean_name", nullable = false, length = 20) private String koreanName; public Board(String code, String koreanName) { diff --git a/src/main/java/com/example/solidconnection/community/comment/domain/Comment.java b/src/main/java/com/example/solidconnection/community/comment/domain/Comment.java index b60aa5077..461e33ec6 100644 --- a/src/main/java/com/example/solidconnection/community/comment/domain/Comment.java +++ b/src/main/java/com/example/solidconnection/community/comment/domain/Comment.java @@ -18,6 +18,7 @@ import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.NoArgsConstructor; +import org.hibernate.annotations.ColumnDefault; @Entity @Getter @@ -34,19 +35,21 @@ public class Comment extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id") private Long id; - @Column(length = 255) + @Column(name = "content", length = 255) private String content; - @Column(name = "is_deleted", columnDefinition = "boolean default false", nullable = false) + @ColumnDefault("false") + @Column(name = "is_deleted", nullable = false) private boolean isDeleted = false; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "post_id") private Post post; - @Column + @Column(name = "site_user_id", nullable = false) private long siteUserId; @ManyToOne(fetch = FetchType.LAZY) diff --git a/src/main/java/com/example/solidconnection/community/post/domain/Post.java b/src/main/java/com/example/solidconnection/community/post/domain/Post.java index 7b3f72745..1ddb29a31 100644 --- a/src/main/java/com/example/solidconnection/community/post/domain/Post.java +++ b/src/main/java/com/example/solidconnection/community/post/domain/Post.java @@ -18,6 +18,7 @@ import lombok.Getter; import lombok.NoArgsConstructor; import org.hibernate.annotations.BatchSize; +import org.hibernate.annotations.ColumnDefault; import org.hibernate.annotations.Where; @Entity @@ -29,30 +30,36 @@ public class Post extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id") private Long id; - @Column(length = 255) + @Column(name = "title", length = 255) private String title; - @Column(length = 1000) + @Column(name = "content", length = 1000) private String content; + @Column(name = "is_question") private Boolean isQuestion; + @Column(name = "like_count") private Long likeCount; + @Column(name = "view_count") private Long viewCount; + @Column(name = "category") @Enumerated(EnumType.STRING) private PostCategory category; - @Column + @Column(name = "board_code") private String boardCode; - @Column + @Column(name = "site_user_id", nullable = false) private long siteUserId; - @Column(name = "is_deleted", columnDefinition = "boolean default false", nullable = false) + @ColumnDefault("false") + @Column(name = "is_deleted", nullable = false) private boolean isDeleted = false; @BatchSize(size = 20) diff --git a/src/main/java/com/example/solidconnection/community/post/domain/PostCategory.java b/src/main/java/com/example/solidconnection/community/post/domain/PostCategory.java index 04d6c2eb5..76b003bc5 100644 --- a/src/main/java/com/example/solidconnection/community/post/domain/PostCategory.java +++ b/src/main/java/com/example/solidconnection/community/post/domain/PostCategory.java @@ -11,7 +11,7 @@ public enum PostCategory { .map(Enum::name) .collect(Collectors.toSet()); - public static boolean isValid(String name){ + public static boolean isValid(String name) { return name != null && NAMES.contains(name); } } diff --git a/src/main/java/com/example/solidconnection/community/post/domain/PostImage.java b/src/main/java/com/example/solidconnection/community/post/domain/PostImage.java index 5493d3f0c..b9027c32b 100644 --- a/src/main/java/com/example/solidconnection/community/post/domain/PostImage.java +++ b/src/main/java/com/example/solidconnection/community/post/domain/PostImage.java @@ -19,9 +19,10 @@ public class PostImage extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id") private Long id; - @Column(length = 500) + @Column(name = "url", length = 500) private String url; @ManyToOne(fetch = FetchType.LAZY) diff --git a/src/main/java/com/example/solidconnection/community/post/domain/PostLike.java b/src/main/java/com/example/solidconnection/community/post/domain/PostLike.java index 0d4406521..09f5279e0 100644 --- a/src/main/java/com/example/solidconnection/community/post/domain/PostLike.java +++ b/src/main/java/com/example/solidconnection/community/post/domain/PostLike.java @@ -1,6 +1,7 @@ package com.example.solidconnection.community.post.domain; import com.example.solidconnection.common.BaseEntity; +import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.FetchType; import jakarta.persistence.GeneratedValue; @@ -20,12 +21,14 @@ public class PostLike extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id") private Long id; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "post_id") private Post post; + @Column(name = "site_user_id", nullable = false) private long siteUserId; public void setPostAndSiteUserId(Post post, long siteUserId) { diff --git a/src/main/java/com/example/solidconnection/community/post/repository/PostRepository.java b/src/main/java/com/example/solidconnection/community/post/repository/PostRepository.java index a1e727d9c..b7a5bfe7a 100644 --- a/src/main/java/com/example/solidconnection/community/post/repository/PostRepository.java +++ b/src/main/java/com/example/solidconnection/community/post/repository/PostRepository.java @@ -52,18 +52,18 @@ AND p.siteUserId NOT IN ( @Modifying(clearAutomatically = true, flushAutomatically = true) @Query(value = """ - UPDATE post p SET p.is_deleted = :isDeleted - WHERE p.site_user_id = :siteUserId - AND p.id IN (SELECT r.target_id FROM report r WHERE r.target_type = 'POST') - """, nativeQuery = true) + UPDATE post p SET p.is_deleted = :isDeleted + WHERE p.site_user_id = :siteUserId + AND p.id IN (SELECT r.target_id FROM report r WHERE r.target_type = 'POST') + """, nativeQuery = true) void updateReportedPostsIsDeleted(@Param("siteUserId") long siteUserId, @Param("isDeleted") boolean isDeleted); @Modifying(clearAutomatically = true, flushAutomatically = true) @Query(value = """ - UPDATE post p SET p.is_deleted = :isDeleted - WHERE p.site_user_id IN :siteUserIds - AND p.id IN (SELECT r.target_id FROM report r WHERE r.target_type = 'POST') - """, nativeQuery = true) + UPDATE post p SET p.is_deleted = :isDeleted + WHERE p.site_user_id IN :siteUserIds + AND p.id IN (SELECT r.target_id FROM report r WHERE r.target_type = 'POST') + """, nativeQuery = true) void bulkUpdateReportedPostsIsDeleted(@Param("siteUserIds") List siteUserIds, @Param("isDeleted") boolean isDeleted); default Post getByIdUsingEntityGraph(Long id) { diff --git a/src/main/java/com/example/solidconnection/community/post/service/UpdateViewCountService.java b/src/main/java/com/example/solidconnection/community/post/service/UpdateViewCountService.java index 4957b50d7..fb30ea44d 100644 --- a/src/main/java/com/example/solidconnection/community/post/service/UpdateViewCountService.java +++ b/src/main/java/com/example/solidconnection/community/post/service/UpdateViewCountService.java @@ -1,6 +1,5 @@ package com.example.solidconnection.community.post.service; -import com.example.solidconnection.community.post.domain.Post; import com.example.solidconnection.community.post.repository.PostRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/com/example/solidconnection/location/country/domain/Country.java b/src/main/java/com/example/solidconnection/location/country/domain/Country.java index 67e295540..fa026fe49 100644 --- a/src/main/java/com/example/solidconnection/location/country/domain/Country.java +++ b/src/main/java/com/example/solidconnection/location/country/domain/Country.java @@ -15,10 +15,10 @@ public class Country { @Id - @Column(length = 2) + @Column(name = "code", length = 2) private String code; - @Column(nullable = false, length = 100) + @Column(name = "korean_name", nullable = false, length = 100) private String koreanName; @Column(name = "region_code") diff --git a/src/main/java/com/example/solidconnection/location/country/domain/InterestedCountry.java b/src/main/java/com/example/solidconnection/location/country/domain/InterestedCountry.java index 2743026d0..68f2973b6 100644 --- a/src/main/java/com/example/solidconnection/location/country/domain/InterestedCountry.java +++ b/src/main/java/com/example/solidconnection/location/country/domain/InterestedCountry.java @@ -26,9 +26,10 @@ public class InterestedCountry extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id") private Long id; - @Column(name = "site_user_id") + @Column(name = "site_user_id", nullable = false) private long siteUserId; @Column(name = "country_code") diff --git a/src/main/java/com/example/solidconnection/location/region/domain/InterestedRegion.java b/src/main/java/com/example/solidconnection/location/region/domain/InterestedRegion.java index 3429632bc..1b74b0f0d 100644 --- a/src/main/java/com/example/solidconnection/location/region/domain/InterestedRegion.java +++ b/src/main/java/com/example/solidconnection/location/region/domain/InterestedRegion.java @@ -26,9 +26,10 @@ public class InterestedRegion extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id") private Long id; - @Column(name = "site_user_id") + @Column(name = "site_user_id", nullable = false) private long siteUserId; @Column(name = "region_code") diff --git a/src/main/java/com/example/solidconnection/location/region/domain/Region.java b/src/main/java/com/example/solidconnection/location/region/domain/Region.java index 3a9953f99..bf148f917 100644 --- a/src/main/java/com/example/solidconnection/location/region/domain/Region.java +++ b/src/main/java/com/example/solidconnection/location/region/domain/Region.java @@ -15,10 +15,10 @@ public class Region { @Id - @Column(length = 10) + @Column(name = "code", length = 10) private String code; - @Column(nullable = false, length = 100) + @Column(name = "korean_name", nullable = false, length = 100) private String koreanName; public Region(String code, String koreanName) { diff --git a/src/main/java/com/example/solidconnection/mentor/controller/MentorController.java b/src/main/java/com/example/solidconnection/mentor/controller/MentorController.java index 37f40fe8d..632f2303b 100644 --- a/src/main/java/com/example/solidconnection/mentor/controller/MentorController.java +++ b/src/main/java/com/example/solidconnection/mentor/controller/MentorController.java @@ -38,7 +38,7 @@ public ResponseEntity getMentorDetails( public ResponseEntity> getMentorPreviews( @AuthorizedUser long siteUserId, @RequestParam("region") String region, - + @PageableDefault(size = 3) @SortDefaults({ @SortDefault(sort = "menteeCount", direction = Sort.Direction.DESC), diff --git a/src/main/java/com/example/solidconnection/mentor/domain/Channel.java b/src/main/java/com/example/solidconnection/mentor/domain/Channel.java index e1d2a023d..e20a04b5b 100644 --- a/src/main/java/com/example/solidconnection/mentor/domain/Channel.java +++ b/src/main/java/com/example/solidconnection/mentor/domain/Channel.java @@ -31,16 +31,17 @@ public class Channel extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id") private Long id; - @Column + @Column(name = "sequence", nullable = false) private int sequence; @Enumerated(EnumType.STRING) - @Column(nullable = false) + @Column(name = "type", nullable = false) private ChannelType type; - @Column(nullable = false, length = 500) + @Column(name = "url", nullable = false, length = 500) private String url; @ManyToOne(fetch = FetchType.LAZY) diff --git a/src/main/java/com/example/solidconnection/mentor/domain/Mentor.java b/src/main/java/com/example/solidconnection/mentor/domain/Mentor.java index 8d1934cca..bed078d2a 100644 --- a/src/main/java/com/example/solidconnection/mentor/domain/Mentor.java +++ b/src/main/java/com/example/solidconnection/mentor/domain/Mentor.java @@ -16,6 +16,7 @@ import lombok.Getter; import lombok.NoArgsConstructor; import org.hibernate.annotations.BatchSize; +import org.hibernate.annotations.ColumnDefault; @Entity @Getter @@ -25,24 +26,27 @@ public class Mentor extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id") private Long id; - @Column + @ColumnDefault("0") + @Column(name = "mentee_count", nullable = false) private int menteeCount = 0; - @Column + @ColumnDefault("false") + @Column(name = "has_badge", nullable = false) private boolean hasBadge = false; - @Column(length = 1000) + @Column(name = "introduction", length = 1000) private String introduction; - @Column(length = 1000) + @Column(name = "pass_tip", length = 1000) private String passTip; - @Column + @Column(name = "site_user_id", nullable = false) private long siteUserId; - @Column + @Column(name = "university_id", nullable = false) private long universityId; @Column(nullable = false, name = "term_id") diff --git a/src/main/java/com/example/solidconnection/mentor/domain/MentorApplication.java b/src/main/java/com/example/solidconnection/mentor/domain/MentorApplication.java index fe4f2ccb1..149ab9168 100644 --- a/src/main/java/com/example/solidconnection/mentor/domain/MentorApplication.java +++ b/src/main/java/com/example/solidconnection/mentor/domain/MentorApplication.java @@ -40,45 +40,36 @@ ) public class MentorApplication extends BaseEntity { + private static final Set ALLOWED = + Collections.unmodifiableSet(EnumSet.of(ExchangeStatus.STUDYING_ABROAD, ExchangeStatus.AFTER_EXCHANGE)); @Id @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id") private Long id; - - @Column(nullable = false) + @Column(name = "site_user_id", nullable = false) private long siteUserId; - - @Column(nullable = false, name = "country_code") + @Column(name = "country_code", nullable = false) private String countryCode; - - @Column + @Column(name = "university_id") private Long universityId; - - @Column(nullable = false) + @Column(name = "university_select_type", nullable = false) @Enumerated(EnumType.STRING) private UniversitySelectType universitySelectType; - - @Column(nullable = false, name = "mentor_proof_url", length = 500) + @Column(name = "mentor_proof_url", nullable = false, length = 500) private String mentorProofUrl; - - @Column(nullable = false, name = "term_id") + @Column(name = "term_id", nullable = false) private long termId; - + @Column(name = "rejected_reason") private String rejectedReason; - - @Column(nullable = false) + @Column(name = "exchange_status", nullable = false) @Enumerated(EnumType.STRING) private ExchangeStatus exchangeStatus; - - @Column(nullable = false) + @Column(name = "mentor_application_status", nullable = false) @Enumerated(EnumType.STRING) private MentorApplicationStatus mentorApplicationStatus; - - @Column + @Column(name = "approved_at") private ZonedDateTime approvedAt; - private static final Set ALLOWED = - Collections.unmodifiableSet(EnumSet.of(ExchangeStatus.STUDYING_ABROAD, ExchangeStatus.AFTER_EXCHANGE)); - public MentorApplication( long siteUserId, String countryCode, @@ -104,39 +95,39 @@ public MentorApplication( private void validateUniversitySelection(UniversitySelectType universitySelectType, Long universityId) { switch (universitySelectType) { case CATALOG -> { - if(universityId == null) { + if (universityId == null) { throw new CustomException(ErrorCode.UNIVERSITY_ID_REQUIRED_FOR_CATALOG); } } case OTHER -> { - if(universityId != null) { + if (universityId != null) { throw new CustomException(ErrorCode.UNIVERSITY_ID_MUST_BE_NULL_FOR_OTHER); } } - default -> throw new CustomException(ErrorCode.INVALID_UNIVERSITY_SELECT_TYPE); + default -> throw new CustomException(ErrorCode.INVALID_UNIVERSITY_SELECT_TYPE); } } private void validateExchangeStatus(ExchangeStatus exchangeStatus) { - if(!ALLOWED.contains(exchangeStatus)) { + if (!ALLOWED.contains(exchangeStatus)) { throw new CustomException(ErrorCode.INVALID_EXCHANGE_STATUS_FOR_MENTOR); } } - public void approve(){ + public void approve() { validatePending(); validateCanApprove(); this.mentorApplicationStatus = MentorApplicationStatus.APPROVED; this.approvedAt = ZonedDateTime.now(UTC).truncatedTo(MICROS); } - private void validateCanApprove(){ - if(this.universitySelectType != UniversitySelectType.CATALOG){ + private void validateCanApprove() { + if (this.universitySelectType != UniversitySelectType.CATALOG) { throw new CustomException(MENTOR_APPLICATION_UNIVERSITY_NOT_SELECTED); } } - public void reject(String rejectedReason){ + public void reject(String rejectedReason) { validatePending(); this.mentorApplicationStatus = MentorApplicationStatus.REJECTED; this.rejectedReason = rejectedReason; @@ -146,16 +137,16 @@ public void assignUniversity(long universityId) { this.universityId = universityId; this.universitySelectType = UniversitySelectType.CATALOG; } - - public void validateCanAssignUniversity(){ + + public void validateCanAssignUniversity() { validatePending(); - if(this.universitySelectType != UniversitySelectType.OTHER){ + if (this.universitySelectType != UniversitySelectType.OTHER) { throw new CustomException(MENTOR_APPLICATION_NOT_OTHER_STATUS); } } - private void validatePending(){ - if(this.mentorApplicationStatus != MentorApplicationStatus.PENDING) { + private void validatePending() { + if (this.mentorApplicationStatus != MentorApplicationStatus.PENDING) { throw new CustomException(MENTOR_APPLICATION_ALREADY_CONFIRMED); } } diff --git a/src/main/java/com/example/solidconnection/mentor/domain/Mentoring.java b/src/main/java/com/example/solidconnection/mentor/domain/Mentoring.java index 4dcae29bf..c2a359962 100644 --- a/src/main/java/com/example/solidconnection/mentor/domain/Mentoring.java +++ b/src/main/java/com/example/solidconnection/mentor/domain/Mentoring.java @@ -20,6 +20,7 @@ import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; +import org.hibernate.annotations.ColumnDefault; import org.hibernate.annotations.DynamicInsert; import org.springframework.data.jpa.domain.support.AuditingEntityListener; @@ -39,9 +40,10 @@ public class Mentoring extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id") private Long id; - @Column(name="confirmed_at") + @Column(name = "confirmed_at") private ZonedDateTime confirmedAt; @Column(name = "checked_at_by_mentor") @@ -50,14 +52,15 @@ public class Mentoring extends BaseEntity { @Column(name = "checked_at_by_mentee") private ZonedDateTime checkedAtByMentee; - @Column(nullable = false, name="verify_status") + @ColumnDefault("'PENDING'") + @Column(name = "verify_status", nullable = false) @Enumerated(EnumType.STRING) private VerifyStatus verifyStatus = VerifyStatus.PENDING; - @Column(name = "mentor_id") + @Column(name = "mentor_id", nullable = false) private long mentorId; - @Column(name = "mentee_id") + @Column(name = "mentee_id", nullable = false) private long menteeId; public Mentoring(long mentorId, long menteeId, VerifyStatus verifyStatus) { diff --git a/src/main/java/com/example/solidconnection/mentor/dto/MentorApplicationRequest.java b/src/main/java/com/example/solidconnection/mentor/dto/MentorApplicationRequest.java index c4c09977b..b70512678 100644 --- a/src/main/java/com/example/solidconnection/mentor/dto/MentorApplicationRequest.java +++ b/src/main/java/com/example/solidconnection/mentor/dto/MentorApplicationRequest.java @@ -22,4 +22,5 @@ public record MentorApplicationRequest( @NotBlank(message = "학기를 입력해주세요.") String term ) { + } diff --git a/src/main/java/com/example/solidconnection/mentor/repository/MentorApplicationRepository.java b/src/main/java/com/example/solidconnection/mentor/repository/MentorApplicationRepository.java index 1da033d45..05be7d0cf 100644 --- a/src/main/java/com/example/solidconnection/mentor/repository/MentorApplicationRepository.java +++ b/src/main/java/com/example/solidconnection/mentor/repository/MentorApplicationRepository.java @@ -7,12 +7,12 @@ import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; -public interface MentorApplicationRepository extends JpaRepository , MentorApplicationFilterRepository { +public interface MentorApplicationRepository extends JpaRepository, MentorApplicationFilterRepository { boolean existsBySiteUserIdAndMentorApplicationStatusIn(long siteUserId, List mentorApplicationStatuses); void deleteAllBySiteUserId(long siteUserId); - + Optional findBySiteUserIdAndMentorApplicationStatus(long siteUserId, MentorApplicationStatus mentorApplicationStatus); long countByMentorApplicationStatus(MentorApplicationStatus mentorApplicationStatus); diff --git a/src/main/java/com/example/solidconnection/mentor/service/MentorApplicationService.java b/src/main/java/com/example/solidconnection/mentor/service/MentorApplicationService.java index 57edfdded..762dcc33e 100644 --- a/src/main/java/com/example/solidconnection/mentor/service/MentorApplicationService.java +++ b/src/main/java/com/example/solidconnection/mentor/service/MentorApplicationService.java @@ -1,5 +1,9 @@ package com.example.solidconnection.mentor.service; +import static com.example.solidconnection.common.exception.ErrorCode.MENTOR_APPLICATION_ALREADY_EXISTED; +import static com.example.solidconnection.common.exception.ErrorCode.TERM_NOT_FOUND; +import static com.example.solidconnection.common.exception.ErrorCode.USER_NOT_FOUND; + import com.example.solidconnection.common.exception.CustomException; import com.example.solidconnection.mentor.domain.MentorApplication; import com.example.solidconnection.mentor.domain.MentorApplicationStatus; @@ -19,10 +23,6 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; -import static com.example.solidconnection.common.exception.ErrorCode.MENTOR_APPLICATION_ALREADY_EXISTED; -import static com.example.solidconnection.common.exception.ErrorCode.TERM_NOT_FOUND; -import static com.example.solidconnection.common.exception.ErrorCode.USER_NOT_FOUND; - @Service @RequiredArgsConstructor @Slf4j diff --git a/src/main/java/com/example/solidconnection/news/domain/LikedNews.java b/src/main/java/com/example/solidconnection/news/domain/LikedNews.java index 78df0965f..0585e32a5 100644 --- a/src/main/java/com/example/solidconnection/news/domain/LikedNews.java +++ b/src/main/java/com/example/solidconnection/news/domain/LikedNews.java @@ -27,12 +27,13 @@ public class LikedNews extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id") private Long id; - @Column(name = "news_id") + @Column(name = "news_id", nullable = false) private long newsId; - @Column(name = "site_user_id") + @Column(name = "site_user_id", nullable = false) private long siteUserId; public LikedNews(long newsId, long siteUserId) { diff --git a/src/main/java/com/example/solidconnection/news/domain/News.java b/src/main/java/com/example/solidconnection/news/domain/News.java index 5443f65aa..c28b317ef 100644 --- a/src/main/java/com/example/solidconnection/news/domain/News.java +++ b/src/main/java/com/example/solidconnection/news/domain/News.java @@ -21,18 +21,22 @@ public class News extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id") private Long id; + @Column(name = "title") private String title; + @Column(name = "description") private String description; - @Column(length = 500) + @Column(name = "thumbnail_url", length = 500) private String thumbnailUrl; - @Column(length = 500) + @Column(name = "url", length = 500) private String url; + @Column(name = "site_user_id", nullable = false) private long siteUserId; public News( diff --git a/src/main/java/com/example/solidconnection/report/domain/Report.java b/src/main/java/com/example/solidconnection/report/domain/Report.java index d76d155f0..ca13ebeda 100644 --- a/src/main/java/com/example/solidconnection/report/domain/Report.java +++ b/src/main/java/com/example/solidconnection/report/domain/Report.java @@ -30,10 +30,10 @@ public class Report extends BaseEntity { @Column(name = "id") private Long id; - @Column(name = "reporter_id") + @Column(name = "reporter_id", nullable = false) private long reporterId; - @Column(name = "reported_id") + @Column(name = "reported_id", nullable = false) private long reportedId; @Column(name = "report_type") @@ -44,7 +44,7 @@ public class Report extends BaseEntity { @Enumerated(value = EnumType.STRING) private TargetType targetType; - @Column(name = "target_id") + @Column(name = "target_id", nullable = false) private long targetId; public Report(long reporterId, long reportedId, ReportType reportType, TargetType targetType, long targetId) { diff --git a/src/main/java/com/example/solidconnection/report/domain/TargetType.java b/src/main/java/com/example/solidconnection/report/domain/TargetType.java index a3a6d68af..90ae3ebcd 100644 --- a/src/main/java/com/example/solidconnection/report/domain/TargetType.java +++ b/src/main/java/com/example/solidconnection/report/domain/TargetType.java @@ -3,6 +3,5 @@ public enum TargetType { POST, - CHAT - ; + CHAT; } diff --git a/src/main/java/com/example/solidconnection/report/repository/ReportRepository.java b/src/main/java/com/example/solidconnection/report/repository/ReportRepository.java index b5f1832c2..8a359450b 100644 --- a/src/main/java/com/example/solidconnection/report/repository/ReportRepository.java +++ b/src/main/java/com/example/solidconnection/report/repository/ReportRepository.java @@ -9,6 +9,6 @@ public interface ReportRepository extends JpaRepository { boolean existsByReporterIdAndTargetTypeAndTargetId(long reporterId, TargetType targetType, long targetId); boolean existsByReportedId(long reportedId); - + void deleteAllByReporterId(long reporterId); } diff --git a/src/main/java/com/example/solidconnection/s3/domain/UploadPath.java b/src/main/java/com/example/solidconnection/s3/domain/UploadPath.java index f4f4d4d6e..d94ed1fb8 100644 --- a/src/main/java/com/example/solidconnection/s3/domain/UploadPath.java +++ b/src/main/java/com/example/solidconnection/s3/domain/UploadPath.java @@ -23,12 +23,17 @@ public enum UploadPath { } public boolean isResizable(long fileSize, String extension, long maxSizeBytes) { - if (!isImage(extension)) return false; + if (!isImage(extension)) { + return false; + } - if (this == CHAT) return false; + if (this == CHAT) { + return false; + } return fileSize >= maxSizeBytes; } + public void validateExtension(String extension) { if (extension == null || !FileConstants.ALL_ALLOWED_EXTENSIONS.contains(extension.toLowerCase())) { throw new CustomException(ErrorCode.NOT_ALLOWED_FILE_EXTENSIONS, diff --git a/src/main/java/com/example/solidconnection/score/domain/GpaScore.java b/src/main/java/com/example/solidconnection/score/domain/GpaScore.java index 7e8536d83..cd7ed1a10 100644 --- a/src/main/java/com/example/solidconnection/score/domain/GpaScore.java +++ b/src/main/java/com/example/solidconnection/score/domain/GpaScore.java @@ -16,6 +16,7 @@ import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; +import org.hibernate.annotations.ColumnDefault; @Getter @Entity @@ -25,18 +26,22 @@ public class GpaScore extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id") private Long id; @Embedded private Gpa gpa; @Setter - @Column(nullable = false) + @ColumnDefault("'PENDING'") + @Column(name = "verify_status", nullable = false) @Enumerated(EnumType.STRING) private VerifyStatus verifyStatus = VerifyStatus.PENDING; + @Column(name = "rejected_reason") private String rejectedReason; + @Column(name = "site_user_id", nullable = false) private long siteUserId; public GpaScore(Gpa gpa, SiteUser siteUser) { diff --git a/src/main/java/com/example/solidconnection/score/domain/LanguageTestScore.java b/src/main/java/com/example/solidconnection/score/domain/LanguageTestScore.java index 415519b7d..da8367026 100644 --- a/src/main/java/com/example/solidconnection/score/domain/LanguageTestScore.java +++ b/src/main/java/com/example/solidconnection/score/domain/LanguageTestScore.java @@ -16,6 +16,7 @@ import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; +import org.hibernate.annotations.ColumnDefault; @Getter @Entity @@ -25,18 +26,22 @@ public class LanguageTestScore extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id") private Long id; @Embedded private LanguageTest languageTest; @Setter - @Column(nullable = false) + @ColumnDefault("'PENDING'") + @Column(name = "verify_status", nullable = false) @Enumerated(EnumType.STRING) private VerifyStatus verifyStatus = VerifyStatus.PENDING; + @Column(name = "rejected_reason") private String rejectedReason; + @Column(name = "site_user_id", nullable = false) private long siteUserId; public LanguageTestScore(LanguageTest languageTest, SiteUser siteUser) { diff --git a/src/main/java/com/example/solidconnection/score/repository/custom/GpaScoreFilterRepositoryImpl.java b/src/main/java/com/example/solidconnection/score/repository/custom/GpaScoreFilterRepositoryImpl.java index 839b4340e..825b5100f 100644 --- a/src/main/java/com/example/solidconnection/score/repository/custom/GpaScoreFilterRepositoryImpl.java +++ b/src/main/java/com/example/solidconnection/score/repository/custom/GpaScoreFilterRepositoryImpl.java @@ -56,7 +56,6 @@ public class GpaScoreFilterRepositoryImpl implements GpaScoreFilterRepository { GPA_SCORE_STATUS_RESPONSE_PROJECTION, SITE_USER_RESPONSE_PROJECTION ); - private final JPAQueryFactory queryFactory; @Autowired diff --git a/src/main/java/com/example/solidconnection/score/repository/custom/LanguageTestScoreFilterRepositoryImpl.java b/src/main/java/com/example/solidconnection/score/repository/custom/LanguageTestScoreFilterRepositoryImpl.java index bcd999a09..6d7ebd537 100644 --- a/src/main/java/com/example/solidconnection/score/repository/custom/LanguageTestScoreFilterRepositoryImpl.java +++ b/src/main/java/com/example/solidconnection/score/repository/custom/LanguageTestScoreFilterRepositoryImpl.java @@ -56,7 +56,6 @@ public class LanguageTestScoreFilterRepositoryImpl implements LanguageTestScoreF LANGUAGE_TEST_SCORE_STATUS_RESPONSE_PROJECTION, SITE_USER_RESPONSE_PROJECTION ); - private final JPAQueryFactory queryFactory; @Autowired diff --git a/src/main/java/com/example/solidconnection/siteuser/domain/SiteUser.java b/src/main/java/com/example/solidconnection/siteuser/domain/SiteUser.java index f6c3f3b33..507e8ab62 100644 --- a/src/main/java/com/example/solidconnection/siteuser/domain/SiteUser.java +++ b/src/main/java/com/example/solidconnection/siteuser/domain/SiteUser.java @@ -36,6 +36,7 @@ public class SiteUser extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id") private Long id; @Column(name = "email", nullable = false, length = 100) @@ -46,31 +47,33 @@ public class SiteUser extends BaseEntity { private AuthType authType; @Setter - @Column(nullable = false, length = 100) + @Column(name = "nickname", nullable = false, length = 100) private String nickname; @Setter - @Column(length = 500) + @Column(name = "profile_image_url", length = 500) private String profileImageUrl; - @Column(nullable = false) + @Column(name = "exchange_status", nullable = false) @Enumerated(EnumType.STRING) private ExchangeStatus exchangeStatus; - @Column(nullable = false) + @Column(name = "role", nullable = false) @Enumerated(EnumType.STRING) private Role role; @Setter + @Column(name = "nickname_modified_at") private LocalDateTime nicknameModifiedAt; @Setter + @Column(name = "quited_at") private LocalDate quitedAt; - @Column(nullable = true) + @Column(name = "password", nullable = true) private String password; - @Column(nullable = false) + @Column(name = "user_status", nullable = false) @Enumerated(EnumType.STRING) private UserStatus userStatus = UserStatus.ACTIVE; diff --git a/src/main/java/com/example/solidconnection/siteuser/domain/UserBan.java b/src/main/java/com/example/solidconnection/siteuser/domain/UserBan.java index 8dab3ea8a..c3a4b03ed 100644 --- a/src/main/java/com/example/solidconnection/siteuser/domain/UserBan.java +++ b/src/main/java/com/example/solidconnection/siteuser/domain/UserBan.java @@ -2,7 +2,6 @@ import static java.time.ZoneOffset.UTC; -import java.time.ZonedDateTime; import com.example.solidconnection.common.BaseEntity; import jakarta.persistence.Column; import jakarta.persistence.Entity; @@ -11,6 +10,7 @@ import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; +import java.time.ZonedDateTime; import lombok.AccessLevel; import lombok.Getter; import lombok.NoArgsConstructor; diff --git a/src/main/java/com/example/solidconnection/siteuser/domain/UserBlock.java b/src/main/java/com/example/solidconnection/siteuser/domain/UserBlock.java index 9cd78795b..cf8611c41 100644 --- a/src/main/java/com/example/solidconnection/siteuser/domain/UserBlock.java +++ b/src/main/java/com/example/solidconnection/siteuser/domain/UserBlock.java @@ -27,6 +27,7 @@ public class UserBlock extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id") private Long id; @Column(name = "blocker_id", nullable = false) diff --git a/src/main/java/com/example/solidconnection/siteuser/dto/MyPageResponse.java b/src/main/java/com/example/solidconnection/siteuser/dto/MyPageResponse.java index 10b8b8953..ae0b1b4cf 100644 --- a/src/main/java/com/example/solidconnection/siteuser/dto/MyPageResponse.java +++ b/src/main/java/com/example/solidconnection/siteuser/dto/MyPageResponse.java @@ -1,6 +1,6 @@ package com.example.solidconnection.siteuser.dto; -import static com.fasterxml.jackson.annotation.JsonInclude.Include.*; +import static com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL; import com.example.solidconnection.siteuser.domain.AuthType; import com.example.solidconnection.siteuser.domain.Role; diff --git a/src/main/java/com/example/solidconnection/siteuser/repository/SiteUserRepository.java b/src/main/java/com/example/solidconnection/siteuser/repository/SiteUserRepository.java index 6cf88ca2c..b151ade94 100644 --- a/src/main/java/com/example/solidconnection/siteuser/repository/SiteUserRepository.java +++ b/src/main/java/com/example/solidconnection/siteuser/repository/SiteUserRepository.java @@ -3,11 +3,10 @@ import com.example.solidconnection.siteuser.domain.AuthType; import com.example.solidconnection.siteuser.domain.SiteUser; import com.example.solidconnection.siteuser.domain.UserStatus; +import com.example.solidconnection.siteuser.repository.custom.SiteUserFilterRepository; import java.time.LocalDate; import java.util.List; import java.util.Optional; - -import com.example.solidconnection.siteuser.repository.custom.SiteUserFilterRepository; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; diff --git a/src/main/java/com/example/solidconnection/siteuser/repository/custom/SiteUserFilterRepository.java b/src/main/java/com/example/solidconnection/siteuser/repository/custom/SiteUserFilterRepository.java index 5908daf1d..be395905b 100644 --- a/src/main/java/com/example/solidconnection/siteuser/repository/custom/SiteUserFilterRepository.java +++ b/src/main/java/com/example/solidconnection/siteuser/repository/custom/SiteUserFilterRepository.java @@ -1,22 +1,22 @@ package com.example.solidconnection.siteuser.repository.custom; -import com.example.solidconnection.siteuser.domain.SiteUser; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; import com.example.solidconnection.admin.dto.RestrictedUserInfoDetailResponse; import com.example.solidconnection.admin.dto.RestrictedUserSearchCondition; import com.example.solidconnection.admin.dto.RestrictedUserSearchResponse; import com.example.solidconnection.admin.dto.UserInfoDetailResponse; import com.example.solidconnection.admin.dto.UserSearchCondition; import com.example.solidconnection.admin.dto.UserSearchResponse; +import com.example.solidconnection.siteuser.domain.SiteUser; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; public interface SiteUserFilterRepository { - Page searchAllUsers(UserSearchCondition searchCondition, Pageable pageable); + Page searchAllUsers(UserSearchCondition searchCondition, Pageable pageable); - Page searchRestrictedUsers(RestrictedUserSearchCondition searchCondition, Pageable pageable); + Page searchRestrictedUsers(RestrictedUserSearchCondition searchCondition, Pageable pageable); - UserInfoDetailResponse getUserInfoDetailByUserId(SiteUser user); + UserInfoDetailResponse getUserInfoDetailByUserId(SiteUser user); - RestrictedUserInfoDetailResponse getRestrictedUserInfoDetail(long userId); + RestrictedUserInfoDetailResponse getRestrictedUserInfoDetail(long userId); } diff --git a/src/main/java/com/example/solidconnection/siteuser/repository/custom/SiteUserFilterRepositoryImpl.java b/src/main/java/com/example/solidconnection/siteuser/repository/custom/SiteUserFilterRepositoryImpl.java index 020db4863..caca1f013 100644 --- a/src/main/java/com/example/solidconnection/siteuser/repository/custom/SiteUserFilterRepositoryImpl.java +++ b/src/main/java/com/example/solidconnection/siteuser/repository/custom/SiteUserFilterRepositoryImpl.java @@ -10,24 +10,15 @@ import static java.time.ZoneOffset.UTC; import static org.springframework.util.StringUtils.hasText; -import com.example.solidconnection.admin.dto.MentorApplicationHistoryInfoResponse; -import java.time.ZonedDateTime; -import java.util.ArrayList; -import java.util.List; -import org.springframework.beans.factory.annotation.Autowired; -import com.example.solidconnection.admin.dto.RestrictedUserInfoDetailResponse; -import com.example.solidconnection.university.domain.QUnivApplyInfo; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageImpl; -import org.springframework.data.domain.Pageable; -import org.springframework.stereotype.Repository; import com.example.solidconnection.admin.dto.BannedHistoryResponse; import com.example.solidconnection.admin.dto.BannedInfoResponse; import com.example.solidconnection.admin.dto.MatchedInfoResponse; import com.example.solidconnection.admin.dto.MenteeInfoResponse; +import com.example.solidconnection.admin.dto.MentorApplicationHistoryInfoResponse; import com.example.solidconnection.admin.dto.MentorInfoResponse; import com.example.solidconnection.admin.dto.ReportedHistoryResponse; import com.example.solidconnection.admin.dto.ReportedInfoResponse; +import com.example.solidconnection.admin.dto.RestrictedUserInfoDetailResponse; import com.example.solidconnection.admin.dto.RestrictedUserSearchCondition; import com.example.solidconnection.admin.dto.RestrictedUserSearchResponse; import com.example.solidconnection.admin.dto.UnivApplyInfoResponse; @@ -37,6 +28,7 @@ import com.example.solidconnection.siteuser.domain.Role; import com.example.solidconnection.siteuser.domain.SiteUser; import com.example.solidconnection.siteuser.domain.UserStatus; +import com.example.solidconnection.university.domain.QUnivApplyInfo; import com.querydsl.core.types.ConstructorExpression; import com.querydsl.core.types.Projections; import com.querydsl.core.types.dsl.BooleanExpression; @@ -44,6 +36,14 @@ import com.querydsl.jpa.impl.JPAQuery; import com.querydsl.jpa.impl.JPAQueryFactory; import jakarta.persistence.EntityManager; +import java.time.ZonedDateTime; +import java.util.ArrayList; +import java.util.List; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Repository; @Repository public class SiteUserFilterRepositoryImpl implements SiteUserFilterRepository { @@ -219,8 +219,8 @@ private JPAQuery createRestrictedUserCountQuery(RestrictedUserSearchCondit private BooleanExpression isRestrictedUser() { return siteUser.userStatus.in( - UserStatus.REPORTED, - UserStatus.BANNED + UserStatus.REPORTED, + UserStatus.BANNED ); } diff --git a/src/main/java/com/example/solidconnection/siteuser/service/MyPageService.java b/src/main/java/com/example/solidconnection/siteuser/service/MyPageService.java index ef6d985e5..cdf5aa83c 100644 --- a/src/main/java/com/example/solidconnection/siteuser/service/MyPageService.java +++ b/src/main/java/com/example/solidconnection/siteuser/service/MyPageService.java @@ -9,9 +9,9 @@ import static com.example.solidconnection.common.exception.ErrorCode.USER_NOT_FOUND; import com.example.solidconnection.common.exception.CustomException; +import com.example.solidconnection.location.country.repository.CountryRepository; import com.example.solidconnection.location.country.service.InterestedCountryService; import com.example.solidconnection.location.region.service.InterestedRegionService; -import com.example.solidconnection.location.country.repository.CountryRepository; import com.example.solidconnection.mentor.domain.Mentor; import com.example.solidconnection.mentor.repository.MentorRepository; import com.example.solidconnection.s3.domain.UploadPath; @@ -25,8 +25,8 @@ import com.example.solidconnection.siteuser.dto.PasswordUpdateRequest; import com.example.solidconnection.siteuser.repository.SiteUserRepository; import com.example.solidconnection.university.domain.HostUniversity; -import com.example.solidconnection.university.repository.LikedUnivApplyInfoRepository; import com.example.solidconnection.university.repository.HostUniversityRepository; +import com.example.solidconnection.university.repository.LikedUnivApplyInfoRepository; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.List; diff --git a/src/main/java/com/example/solidconnection/term/domain/Term.java b/src/main/java/com/example/solidconnection/term/domain/Term.java index 9c8c5c8da..544c73db1 100644 --- a/src/main/java/com/example/solidconnection/term/domain/Term.java +++ b/src/main/java/com/example/solidconnection/term/domain/Term.java @@ -26,9 +26,10 @@ public class Term { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id") private Long id; - @Column(length = 20) + @Column(name = "name", length = 20) private String name; @Column(name = "is_current", unique = true) diff --git a/src/main/java/com/example/solidconnection/university/domain/HomeUniversity.java b/src/main/java/com/example/solidconnection/university/domain/HomeUniversity.java index ef9cc01bd..f39378e97 100644 --- a/src/main/java/com/example/solidconnection/university/domain/HomeUniversity.java +++ b/src/main/java/com/example/solidconnection/university/domain/HomeUniversity.java @@ -19,8 +19,9 @@ public class HomeUniversity extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id") private Long id; - @Column(nullable = false, unique = true, length = 100) + @Column(name = "name", nullable = false, unique = true, length = 100) private String name; } diff --git a/src/main/java/com/example/solidconnection/university/domain/HostUniversity.java b/src/main/java/com/example/solidconnection/university/domain/HostUniversity.java index 6e9f4b4c6..6f816a23c 100644 --- a/src/main/java/com/example/solidconnection/university/domain/HostUniversity.java +++ b/src/main/java/com/example/solidconnection/university/domain/HostUniversity.java @@ -22,33 +22,34 @@ public class HostUniversity extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id") private Long id; - @Column(nullable = false, unique = true, length = 100) + @Column(name = "korean_name", nullable = false, unique = true, length = 100) private String koreanName; - @Column(nullable = false, length = 100) + @Column(name = "english_name", nullable = false, length = 100) private String englishName; - @Column(nullable = false, length = 100) + @Column(name = "format_name", nullable = false, length = 100) private String formatName; - @Column(length = 500) + @Column(name = "homepage_url", length = 500) private String homepageUrl; - @Column(length = 500) + @Column(name = "english_course_url", length = 500) private String englishCourseUrl; - @Column(length = 500) + @Column(name = "accommodation_url", length = 500) private String accommodationUrl; - @Column(nullable = false, length = 500) + @Column(name = "logo_image_url", nullable = false, length = 500) private String logoImageUrl; - @Column(nullable = false, length = 500) + @Column(name = "background_image_url", nullable = false, length = 500) private String backgroundImageUrl; - @Column(length = 1000) + @Column(name = "details_for_local", length = 1000) private String detailsForLocal; @ManyToOne diff --git a/src/main/java/com/example/solidconnection/university/domain/LanguageRequirement.java b/src/main/java/com/example/solidconnection/university/domain/LanguageRequirement.java index 6a15b6dce..1e4c7d739 100644 --- a/src/main/java/com/example/solidconnection/university/domain/LanguageRequirement.java +++ b/src/main/java/com/example/solidconnection/university/domain/LanguageRequirement.java @@ -24,13 +24,14 @@ public class LanguageRequirement extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id") private Long id; - @Column(nullable = false) + @Column(name = "language_test_type", nullable = false) @Enumerated(EnumType.STRING) private LanguageTestType languageTestType; - @Column(nullable = false) + @Column(name = "min_score", nullable = false) private String minScore; @ManyToOne(fetch = FetchType.LAZY) diff --git a/src/main/java/com/example/solidconnection/university/domain/LikedUnivApplyInfo.java b/src/main/java/com/example/solidconnection/university/domain/LikedUnivApplyInfo.java index b34309d4a..bbb118e70 100644 --- a/src/main/java/com/example/solidconnection/university/domain/LikedUnivApplyInfo.java +++ b/src/main/java/com/example/solidconnection/university/domain/LikedUnivApplyInfo.java @@ -30,11 +30,12 @@ public class LikedUnivApplyInfo extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id") private Long id; - @Column(name = "university_info_for_apply_id") + @Column(name = "university_info_for_apply_id", nullable = false) private long univApplyInfoId; - @Column(name = "site_user_id") + @Column(name = "site_user_id", nullable = false) private long siteUserId; } diff --git a/src/main/java/com/example/solidconnection/university/domain/UnivApplyInfo.java b/src/main/java/com/example/solidconnection/university/domain/UnivApplyInfo.java index 64d264f35..5ebfebcbb 100644 --- a/src/main/java/com/example/solidconnection/university/domain/UnivApplyInfo.java +++ b/src/main/java/com/example/solidconnection/university/domain/UnivApplyInfo.java @@ -32,54 +32,55 @@ public class UnivApplyInfo extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id") private Long id; - @Column(nullable = false, name = "term_id") + @Column(name = "term_id", nullable = false) private long termId; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "home_university_id") private HomeUniversity homeUniversity; - @Column(nullable = false, length = 100) + @Column(name = "korean_name", nullable = false, length = 100) private String koreanName; - @Column + @Column(name = "student_capacity") private Integer studentCapacity; - @Column + @Column(name = "tuition_fee_type") @Enumerated(EnumType.STRING) private TuitionFeeType tuitionFeeType; - @Column + @Column(name = "semester_available_for_dispatch") @Enumerated(EnumType.STRING) private SemesterAvailableForDispatch semesterAvailableForDispatch; - @Column(length = 100) + @Column(name = "semester_requirement", length = 100) private String semesterRequirement; - @Column(length = 1000) + @Column(name = "details_for_language", length = 1000) private String detailsForLanguage; - @Column(length = 100) + @Column(name = "gpa_requirement", length = 100) private String gpaRequirement; - @Column(length = 100) + @Column(name = "gpa_requirement_criteria", length = 100) private String gpaRequirementCriteria; - @Column(length = 1000) + @Column(name = "details_for_apply", length = 1000) private String detailsForApply; - @Column(length = 1000) + @Column(name = "details_for_major", length = 1000) private String detailsForMajor; - @Column(length = 1000) + @Column(name = "details_for_accommodation", length = 1000) private String detailsForAccommodation; - @Column(length = 1000) + @Column(name = "details_for_english_course", length = 1000) private String detailsForEnglishCourse; - @Column(length = 1000) + @Column(name = "details", length = 1000) private String details; @OneToMany(mappedBy = "univApplyInfo", cascade = CascadeType.ALL, orphanRemoval = true) diff --git a/src/main/java/com/example/solidconnection/university/dto/UnivApplyInfoDetailResponse.java b/src/main/java/com/example/solidconnection/university/dto/UnivApplyInfoDetailResponse.java index e2425c237..7ed5826b3 100644 --- a/src/main/java/com/example/solidconnection/university/dto/UnivApplyInfoDetailResponse.java +++ b/src/main/java/com/example/solidconnection/university/dto/UnivApplyInfoDetailResponse.java @@ -1,7 +1,7 @@ package com.example.solidconnection.university.dto; -import com.example.solidconnection.university.domain.UnivApplyInfo; import com.example.solidconnection.university.domain.HostUniversity; +import com.example.solidconnection.university.domain.UnivApplyInfo; import java.util.List; public record UnivApplyInfoDetailResponse( diff --git a/src/main/java/com/example/solidconnection/university/service/GeneralUnivApplyInfoRecommendService.java b/src/main/java/com/example/solidconnection/university/service/GeneralUnivApplyInfoRecommendService.java index d115098dd..18978aa2c 100644 --- a/src/main/java/com/example/solidconnection/university/service/GeneralUnivApplyInfoRecommendService.java +++ b/src/main/java/com/example/solidconnection/university/service/GeneralUnivApplyInfoRecommendService.java @@ -1,10 +1,7 @@ package com.example.solidconnection.university.service; -import static com.example.solidconnection.common.exception.ErrorCode.CURRENT_TERM_NOT_FOUND; import static com.example.solidconnection.university.service.UnivApplyInfoRecommendService.RECOMMEND_UNIV_APPLY_INFO_NUM; -import com.example.solidconnection.common.exception.CustomException; -import com.example.solidconnection.term.domain.Term; import com.example.solidconnection.term.repository.TermRepository; import com.example.solidconnection.university.domain.UnivApplyInfo; import com.example.solidconnection.university.repository.UnivApplyInfoRepository; diff --git a/src/main/java/com/example/solidconnection/university/service/UnivApplyInfoRecommendService.java b/src/main/java/com/example/solidconnection/university/service/UnivApplyInfoRecommendService.java index 872524d63..1ce568a71 100644 --- a/src/main/java/com/example/solidconnection/university/service/UnivApplyInfoRecommendService.java +++ b/src/main/java/com/example/solidconnection/university/service/UnivApplyInfoRecommendService.java @@ -51,8 +51,8 @@ public UnivApplyInfoRecommendsResponse getPersonalRecommends(long siteUserId) { } return new UnivApplyInfoRecommendsResponse(trimmedRecommends.stream() - .map(univApplyInfo -> UnivApplyInfoPreviewResponse.of(univApplyInfo, term.getName())) - .toList()); + .map(univApplyInfo -> UnivApplyInfoPreviewResponse.of(univApplyInfo, term.getName())) + .toList()); } private List getGeneralRecommendsExcludingSelected(List alreadyPicked) { @@ -75,7 +75,7 @@ public UnivApplyInfoRecommendsResponse getGeneralRecommends() { List generalRecommends = new ArrayList<>(generalUnivApplyInfoRecommendService.getGeneralRecommends()); return new UnivApplyInfoRecommendsResponse(generalRecommends.stream() - .map(univApplyInfo -> UnivApplyInfoPreviewResponse.of(univApplyInfo, term.getName())) - .toList()); + .map(univApplyInfo -> UnivApplyInfoPreviewResponse.of(univApplyInfo, term.getName())) + .toList()); } } diff --git a/src/main/resources/data.sql b/src/main/resources/data.sql index 3fa29bd0f..58eefa5bf 100644 --- a/src/main/resources/data.sql +++ b/src/main/resources/data.sql @@ -41,18 +41,20 @@ VALUES ('BN', '브루나이', 'ASIA'), ('MY', '말레이시아', 'ASIA'), ('RU', '러시아', 'EUROPE'); -INSERT INTO term (name, is_current) VALUES ('2024-1', true); +INSERT INTO term (name, is_current) +VALUES ('2024-1', true); INSERT INTO site_user (email, nickname, profile_image_url, exchange_status, role, password, auth_type) VALUES ('test@test.email', 'yonso', 'https://github.com/nayonsoso.png', 'CONSIDERING', 'MENTEE', '$2a$10$psmwlxPfqWnIlq9JrlQJkuXr1XtjRNsyVOgcTWYZub5jFfn0TML76', 'EMAIL'); -- 12341234 -INSERT INTO home_university (id, name) VALUES (1, '인하대학교'); +INSERT INTO home_university (id, name) +VALUES (1, '인하대학교'); INSERT INTO host_university(id, country_code, region_code, english_name, format_name, korean_name, - accommodation_url, english_course_url, homepage_url, - details_for_local, logo_image_url, background_image_url) + accommodation_url, english_course_url, homepage_url, + details_for_local, logo_image_url, background_image_url) VALUES (1, 'US', 'AMERICAS', 'University of Guam', 'university_of_guam', '괌대학', 'https://www.uog.edu/life-at-uog/residence-halls/', 'https://www.uog.edu/admissions/course-schedule', 'https://www.uog.edu/admissions/international-students', NULL, diff --git a/src/main/resources/db/migration/V11__remove_siteuser_birth_and_gender.sql b/src/main/resources/db/migration/V11__remove_siteuser_birth_and_gender.sql index 20fdf7496..e7fe96ec5 100644 --- a/src/main/resources/db/migration/V11__remove_siteuser_birth_and_gender.sql +++ b/src/main/resources/db/migration/V11__remove_siteuser_birth_and_gender.sql @@ -1,3 +1,5 @@ ALTER TABLE site_user - DROP COLUMN gender, - DROP COLUMN birth; +DROP +COLUMN gender, + DROP +COLUMN birth; diff --git a/src/main/resources/db/migration/V12__create_news.sql b/src/main/resources/db/migration/V12__create_news.sql index 1ef91356c..526a633dc 100644 --- a/src/main/resources/db/migration/V12__create_news.sql +++ b/src/main/resources/db/migration/V12__create_news.sql @@ -1,10 +1,11 @@ -CREATE TABLE news ( - created_at datetime(6), - id bigint not null auto_increment, - updated_at datetime(6), +CREATE TABLE news +( + created_at datetime(6), + id bigint not null auto_increment, + updated_at datetime(6), thumbnail_url varchar(500), - url varchar(500), - description varchar(255), - title varchar(255), + url varchar(500), + description varchar(255), + title varchar(255), primary key (id) ) diff --git a/src/main/resources/db/migration/V13__add_application_index_and_delete_manny_to_one_mapping.sql b/src/main/resources/db/migration/V13__add_application_index_and_delete_manny_to_one_mapping.sql index df8437c3a..eb468d26b 100644 --- a/src/main/resources/db/migration/V13__add_application_index_and_delete_manny_to_one_mapping.sql +++ b/src/main/resources/db/migration/V13__add_application_index_and_delete_manny_to_one_mapping.sql @@ -3,13 +3,13 @@ ALTER TABLE application RENAME COLUMN second_choice_university_id TO second_choi ALTER TABLE application RENAME COLUMN third_choice_university_id TO third_choice_university_info_for_apply_id; CREATE INDEX idx_app_user_term_delete - ON application(site_user_id, term, is_delete); + ON application (site_user_id, term, is_delete); CREATE INDEX idx_app_first_choice_search - ON application(verify_status, term, is_delete, first_choice_university_info_for_apply_id); + ON application (verify_status, term, is_delete, first_choice_university_info_for_apply_id); CREATE INDEX idx_app_second_choice_search - ON application(verify_status, term, is_delete, second_choice_university_info_for_apply_id); + ON application (verify_status, term, is_delete, second_choice_university_info_for_apply_id); CREATE INDEX idx_app_third_choice_search - ON application(verify_status, term, is_delete, third_choice_university_info_for_apply_id); + ON application (verify_status, term, is_delete, third_choice_university_info_for_apply_id); diff --git a/src/main/resources/db/migration/V14__set_unique_constraint_to_nickname.sql b/src/main/resources/db/migration/V14__set_unique_constraint_to_nickname.sql index 75d290f7b..334e235fb 100644 --- a/src/main/resources/db/migration/V14__set_unique_constraint_to_nickname.sql +++ b/src/main/resources/db/migration/V14__set_unique_constraint_to_nickname.sql @@ -1,3 +1,3 @@ ALTER TABLE site_user -ADD CONSTRAINT uk_site_user_nickname -UNIQUE (nickname); + ADD CONSTRAINT uk_site_user_nickname + UNIQUE (nickname); diff --git a/src/main/resources/db/migration/V15__add_unique_constraint_to_liked_university.sql b/src/main/resources/db/migration/V15__add_unique_constraint_to_liked_university.sql index 2c49f9ffb..d348dfc86 100644 --- a/src/main/resources/db/migration/V15__add_unique_constraint_to_liked_university.sql +++ b/src/main/resources/db/migration/V15__add_unique_constraint_to_liked_university.sql @@ -1,3 +1,3 @@ ALTER TABLE liked_university -ADD CONSTRAINT uk_liked_university_site_user_id_university_info_for_apply_id -UNIQUE (site_user_id, university_info_for_apply_id); + ADD CONSTRAINT uk_liked_university_site_user_id_university_info_for_apply_id + UNIQUE (site_user_id, university_info_for_apply_id); diff --git a/src/main/resources/db/migration/V16__add_unique_constraint_to_intersted.sql b/src/main/resources/db/migration/V16__add_unique_constraint_to_intersted.sql index 2f7a8524c..d3aba39d1 100644 --- a/src/main/resources/db/migration/V16__add_unique_constraint_to_intersted.sql +++ b/src/main/resources/db/migration/V16__add_unique_constraint_to_intersted.sql @@ -1,7 +1,7 @@ ALTER TABLE interested_country -ADD CONSTRAINT uk_interested_country_site_user_id_country_code -UNIQUE (site_user_id, country_code); + ADD CONSTRAINT uk_interested_country_site_user_id_country_code + UNIQUE (site_user_id, country_code); ALTER TABLE interested_region -ADD CONSTRAINT uk_interested_region_site_user_id_region_code -UNIQUE (site_user_id, region_code); + ADD CONSTRAINT uk_interested_region_site_user_id_region_code + UNIQUE (site_user_id, region_code); diff --git a/src/main/resources/db/migration/V19__create_mentor_related_tables.sql b/src/main/resources/db/migration/V19__create_mentor_related_tables.sql index 5e554d7c1..909bc8414 100644 --- a/src/main/resources/db/migration/V19__create_mentor_related_tables.sql +++ b/src/main/resources/db/migration/V19__create_mentor_related_tables.sql @@ -1,10 +1,10 @@ CREATE TABLE mentor ( - id BIGINT NOT NULL AUTO_INCREMENT, - university_id BIGINT NOT NULL, - site_user_id BIGINT NOT NULL, - mentee_count INT NOT NULL DEFAULT 0, - has_badge BOOLEAN NOT NULL DEFAULT FALSE, + id BIGINT NOT NULL AUTO_INCREMENT, + university_id BIGINT NOT NULL, + site_user_id BIGINT NOT NULL, + mentee_count INT NOT NULL DEFAULT 0, + has_badge BOOLEAN NOT NULL DEFAULT FALSE, introduction VARCHAR(1000) NULL, pass_tip VARCHAR(1000) NULL, PRIMARY KEY (id), @@ -14,14 +14,14 @@ CREATE TABLE mentor CREATE TABLE mentoring ( - id BIGINT NOT NULL AUTO_INCREMENT, - mentor_id BIGINT NOT NULL, - mentee_id BIGINT NOT NULL, + id BIGINT NOT NULL AUTO_INCREMENT, + mentor_id BIGINT NOT NULL, + mentee_id BIGINT NOT NULL, created_at DATETIME(6) NOT NULL, confirmed_at DATETIME(6) NULL, checked_at DATETIME(6) NULL, verify_status ENUM ('PENDING', 'REJECTED', 'APPROVED') NOT NULL DEFAULT 'PENDING', - rejected_reason VARCHAR(500) NULL, + rejected_reason VARCHAR(500) NULL, PRIMARY KEY (id), CONSTRAINT fk_mentoring_mentor_id FOREIGN KEY (mentor_id) REFERENCES mentor (id), CONSTRAINT fk_mentoring_site_user_id FOREIGN KEY (mentee_id) REFERENCES site_user (id) @@ -29,11 +29,11 @@ CREATE TABLE mentoring CREATE TABLE channel ( - id BIGINT NOT NULL AUTO_INCREMENT, - mentor_id BIGINT NOT NULL, - sequence INT NOT NULL, + id BIGINT NOT NULL AUTO_INCREMENT, + mentor_id BIGINT NOT NULL, + sequence INT NOT NULL, type ENUM ('BLOG', 'INSTAGRAM', 'YOUTUBE', 'BRUNCH') NOT NULL, - url VARCHAR(500) NOT NULL, + url VARCHAR(500) NOT NULL, PRIMARY KEY (id), CONSTRAINT fk_channel_mentor_id FOREIGN KEY (mentor_id) REFERENCES mentor (id), CONSTRAINT uk_channel_mentor_id_sequence UNIQUE (mentor_id, sequence) diff --git a/src/main/resources/db/migration/V1__init.sql b/src/main/resources/db/migration/V1__init.sql index 8910ad629..6cf7baab6 100644 --- a/src/main/resources/db/migration/V1__init.sql +++ b/src/main/resources/db/migration/V1__init.sql @@ -1,174 +1,511 @@ CREATE TABLE IF NOT EXISTS application ( - id BIGINT AUTO_INCREMENT NOT NULL, - term VARCHAR(50) NOT NULL, - site_user_id BIGINT NULL, - nickname_for_apply VARCHAR(100) NULL, - update_count INT DEFAULT 0 NOT NULL, - verify_status VARCHAR(50) DEFAULT 'PENDING' NOT NULL, + id + BIGINT + AUTO_INCREMENT + NOT + NULL, + term + VARCHAR +( + 50 +) NOT NULL, + site_user_id BIGINT NULL, + nickname_for_apply VARCHAR +( + 100 +) NULL, + update_count INT DEFAULT 0 NOT NULL, + verify_status VARCHAR +( + 50 +) DEFAULT 'PENDING' NOT NULL, gpa DOUBLE NOT NULL, gpa_criteria DOUBLE NOT NULL, - language_test_type ENUM ('CEFR','DALF','DELF','DUOLINGO','IELTS','JLPT','NEW_HSK','TCF','TEF','TOEFL_IBT','TOEFL_ITP','TOEIC') NOT NULL, - language_test_score VARCHAR(255) NOT NULL, - gpa_report_url VARCHAR(500) NOT NULL, - language_test_report_url VARCHAR(500) NOT NULL, - first_choice_university_id BIGINT NULL, + language_test_type ENUM +( + 'CEFR', + 'DALF', + 'DELF', + 'DUOLINGO', + 'IELTS', + 'JLPT', + 'NEW_HSK', + 'TCF', + 'TEF', + 'TOEFL_IBT', + 'TOEFL_ITP', + 'TOEIC' +) NOT NULL, + language_test_score VARCHAR +( + 255 +) NOT NULL, + gpa_report_url VARCHAR +( + 500 +) NOT NULL, + language_test_report_url VARCHAR +( + 500 +) NOT NULL, + first_choice_university_id BIGINT NULL, second_choice_university_id BIGINT NULL, - third_choice_university_id BIGINT NULL, - CONSTRAINT `PRIMARY` PRIMARY KEY (id) -); + third_choice_university_id BIGINT NULL, + CONSTRAINT `PRIMARY` PRIMARY KEY +( + id +) + ); CREATE TABLE IF NOT EXISTS board ( - code VARCHAR(20) NOT NULL, - korean_name VARCHAR(20) NOT NULL, - CONSTRAINT `PRIMARY` PRIMARY KEY (code) -); + code + VARCHAR +( + 20 +) NOT NULL, + korean_name VARCHAR +( + 20 +) NOT NULL, + CONSTRAINT `PRIMARY` PRIMARY KEY +( + code +) + ); CREATE TABLE IF NOT EXISTS comment ( - created_at datetime NULL, - id BIGINT AUTO_INCREMENT NOT NULL, - parent_id BIGINT NULL, - post_id BIGINT NULL, - site_user_id BIGINT NULL, - updated_at datetime NULL, - content VARCHAR(255) NULL, - CONSTRAINT `PRIMARY` PRIMARY KEY (id) -); + created_at + datetime + NULL, + id + BIGINT + AUTO_INCREMENT + NOT + NULL, + parent_id + BIGINT + NULL, + post_id + BIGINT + NULL, + site_user_id + BIGINT + NULL, + updated_at + datetime + NULL, + content + VARCHAR +( + 255 +) NULL, + CONSTRAINT `PRIMARY` PRIMARY KEY +( + id +) + ); CREATE TABLE IF NOT EXISTS country ( - code VARCHAR(2) NOT NULL, - region_code VARCHAR(10) NULL, - korean_name VARCHAR(100) NOT NULL, - CONSTRAINT `PRIMARY` PRIMARY KEY (code) -); + code + VARCHAR +( + 2 +) NOT NULL, + region_code VARCHAR +( + 10 +) NULL, + korean_name VARCHAR +( + 100 +) NOT NULL, + CONSTRAINT `PRIMARY` PRIMARY KEY +( + code +) + ); CREATE TABLE IF NOT EXISTS interested_country ( - country_code VARCHAR(2) NULL, - id BIGINT AUTO_INCREMENT NOT NULL, + country_code + VARCHAR +( + 2 +) NULL, + id BIGINT AUTO_INCREMENT NOT NULL, site_user_id BIGINT NULL, - CONSTRAINT `PRIMARY` PRIMARY KEY (id) -); + CONSTRAINT `PRIMARY` PRIMARY KEY +( + id +) + ); CREATE TABLE IF NOT EXISTS interested_region ( - id BIGINT AUTO_INCREMENT NOT NULL, - site_user_id BIGINT NULL, - region_code VARCHAR(10) NULL, - CONSTRAINT `PRIMARY` PRIMARY KEY (id) -); + id + BIGINT + AUTO_INCREMENT + NOT + NULL, + site_user_id + BIGINT + NULL, + region_code + VARCHAR +( + 10 +) NULL, + CONSTRAINT `PRIMARY` PRIMARY KEY +( + id +) + ); CREATE TABLE IF NOT EXISTS language_requirement ( - id BIGINT AUTO_INCREMENT NOT NULL, - university_info_for_apply_id BIGINT NULL, - language_test_type ENUM ('CEFR','DALF','DELF','DUOLINGO','IELTS','JLPT','NEW_HSK','TCF','TEF','TOEFL_IBT','TOEFL_ITP','TOEIC') NOT NULL, - min_score VARCHAR(255) NOT NULL, - CONSTRAINT `PRIMARY` PRIMARY KEY (id) -); + id + BIGINT + AUTO_INCREMENT + NOT + NULL, + university_info_for_apply_id + BIGINT + NULL, + language_test_type + ENUM +( + 'CEFR', + 'DALF', + 'DELF', + 'DUOLINGO', + 'IELTS', + 'JLPT', + 'NEW_HSK', + 'TCF', + 'TEF', + 'TOEFL_IBT', + 'TOEFL_ITP', + 'TOEIC' +) NOT NULL, + min_score VARCHAR +( + 255 +) NOT NULL, + CONSTRAINT `PRIMARY` PRIMARY KEY +( + id +) + ); CREATE TABLE IF NOT EXISTS liked_university ( - id BIGINT AUTO_INCREMENT NOT NULL, - site_user_id BIGINT NULL, - university_info_for_apply_id BIGINT NULL, - CONSTRAINT `PRIMARY` PRIMARY KEY (id) -); + id + BIGINT + AUTO_INCREMENT + NOT + NULL, + site_user_id + BIGINT + NULL, + university_info_for_apply_id + BIGINT + NULL, + CONSTRAINT + `PRIMARY` + PRIMARY + KEY +( + id +) + ); CREATE TABLE IF NOT EXISTS post ( - is_question BIT(1) NULL, - created_at datetime NULL, - id BIGINT AUTO_INCREMENT NOT NULL, - like_count BIGINT NULL, + is_question + BIT +( + 1 +) NULL, + created_at datetime NULL, + id BIGINT AUTO_INCREMENT NOT NULL, + like_count BIGINT NULL, site_user_id BIGINT NULL, - updated_at datetime NULL, - view_count BIGINT NULL, - board_code VARCHAR(20) NULL, - content VARCHAR(1000) NULL, - category ENUM ('자유','전체','질문') NULL, - title VARCHAR(255) NULL, - CONSTRAINT `PRIMARY` PRIMARY KEY (id) -); + updated_at datetime NULL, + view_count BIGINT NULL, + board_code VARCHAR +( + 20 +) NULL, + content VARCHAR +( + 1000 +) NULL, + category ENUM +( + '자유', + '전체', + '질문' +) NULL, + title VARCHAR +( + 255 +) NULL, + CONSTRAINT `PRIMARY` PRIMARY KEY +( + id +) + ); CREATE TABLE IF NOT EXISTS post_image ( - id BIGINT AUTO_INCREMENT NOT NULL, - post_id BIGINT NULL, - url VARCHAR(500) NULL, - CONSTRAINT `PRIMARY` PRIMARY KEY (id) -); + id + BIGINT + AUTO_INCREMENT + NOT + NULL, + post_id + BIGINT + NULL, + url + VARCHAR +( + 500 +) NULL, + CONSTRAINT `PRIMARY` PRIMARY KEY +( + id +) + ); CREATE TABLE IF NOT EXISTS post_like ( - id BIGINT AUTO_INCREMENT NOT NULL, - post_id BIGINT NULL, - site_user_id BIGINT NULL, - CONSTRAINT `PRIMARY` PRIMARY KEY (id) -); + id + BIGINT + AUTO_INCREMENT + NOT + NULL, + post_id + BIGINT + NULL, + site_user_id + BIGINT + NULL, + CONSTRAINT + `PRIMARY` + PRIMARY + KEY +( + id +) + ); CREATE TABLE IF NOT EXISTS region ( - code VARCHAR(10) NOT NULL, - korean_name VARCHAR(100) NOT NULL, - CONSTRAINT `PRIMARY` PRIMARY KEY (code) -); + code + VARCHAR +( + 10 +) NOT NULL, + korean_name VARCHAR +( + 100 +) NOT NULL, + CONSTRAINT `PRIMARY` PRIMARY KEY +( + code +) + ); CREATE TABLE IF NOT EXISTS site_user ( - quited_at date NULL, - id BIGINT AUTO_INCREMENT NOT NULL, - nickname_modified_at datetime NULL, - birth VARCHAR(20) NOT NULL, - email VARCHAR(100) NOT NULL, - nickname VARCHAR(100) NOT NULL, - profile_image_url VARCHAR(500) NULL, - gender ENUM ('FEMALE','MALE','PREFER_NOT_TO_SAY') NOT NULL, - preparation_stage ENUM ('AFTER_EXCHANGE','CONSIDERING','PREPARING_FOR_DEPARTURE','STUDYING_ABROAD') NOT NULL, - `role` ENUM ('MENTEE','MENTOR') NOT NULL, - CONSTRAINT `PRIMARY` PRIMARY KEY (id) -); + quited_at + date + NULL, + id + BIGINT + AUTO_INCREMENT + NOT + NULL, + nickname_modified_at + datetime + NULL, + birth + VARCHAR +( + 20 +) NOT NULL, + email VARCHAR +( + 100 +) NOT NULL, + nickname VARCHAR +( + 100 +) NOT NULL, + profile_image_url VARCHAR +( + 500 +) NULL, + gender ENUM +( + 'FEMALE', + 'MALE', + 'PREFER_NOT_TO_SAY' +) NOT NULL, + preparation_stage ENUM +( + 'AFTER_EXCHANGE', + 'CONSIDERING', + 'PREPARING_FOR_DEPARTURE', + 'STUDYING_ABROAD' +) NOT NULL, + `role` ENUM +( + 'MENTEE', + 'MENTOR' +) NOT NULL, + CONSTRAINT `PRIMARY` PRIMARY KEY +( + id +) + ); CREATE TABLE IF NOT EXISTS university ( - id BIGINT AUTO_INCREMENT NOT NULL, - region_code VARCHAR(10) NULL, - country_code VARCHAR(2) NULL, - format_name VARCHAR(100) NOT NULL, - english_name VARCHAR(100) NOT NULL, - korean_name VARCHAR(100) NOT NULL, - background_image_url VARCHAR(500) NOT NULL, - logo_image_url VARCHAR(500) NOT NULL, - details_for_local VARCHAR(1000) NULL, - homepage_url VARCHAR(500) NULL, - english_course_url VARCHAR(500) NULL, - accommodation_url VARCHAR(500) NULL, - CONSTRAINT `PRIMARY` PRIMARY KEY (id) -); + id + BIGINT + AUTO_INCREMENT + NOT + NULL, + region_code + VARCHAR +( + 10 +) NULL, + country_code VARCHAR +( + 2 +) NULL, + format_name VARCHAR +( + 100 +) NOT NULL, + english_name VARCHAR +( + 100 +) NOT NULL, + korean_name VARCHAR +( + 100 +) NOT NULL, + background_image_url VARCHAR +( + 500 +) NOT NULL, + logo_image_url VARCHAR +( + 500 +) NOT NULL, + details_for_local VARCHAR +( + 1000 +) NULL, + homepage_url VARCHAR +( + 500 +) NULL, + english_course_url VARCHAR +( + 500 +) NULL, + accommodation_url VARCHAR +( + 500 +) NULL, + CONSTRAINT `PRIMARY` PRIMARY KEY +( + id +) + ); CREATE TABLE IF NOT EXISTS university_info_for_apply ( - id BIGINT AUTO_INCREMENT NOT NULL, - term VARCHAR(50) NOT NULL, - university_id BIGINT NULL, - korean_name VARCHAR(100) NOT NULL, - student_capacity INT NULL, - tuition_fee_type ENUM ('HOME_UNIVERSITY_PAYMENT','MIXED_PAYMENT','OVERSEAS_UNIVERSITY_PAYMENT') NULL, - semester_available_for_dispatch ENUM ('FOUR_SEMESTER','IRRELEVANT','NO_DATA','ONE_OR_TWO_SEMESTER','ONE_SEMESTER','ONE_YEAR') NULL, - details_for_language VARCHAR(1000) NULL, - gpa_requirement VARCHAR(100) NULL, - gpa_requirement_criteria VARCHAR(100) NULL, - semester_requirement VARCHAR(100) NULL, - details_for_apply VARCHAR(1000) NULL, - details_for_major VARCHAR(1000) NULL, - details_for_english_course VARCHAR(1000) NULL, - details_for_accommodation VARCHAR(1000) NULL, - details VARCHAR(500) NULL, - CONSTRAINT `PRIMARY` PRIMARY KEY (id) -); + id + BIGINT + AUTO_INCREMENT + NOT + NULL, + term + VARCHAR +( + 50 +) NOT NULL, + university_id BIGINT NULL, + korean_name VARCHAR +( + 100 +) NOT NULL, + student_capacity INT NULL, + tuition_fee_type ENUM +( + 'HOME_UNIVERSITY_PAYMENT', + 'MIXED_PAYMENT', + 'OVERSEAS_UNIVERSITY_PAYMENT' +) NULL, + semester_available_for_dispatch ENUM +( + 'FOUR_SEMESTER', + 'IRRELEVANT', + 'NO_DATA', + 'ONE_OR_TWO_SEMESTER', + 'ONE_SEMESTER', + 'ONE_YEAR' +) NULL, + details_for_language VARCHAR +( + 1000 +) NULL, + gpa_requirement VARCHAR +( + 100 +) NULL, + gpa_requirement_criteria VARCHAR +( + 100 +) NULL, + semester_requirement VARCHAR +( + 100 +) NULL, + details_for_apply VARCHAR +( + 1000 +) NULL, + details_for_major VARCHAR +( + 1000 +) NULL, + details_for_english_course VARCHAR +( + 1000 +) NULL, + details_for_accommodation VARCHAR +( + 1000 +) NULL, + details VARCHAR +( + 500 +) NULL, + CONSTRAINT `PRIMARY` PRIMARY KEY +( + id +) + ); ALTER TABLE site_user ADD CONSTRAINT site_user_email_unique UNIQUE (email); diff --git a/src/main/resources/db/migration/V21__create_liked_news_table.sql b/src/main/resources/db/migration/V21__create_liked_news_table.sql index e80f65fc1..bf5d705c0 100644 --- a/src/main/resources/db/migration/V21__create_liked_news_table.sql +++ b/src/main/resources/db/migration/V21__create_liked_news_table.sql @@ -1,9 +1,10 @@ -CREATE TABLE liked_news ( - id BIGINT NOT NULL AUTO_INCREMENT, - news_id BIGINT NOT NULL, +CREATE TABLE liked_news +( + id BIGINT NOT NULL AUTO_INCREMENT, + news_id BIGINT NOT NULL, site_user_id BIGINT NOT NULL, PRIMARY KEY (id), CONSTRAINT uk_liked_news_site_user_id_news_id UNIQUE (site_user_id, news_id), - CONSTRAINT fk_liked_news_news_id FOREIGN KEY (news_id) REFERENCES news(id), - CONSTRAINT fk_liked_news_site_user_id FOREIGN KEY (site_user_id) REFERENCES site_user(id) + CONSTRAINT fk_liked_news_news_id FOREIGN KEY (news_id) REFERENCES news (id), + CONSTRAINT fk_liked_news_site_user_id FOREIGN KEY (site_user_id) REFERENCES site_user (id) ); diff --git a/src/main/resources/db/migration/V23__drop_mentoring_reject_reason_column.sql b/src/main/resources/db/migration/V23__drop_mentoring_reject_reason_column.sql index dde39c460..a9bdf4c2f 100644 --- a/src/main/resources/db/migration/V23__drop_mentoring_reject_reason_column.sql +++ b/src/main/resources/db/migration/V23__drop_mentoring_reject_reason_column.sql @@ -1,2 +1,3 @@ ALTER TABLE mentoring - DROP COLUMN rejected_reason; +DROP +COLUMN rejected_reason; diff --git a/src/main/resources/db/migration/V24__add_chat_related_tables.sql b/src/main/resources/db/migration/V24__add_chat_related_tables.sql index 20898a147..cd5b5b6a8 100644 --- a/src/main/resources/db/migration/V24__add_chat_related_tables.sql +++ b/src/main/resources/db/migration/V24__add_chat_related_tables.sql @@ -1,18 +1,18 @@ CREATE TABLE chat_room ( - id BIGINT AUTO_INCREMENT PRIMARY KEY, - is_group BOOLEAN NOT NULL DEFAULT false, + id BIGINT AUTO_INCREMENT PRIMARY KEY, + is_group BOOLEAN NOT NULL DEFAULT false, created_at DATETIME(6) NOT NULL, updated_at DATETIME(6) NOT NULL ); CREATE TABLE chat_participant ( - id BIGINT AUTO_INCREMENT PRIMARY KEY, + id BIGINT AUTO_INCREMENT PRIMARY KEY, site_user_id BIGINT NOT NULL, chat_room_id BIGINT NOT NULL, - created_at DATETIME(6) NOT NULL, - updated_at DATETIME(6) NOT NULL, + created_at DATETIME(6) NOT NULL, + updated_at DATETIME(6) NOT NULL, CONSTRAINT FK_CHAT_PARTICIPANT_CHAT_ROOM_ID FOREIGN KEY (chat_room_id) REFERENCES chat_room (id), CONSTRAINT FK_CHAT_PARTICIPANT_SITE_USER_ID FOREIGN KEY (site_user_id) REFERENCES site_user (id), CONSTRAINT UK_CHAT_PARTICIPANT_CHAT_ROOM_ID_SITE_USER_ID UNIQUE (chat_room_id, site_user_id) @@ -20,35 +20,35 @@ CREATE TABLE chat_participant CREATE TABLE chat_message ( - id BIGINT AUTO_INCREMENT PRIMARY KEY, - content VARCHAR(500) NOT NULL, - sender_id BIGINT NOT NULL, - chat_room_id BIGINT NOT NULL, - created_at DATETIME(6) NOT NULL, - updated_at DATETIME(6) NOT NULL, + id BIGINT AUTO_INCREMENT PRIMARY KEY, + content VARCHAR(500) NOT NULL, + sender_id BIGINT NOT NULL, + chat_room_id BIGINT NOT NULL, + created_at DATETIME(6) NOT NULL, + updated_at DATETIME(6) NOT NULL, CONSTRAINT FK_CHAT_MESSAGE_CHAT_ROOM_ID FOREIGN KEY (chat_room_id) REFERENCES chat_room (id), CONSTRAINT FK_CHAT_MESSAGE_SENDER_ID FOREIGN KEY (sender_id) REFERENCES chat_participant (id) ); CREATE TABLE chat_attachment ( - id BIGINT AUTO_INCREMENT PRIMARY KEY, - is_image BOOLEAN NOT NULL, - url VARCHAR(500) NOT NULL, - thumbnail_url VARCHAR(500), - chat_message_id BIGINT NOT NULL, - created_at DATETIME(6) NOT NULL, - updated_at DATETIME(6) NOT NULL, + id BIGINT AUTO_INCREMENT PRIMARY KEY, + is_image BOOLEAN NOT NULL, + url VARCHAR(500) NOT NULL, + thumbnail_url VARCHAR(500), + chat_message_id BIGINT NOT NULL, + created_at DATETIME(6) NOT NULL, + updated_at DATETIME(6) NOT NULL, CONSTRAINT FK_CHAT_ATTACHMENT_CHAT_MESSAGE_ID FOREIGN KEY (chat_message_id) REFERENCES chat_message (id) ); CREATE TABLE chat_read_status ( - id BIGINT AUTO_INCREMENT PRIMARY KEY, - chat_room_id BIGINT NOT NULL, + id BIGINT AUTO_INCREMENT PRIMARY KEY, + chat_room_id BIGINT NOT NULL, chat_participant_id BIGINT NOT NULL, - created_at DATETIME(6) NOT NULL, - updated_at DATETIME(6) NOT NULL, + created_at DATETIME(6) NOT NULL, + updated_at DATETIME(6) NOT NULL, CONSTRAINT FK_CHAT_READ_STATUS_CHAT_ROOM_ID FOREIGN KEY (chat_room_id) REFERENCES chat_room (id), CONSTRAINT FK_CHAT_READ_STATUS_CHAT_PARTICIPANT_ID FOREIGN KEY (chat_participant_id) REFERENCES chat_participant (id), CONSTRAINT UK_CHAT_READ_STATUS_CHAT_ROOM_ID_CHAT_PARTICIPANT_ID UNIQUE (chat_room_id, chat_participant_id) diff --git a/src/main/resources/db/migration/V29__alter_mentor_introduction_pass_tip_not_null.sql b/src/main/resources/db/migration/V29__alter_mentor_introduction_pass_tip_not_null.sql index 8acb72761..b57a28172 100644 --- a/src/main/resources/db/migration/V29__alter_mentor_introduction_pass_tip_not_null.sql +++ b/src/main/resources/db/migration/V29__alter_mentor_introduction_pass_tip_not_null.sql @@ -1,5 +1,5 @@ ALTER TABLE mentor - MODIFY introduction VARCHAR(1000) NOT NULL; + MODIFY introduction VARCHAR (1000) NOT NULL; ALTER TABLE mentor - MODIFY pass_tip VARCHAR(1000) NOT NULL; + MODIFY pass_tip VARCHAR (1000) NOT NULL; diff --git a/src/main/resources/db/migration/V2__add_gpa_score_and_language_test_score.sql b/src/main/resources/db/migration/V2__add_gpa_score_and_language_test_score.sql index ad3ab10b0..6753cbbb5 100644 --- a/src/main/resources/db/migration/V2__add_gpa_score_and_language_test_score.sql +++ b/src/main/resources/db/migration/V2__add_gpa_score_and_language_test_score.sql @@ -1,15 +1,16 @@ -create table gpa_score ( - gpa float(53) not null, - gpa_criteria float(53) not null, - issue_date date, - created_at datetime(6), - id bigint not null auto_increment, - site_user_id bigint, - updated_at datetime(6), - gpa_report_url varchar(500) not null, - rejected_reason varchar(255), - verify_status varchar(50) not null default 'PENDING', - primary key (id) +create table gpa_score +( + gpa float(53) not null, + gpa_criteria float(53) not null, + issue_date date, + created_at datetime(6), + id bigint not null auto_increment, + site_user_id bigint, + updated_at datetime(6), + gpa_report_url varchar(500) not null, + rejected_reason varchar(255), + verify_status varchar(50) not null default 'PENDING', + primary key (id) ) engine=InnoDB; alter table gpa_score @@ -17,18 +18,19 @@ alter table gpa_score foreign key (site_user_id) references site_user (id); -create table language_test_score ( - issue_date date, - created_at datetime(6), - id bigint not null auto_increment, - site_user_id bigint, - updated_at datetime(6), - language_test_type enum ('CEFR', 'DALF', 'DELF', 'DUOLINGO', 'IELTS', 'JLPT', 'NEW_HSK', 'TCF', 'TEF', 'TOEFL_IBT', 'TOEFL_ITP', 'TOEIC') not null, - language_test_report_url varchar(500) not null, - language_test_score varchar(255) not null, - rejected_reason varchar(255), - verify_status varchar(50) not null default 'PENDING', - primary key (id) +create table language_test_score +( + issue_date date, + created_at datetime(6), + id bigint not null auto_increment, + site_user_id bigint, + updated_at datetime(6), + language_test_type enum ('CEFR', 'DALF', 'DELF', 'DUOLINGO', 'IELTS', 'JLPT', 'NEW_HSK', 'TCF', 'TEF', 'TOEFL_IBT', 'TOEFL_ITP', 'TOEIC') not null, + language_test_report_url varchar(500) not null, + language_test_score varchar(255) not null, + rejected_reason varchar(255), + verify_status varchar(50) not null default 'PENDING', + primary key (id) ) engine=InnoDB; alter table language_test_score @@ -36,7 +38,8 @@ alter table language_test_score foreign key (site_user_id) references site_user (id); -alter table application add column is_delete bit; +alter table application + add column is_delete bit; alter table application drop foreign key fk_university_info_for_apply_id_1; alter table application drop foreign key fk_university_info_for_apply_id_2; diff --git a/src/main/resources/db/migration/V30__modify_verify_status_from_varchar_to_enum.sql b/src/main/resources/db/migration/V30__modify_verify_status_from_varchar_to_enum.sql index c70a2b512..5a82bb468 100644 --- a/src/main/resources/db/migration/V30__modify_verify_status_from_varchar_to_enum.sql +++ b/src/main/resources/db/migration/V30__modify_verify_status_from_varchar_to_enum.sql @@ -1,8 +1,8 @@ ALTER TABLE application -MODIFY COLUMN verify_status ENUM('PENDING', 'REJECTED', 'APPROVED') NOT NULL DEFAULT 'PENDING'; + MODIFY COLUMN verify_status ENUM('PENDING', 'REJECTED', 'APPROVED') NOT NULL DEFAULT 'PENDING'; ALTER TABLE gpa_score -MODIFY COLUMN verify_status ENUM('PENDING', 'REJECTED', 'APPROVED') NOT NULL DEFAULT 'PENDING'; + MODIFY COLUMN verify_status ENUM('PENDING', 'REJECTED', 'APPROVED') NOT NULL DEFAULT 'PENDING'; ALTER TABLE language_test_score -MODIFY COLUMN verify_status ENUM('PENDING', 'REJECTED', 'APPROVED') NOT NULL DEFAULT 'PENDING'; + MODIFY COLUMN verify_status ENUM('PENDING', 'REJECTED', 'APPROVED') NOT NULL DEFAULT 'PENDING'; diff --git a/src/main/resources/db/migration/V32__add_user_block_table.sql b/src/main/resources/db/migration/V32__add_user_block_table.sql index 3983d1b85..3f2bb9cab 100644 --- a/src/main/resources/db/migration/V32__add_user_block_table.sql +++ b/src/main/resources/db/migration/V32__add_user_block_table.sql @@ -1,10 +1,10 @@ CREATE TABLE user_block ( - id BIGINT NOT NULL AUTO_INCREMENT, - blocker_id BIGINT NOT NULL, - blocked_id BIGINT NOT NULL, - created_at DATETIME(6) NOT NULL, - updated_at DATETIME(6) NOT NULL, + id BIGINT NOT NULL AUTO_INCREMENT, + blocker_id BIGINT NOT NULL, + blocked_id BIGINT NOT NULL, + created_at DATETIME(6) NOT NULL, + updated_at DATETIME(6) NOT NULL, PRIMARY KEY (id), CONSTRAINT uk_user_block_blocker_id_blocked_id UNIQUE (blocker_id, blocked_id), CONSTRAINT fk_user_block_blocker_id FOREIGN KEY (blocker_id) REFERENCES site_user (id), diff --git a/src/main/resources/db/migration/V35__add_mentor_application_table.sql b/src/main/resources/db/migration/V35__add_mentor_application_table.sql index be07fe901..14cdb12dd 100644 --- a/src/main/resources/db/migration/V35__add_mentor_application_table.sql +++ b/src/main/resources/db/migration/V35__add_mentor_application_table.sql @@ -15,6 +15,6 @@ CREATE TABLE mentor_application CONSTRAINT fk_mentor_application_site_user FOREIGN KEY (site_user_id) REFERENCES site_user (id), CONSTRAINT chk_ma_university_select_rule CHECK ( (university_select_type = 'CATALOG' AND university_id IS NOT NULL) OR - (university_select_type = 'OTHER' AND university_id IS NULL) - ) + (university_select_type = 'OTHER' AND university_id IS NULL) + ) ) ENGINE=InnoDB diff --git a/src/main/resources/db/migration/V36__migrate_term_to_table.sql b/src/main/resources/db/migration/V36__migrate_term_to_table.sql index 93e1b13b0..4edaf2f4b 100644 --- a/src/main/resources/db/migration/V36__migrate_term_to_table.sql +++ b/src/main/resources/db/migration/V36__migrate_term_to_table.sql @@ -1,33 +1,50 @@ -- 1. Term 테이블 생성 -CREATE TABLE IF NOT EXISTS term ( - id BIGINT AUTO_INCREMENT PRIMARY KEY, - name VARCHAR(20) NOT NULL, +CREATE TABLE IF NOT EXISTS term +( + id + BIGINT + AUTO_INCREMENT + PRIMARY + KEY, + name + VARCHAR +( + 20 +) NOT NULL, is_current BOOLEAN NOT NULL DEFAULT FALSE, - CONSTRAINT uk_term_name UNIQUE (name) -); + CONSTRAINT uk_term_name UNIQUE +( + name +) + ); -- 2. 기존에 사용하던 term 값들을 Term 테이블에 INSERT -INSERT IGNORE INTO term (name, is_current) +INSERT +IGNORE INTO term (name, is_current) SELECT DISTINCT term, FALSE FROM application WHERE term NOT IN (SELECT name FROM term); -INSERT IGNORE INTO term (name, is_current) +INSERT +IGNORE INTO term (name, is_current) SELECT DISTINCT term, FALSE FROM mentor WHERE term NOT IN (SELECT name FROM term); -INSERT IGNORE INTO term (name, is_current) +INSERT +IGNORE INTO term (name, is_current) SELECT DISTINCT term, FALSE FROM university_info_for_apply WHERE term NOT IN (SELECT name FROM term); -- 3. 현재 학기 설정 INSERT INTO term (name, is_current) -VALUES ('2026-1', TRUE) - ON DUPLICATE KEY UPDATE is_current = TRUE; +VALUES ('2026-1', TRUE) ON DUPLICATE KEY +UPDATE is_current = TRUE; -UPDATE term SET is_current = FALSE WHERE name != '2026-1'; +UPDATE term +SET is_current = FALSE +WHERE name != '2026-1'; -- 4. 각 테이블에 term_id 컬럼 추가 (임시로 nullable) ALTER TABLE application @@ -41,17 +58,20 @@ ALTER TABLE university_info_for_apply -- 5. 기존 term(String) 값을 term_id(Long)로 매핑 UPDATE application a - INNER JOIN term t ON a.term = t.name + INNER JOIN term t +ON a.term = t.name SET a.term_id = t.id WHERE a.term_id IS NULL; UPDATE mentor m - INNER JOIN term t ON m.term = t.name + INNER JOIN term t +ON m.term = t.name SET m.term_id = t.id WHERE m.term_id IS NULL; UPDATE university_info_for_apply u - INNER JOIN term t ON u.term = t.name + INNER JOIN term t +ON u.term = t.name SET u.term_id = t.id WHERE u.term_id IS NULL; @@ -68,31 +88,32 @@ ALTER TABLE university_info_for_apply -- 7. term_id에 대해 FK 설정 ALTER TABLE application ADD CONSTRAINT fk_application_term_id - FOREIGN KEY (term_id) REFERENCES term(id); + FOREIGN KEY (term_id) REFERENCES term (id); ALTER TABLE mentor ADD CONSTRAINT fk_mentor_term_id - FOREIGN KEY (term_id) REFERENCES term(id); + FOREIGN KEY (term_id) REFERENCES term (id); ALTER TABLE university_info_for_apply ADD CONSTRAINT fk_university_info_for_apply_term_id - FOREIGN KEY (term_id) REFERENCES term(id); + FOREIGN KEY (term_id) REFERENCES term (id); -- 8. term_id 기반 새로운 인덱스 생성 CREATE INDEX idx_app_user_term_id_delete - ON application(site_user_id, term_id, is_delete); + ON application (site_user_id, term_id, is_delete); CREATE INDEX idx_app_first_choice_term_id_search - ON application(verify_status, term_id, is_delete, first_choice_university_info_for_apply_id); + ON application (verify_status, term_id, is_delete, first_choice_university_info_for_apply_id); CREATE INDEX idx_app_second_choice_term_id_search - ON application(verify_status, term_id, is_delete, second_choice_university_info_for_apply_id); + ON application (verify_status, term_id, is_delete, second_choice_university_info_for_apply_id); CREATE INDEX idx_app_third_choice_term_id_search - ON application(verify_status, term_id, is_delete, third_choice_university_info_for_apply_id); + ON application (verify_status, term_id, is_delete, third_choice_university_info_for_apply_id); -- 9. 기존 fk 삭제 -SET @drop_fk1 = ( +SET +@drop_fk1 = ( SELECT CONCAT('ALTER TABLE `application` DROP FOREIGN KEY `', CONSTRAINT_NAME, '`;') FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_SCHEMA = DATABASE() @@ -102,12 +123,14 @@ SET @drop_fk1 = ( LIMIT 1 ); -SET @drop_fk1 = IFNULL(@drop_fk1, 'SELECT 1'); +SET +@drop_fk1 = IFNULL(@drop_fk1, 'SELECT 1'); PREPARE stmt1 FROM @drop_fk1; EXECUTE stmt1; DEALLOCATE PREPARE stmt1; -SET @drop_fk2 = ( +SET +@drop_fk2 = ( SELECT CONCAT('ALTER TABLE `application` DROP FOREIGN KEY `', CONSTRAINT_NAME, '`;') FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_SCHEMA = DATABASE() @@ -117,12 +140,14 @@ SET @drop_fk2 = ( LIMIT 1 ); -SET @drop_fk2 = IFNULL(@drop_fk2, 'SELECT 1'); +SET +@drop_fk2 = IFNULL(@drop_fk2, 'SELECT 1'); PREPARE stmt2 FROM @drop_fk2; EXECUTE stmt2; DEALLOCATE PREPARE stmt2; -SET @drop_fk3 = ( +SET +@drop_fk3 = ( SELECT CONCAT('ALTER TABLE `application` DROP FOREIGN KEY `', CONSTRAINT_NAME, '`;') FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_SCHEMA = DATABASE() @@ -132,12 +157,14 @@ SET @drop_fk3 = ( LIMIT 1 ); -SET @drop_fk3 = IFNULL(@drop_fk3, 'SELECT 1'); +SET +@drop_fk3 = IFNULL(@drop_fk3, 'SELECT 1'); PREPARE stmt3 FROM @drop_fk3; EXECUTE stmt3; DEALLOCATE PREPARE stmt3; -SET @drop_fk4 = ( +SET +@drop_fk4 = ( SELECT CONCAT('ALTER TABLE `application` DROP FOREIGN KEY `', CONSTRAINT_NAME, '`;') FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_SCHEMA = DATABASE() @@ -147,7 +174,8 @@ SET @drop_fk4 = ( LIMIT 1 ); -SET @drop_fk4 = IFNULL(@drop_fk4, 'SELECT 1'); +SET +@drop_fk4 = IFNULL(@drop_fk4, 'SELECT 1'); PREPARE stmt4 FROM @drop_fk4; EXECUTE stmt4; DEALLOCATE PREPARE stmt4; @@ -167,19 +195,19 @@ ALTER TABLE university_info_for_apply DROP COLUMN term; ALTER TABLE application ADD CONSTRAINT fk_application_first_choice_university_info_for_apply_id FOREIGN KEY (first_choice_university_info_for_apply_id) - REFERENCES university_info_for_apply(id); + REFERENCES university_info_for_apply (id); ALTER TABLE application ADD CONSTRAINT fk_application_second_choice_university_info_for_apply_id FOREIGN KEY (second_choice_university_info_for_apply_id) - REFERENCES university_info_for_apply(id); + REFERENCES university_info_for_apply (id); ALTER TABLE application ADD CONSTRAINT fk_application_third_choice_university_info_for_apply_id FOREIGN KEY (third_choice_university_info_for_apply_id) - REFERENCES university_info_for_apply(id); + REFERENCES university_info_for_apply (id); ALTER TABLE application ADD CONSTRAINT fk_app_site_user FOREIGN KEY (site_user_id) - REFERENCES site_user(id); + REFERENCES site_user (id); diff --git a/src/main/resources/db/migration/V37__add_unique_constraint_to_mentor_id_mentee_id.sql b/src/main/resources/db/migration/V37__add_unique_constraint_to_mentor_id_mentee_id.sql index 98968fbb1..82ed5e5d9 100644 --- a/src/main/resources/db/migration/V37__add_unique_constraint_to_mentor_id_mentee_id.sql +++ b/src/main/resources/db/migration/V37__add_unique_constraint_to_mentor_id_mentee_id.sql @@ -1,3 +1,3 @@ ALTER TABLE mentoring -ADD CONSTRAINT uk_mentoring_mentor_id_mentee_id -UNIQUE (mentor_id, mentee_id); + ADD CONSTRAINT uk_mentoring_mentor_id_mentee_id + UNIQUE (mentor_id, mentee_id); diff --git a/src/main/resources/db/migration/V38__add_term_id_to_mentor_application.sql b/src/main/resources/db/migration/V38__add_term_id_to_mentor_application.sql index 87867f44e..df96b235f 100644 --- a/src/main/resources/db/migration/V38__add_term_id_to_mentor_application.sql +++ b/src/main/resources/db/migration/V38__add_term_id_to_mentor_application.sql @@ -3,4 +3,4 @@ ALTER TABLE mentor_application ALTER TABLE mentor_application ADD CONSTRAINT fk_mentor_application_term_id - FOREIGN KEY (term_id) REFERENCES term(id); \ No newline at end of file + FOREIGN KEY (term_id) REFERENCES term (id); \ No newline at end of file diff --git a/src/main/resources/db/migration/V3__add_auth_type_column_and_unique_key.sql b/src/main/resources/db/migration/V3__add_auth_type_column_and_unique_key.sql index e89c4aa1b..48faaa7cd 100644 --- a/src/main/resources/db/migration/V3__add_auth_type_column_and_unique_key.sql +++ b/src/main/resources/db/migration/V3__add_auth_type_column_and_unique_key.sql @@ -1,13 +1,13 @@ ALTER TABLE site_user -ADD COLUMN auth_type ENUM('KAKAO', 'APPLE', 'EMAIL'); + ADD COLUMN auth_type ENUM('KAKAO', 'APPLE', 'EMAIL'); UPDATE site_user SET auth_type = 'KAKAO' WHERE auth_type IS NULL; ALTER TABLE site_user -MODIFY COLUMN auth_type ENUM('KAKAO', 'APPLE', 'EMAIL') NOT NULL; + MODIFY COLUMN auth_type ENUM('KAKAO', 'APPLE', 'EMAIL') NOT NULL; ALTER TABLE site_user -ADD CONSTRAINT uk_site_user_email_auth_type -UNIQUE (email, auth_type); + ADD CONSTRAINT uk_site_user_email_auth_type + UNIQUE (email, auth_type); diff --git a/src/main/resources/db/migration/V40__create_user_ban_table.sql b/src/main/resources/db/migration/V40__create_user_ban_table.sql index 4a695fe62..ccd7c4df3 100644 --- a/src/main/resources/db/migration/V40__create_user_ban_table.sql +++ b/src/main/resources/db/migration/V40__create_user_ban_table.sql @@ -1,15 +1,15 @@ CREATE TABLE user_ban ( - id BIGINT NOT NULL AUTO_INCREMENT, - banned_user_id BIGINT NOT NULL, - banned_by BIGINT NOT NULL, - duration VARCHAR(30) NOT NULL, - expired_at DATETIME(6) NOT NULL, - is_expired TINYINT(1) NOT NULL DEFAULT 0, - unbanned_by BIGINT NULL, - unbanned_at DATETIME(6) NULL, - created_at DATETIME(6) NOT NULL, - updated_at DATETIME(6) NOT NULL, + id BIGINT NOT NULL AUTO_INCREMENT, + banned_user_id BIGINT NOT NULL, + banned_by BIGINT NOT NULL, + duration VARCHAR(30) NOT NULL, + expired_at DATETIME(6) NOT NULL, + is_expired TINYINT(1) NOT NULL DEFAULT 0, + unbanned_by BIGINT NULL, + unbanned_at DATETIME(6) NULL, + created_at DATETIME(6) NOT NULL, + updated_at DATETIME(6) NOT NULL, PRIMARY KEY (id), CONSTRAINT fk_user_ban_banned_user_id FOREIGN KEY (banned_user_id) REFERENCES site_user (id), CONSTRAINT fk_user_ban_banned_by_id FOREIGN KEY (banned_by) REFERENCES site_user (id), diff --git a/src/main/resources/db/migration/V41__add_is_deleted_to_post_and_chat_message.sql b/src/main/resources/db/migration/V41__add_is_deleted_to_post_and_chat_message.sql index 5444af27c..8ecc42213 100644 --- a/src/main/resources/db/migration/V41__add_is_deleted_to_post_and_chat_message.sql +++ b/src/main/resources/db/migration/V41__add_is_deleted_to_post_and_chat_message.sql @@ -1,3 +1,5 @@ -ALTER TABLE post ADD COLUMN is_deleted BOOLEAN NOT NULL DEFAULT FALSE; +ALTER TABLE post + ADD COLUMN is_deleted BOOLEAN NOT NULL DEFAULT FALSE; -ALTER TABLE chat_message ADD COLUMN is_deleted BOOLEAN NOT NULL DEFAULT FALSE; +ALTER TABLE chat_message + ADD COLUMN is_deleted BOOLEAN NOT NULL DEFAULT FALSE; diff --git a/src/main/resources/db/migration/V42__rename_university_to_host_university_and_create_home_university.sql b/src/main/resources/db/migration/V42__rename_university_to_host_university_and_create_home_university.sql index d6b9b6044..bbf81945b 100644 --- a/src/main/resources/db/migration/V42__rename_university_to_host_university_and_create_home_university.sql +++ b/src/main/resources/db/migration/V42__rename_university_to_host_university_and_create_home_university.sql @@ -1,7 +1,9 @@ -RENAME TABLE university TO host_university; +RENAME +TABLE university TO host_university; ALTER TABLE university_info_for_apply - DROP FOREIGN KEY FKd0257hco6uy2utd1xccjh3fal; +DROP +FOREIGN KEY FKd0257hco6uy2utd1xccjh3fal; ALTER TABLE university_info_for_apply ADD CONSTRAINT fk_university_info_for_apply_host_university @@ -9,13 +11,33 @@ ALTER TABLE university_info_for_apply CREATE TABLE IF NOT EXISTS home_university ( - id BIGINT AUTO_INCREMENT NOT NULL, - name VARCHAR(100) NOT NULL, - created_at DATETIME(6), - updated_at DATETIME(6), - CONSTRAINT `PRIMARY` PRIMARY KEY (id), - CONSTRAINT uk_home_university_name UNIQUE (name) -); + id + BIGINT + AUTO_INCREMENT + NOT + NULL, + name + VARCHAR +( + 100 +) NOT NULL, + created_at DATETIME +( + 6 +), + updated_at DATETIME +( + 6 +), + CONSTRAINT `PRIMARY` PRIMARY KEY +( + id +), + CONSTRAINT uk_home_university_name UNIQUE +( + name +) + ); ALTER TABLE host_university ADD COLUMN home_university_id BIGINT NULL; diff --git a/src/main/resources/db/migration/V43__move_home_university_fk_to_univ_apply_info.sql b/src/main/resources/db/migration/V43__move_home_university_fk_to_univ_apply_info.sql index 36ba62a90..35bd3aa93 100644 --- a/src/main/resources/db/migration/V43__move_home_university_fk_to_univ_apply_info.sql +++ b/src/main/resources/db/migration/V43__move_home_university_fk_to_univ_apply_info.sql @@ -1,8 +1,10 @@ ALTER TABLE host_university - DROP FOREIGN KEY fk_host_university_home_university; +DROP +FOREIGN KEY fk_host_university_home_university; ALTER TABLE host_university - DROP COLUMN home_university_id; +DROP +COLUMN home_university_id; ALTER TABLE university_info_for_apply ADD COLUMN home_university_id BIGINT NULL; diff --git a/src/main/resources/db/migration/V45__modify_mentor_introduction_pass_tip_nullable.sql b/src/main/resources/db/migration/V45__modify_mentor_introduction_pass_tip_nullable.sql index e81eb049c..0f7564359 100644 --- a/src/main/resources/db/migration/V45__modify_mentor_introduction_pass_tip_nullable.sql +++ b/src/main/resources/db/migration/V45__modify_mentor_introduction_pass_tip_nullable.sql @@ -1,5 +1,5 @@ ALTER TABLE mentor - MODIFY introduction VARCHAR(1000) NULL; + MODIFY introduction VARCHAR (1000) NULL; ALTER TABLE mentor - MODIFY pass_tip VARCHAR(1000) NULL; + MODIFY pass_tip VARCHAR (1000) NULL; diff --git a/src/main/resources/db/migration/V4__remove_issue_date_columns.sql b/src/main/resources/db/migration/V4__remove_issue_date_columns.sql index 9a8e0700b..9af0e5fc8 100644 --- a/src/main/resources/db/migration/V4__remove_issue_date_columns.sql +++ b/src/main/resources/db/migration/V4__remove_issue_date_columns.sql @@ -1,5 +1,7 @@ ALTER TABLE gpa_score - DROP COLUMN issue_date; +DROP +COLUMN issue_date; ALTER TABLE language_test_score - DROP COLUMN issue_date; \ No newline at end of file +DROP +COLUMN issue_date; \ No newline at end of file diff --git a/src/main/resources/db/migration/V5__add_password_column.sql b/src/main/resources/db/migration/V5__add_password_column.sql index 948e2a97d..7edb05507 100644 --- a/src/main/resources/db/migration/V5__add_password_column.sql +++ b/src/main/resources/db/migration/V5__add_password_column.sql @@ -1,2 +1,2 @@ ALTER TABLE site_user -ADD COLUMN password VARCHAR(255) NULL; + ADD COLUMN password VARCHAR(255) NULL; diff --git a/src/main/resources/db/migration/V7__expand_details_column_length.sql b/src/main/resources/db/migration/V7__expand_details_column_length.sql index 452cc12a7..8e4b8bed6 100644 --- a/src/main/resources/db/migration/V7__expand_details_column_length.sql +++ b/src/main/resources/db/migration/V7__expand_details_column_length.sql @@ -1,2 +1,2 @@ ALTER TABLE university_info_for_apply - modify details VARCHAR(1000) NULL; \ No newline at end of file + modify details VARCHAR (1000) NULL; \ No newline at end of file diff --git a/src/main/resources/db/migration/V8__add_two_semester_to_semeter_avaliable_enum.sql b/src/main/resources/db/migration/V8__add_two_semester_to_semeter_avaliable_enum.sql index f0907d1a7..634102e66 100644 --- a/src/main/resources/db/migration/V8__add_two_semester_to_semeter_avaliable_enum.sql +++ b/src/main/resources/db/migration/V8__add_two_semester_to_semeter_avaliable_enum.sql @@ -1,6 +1,6 @@ ALTER TABLE university_info_for_apply -MODIFY COLUMN semester_available_for_dispatch -ENUM('ONE_SEMESTER', + MODIFY COLUMN semester_available_for_dispatch + ENUM('ONE_SEMESTER', 'TWO_SEMESTER', 'FOUR_SEMESTER', 'ONE_OR_TWO_SEMESTER', diff --git a/src/main/resources/logback-spring.xml b/src/main/resources/logback-spring.xml index 52d0bb4e8..e8232555d 100644 --- a/src/main/resources/logback-spring.xml +++ b/src/main/resources/logback-spring.xml @@ -1,97 +1,97 @@ - - + + - + - - - + + + + + ${LOG_PATTERN} + + ${LOG_PATH}/info/info.log + + INFO + ACCEPT + DENY + + + ${LOG_PATH}/info/info.%d{yyyy-MM-dd}.log + 7 + + - - - ${LOG_PATH}/info/info.log - - ${LOG_PATH}/info/info.%d{yyyy-MM-dd}.log - 7 - - - ${LOG_PATTERN} - - - INFO - ACCEPT - DENY - - + + + + ${LOG_PATTERN} + + ${LOG_PATH}/warn/warn.log + + WARN + ACCEPT + DENY + + + ${LOG_PATH}/warn/warn.%d{yyyy-MM-dd}.log + 7 + + - - - ${LOG_PATH}/warn/warn.log - - ${LOG_PATH}/warn/warn.%d{yyyy-MM-dd}.log - 7 - - - ${LOG_PATTERN} - - - WARN - ACCEPT - DENY - - + + + + ${LOG_PATTERN} + + ${LOG_PATH}/error/error.log + + ERROR + ACCEPT + DENY + + + ${LOG_PATH}/error/error.%d{yyyy-MM-dd}.log + 7 + + - - - ${LOG_PATH}/error/error.log - - ${LOG_PATH}/error/error.%d{yyyy-MM-dd}.log - 7 - - - ${LOG_PATTERN} - - - ERROR - ACCEPT - DENY - - + + + + ${LOG_PATTERN} + + ${LOG_PATH}/api-perf/api-perf.log + + ${LOG_PATH}/api-perf/api-perf.%d{yyyy-MM-dd}.log + 7 + + - - - ${LOG_PATH}/api-perf/api-perf.log - - ${LOG_PATH}/api-perf/api-perf.%d{yyyy-MM-dd}.log - 7 - - - ${LOG_PATTERN} - - + + + + - - - - + + - - - - - - - + + + + + + + - - - - - - - - + + + + + + + + \ No newline at end of file diff --git a/src/test/java/com/example/solidconnection/admin/service/AdminHostUniversityServiceTest.java b/src/test/java/com/example/solidconnection/admin/service/AdminHostUniversityServiceTest.java index b28d5bf01..5e2bbbf1d 100644 --- a/src/test/java/com/example/solidconnection/admin/service/AdminHostUniversityServiceTest.java +++ b/src/test/java/com/example/solidconnection/admin/service/AdminHostUniversityServiceTest.java @@ -29,9 +29,9 @@ import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.test.context.bean.override.mockito.MockitoSpyBean; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; +import org.springframework.test.context.bean.override.mockito.MockitoSpyBean; @TestContainerSpringBootTest @DisplayName("파견 대학 관리 서비스 테스트") diff --git a/src/test/java/com/example/solidconnection/admin/service/AdminUserServiceTest.java b/src/test/java/com/example/solidconnection/admin/service/AdminUserServiceTest.java index 3c1d081b2..8c1d5a5f1 100644 --- a/src/test/java/com/example/solidconnection/admin/service/AdminUserServiceTest.java +++ b/src/test/java/com/example/solidconnection/admin/service/AdminUserServiceTest.java @@ -14,7 +14,6 @@ import com.example.solidconnection.application.domain.Gpa; import com.example.solidconnection.application.domain.LanguageTest; import com.example.solidconnection.application.fixture.ApplicationFixture; -import com.example.solidconnection.university.domain.LanguageTestType; import com.example.solidconnection.common.exception.CustomException; import com.example.solidconnection.community.board.fixture.BoardFixture; import com.example.solidconnection.community.post.domain.Post; @@ -34,8 +33,9 @@ import com.example.solidconnection.siteuser.fixture.UserBanFixture; import com.example.solidconnection.support.TestContainerSpringBootTest; import com.example.solidconnection.term.fixture.TermFixture; -import com.example.solidconnection.university.domain.UnivApplyInfo; import com.example.solidconnection.university.domain.HostUniversity; +import com.example.solidconnection.university.domain.LanguageTestType; +import com.example.solidconnection.university.domain.UnivApplyInfo; import com.example.solidconnection.university.fixture.UnivApplyInfoFixture; import com.example.solidconnection.university.fixture.UniversityFixture; import org.junit.jupiter.api.DisplayName; @@ -292,8 +292,8 @@ class 신고_차단된_유저_검색 { () -> assertThat(result.getContent()).hasSize(2), () -> assertThat(result.getContent()) .allMatch(user -> - user.userStatus() == UserStatus.REPORTED || - user.userStatus() == UserStatus.BANNED + user.userStatus() == UserStatus.REPORTED || + user.userStatus() == UserStatus.BANNED ) ); } diff --git a/src/test/java/com/example/solidconnection/auth/controller/RefreshTokenCookieManagerTest.java b/src/test/java/com/example/solidconnection/auth/controller/RefreshTokenCookieManagerTest.java index 2496b65d8..c3df27fce 100644 --- a/src/test/java/com/example/solidconnection/auth/controller/RefreshTokenCookieManagerTest.java +++ b/src/test/java/com/example/solidconnection/auth/controller/RefreshTokenCookieManagerTest.java @@ -18,28 +18,24 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.boot.web.server.Cookie.SameSite; import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.mock.web.MockHttpServletResponse; +import org.springframework.test.context.bean.override.mockito.MockitoBean; @DisplayName("리프레시 토큰 쿠키 매니저 테스트") @TestContainerSpringBootTest class RefreshTokenCookieManagerTest { private static final String REFRESH_TOKEN_COOKIE_NAME = "refreshToken"; - + private final String domain = "example.com"; @Autowired private RefreshTokenCookieManager cookieManager; - @Autowired private TokenProperties tokenProperties; - @MockitoBean private RefreshTokenCookieProperties refreshTokenCookieProperties; - private final String domain = "example.com"; - @BeforeEach void setUp() { given(refreshTokenCookieProperties.cookieDomain()).willReturn(domain); diff --git a/src/test/java/com/example/solidconnection/auth/service/AuthTokenProviderTest.java b/src/test/java/com/example/solidconnection/auth/service/AuthTokenProviderTest.java index 54e5f236c..7a6f64428 100644 --- a/src/test/java/com/example/solidconnection/auth/service/AuthTokenProviderTest.java +++ b/src/test/java/com/example/solidconnection/auth/service/AuthTokenProviderTest.java @@ -58,6 +58,18 @@ void setUp() { ); } + @Test + void 토큰으로부터_SiteUser_를_추출한다() { + // given + String accessToken = authTokenProvider.generateAccessToken(siteUser).token(); + + // when + SiteUser actualSitUser = authTokenProvider.parseSiteUser(accessToken); + + // then + assertThat(actualSitUser.getId()).isEqualTo(siteUser.getId()); + } + @Nested class 리프레시_토큰을_제공한다 { @@ -101,16 +113,4 @@ class 리프레시_토큰을_제공한다 { assertThat(tokenStorage.findToken(expectedSubject, RefreshToken.class)).isEmpty(); } } - - @Test - void 토큰으로부터_SiteUser_를_추출한다() { - // given - String accessToken = authTokenProvider.generateAccessToken(siteUser).token(); - - // when - SiteUser actualSitUser = authTokenProvider.parseSiteUser(accessToken); - - // then - assertThat(actualSitUser.getId()).isEqualTo(siteUser.getId()); - } } diff --git a/src/test/java/com/example/solidconnection/auth/service/JwtTokenProviderTest.java b/src/test/java/com/example/solidconnection/auth/service/JwtTokenProviderTest.java index d7a1a6f8e..54d3a85a2 100644 --- a/src/test/java/com/example/solidconnection/auth/service/JwtTokenProviderTest.java +++ b/src/test/java/com/example/solidconnection/auth/service/JwtTokenProviderTest.java @@ -29,14 +29,33 @@ @TestContainerSpringBootTest class JwtTokenProviderTest { + private final Subject expectedSubject = new Subject("subject123"); + private final Duration expectedExpireTime = Duration.ofMinutes(10); @Autowired private JwtTokenProvider tokenProvider; - @Autowired private JwtProperties jwtProperties; - private final Subject expectedSubject = new Subject("subject123"); - private final Duration expectedExpireTime = Duration.ofMinutes(10); + private String createExpiredToken(String subject) { + return Jwts.builder() + .subject(subject) + .issuedAt(new Date()) + .expiration(new Date(System.currentTimeMillis() - 1000)) + .signWith(getSigningKey()) + .compact(); + } + + private String createExpiredToken(Map claims) { + JwtBuilder builder = Jwts.builder() + .issuedAt(new Date()) + .expiration(new Date(System.currentTimeMillis() - 1000)); + claims.forEach(builder::claim); + return builder.signWith(getSigningKey()).compact(); + } + + private SecretKey getSigningKey() { + return Keys.hmacShaKeyFor(jwtProperties.secret().getBytes(StandardCharsets.UTF_8)); + } @Nested class 토큰을_생성한다 { @@ -185,25 +204,4 @@ class 토큰으로부터_claim_을_추출한다 { assertThat(actualClaimValue).isNull(); } } - - private String createExpiredToken(String subject) { - return Jwts.builder() - .subject(subject) - .issuedAt(new Date()) - .expiration(new Date(System.currentTimeMillis() - 1000)) - .signWith(getSigningKey()) - .compact(); - } - - private String createExpiredToken(Map claims) { - JwtBuilder builder = Jwts.builder() - .issuedAt(new Date()) - .expiration(new Date(System.currentTimeMillis() - 1000)); - claims.forEach(builder::claim); - return builder.signWith(getSigningKey()).compact(); - } - - private SecretKey getSigningKey() { - return Keys.hmacShaKeyFor(jwtProperties.secret().getBytes(StandardCharsets.UTF_8)); - } } diff --git a/src/test/java/com/example/solidconnection/auth/service/oauth/OAuthServiceTest.java b/src/test/java/com/example/solidconnection/auth/service/oauth/OAuthServiceTest.java index 209bd95d7..c9c4a7a1b 100644 --- a/src/test/java/com/example/solidconnection/auth/service/oauth/OAuthServiceTest.java +++ b/src/test/java/com/example/solidconnection/auth/service/oauth/OAuthServiceTest.java @@ -24,21 +24,18 @@ @TestContainerSpringBootTest class OAuthServiceTest { + private final AuthType authType = AuthType.KAKAO; + private final String oauthCode = "code"; + private final String email = "test@test.com"; + private final String profileImageUrl = "profile.jpg"; + private final String nickname = "testUser"; @Autowired private OAuthService oAuthService; - @Autowired private SiteUserFixture siteUserFixture; - @MockitoBean private OAuthClientMap oauthClientMap; - private final AuthType authType = AuthType.KAKAO; - private final String oauthCode = "code"; - private final String email = "test@test.com"; - private final String profileImageUrl = "profile.jpg"; - private final String nickname = "testUser"; - @BeforeEach void setUp() { // 실제 client 호출하지 않도록 mocking OAuthUserInfoDto oauthUserInfoDto = mock(OAuthUserInfoDto.class); diff --git a/src/test/java/com/example/solidconnection/auth/service/signup/PasswordTemporaryStorageTest.java b/src/test/java/com/example/solidconnection/auth/service/signup/PasswordTemporaryStorageTest.java index 2a56f94b3..256785603 100644 --- a/src/test/java/com/example/solidconnection/auth/service/signup/PasswordTemporaryStorageTest.java +++ b/src/test/java/com/example/solidconnection/auth/service/signup/PasswordTemporaryStorageTest.java @@ -13,15 +13,13 @@ @TestContainerSpringBootTest class PasswordTemporaryStorageTest { + private final String email = "test@email.com"; + private final String rawPassword = "password123"; @Autowired private PasswordTemporaryStorage passwordTemporaryStorage; - @Autowired private PasswordEncoder passwordEncoder; - private final String email = "test@email.com"; - private final String rawPassword = "password123"; - @Test void 인코딩된_비밀번호를_임시_저장소에_저장하고_조회한다() { // when diff --git a/src/test/java/com/example/solidconnection/auth/service/signup/SignUpTokenProviderTest.java b/src/test/java/com/example/solidconnection/auth/service/signup/SignUpTokenProviderTest.java index b54a181d2..49c78a5b0 100644 --- a/src/test/java/com/example/solidconnection/auth/service/signup/SignUpTokenProviderTest.java +++ b/src/test/java/com/example/solidconnection/auth/service/signup/SignUpTokenProviderTest.java @@ -21,10 +21,10 @@ import java.nio.charset.StandardCharsets; import java.time.Duration; import java.util.Date; -import javax.crypto.SecretKey; import java.util.HashMap; import java.util.Map; import java.util.Optional; +import javax.crypto.SecretKey; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; @@ -35,23 +35,19 @@ @DisplayName("회원가입 토큰 제공자 테스트") class SignUpTokenProviderTest { + private final String authTypeClaimKey = "authType"; + private final String email = "test@email.com"; + private final Subject subject = new Subject(email); + private final AuthType authType = AuthType.KAKAO; @Autowired private SignUpTokenProvider signUpTokenProvider; - @Autowired private TokenProvider tokenProvider; - @MockitoSpyBean private TokenStorage tokenStorage; - @Autowired private JwtProperties jwtProperties; - private final String authTypeClaimKey = "authType"; - private final String email = "test@email.com"; - private final Subject subject = new Subject(email); - private final AuthType authType = AuthType.KAKAO; - @Test void 회원가입_토큰을_생성하고_저장한다() { // when @@ -80,6 +76,40 @@ class SignUpTokenProviderTest { assertThat(tokenStorage.findToken(subject, SignUpToken.class)).isEmpty(); } + @Test + void 회원가입_토큰에서_이메일을_추출한다() { + // given + String signUpToken = signUpTokenProvider.generateAndSaveSignUpToken(email, authType).token(); + + // when + String extractedEmail = signUpTokenProvider.parseEmail(signUpToken); + + // then + assertThat(extractedEmail).isEqualTo(email); + } + + @Test + void 회원가입_토큰에서_인증_타입을_추출한다() { + // given + String signUpToken = signUpTokenProvider.generateAndSaveSignUpToken(email, authType).token(); + + // when + AuthType extractedAuthType = signUpTokenProvider.parseAuthType(signUpToken); + + // then + assertThat(extractedAuthType).isEqualTo(authType); + } + + private String createExpiredToken() { + SecretKey signingKey = Keys.hmacShaKeyFor(jwtProperties.secret().getBytes(StandardCharsets.UTF_8)); + return Jwts.builder() + .subject(email) + .issuedAt(new Date()) + .expiration(new Date(System.currentTimeMillis() - 1000)) + .signWith(signingKey) + .compact(); + } + @Nested class 주어진_회원가입_토큰을_검증한다 { @@ -139,38 +169,4 @@ class 주어진_회원가입_토큰을_검증한다 { .hasMessageContaining(SIGN_UP_TOKEN_NOT_ISSUED_BY_SERVER.getMessage()); } } - - @Test - void 회원가입_토큰에서_이메일을_추출한다() { - // given - String signUpToken = signUpTokenProvider.generateAndSaveSignUpToken(email, authType).token(); - - // when - String extractedEmail = signUpTokenProvider.parseEmail(signUpToken); - - // then - assertThat(extractedEmail).isEqualTo(email); - } - - @Test - void 회원가입_토큰에서_인증_타입을_추출한다() { - // given - String signUpToken = signUpTokenProvider.generateAndSaveSignUpToken(email, authType).token(); - - // when - AuthType extractedAuthType = signUpTokenProvider.parseAuthType(signUpToken); - - // then - assertThat(extractedAuthType).isEqualTo(authType); - } - - private String createExpiredToken() { - SecretKey signingKey = Keys.hmacShaKeyFor(jwtProperties.secret().getBytes(StandardCharsets.UTF_8)); - return Jwts.builder() - .subject(email) - .issuedAt(new Date()) - .expiration(new Date(System.currentTimeMillis() - 1000)) - .signWith(signingKey) - .compact(); - } } diff --git a/src/test/java/com/example/solidconnection/auth/token/RedisTokenStorageTest.java b/src/test/java/com/example/solidconnection/auth/token/RedisTokenStorageTest.java index ff06979b2..ad0aba11b 100644 --- a/src/test/java/com/example/solidconnection/auth/token/RedisTokenStorageTest.java +++ b/src/test/java/com/example/solidconnection/auth/token/RedisTokenStorageTest.java @@ -50,6 +50,19 @@ void setUp() { ); } + @Test + void 토큰을_삭제한다() { + // given + redisTokenStorage.saveToken(subject, expectedToken); + + // when + redisTokenStorage.deleteToken(subject, tokenClass); + + // then + Optional foundToken = redisTokenStorage.findToken(subject, tokenClass); + assertThat(foundToken).isEmpty(); + } + @Nested class 토큰을_조회한다 { @@ -74,17 +87,4 @@ class 토큰을_조회한다 { assertThat(foundToken).isEmpty(); } } - - @Test - void 토큰을_삭제한다() { - // given - redisTokenStorage.saveToken(subject, expectedToken); - - // when - redisTokenStorage.deleteToken(subject, tokenClass); - - // then - Optional foundToken = redisTokenStorage.findToken(subject, tokenClass); - assertThat(foundToken).isEmpty(); - } } diff --git a/src/test/java/com/example/solidconnection/chat/service/ChatServiceTest.java b/src/test/java/com/example/solidconnection/chat/service/ChatServiceTest.java index 68bb31e55..614769e84 100644 --- a/src/test/java/com/example/solidconnection/chat/service/ChatServiceTest.java +++ b/src/test/java/com/example/solidconnection/chat/service/ChatServiceTest.java @@ -38,11 +38,11 @@ import org.mockito.ArgumentCaptor; import org.mockito.BDDMockito; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.messaging.simp.SimpMessagingTemplate; +import org.springframework.test.context.bean.override.mockito.MockitoBean; @TestContainerSpringBootTest @DisplayName("채팅 서비스 테스트") @@ -451,12 +451,12 @@ void setUp() { @Nested class 채팅_이미지를_전송한다 { - private SiteUser sender; - private ChatParticipant senderParticipant; - private ChatRoom chatRoom; private static final String TEST_IMAGE_URL = "https://bucket.s3.ap-northeast-2.amazonaws.com/chat/files/example.jpg"; private static final String TEST_IMAGE_URL2 = "https://bucket.s3.ap-northeast-2.amazonaws.com/chat/files/example2.jpg"; private static final String EXPECTED_THUMBNAIL_URL = "https://bucket.s3.ap-northeast-2.amazonaws.com/chat/thumbnails/example_thumb.jpg"; + private SiteUser sender; + private ChatParticipant senderParticipant; + private ChatRoom chatRoom; @BeforeEach void setUp() { diff --git a/src/test/java/com/example/solidconnection/common/filter/HttpLoggingFilterTest.java b/src/test/java/com/example/solidconnection/common/filter/HttpLoggingFilterTest.java index 815370bfb..a48818ed0 100644 --- a/src/test/java/com/example/solidconnection/common/filter/HttpLoggingFilterTest.java +++ b/src/test/java/com/example/solidconnection/common/filter/HttpLoggingFilterTest.java @@ -67,7 +67,7 @@ class TraceId_생성 { AtomicReference capturedTraceId = new AtomicReference<>(); - doAnswer(invocation ->{ + doAnswer(invocation -> { capturedTraceId.set(MDC.get("traceId")); return null; }).when(filterChain).doFilter(request, response); @@ -115,7 +115,6 @@ class 로깅_제외_패턴 { String expectedRequestLog = "[REQUEST] GET /api/users"; String expectedResponseLog = "[RESPONSE] /api/users userId = null, (200 OK)"; - // when filter.doFilterInternal(request, response, filterChain); diff --git a/src/test/java/com/example/solidconnection/common/interceptor/BannedUserInterceptorTest.java b/src/test/java/com/example/solidconnection/common/interceptor/BannedUserInterceptorTest.java index d6337f55f..8e89162b0 100644 --- a/src/test/java/com/example/solidconnection/common/interceptor/BannedUserInterceptorTest.java +++ b/src/test/java/com/example/solidconnection/common/interceptor/BannedUserInterceptorTest.java @@ -78,14 +78,14 @@ void setUp() { // when & then mockMvc.perform(post("/comments") - .contentType(MediaType.APPLICATION_JSON) - .content(""" - { - "postId": 1, - "content": "테스트 댓글 내용", - "parentId": null - } - """)) + .contentType(MediaType.APPLICATION_JSON) + .content(""" + { + "postId": 1, + "content": "테스트 댓글 내용", + "parentId": null + } + """)) .andExpect(status().isForbidden()); } @@ -124,12 +124,12 @@ void setUp() { mockMvc.perform(post("/comments") .contentType(MediaType.APPLICATION_JSON) .content(""" - { - "postId": 1, - "content": "테스트 댓글 내용", - "parentId": null - } - """)) + { + "postId": 1, + "content": "테스트 댓글 내용", + "parentId": null + } + """)) .andExpect(status().isOk()); mockMvc.perform(get("/chats/rooms")) diff --git a/src/test/java/com/example/solidconnection/common/resolver/AuthorizedUserResolverTest.java b/src/test/java/com/example/solidconnection/common/resolver/AuthorizedUserResolverTest.java index b53be9c79..ed9e7bc65 100644 --- a/src/test/java/com/example/solidconnection/common/resolver/AuthorizedUserResolverTest.java +++ b/src/test/java/com/example/solidconnection/common/resolver/AuthorizedUserResolverTest.java @@ -55,6 +55,36 @@ void setUp() { ); } + private TokenAuthentication createAuthenticationWithUser(SiteUser siteUser) { + SiteUserDetails userDetails = new SiteUserDetails(siteUser); + return new TokenAuthentication("token", userDetails); + } + + private MethodParameter getTestMethodParameter(String methodName, Class parameterType) { + // 테스트의 목적을 불분명히 만들 수 있는 throws 절을 제거하기 위해 uncheckedException 로 변환한다. + try { + Method method = TestController.class.getMethod(methodName, parameterType); + return new MethodParameter(method, 0); + } catch (NoSuchMethodException e) { + throw new RuntimeException("Method not found: " + methodName, e); + } + } + + static class TestController { + + public void method(@AuthorizedUser Long userId) { + } + + public void primitiveType(@AuthorizedUser long userId) { + } + + public void required(@AuthorizedUser(required = true) Long userId) { + } + + public void notRequired(@AuthorizedUser(required = false) Long userId) { + } + } + @Nested class security_context_에_저장된_사용자가_없는_경우 { @@ -91,34 +121,4 @@ class security_context_에_저장된_사용자가_없는_경우 { ).isNull(); } } - - private TokenAuthentication createAuthenticationWithUser(SiteUser siteUser) { - SiteUserDetails userDetails = new SiteUserDetails(siteUser); - return new TokenAuthentication("token", userDetails); - } - - private MethodParameter getTestMethodParameter(String methodName, Class parameterType) { - // 테스트의 목적을 불분명히 만들 수 있는 throws 절을 제거하기 위해 uncheckedException 로 변환한다. - try { - Method method = TestController.class.getMethod(methodName, parameterType); - return new MethodParameter(method, 0); - } catch (NoSuchMethodException e) { - throw new RuntimeException("Method not found: " + methodName, e); - } - } - - static class TestController { - - public void method(@AuthorizedUser Long userId) { - } - - public void primitiveType(@AuthorizedUser long userId) { - } - - public void required(@AuthorizedUser(required = true) Long userId) { - } - - public void notRequired(@AuthorizedUser(required = false) Long userId) { - } - } } diff --git a/src/test/java/com/example/solidconnection/common/resolver/CustomPageableHandlerMethodArgumentResolverTest.java b/src/test/java/com/example/solidconnection/common/resolver/CustomPageableHandlerMethodArgumentResolverTest.java index da4fcc852..9df860078 100644 --- a/src/test/java/com/example/solidconnection/common/resolver/CustomPageableHandlerMethodArgumentResolverTest.java +++ b/src/test/java/com/example/solidconnection/common/resolver/CustomPageableHandlerMethodArgumentResolverTest.java @@ -35,6 +35,16 @@ class CustomPageableHandlerMethodArgumentResolverTest { private NativeWebRequest webRequest; private MethodParameter parameter; + static Stream provideInvalidParameters() { + return Stream.of( + Arguments.of("null", null), + Arguments.of("빈 문자열", ""), + Arguments.of("0", "0"), + Arguments.of("음수", "-1"), + Arguments.of("문자열", "invalid") + ); + } + @BeforeEach void setUp() throws NoSuchMethodException { request = new MockHttpServletRequest(); @@ -114,16 +124,6 @@ void setUp() throws NoSuchMethodException { assertThat(pageable.getPageSize()).isEqualTo(DEFAULT_SIZE); } - static Stream provideInvalidParameters() { - return Stream.of( - Arguments.of("null", null), - Arguments.of("빈 문자열", ""), - Arguments.of("0", "0"), - Arguments.of("음수", "-1"), - Arguments.of("문자열", "invalid") - ); - } - private static class TestController { public void pageableMethod(Pageable pageable) { diff --git a/src/test/java/com/example/solidconnection/community/post/service/PostCommandServiceTest.java b/src/test/java/com/example/solidconnection/community/post/service/PostCommandServiceTest.java index a8ef1d25f..309797032 100644 --- a/src/test/java/com/example/solidconnection/community/post/service/PostCommandServiceTest.java +++ b/src/test/java/com/example/solidconnection/community/post/service/PostCommandServiceTest.java @@ -39,8 +39,8 @@ import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.mock.web.MockMultipartFile; +import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.web.multipart.MultipartFile; @TestContainerSpringBootTest @@ -99,6 +99,44 @@ void setUp() { ); } + private PostCreateRequest createPostCreateRequest(String category) { + return new PostCreateRequest( + boardFixture.자유게시판().getCode(), + category, + "테스트 제목", + "테스트 내용", + false + ); + } + + private MockMultipartFile createImageFile() { + return new MockMultipartFile( + "image", + "test.jpg", + "image/jpeg", + "test image content".getBytes() + ); + } + + private List createSixImageFiles() { + return List.of( + createImageFile(), + createImageFile(), + createImageFile(), + createImageFile(), + createImageFile(), + createImageFile() + ); + } + + private PostUpdateRequest createPostUpdateRequest() { + return new PostUpdateRequest( + PostCategory.자유.name(), + "수정된 제목", + "수정된 내용" + ); + } + @Nested class 게시글_생성_테스트 { @@ -308,42 +346,4 @@ class 게시글_삭제_테스트 { .hasMessage(CAN_NOT_DELETE_OR_UPDATE_QUESTION.getMessage()); } } - - private PostCreateRequest createPostCreateRequest(String category) { - return new PostCreateRequest( - boardFixture.자유게시판().getCode(), - category, - "테스트 제목", - "테스트 내용", - false - ); - } - - private MockMultipartFile createImageFile() { - return new MockMultipartFile( - "image", - "test.jpg", - "image/jpeg", - "test image content".getBytes() - ); - } - - private List createSixImageFiles() { - return List.of( - createImageFile(), - createImageFile(), - createImageFile(), - createImageFile(), - createImageFile(), - createImageFile() - ); - } - - private PostUpdateRequest createPostUpdateRequest() { - return new PostUpdateRequest( - PostCategory.자유.name(), - "수정된 제목", - "수정된 내용" - ); - } } diff --git a/src/test/java/com/example/solidconnection/database/FlywayMigrationTest.java b/src/test/java/com/example/solidconnection/database/FlywayMigrationTest.java index 65f74f15d..9fe0fd4fd 100644 --- a/src/test/java/com/example/solidconnection/database/FlywayMigrationTest.java +++ b/src/test/java/com/example/solidconnection/database/FlywayMigrationTest.java @@ -28,7 +28,14 @@ class FlywayMigrationTest { CONTAINER.start(); } + @Test + void flyway_스크립트가_정상적으로_수행되는지_확인한다() { + // Spring Boot 컨텍스트가 정상적으로 시작되면 + // Flyway 마이그레이션과 ddl-auto=validate 검증이 성공한 것 + } + static class FlywayMySQLInitializer implements ApplicationContextInitializer { + @Override public void initialize(ConfigurableApplicationContext applicationContext) { TestPropertyValues.of( @@ -38,10 +45,4 @@ public void initialize(ConfigurableApplicationContext applicationContext) { ).applyTo(applicationContext.getEnvironment()); } } - - @Test - void flyway_스크립트가_정상적으로_수행되는지_확인한다() { - // Spring Boot 컨텍스트가 정상적으로 시작되면 - // Flyway 마이그레이션과 ddl-auto=validate 검증이 성공한 것 - } } diff --git a/src/test/java/com/example/solidconnection/mentor/fixture/MentorApplicationFixture.java b/src/test/java/com/example/solidconnection/mentor/fixture/MentorApplicationFixture.java index 6a7153757..843b7fedc 100644 --- a/src/test/java/com/example/solidconnection/mentor/fixture/MentorApplicationFixture.java +++ b/src/test/java/com/example/solidconnection/mentor/fixture/MentorApplicationFixture.java @@ -12,13 +12,12 @@ @RequiredArgsConstructor public class MentorApplicationFixture { - private final MentorApplicationFixtureBuilder mentorApplicationFixtureBuilder; - private final TermFixture termFixture; - private static final String DEFAULT_COUNTRY_CODE = "US"; - private static final String DEFAULT_PROOF_URL = "/mentor-proof.pdf"; + private static final String DEFAULT_PROOF_URL = "/mentor-proof.pdf"; private static final ExchangeStatus DEFAULT_EXCHANGE_STATUS = ExchangeStatus.AFTER_EXCHANGE; private static final String REJECTED_REASON = "pdf 파일 안열림"; + private final MentorApplicationFixtureBuilder mentorApplicationFixtureBuilder; + private final TermFixture termFixture; public MentorApplication 대기중_멘토신청( long siteUserId, @@ -40,7 +39,7 @@ public class MentorApplicationFixture { long siteUserId, UniversitySelectType selectType, Long universityId - ){ + ) { return mentorApplicationFixtureBuilder.mentorApplication() .siteUserId(siteUserId) .countryCode(DEFAULT_COUNTRY_CODE) @@ -57,7 +56,7 @@ public class MentorApplicationFixture { long siteUserId, UniversitySelectType selectType, Long universityId - ){ + ) { return mentorApplicationFixtureBuilder.mentorApplication() .siteUserId(siteUserId) .countryCode(DEFAULT_COUNTRY_CODE) diff --git a/src/test/java/com/example/solidconnection/mentor/fixture/MentorApplicationFixtureBuilder.java b/src/test/java/com/example/solidconnection/mentor/fixture/MentorApplicationFixtureBuilder.java index 93e5e24bc..dcd52c5bd 100644 --- a/src/test/java/com/example/solidconnection/mentor/fixture/MentorApplicationFixtureBuilder.java +++ b/src/test/java/com/example/solidconnection/mentor/fixture/MentorApplicationFixtureBuilder.java @@ -85,7 +85,7 @@ public MentorApplication create() { exchangeStatus ); ReflectionTestUtils.setField(mentorApplication, "mentorApplicationStatus", mentorApplicationStatus); - if(rejectedReason != null) { + if (rejectedReason != null) { ReflectionTestUtils.setField(mentorApplication, "rejectedReason", rejectedReason); } return mentorApplicationRepository.save(mentorApplication); diff --git a/src/test/java/com/example/solidconnection/mentor/service/MentorApplicationServiceTest.java b/src/test/java/com/example/solidconnection/mentor/service/MentorApplicationServiceTest.java index 49e69e976..9c148291b 100644 --- a/src/test/java/com/example/solidconnection/mentor/service/MentorApplicationServiceTest.java +++ b/src/test/java/com/example/solidconnection/mentor/service/MentorApplicationServiceTest.java @@ -27,8 +27,8 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.mock.web.MockMultipartFile; +import org.springframework.test.context.bean.override.mockito.MockitoBean; @TestContainerSpringBootTest @DisplayName("멘토 승격 신청 서비스 테스트") @@ -94,11 +94,11 @@ void setUp() { mentorApplicationService.submitMentorApplication(user.getId(), request, file); // then - assertThat(mentorApplicationRepository.existsBySiteUserIdAndMentorApplicationStatusIn(user.getId(),List.of(MentorApplicationStatus.PENDING, MentorApplicationStatus.APPROVED))).isEqualTo(true); + assertThat(mentorApplicationRepository.existsBySiteUserIdAndMentorApplicationStatusIn(user.getId(), List.of(MentorApplicationStatus.PENDING, MentorApplicationStatus.APPROVED))).isEqualTo(true); } @Test - void 대학_선택_타입이_CATALOG_인데_universityId가_null_이면_예외가_발생한다(){ + void 대학_선택_타입이_CATALOG_인데_universityId가_null_이면_예외가_발생한다() { // given UniversitySelectType universitySelectType = UniversitySelectType.CATALOG; Long universityId = null; @@ -115,7 +115,7 @@ void setUp() { } @Test - void 대학_선택_타입이_OTHER_인데_universityId가_존재하면_예외가_발생한다(){ + void 대학_선택_타입이_OTHER_인데_universityId가_존재하면_예외가_발생한다() { // given UniversitySelectType universitySelectType = UniversitySelectType.OTHER; Long universityId = 1L; @@ -180,7 +180,7 @@ void setUp() { mentorApplicationService.submitMentorApplication(user.getId(), request, file); // then - assertThat(mentorApplicationRepository.existsBySiteUserIdAndMentorApplicationStatusIn(user.getId(),List.of(MentorApplicationStatus.PENDING, MentorApplicationStatus.APPROVED))).isEqualTo(true); + assertThat(mentorApplicationRepository.existsBySiteUserIdAndMentorApplicationStatusIn(user.getId(), List.of(MentorApplicationStatus.PENDING, MentorApplicationStatus.APPROVED))).isEqualTo(true); } private MockMultipartFile createMentorProofFile() { diff --git a/src/test/java/com/example/solidconnection/mentor/service/MentoringCommandServiceTest.java b/src/test/java/com/example/solidconnection/mentor/service/MentoringCommandServiceTest.java index db2a4a5ea..7c76a978b 100644 --- a/src/test/java/com/example/solidconnection/mentor/service/MentoringCommandServiceTest.java +++ b/src/test/java/com/example/solidconnection/mentor/service/MentoringCommandServiceTest.java @@ -7,7 +7,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.junit.jupiter.api.Assertions.assertAll; -import static org.awaitility.Awaitility.await; + import com.example.solidconnection.chat.domain.ChatParticipant; import com.example.solidconnection.chat.domain.ChatRoom; import com.example.solidconnection.chat.repository.ChatRoomRepositoryForTest; @@ -26,7 +26,6 @@ import com.example.solidconnection.siteuser.domain.SiteUser; import com.example.solidconnection.siteuser.fixture.SiteUserFixture; import com.example.solidconnection.support.TestContainerSpringBootTest; -import java.time.Duration; import java.util.List; import java.util.Optional; import org.junit.jupiter.api.BeforeEach; diff --git a/src/test/java/com/example/solidconnection/news/service/NewsCommandServiceTest.java b/src/test/java/com/example/solidconnection/news/service/NewsCommandServiceTest.java index 95cde320d..e0a301323 100644 --- a/src/test/java/com/example/solidconnection/news/service/NewsCommandServiceTest.java +++ b/src/test/java/com/example/solidconnection/news/service/NewsCommandServiceTest.java @@ -29,8 +29,8 @@ import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.mock.web.MockMultipartFile; +import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.web.multipart.MultipartFile; @TestContainerSpringBootTest @@ -62,6 +62,23 @@ void setUp() { user = siteUserFixture.멘토(1, "mentor"); } + private NewsCreateRequest createNewsCreateRequest() { + return new NewsCreateRequest("제목", "설명", "https://youtu.be/test"); + } + + private NewsUpdateRequest createNewsUpdateRequest(String title, String description, String url, Boolean resetToDefaultImage) { + return new NewsUpdateRequest(title, description, url, resetToDefaultImage); + } + + private MockMultipartFile createImageFile() { + return new MockMultipartFile( + "image", + "test.jpg", + "image/jpeg", + "test image content".getBytes() + ); + } + @Nested class 소식지_생성_테스트 { @@ -83,10 +100,6 @@ class 소식지_생성_테스트 { } } - private NewsCreateRequest createNewsCreateRequest() { - return new NewsCreateRequest("제목", "설명", "https://youtu.be/test"); - } - @Nested class 소식지_수정_테스트 { @@ -279,19 +292,6 @@ void setUp() { } } - private NewsUpdateRequest createNewsUpdateRequest(String title, String description, String url, Boolean resetToDefaultImage) { - return new NewsUpdateRequest(title, description, url, resetToDefaultImage); - } - - private MockMultipartFile createImageFile() { - return new MockMultipartFile( - "image", - "test.jpg", - "image/jpeg", - "test image content".getBytes() - ); - } - @Nested class 소식지_삭제_테스트 { diff --git a/src/test/java/com/example/solidconnection/report/fixture/ReportFixtureBuilder.java b/src/test/java/com/example/solidconnection/report/fixture/ReportFixtureBuilder.java index 0c7705dcf..a83f05625 100644 --- a/src/test/java/com/example/solidconnection/report/fixture/ReportFixtureBuilder.java +++ b/src/test/java/com/example/solidconnection/report/fixture/ReportFixtureBuilder.java @@ -28,7 +28,7 @@ public ReportFixtureBuilder reporterId(long reporterId) { return this; } - public ReportFixtureBuilder reportedId(long reportedId) { + public ReportFixtureBuilder reportedId(long reportedId) { this.reportedId = reportedId; return this; } diff --git a/src/test/java/com/example/solidconnection/s3/service/S3ServiceTest.java b/src/test/java/com/example/solidconnection/s3/service/S3ServiceTest.java index 51d2aead5..c4485858a 100644 --- a/src/test/java/com/example/solidconnection/s3/service/S3ServiceTest.java +++ b/src/test/java/com/example/solidconnection/s3/service/S3ServiceTest.java @@ -21,11 +21,11 @@ @ExtendWith(MockitoExtension.class) public class S3ServiceTest { + private static final long MAX_FILE_SIZE_MB = 1024 * 1024 * 5; @InjectMocks private S3Service s3Service; - - @Mock private FileUploadService fileUploadService; - private static final long MAX_FILE_SIZE_MB = 1024 * 1024 * 5; + @Mock + private FileUploadService fileUploadService; private MockMultipartFile createMockFile(String originalName, long size) { return new MockMultipartFile("file", originalName, "image/jpeg", new byte[(int) size]); diff --git a/src/test/java/com/example/solidconnection/score/service/ScoreServiceTest.java b/src/test/java/com/example/solidconnection/score/service/ScoreServiceTest.java index 0f2e27366..ddf7a722e 100644 --- a/src/test/java/com/example/solidconnection/score/service/ScoreServiceTest.java +++ b/src/test/java/com/example/solidconnection/score/service/ScoreServiceTest.java @@ -26,8 +26,8 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.mock.web.MockMultipartFile; +import org.springframework.test.context.bean.override.mockito.MockitoBean; @TestContainerSpringBootTest @DisplayName("점수 서비스 테스트") diff --git a/src/test/java/com/example/solidconnection/security/authentication/TokenAuthenticationProviderTest.java b/src/test/java/com/example/solidconnection/security/authentication/TokenAuthenticationProviderTest.java index 9c2c77f84..124ba7be0 100644 --- a/src/test/java/com/example/solidconnection/security/authentication/TokenAuthenticationProviderTest.java +++ b/src/test/java/com/example/solidconnection/security/authentication/TokenAuthenticationProviderTest.java @@ -28,15 +28,13 @@ @DisplayName("사용자 인증정보 provider 테스트") class TokenAuthenticationProviderTest { + private static final long VALID_TOKEN_TTL_MS = 30 * 1000L; @Autowired private TokenAuthenticationProvider tokenAuthenticationProvider; - @Autowired private JwtProperties jwtProperties; - @Autowired private SiteUserFixture siteUserFixture; - private SiteUser user; @BeforeEach @@ -44,8 +42,6 @@ void setUp() { user = siteUserFixture.사용자(); } - private static final long VALID_TOKEN_TTL_MS = 30 * 1000L; - @Test void 처리할_수_있는_타입인지를_반환한다() { // given @@ -76,6 +72,33 @@ void setUp() { ); } + private String createValidToken(long id) { + return Jwts.builder() + .subject(String.valueOf(id)) + .issuedAt(new Date()) + .expiration(new Date(System.currentTimeMillis() + VALID_TOKEN_TTL_MS)) + .signWith(Keys.hmacShaKeyFor(jwtProperties.secret().getBytes(StandardCharsets.UTF_8))) + .compact(); + } + + private String createExpiredToken() { + return Jwts.builder() + .subject(String.valueOf(user.getId())) + .issuedAt(new Date()) + .expiration(new Date(System.currentTimeMillis() - VALID_TOKEN_TTL_MS)) + .signWith(Keys.hmacShaKeyFor(jwtProperties.secret().getBytes(StandardCharsets.UTF_8))) + .compact(); + } + + private String createWrongSubjectTypeToken() { + return Jwts.builder() + .subject("subject") + .issuedAt(new Date()) + .expiration(new Date(System.currentTimeMillis() + VALID_TOKEN_TTL_MS)) + .signWith(Keys.hmacShaKeyFor(jwtProperties.secret().getBytes(StandardCharsets.UTF_8))) + .compact(); + } + @Nested class 예외가_발생한다 { @@ -115,31 +138,4 @@ class 예외가_발생한다 { .hasMessageContaining(AUTHENTICATION_FAILED.getMessage()); } } - - private String createValidToken(long id) { - return Jwts.builder() - .subject(String.valueOf(id)) - .issuedAt(new Date()) - .expiration(new Date(System.currentTimeMillis() + VALID_TOKEN_TTL_MS)) - .signWith(Keys.hmacShaKeyFor(jwtProperties.secret().getBytes(StandardCharsets.UTF_8))) - .compact(); - } - - private String createExpiredToken() { - return Jwts.builder() - .subject(String.valueOf(user.getId())) - .issuedAt(new Date()) - .expiration(new Date(System.currentTimeMillis() - VALID_TOKEN_TTL_MS)) - .signWith(Keys.hmacShaKeyFor(jwtProperties.secret().getBytes(StandardCharsets.UTF_8))) - .compact(); - } - - private String createWrongSubjectTypeToken() { - return Jwts.builder() - .subject("subject") - .issuedAt(new Date()) - .expiration(new Date(System.currentTimeMillis() + VALID_TOKEN_TTL_MS)) - .signWith(Keys.hmacShaKeyFor(jwtProperties.secret().getBytes(StandardCharsets.UTF_8))) - .compact(); - } } diff --git a/src/test/java/com/example/solidconnection/security/authentication/TokenAuthenticationTest.java b/src/test/java/com/example/solidconnection/security/authentication/TokenAuthenticationTest.java index 90e76abc2..97f407d67 100644 --- a/src/test/java/com/example/solidconnection/security/authentication/TokenAuthenticationTest.java +++ b/src/test/java/com/example/solidconnection/security/authentication/TokenAuthenticationTest.java @@ -13,6 +13,16 @@ @DisplayName("토큰 인증 정보 테스트") class TokenAuthenticationTest { + private SiteUser createSiteUser() { + return new SiteUser( + "test@example.com", + "nickname", + "profileImageUrl", + ExchangeStatus.CONSIDERING, + Role.MENTEE + ); + } + @Nested class Authentication의_인증_정보를_반환한다 { @@ -68,14 +78,4 @@ class Authentication의_인증_상태를_반환한다 { assertThat(authentication.isAuthenticated()).isTrue(); } } - - private SiteUser createSiteUser() { - return new SiteUser( - "test@example.com", - "nickname", - "profileImageUrl", - ExchangeStatus.CONSIDERING, - Role.MENTEE - ); - } } diff --git a/src/test/java/com/example/solidconnection/security/filter/ExceptionHandlerFilterTest.java b/src/test/java/com/example/solidconnection/security/filter/ExceptionHandlerFilterTest.java index aae969160..5fb997f0f 100644 --- a/src/test/java/com/example/solidconnection/security/filter/ExceptionHandlerFilterTest.java +++ b/src/test/java/com/example/solidconnection/security/filter/ExceptionHandlerFilterTest.java @@ -37,6 +37,13 @@ class ExceptionHandlerFilterTest { private HttpServletResponse response; private FilterChain filterChain; + private static Stream provideException() { + return Stream.of( + new RuntimeException(), + new CustomException(ErrorCode.INVALID_TOKEN) + ); + } + @BeforeEach() void setUp() { request = new MockHttpServletRequest(); @@ -83,13 +90,6 @@ void setUp() { assertThat(response.getStatus()).isEqualTo(HttpServletResponse.SC_UNAUTHORIZED); } - private static Stream provideException() { - return Stream.of( - new RuntimeException(), - new CustomException(ErrorCode.INVALID_TOKEN) - ); - } - private Authentication getAnonymousAuth() { return new AnonymousAuthenticationToken( "key", diff --git a/src/test/java/com/example/solidconnection/security/filter/SignOutCheckFilterTest.java b/src/test/java/com/example/solidconnection/security/filter/SignOutCheckFilterTest.java index 372d7ed67..3760fa3fe 100644 --- a/src/test/java/com/example/solidconnection/security/filter/SignOutCheckFilterTest.java +++ b/src/test/java/com/example/solidconnection/security/filter/SignOutCheckFilterTest.java @@ -29,24 +29,19 @@ @DisplayName("로그아웃 체크 필터 테스트") class SignOutCheckFilterTest { + private final String subject = "subject"; @Autowired private SignOutCheckFilter signOutCheckFilter; - @Autowired private RedisTemplate redisTemplate; - @Autowired private JwtProperties jwtProperties; - @Autowired private TokenProperties tokenProperties; - private HttpServletRequest request; private HttpServletResponse response; private FilterChain filterChain; - private final String subject = "subject"; - @BeforeEach void setUp() { response = new MockHttpServletResponse(); diff --git a/src/test/java/com/example/solidconnection/security/filter/TokenAuthenticationFilterTest.java b/src/test/java/com/example/solidconnection/security/filter/TokenAuthenticationFilterTest.java index e54a50e22..b6d1a5f5b 100644 --- a/src/test/java/com/example/solidconnection/security/filter/TokenAuthenticationFilterTest.java +++ b/src/test/java/com/example/solidconnection/security/filter/TokenAuthenticationFilterTest.java @@ -24,10 +24,10 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.mock.web.MockHttpServletResponse; import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.test.context.bean.override.mockito.MockitoBean; @TestContainerSpringBootTest @DisplayName("토큰 인증 필터 테스트") diff --git a/src/test/java/com/example/solidconnection/security/userdetails/SiteUserDetailsServiceTest.java b/src/test/java/com/example/solidconnection/security/userdetails/SiteUserDetailsServiceTest.java index d82e7406b..3e72d9039 100644 --- a/src/test/java/com/example/solidconnection/security/userdetails/SiteUserDetailsServiceTest.java +++ b/src/test/java/com/example/solidconnection/security/userdetails/SiteUserDetailsServiceTest.java @@ -46,6 +46,10 @@ class SiteUserDetailsServiceTest { ); } + private String getUserName(SiteUser siteUser) { + return siteUser.getId().toString(); + } + @Nested class 예외가_발생한다 { @@ -85,8 +89,4 @@ class 예외가_발생한다 { .hasMessageContaining(AUTHENTICATION_FAILED.getMessage()); } } - - private String getUserName(SiteUser siteUser) { - return siteUser.getId().toString(); - } } diff --git a/src/test/java/com/example/solidconnection/siteuser/fixture/UserBanFixture.java b/src/test/java/com/example/solidconnection/siteuser/fixture/UserBanFixture.java index b73e4f055..b91d12c88 100644 --- a/src/test/java/com/example/solidconnection/siteuser/fixture/UserBanFixture.java +++ b/src/test/java/com/example/solidconnection/siteuser/fixture/UserBanFixture.java @@ -2,7 +2,6 @@ import com.example.solidconnection.siteuser.domain.UserBan; import com.example.solidconnection.siteuser.domain.UserBanDuration; - import java.time.ZonedDateTime; import lombok.RequiredArgsConstructor; import org.springframework.boot.test.context.TestComponent; @@ -11,9 +10,8 @@ @RequiredArgsConstructor public class UserBanFixture { - private final UserBanFixtureBuilder userBanFixtureBuilder; - private static final long DEFAULT_ADMIN_ID = 1L; + private final UserBanFixtureBuilder userBanFixtureBuilder; public UserBan 만료된_차단(long bannedUserId) { return userBanFixtureBuilder.userBan() diff --git a/src/test/java/com/example/solidconnection/siteuser/repository/SiteUserRepositoryTest.java b/src/test/java/com/example/solidconnection/siteuser/repository/SiteUserRepositoryTest.java index cca31fbbe..41ec37251 100644 --- a/src/test/java/com/example/solidconnection/siteuser/repository/SiteUserRepositoryTest.java +++ b/src/test/java/com/example/solidconnection/siteuser/repository/SiteUserRepositoryTest.java @@ -18,6 +18,17 @@ class SiteUserRepositoryTest { @Autowired private SiteUserRepository siteUserRepository; + private SiteUser createSiteUser(String email, String nickname, AuthType authType) { + return new SiteUser( + email, + nickname, + "profileImageUrl", + ExchangeStatus.CONSIDERING, + Role.MENTEE, + authType + ); + } + @Nested class 이메일과_인증_유형이_동일한_사용자는_저장할_수_없다 { @@ -77,15 +88,4 @@ class 닉네임은_중복될_수_없다 { .isInstanceOf(DataIntegrityViolationException.class); } } - - private SiteUser createSiteUser(String email, String nickname, AuthType authType) { - return new SiteUser( - email, - nickname, - "profileImageUrl", - ExchangeStatus.CONSIDERING, - Role.MENTEE, - authType - ); - } } diff --git a/src/test/java/com/example/solidconnection/siteuser/service/MyPageServiceTest.java b/src/test/java/com/example/solidconnection/siteuser/service/MyPageServiceTest.java index 7a8463a65..4325e1481 100644 --- a/src/test/java/com/example/solidconnection/siteuser/service/MyPageServiceTest.java +++ b/src/test/java/com/example/solidconnection/siteuser/service/MyPageServiceTest.java @@ -40,8 +40,8 @@ import com.example.solidconnection.support.TestContainerSpringBootTest; import com.example.solidconnection.term.domain.Term; import com.example.solidconnection.term.fixture.TermFixture; -import com.example.solidconnection.university.domain.LikedUnivApplyInfo; import com.example.solidconnection.university.domain.HostUniversity; +import com.example.solidconnection.university.domain.LikedUnivApplyInfo; import com.example.solidconnection.university.domain.UnivApplyInfo; import com.example.solidconnection.university.fixture.UnivApplyInfoFixture; import com.example.solidconnection.university.repository.LikedUnivApplyInfoRepository; @@ -54,9 +54,9 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.EnumSource; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.mock.web.MockMultipartFile; import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.test.context.bean.override.mockito.MockitoBean; @TestContainerSpringBootTest @DisplayName("마이페이지 서비스 테스트") diff --git a/src/test/java/com/example/solidconnection/university/repository/HostUniversityRepositoryForTest.java b/src/test/java/com/example/solidconnection/university/repository/HostUniversityRepositoryForTest.java index c941a5199..ea94febb7 100644 --- a/src/test/java/com/example/solidconnection/university/repository/HostUniversityRepositoryForTest.java +++ b/src/test/java/com/example/solidconnection/university/repository/HostUniversityRepositoryForTest.java @@ -4,4 +4,5 @@ import org.springframework.data.jpa.repository.JpaRepository; public interface HostUniversityRepositoryForTest extends JpaRepository { + } diff --git a/src/test/java/com/example/solidconnection/university/repository/LikedUnivApplyInfoRepositoryTest.java b/src/test/java/com/example/solidconnection/university/repository/LikedUnivApplyInfoRepositoryTest.java index 04696f7a2..d0e486adb 100644 --- a/src/test/java/com/example/solidconnection/university/repository/LikedUnivApplyInfoRepositoryTest.java +++ b/src/test/java/com/example/solidconnection/university/repository/LikedUnivApplyInfoRepositoryTest.java @@ -40,6 +40,13 @@ void setUp() { term = termFixture.현재_학기("2025-2"); } + private LikedUnivApplyInfo createLikedUnivApplyInfo(SiteUser siteUser, UnivApplyInfo univApplyInfo) { + return LikedUnivApplyInfo.builder() + .siteUserId(siteUser.getId()) + .univApplyInfoId(univApplyInfo.getId()) + .build(); + } + @Nested class 사용자와_좋아요한_대학은_복합_유니크_제약조건을_갖는다 { @@ -91,11 +98,4 @@ class 사용자와_좋아요한_대학은_복합_유니크_제약조건을_갖 assertThatCode(() -> likedUnivApplyInfoRepository.save(secondLike)).doesNotThrowAnyException(); } } - - private LikedUnivApplyInfo createLikedUnivApplyInfo(SiteUser siteUser, UnivApplyInfo univApplyInfo) { - return LikedUnivApplyInfo.builder() - .siteUserId(siteUser.getId()) - .univApplyInfoId(univApplyInfo.getId()) - .build(); - } } diff --git a/src/test/java/com/example/solidconnection/university/service/LikedUnivApplyInfoServiceTest.java b/src/test/java/com/example/solidconnection/university/service/LikedUnivApplyInfoServiceTest.java index bbc2b476b..81cb7789d 100644 --- a/src/test/java/com/example/solidconnection/university/service/LikedUnivApplyInfoServiceTest.java +++ b/src/test/java/com/example/solidconnection/university/service/LikedUnivApplyInfoServiceTest.java @@ -71,6 +71,57 @@ void setUp() { .containsExactlyInAnyOrder(메이지대학_지원_정보.getId(), 그라츠대학_지원_정보.getId()); } + @Test + void 존재하지_않는_지원_정보에_좋아요_시도하면_예외가_발생한다() { + // given + Long invalidUnivApplyInfoId = 9999L; + + // when & then + assertThatCode(() -> likedUnivApplyInfoService.addUnivApplyInfoLike(user.getId(), invalidUnivApplyInfoId)) + .isInstanceOf(CustomException.class) + .hasMessage(UNIV_APPLY_INFO_NOT_FOUND.getMessage()); + } + + @Test + void 좋아요한_대학_지원_정보인지_확인한다() { + // given + saveLikedUnivApplyInfo(user, 괌대학_A_지원_정보); + + // when + IsLikeResponse response = likedUnivApplyInfoService.isUnivApplyInfoLiked(user.getId(), 괌대학_A_지원_정보.getId()); + + // then + assertThat(response.isLike()).isTrue(); + } + + @Test + void 좋아요하지_않은_대학_지원_정보인지_확인한다() { + // when + IsLikeResponse response = likedUnivApplyInfoService.isUnivApplyInfoLiked(user.getId(), 괌대학_A_지원_정보.getId()); + + // then + assertThat(response.isLike()).isFalse(); + } + + @Test + void 존재하지_않는_대학_지원_정보의_좋아요_여부를_조회하면_예외가_발생한다() { + // given + Long invalidUnivApplyInfoId = 9999L; + + // when & then + assertThatCode(() -> likedUnivApplyInfoService.isUnivApplyInfoLiked(user.getId(), invalidUnivApplyInfoId)) + .isInstanceOf(CustomException.class) + .hasMessage(UNIV_APPLY_INFO_NOT_FOUND.getMessage()); + } + + private void saveLikedUnivApplyInfo(SiteUser siteUser, UnivApplyInfo univApplyInfo) { + LikedUnivApplyInfo likedUnivApplyInfo = LikedUnivApplyInfo.builder() + .siteUserId(siteUser.getId()) + .univApplyInfoId(univApplyInfo.getId()) + .build(); + likedUnivApplyInfoRepository.save(likedUnivApplyInfo); + } + @Nested class 대학_지원_정보_좋아요를_등록한다 { @@ -122,55 +173,4 @@ class 대학_지원_정보_좋아요를_취소한다 { .hasMessage(NOT_LIKED_UNIV_APPLY_INFO.getMessage()); } } - - @Test - void 존재하지_않는_지원_정보에_좋아요_시도하면_예외가_발생한다() { - // given - Long invalidUnivApplyInfoId = 9999L; - - // when & then - assertThatCode(() -> likedUnivApplyInfoService.addUnivApplyInfoLike(user.getId(), invalidUnivApplyInfoId)) - .isInstanceOf(CustomException.class) - .hasMessage(UNIV_APPLY_INFO_NOT_FOUND.getMessage()); - } - - @Test - void 좋아요한_대학_지원_정보인지_확인한다() { - // given - saveLikedUnivApplyInfo(user, 괌대학_A_지원_정보); - - // when - IsLikeResponse response = likedUnivApplyInfoService.isUnivApplyInfoLiked(user.getId(), 괌대학_A_지원_정보.getId()); - - // then - assertThat(response.isLike()).isTrue(); - } - - @Test - void 좋아요하지_않은_대학_지원_정보인지_확인한다() { - // when - IsLikeResponse response = likedUnivApplyInfoService.isUnivApplyInfoLiked(user.getId(), 괌대학_A_지원_정보.getId()); - - // then - assertThat(response.isLike()).isFalse(); - } - - @Test - void 존재하지_않는_대학_지원_정보의_좋아요_여부를_조회하면_예외가_발생한다() { - // given - Long invalidUnivApplyInfoId = 9999L; - - // when & then - assertThatCode(() -> likedUnivApplyInfoService.isUnivApplyInfoLiked(user.getId(), invalidUnivApplyInfoId)) - .isInstanceOf(CustomException.class) - .hasMessage(UNIV_APPLY_INFO_NOT_FOUND.getMessage()); - } - - private void saveLikedUnivApplyInfo(SiteUser siteUser, UnivApplyInfo univApplyInfo) { - LikedUnivApplyInfo likedUnivApplyInfo = LikedUnivApplyInfo.builder() - .siteUserId(siteUser.getId()) - .univApplyInfoId(univApplyInfo.getId()) - .build(); - likedUnivApplyInfoRepository.save(likedUnivApplyInfo); - } } diff --git a/src/test/java/com/example/solidconnection/university/service/UnivApplyInfoQueryServiceTest.java b/src/test/java/com/example/solidconnection/university/service/UnivApplyInfoQueryServiceTest.java index c0222c8f2..32e59121d 100644 --- a/src/test/java/com/example/solidconnection/university/service/UnivApplyInfoQueryServiceTest.java +++ b/src/test/java/com/example/solidconnection/university/service/UnivApplyInfoQueryServiceTest.java @@ -111,6 +111,53 @@ class 대학_지원_정보_텍스트_검색 { ); } + @Test + void 대학_국가_권역_일치_순서로_정렬하여_응답한다() { + // given + String text = "아"; + UnivApplyInfo 권역_아 = univApplyInfoFixture.메이지대학_지원_정보(term.getId()); + UnivApplyInfo 국가_아 = univApplyInfoFixture.그라츠대학_지원_정보(term.getId()); + UnivApplyInfo 대학지원정보_아 = univApplyInfoFixture.아칸소주립대학_지원_정보(term.getId()); + + // when + UnivApplyInfoPreviewResponses response = univApplyInfoQueryService.searchUnivApplyInfoByText(text); + + // then + assertThat(response.univApplyInfoPreviews()) + .containsExactly( + UnivApplyInfoPreviewResponse.of(대학지원정보_아, term.getName()), + UnivApplyInfoPreviewResponse.of(국가_아, term.getName()), + UnivApplyInfoPreviewResponse.of(권역_아, term.getName()) + ); + } + + // todo: 현재 레디스 관련 에러 발생중으로 임시 주석처리, 추후 원인 분석 후 적용 필요 + // @Test + void 캐시가_적용된다() { + // given + String text = "Guam"; + UnivApplyInfo 괌대학_A_지원_정보 = univApplyInfoFixture.괌대학_A_지원_정보(term.getId()); + + // when + UnivApplyInfoPreviewResponses firstResponse = univApplyInfoQueryService.searchUnivApplyInfoByText(text); + UnivApplyInfoPreviewResponses secondResponse = univApplyInfoQueryService.searchUnivApplyInfoByText(text); + + // then + assertThatCode(() -> { + List firstResponseIds = extractIds(firstResponse); + List secondResponseIds = extractIds(secondResponse); + assertThat(firstResponseIds).isEqualTo(secondResponseIds); + }).doesNotThrowAnyException(); + then(univApplyInfoRepository).should(times(1)).findAllByText(text, term.getId()); + } + + private List extractIds(UnivApplyInfoPreviewResponses responses) { + return responses.univApplyInfoPreviews() + .stream() + .map(UnivApplyInfoPreviewResponse::id) + .toList(); + } + @Nested class 각각의_검색_대상에_대해_검색한다 { @@ -171,52 +218,5 @@ class 각각의_검색_대상에_대해_검색한다 { ); } } - - @Test - void 대학_국가_권역_일치_순서로_정렬하여_응답한다() { - // given - String text = "아"; - UnivApplyInfo 권역_아 = univApplyInfoFixture.메이지대학_지원_정보(term.getId()); - UnivApplyInfo 국가_아 = univApplyInfoFixture.그라츠대학_지원_정보(term.getId()); - UnivApplyInfo 대학지원정보_아 = univApplyInfoFixture.아칸소주립대학_지원_정보(term.getId()); - - // when - UnivApplyInfoPreviewResponses response = univApplyInfoQueryService.searchUnivApplyInfoByText(text); - - // then - assertThat(response.univApplyInfoPreviews()) - .containsExactly( - UnivApplyInfoPreviewResponse.of(대학지원정보_아, term.getName()), - UnivApplyInfoPreviewResponse.of(국가_아, term.getName()), - UnivApplyInfoPreviewResponse.of(권역_아, term.getName()) - ); - } - - // todo: 현재 레디스 관련 에러 발생중으로 임시 주석처리, 추후 원인 분석 후 적용 필요 - // @Test - void 캐시가_적용된다() { - // given - String text = "Guam"; - UnivApplyInfo 괌대학_A_지원_정보 = univApplyInfoFixture.괌대학_A_지원_정보(term.getId()); - - // when - UnivApplyInfoPreviewResponses firstResponse = univApplyInfoQueryService.searchUnivApplyInfoByText(text); - UnivApplyInfoPreviewResponses secondResponse = univApplyInfoQueryService.searchUnivApplyInfoByText(text); - - // then - assertThatCode(() -> { - List firstResponseIds = extractIds(firstResponse); - List secondResponseIds = extractIds(secondResponse); - assertThat(firstResponseIds).isEqualTo(secondResponseIds); - }).doesNotThrowAnyException(); - then(univApplyInfoRepository).should(times(1)).findAllByText(text, term.getId()); - } - - private List extractIds(UnivApplyInfoPreviewResponses responses) { - return responses.univApplyInfoPreviews() - .stream() - .map(UnivApplyInfoPreviewResponse::id) - .toList(); - } } } diff --git a/src/test/resources/application.yml b/src/test/resources/application.yml index 34f19fa77..165e12a53 100644 --- a/src/test/resources/application.yml +++ b/src/test/resources/application.yml @@ -4,7 +4,7 @@ spring: parameterstore: enabled: false -# db + # db data: redis: host: localhost @@ -66,10 +66,10 @@ oauth: redirect-url: "https://localhost:8080/auth/apple" secret-key: MEECAQAwEwYHKoZIzj0CAQYIKoZIzj0DAQcEJzAlAgEBBCAfGIQ3TtNYAZG7i3m72odmdhfymkM9wAFg2rEL2RKUEA== # base64 encoded 된 임의의 값 kakao: - redirect-url: "http://localhost:8080/auth/kakao" - client-id: client-id - token-url: "https://kauth.kakao.com/oauth/token" - user-info-url: "https://kapi.kakao.com/v2/user/me" + redirect-url: "http://localhost:8080/auth/kakao" + client-id: client-id + token-url: "https://kauth.kakao.com/oauth/token" + user-info-url: "https://kapi.kakao.com/v2/user/me" sentry: environment: test dsn: "https://test-public-key@sentry.test-domain.io/123456"