From b1eb2daed76e83ec751cec6b9931c7c44bd0098d Mon Sep 17 00:00:00 2001
From: losecow <100589396+Losecow@users.noreply.github.com>
Date: Tue, 1 Jul 2025 13:21:16 +0900
Subject: [PATCH 001/132] Add files via upload
---
.github/pull_request_template.md | 18 ++++++++++++++++++
1 file changed, 18 insertions(+)
create mode 100644 .github/pull_request_template.md
diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md
new file mode 100644
index 0000000..e74b4a8
--- /dev/null
+++ b/.github/pull_request_template.md
@@ -0,0 +1,18 @@
+## #️⃣연관된 이슈
+
+> ex) #이슈번호, #이슈번호
+
+## 📝작업 내용
+
+> 이번 PR에서 작업한 내용을 간략히 설명해주세요(이미지 첨부 가능)
+
+### 스크린샷 (선택)
+
+
+> 스크린샷 너무 크니까 보기 불편해서 만든 템플릿
+
+## 💬리뷰 요구사항(선택)
+
+> 리뷰어가 특별히 봐주었으면 하는 부분이 있다면 작성해주세요
+>
+> ex) 메서드 XXX의 이름을 더 잘 짓고 싶은데 혹시 좋은 명칭이 있을까요?
From c496b246a7aff9d1e8b820087a0b5186a99c627f Mon Sep 17 00:00:00 2001
From: bendy41
Date: Tue, 1 Jul 2025 18:41:30 +0900
Subject: [PATCH 002/132] connect userinvite
---
.../ccapp/ccgo/controller/AuthController.java | 66 +++++---
.../ccgo/controller/InviteCodeController.java | 14 +-
.../com/ccapp/ccgo/jwt/LoginUserDetails.java | 10 +-
.../com/ccapp/ccgo/jwt/SecurityConfig.java | 154 +++++++++---------
.../ccapp/ccgo/service/InviteCodeService.java | 2 +-
.../java/com/ccapp/ccgo/team/TeamMember.java | 2 +-
src/main/resources/application.properties | 2 +-
7 files changed, 142 insertions(+), 108 deletions(-)
diff --git a/src/main/java/com/ccapp/ccgo/controller/AuthController.java b/src/main/java/com/ccapp/ccgo/controller/AuthController.java
index 9867f2c..965ccb5 100644
--- a/src/main/java/com/ccapp/ccgo/controller/AuthController.java
+++ b/src/main/java/com/ccapp/ccgo/controller/AuthController.java
@@ -20,6 +20,7 @@
import org.springframework.security.authentication.BadCredentialsException;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
+import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.web.bind.annotation.*;
import org.springframework.http.HttpHeaders;
@@ -40,8 +41,9 @@ public class AuthController {
private final LoginUserDetailsService loginUserDetailsService;
private final TeamRepository teamRepository;
+ //@authenticatedPrincipal UserDetails authenticatedPrincipal
@PostMapping("/login")
- public ResponseEntity> login(@Valid @RequestBody LoginRequestDto requestDto) {
+ public ResponseEntity> login(@Valid @RequestBody LoginRequestDto requestDto ) {
log.info("로그인 요청 받음: {}", requestDto.getEmail());
log.info("로그인 요청 받음: {}", requestDto.getPassword());
@@ -61,41 +63,55 @@ public ResponseEntity> login(@Valid @RequestBody LoginRequestDto requestDto) {
// ✅ 팀이 없으면 팀 생성 + 팀장 등록
Optional existingTeamMember = teamMemberRepository.findByUserAndIsActiveTrue(user);
- if (existingTeamMember.isEmpty() && user.getRole().equals("TeamLeader")) {
-
- // 1. 새 팀 생성
- Team team = new Team();
- team.setTeamName(user.getName() + "의 팀"); // 원하는 네이밍 규칙 사용
- team.setCreatedAt(LocalDateTime.now());
- team.setCreatedBy(user.getId());
- teamRepository.save(team);
-
- // 2. 팀장 본인을 팀원으로 등록
- TeamMember teamMember = new TeamMember();
- teamMember.setUser(user);
- teamMember.setTeam(team);
- teamMember.setRole("TeamLeader"); // 또는 enum 등
- teamMember.setActive(true);
- teamMember.setJoinedAt(LocalDateTime.now());
- teamMemberRepository.save(teamMember);
-
- log.info("🆕 새 팀 생성 및 팀장 등록 완료");
+
+ if (existingTeamMember.isEmpty()) {
+ if (user.getRole().equals("TeamLeader")) {
+ // 팀 생성 및 팀장 등록
+ Team team = new Team();
+ team.setTeamName(user.getName() + "의 팀");
+ team.setCreatedAt(LocalDateTime.now());
+ team.setCreatedBy(user.getId());
+ teamRepository.save(team);
+
+ TeamMember teamMember = new TeamMember();
+ teamMember.setUser(user);
+ teamMember.setTeam(team);
+ teamMember.setRole("TeamLeader");
+ teamMember.setActive(true);
+ teamMember.setJoinedAt(LocalDateTime.now());
+ teamMemberRepository.save(teamMember);
+
+ log.info("🆕 새 팀 생성 및 팀장 등록 완료");
+ } else if (user.getRole().equals("TeamMember")) {
+ // 팀원 등록 (팀 없음)
+ TeamMember teamMember = new TeamMember();
+ teamMember.setUser(user);
+ teamMember.setTeam(null); // 나중에 초대코드로 팀이 지정될 예정
+ teamMember.setRole("TeamMember");
+ teamMember.setActive(true);
+ teamMember.setJoinedAt(LocalDateTime.now());
+ teamMemberRepository.save(teamMember);
+
+ log.info("🆕 팀원 등록 완료 (팀 없음)");
+ }
}
// ✅ 다시 조회 (혹은 Optional.get으로 바로 사용 가능)
TeamMember teamMember = teamMemberRepository.findByUserAndIsActiveTrue(user)
- .orElseThrow(() -> new RuntimeException("소속된 팀이 없습니다."));
+ .orElseThrow(() -> new RuntimeException("TeamMember 레코드가 없습니다."));
HttpHeaders headers = createTokenCookies(accessToken, refreshToken);
+ Team team = teamMember.getTeam();
+
LoginResponseDto response = LoginResponseDto.builder()
.userId(user.getId())
.email(user.getEmail())
.name(user.getName())
- .teamId(teamMember.getTeam().getTeamId())
- .teamName(teamMember.getTeam().getTeamName())
+ .teamId(team != null ? team.getTeamId() : null)
+ .teamName(team != null ? team.getTeamName() : null)
.role(teamMember.getRole())
- .accessToken(accessToken) // 추가
+ .accessToken(accessToken)
.refreshToken(refreshToken)
.build();
@@ -104,7 +120,7 @@ public ResponseEntity> login(@Valid @RequestBody LoginRequestDto requestDto) {
.body(response);
} catch (BadCredentialsException e) {
- log.error("❌ 로그인 실패: 자격 증명 오류", e);
+
return ResponseEntity.status(401).body(Map.of("message", "이메일 또는 비밀번호가 잘못되었습니다."));
} catch (RuntimeException e) {
log.error("❌ 로그인 중 런타임 예외", e);
diff --git a/src/main/java/com/ccapp/ccgo/controller/InviteCodeController.java b/src/main/java/com/ccapp/ccgo/controller/InviteCodeController.java
index 51d3ece..aeb1abd 100644
--- a/src/main/java/com/ccapp/ccgo/controller/InviteCodeController.java
+++ b/src/main/java/com/ccapp/ccgo/controller/InviteCodeController.java
@@ -22,17 +22,27 @@ public class InviteCodeController {
@PostMapping("/create")
public ResponseEntity createInviteCode(
@AuthenticationPrincipal LoginUserDetails userDetails) {
+ System.out.println("초대코드 생성 요청 들어옴");
+ System.out.println("userDetails: " + userDetails);
+
+ if (userDetails != null) {
+ System.out.println("인증된 사용자 이메일: " + userDetails.getUsername());
+ System.out.println("사용자 권한: " + userDetails.getAuthorities());
+ } else {
+ System.out.println("userDetails가 null입니다. 인증 정보 없음.");
+ }
User user = userDetails.getUser();
+ System.out.print("코드 만듭니당");
// 초대코드 생성 서비스 호출
InviteCode inviteCode = inviteCodeService.createInviteCode(user);
-
+ System.out.print("만들었어용");
InviteCodeCreateResponseDto responseDto = InviteCodeCreateResponseDto.builder()
.code(inviteCode.getCode())
.expiresAt(inviteCode.getExpiresAt())
.build();
-
+ System.out.print("무슨 dto생성해용");
return ResponseEntity.ok(responseDto);
}
}
diff --git a/src/main/java/com/ccapp/ccgo/jwt/LoginUserDetails.java b/src/main/java/com/ccapp/ccgo/jwt/LoginUserDetails.java
index 5e7cedf..3737ec4 100644
--- a/src/main/java/com/ccapp/ccgo/jwt/LoginUserDetails.java
+++ b/src/main/java/com/ccapp/ccgo/jwt/LoginUserDetails.java
@@ -4,9 +4,12 @@
import lombok.Getter;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.security.core.authority.SimpleGrantedAuthority;
+
import java.util.Collection;
import java.util.Collections;
+import java.util.List;
@Getter
public class LoginUserDetails implements UserDetails {
@@ -20,7 +23,11 @@ public LoginUserDetails(User user) {
// ✅ 기본 권한 비워둠 (나중에 ROLE_ 추가 가능)
@Override
public Collection extends GrantedAuthority> getAuthorities() {
- return Collections.emptyList();
+ if (user.getRole() == null || user.getRole().isEmpty()) {
+ return Collections.emptyList();
+ }
+ // "TeamLeader" -> "ROLE_TeamLeader"
+ return List.of(new SimpleGrantedAuthority(user.getRole()));
}
// ✅ 로그인 시 사용할 비밀번호
@@ -40,4 +47,5 @@ public String getUsername() {
@Override public boolean isAccountNonLocked() { return true; }
@Override public boolean isCredentialsNonExpired() { return true; }
@Override public boolean isEnabled() { return true; }
+
}
diff --git a/src/main/java/com/ccapp/ccgo/jwt/SecurityConfig.java b/src/main/java/com/ccapp/ccgo/jwt/SecurityConfig.java
index 313c30a..69b6ff5 100644
--- a/src/main/java/com/ccapp/ccgo/jwt/SecurityConfig.java
+++ b/src/main/java/com/ccapp/ccgo/jwt/SecurityConfig.java
@@ -1,77 +1,77 @@
-//package com.ccapp.ccgo.jwt;
-//
-//import lombok.RequiredArgsConstructor;
-//import org.springframework.context.annotation.Bean;
-//import org.springframework.context.annotation.Configuration;
-//import org.springframework.security.authentication.AuthenticationManager;
-//import org.springframework.security.authentication.AuthenticationProvider;
-//import org.springframework.security.authentication.dao.DaoAuthenticationProvider;
-//import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration;
-//import org.springframework.security.config.annotation.web.builders.HttpSecurity;
-//import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
-//import org.springframework.security.config.http.SessionCreationPolicy;
-//import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
-//import org.springframework.security.web.SecurityFilterChain;
-//import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
-//import org.springframework.web.cors.CorsConfiguration;
-//import org.springframework.web.cors.CorsConfigurationSource;
-//import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
-//import java.util.List;
-//
-//@Configuration
-//@RequiredArgsConstructor
-//public class SecurityConfig {
-//
-// private final JwtAuthenticationFilter jwtAuthenticationFilter;
-// private final LoginUserDetailsService loginUserDetailsService;
-//
-// // 🔐 비밀번호 인코더 등록
-// @Bean
-// public BCryptPasswordEncoder passwordEncoder() {
-// return new BCryptPasswordEncoder();
-// }
-//
-// // 🔐 로그인 시 사용할 인증 제공자 (UserDetailsService + PasswordEncoder)
-// @Bean
-// public AuthenticationProvider authenticationProvider() {
-// DaoAuthenticationProvider provider = new DaoAuthenticationProvider();
-// provider.setUserDetailsService(loginUserDetailsService);
-// provider.setPasswordEncoder(passwordEncoder());
-// return provider;
-// }
-//
-// // 🔐 인증 매니저 (로그인 인증 처리 시 필요)
-// @Bean
-// public AuthenticationManager authenticationManager(AuthenticationConfiguration config) throws Exception {
-// return config.getAuthenticationManager();
-// }
-//
-// // 🔐 필터 체인 설정
-// @Bean
-// public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
-// return http
-// .cors(cors -> cors.configurationSource(corsConfigurationSource()))
-// .csrf(AbstractHttpConfigurer::disable)
-// .sessionManagement(sm -> sm.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
-// .authorizeHttpRequests(auth -> auth
-// .requestMatchers("/api/auth/login", "/register").permitAll() // 로그인, 회원가입 허용
-// .anyRequest().authenticated() // 그 외는 인증 필요
-// )
-// .authenticationProvider(authenticationProvider())
-// .addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class)
-// .build();
-// }
-// //cors
-// @Bean
-// public CorsConfigurationSource corsConfigurationSource() {
-// CorsConfiguration config = new CorsConfiguration();
-// config.setAllowedOriginPatterns(List.of("*")); // 변경된 부분
-// config.setAllowedMethods(List.of("GET", "POST", "PUT", "DELETE", "OPTIONS"));
-// config.setAllowedHeaders(List.of("*"));
-// config.setAllowCredentials(true);
-//
-// UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
-// source.registerCorsConfiguration("/**", config);
-// return source;
-// }
-//}
+package com.ccapp.ccgo.jwt;
+
+import lombok.RequiredArgsConstructor;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.authentication.AuthenticationManager;
+import org.springframework.security.authentication.AuthenticationProvider;
+import org.springframework.security.authentication.dao.DaoAuthenticationProvider;
+import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
+import org.springframework.security.config.http.SessionCreationPolicy;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
+import org.springframework.security.web.SecurityFilterChain;
+import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
+import org.springframework.web.cors.CorsConfiguration;
+import org.springframework.web.cors.CorsConfigurationSource;
+import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
+import java.util.List;
+
+@Configuration
+@RequiredArgsConstructor
+public class SecurityConfig {
+
+ private final JwtAuthenticationFilter jwtAuthenticationFilter;
+ private final LoginUserDetailsService loginUserDetailsService;
+
+ // 🔐 비밀번호 인코더 등록
+ @Bean
+ public BCryptPasswordEncoder passwordEncoder() {
+ return new BCryptPasswordEncoder();
+ }
+
+ // 🔐 로그인 시 사용할 인증 제공자 (UserDetailsService + PasswordEncoder)
+ @Bean
+ public AuthenticationProvider authenticationProvider() {
+ DaoAuthenticationProvider provider = new DaoAuthenticationProvider();
+ provider.setUserDetailsService(loginUserDetailsService);
+ provider.setPasswordEncoder(passwordEncoder());
+ return provider;
+ }
+
+ // 🔐 인증 매니저 (로그인 인증 처리 시 필요)
+ @Bean
+ public AuthenticationManager authenticationManager(AuthenticationConfiguration config) throws Exception {
+ return config.getAuthenticationManager();
+ }
+
+ // 🔐 필터 체인 설정
+ @Bean
+ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
+ return http
+ .cors(cors -> cors.configurationSource(corsConfigurationSource()))
+ .csrf(AbstractHttpConfigurer::disable)
+ .sessionManagement(sm -> sm.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
+ .authorizeHttpRequests(auth -> auth
+ .requestMatchers("/api/auth/login", "/register").permitAll() // 로그인, 회원가입 허용
+ .anyRequest().authenticated() // 그 외는 인증 필요
+ )
+ .authenticationProvider(authenticationProvider())
+ .addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class)
+ .build();
+ }
+ //cors
+ @Bean
+ public CorsConfigurationSource corsConfigurationSource() {
+ CorsConfiguration config = new CorsConfiguration();
+ config.setAllowedOriginPatterns(List.of("*")); // 변경된 부분
+ config.setAllowedMethods(List.of("GET", "POST", "PUT", "DELETE", "OPTIONS"));
+ config.setAllowedHeaders(List.of("*"));
+ config.setAllowCredentials(true);
+
+ UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
+ source.registerCorsConfiguration("/**", config);
+ return source;
+ }
+}
diff --git a/src/main/java/com/ccapp/ccgo/service/InviteCodeService.java b/src/main/java/com/ccapp/ccgo/service/InviteCodeService.java
index acc94e9..937ca70 100644
--- a/src/main/java/com/ccapp/ccgo/service/InviteCodeService.java
+++ b/src/main/java/com/ccapp/ccgo/service/InviteCodeService.java
@@ -68,7 +68,7 @@ public void joinTeamByInviteCode(User user, String inviteCode) {
public InviteCode createInviteCode(User user) {
var teamMember = teamMemberRepository.findByUserAndIsActiveTrue(user)
.orElseThrow(() -> new CustomException("팀 소속이 아닙니다.", HttpStatus.BAD_REQUEST));
- if (!"TEAM_LEADER".equals(teamMember.getRole())) {
+ if (!"TeamLeader".equals(teamMember.getRole())) {
throw new CustomException("팀장만 초대코드를 생성할 수 있습니다.", HttpStatus.FORBIDDEN);
}
diff --git a/src/main/java/com/ccapp/ccgo/team/TeamMember.java b/src/main/java/com/ccapp/ccgo/team/TeamMember.java
index 9d0e65d..a9c2948 100644
--- a/src/main/java/com/ccapp/ccgo/team/TeamMember.java
+++ b/src/main/java/com/ccapp/ccgo/team/TeamMember.java
@@ -34,7 +34,7 @@ public class TeamMember {
// FK - 팀 ID
@ManyToOne(fetch = FetchType.LAZY)
- @JoinColumn(name = "team_id", nullable = false)
+ @JoinColumn(name = "team_id")
private Team team;
// FK - 유저 ID
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index e3dc7df..61bed74 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -4,7 +4,7 @@ server.address=0.0.0.0
server.port=8080
spring.datasource.username = root
-spring.datasource.password = qkrwlsdn
+spring.datasource.password = 06250730cc
jwt.secret=????????????????????1234!@11111123451234432AVDSFUCKYOUSHITHOLY
jwt.access-token-expiration=86400000
From 90bbe465f56aabcdb1a16c6d5928ea70c0e6f7b5 Mon Sep 17 00:00:00 2001
From: bendy41
Date: Thu, 3 Jul 2025 15:22:49 +0900
Subject: [PATCH 003/132] Seperate Role
---
src/main/java/com/ccapp/ccgo/common/Role.java | 6 ++++++
.../com/ccapp/ccgo/config/SchedulingConfig.java | 9 +++++++++
.../com/ccapp/ccgo/controller/AuthController.java | 11 ++++++-----
.../ccgo/controller/InviteCodeController.java | 2 ++
.../java/com/ccapp/ccgo/dto/LoginResponseDto.java | 2 ++
src/main/java/com/ccapp/ccgo/dto/UserMapper.java | 2 +-
.../java/com/ccapp/ccgo/dto/UserRequestDto.java | 3 ++-
.../java/com/ccapp/ccgo/jwt/LoginUserDetails.java | 6 +++---
.../ccgo/repository/InviteCodeRepository.java | 5 +++++
.../com/ccapp/ccgo/service/InviteCodeService.java | 15 ++++++++++++---
src/main/java/com/ccapp/ccgo/team/TeamMember.java | 4 +++-
src/main/java/com/ccapp/ccgo/user/User.java | 14 ++++++++++----
12 files changed, 61 insertions(+), 18 deletions(-)
create mode 100644 src/main/java/com/ccapp/ccgo/common/Role.java
create mode 100644 src/main/java/com/ccapp/ccgo/config/SchedulingConfig.java
diff --git a/src/main/java/com/ccapp/ccgo/common/Role.java b/src/main/java/com/ccapp/ccgo/common/Role.java
new file mode 100644
index 0000000..01e4d85
--- /dev/null
+++ b/src/main/java/com/ccapp/ccgo/common/Role.java
@@ -0,0 +1,6 @@
+package com.ccapp.ccgo.common;
+
+public enum Role {
+ LEADER,
+ MEMBER
+}
\ No newline at end of file
diff --git a/src/main/java/com/ccapp/ccgo/config/SchedulingConfig.java b/src/main/java/com/ccapp/ccgo/config/SchedulingConfig.java
new file mode 100644
index 0000000..a39d8d7
--- /dev/null
+++ b/src/main/java/com/ccapp/ccgo/config/SchedulingConfig.java
@@ -0,0 +1,9 @@
+package com.ccapp.ccgo.config;
+
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.annotation.EnableScheduling;
+
+@Configuration
+@EnableScheduling // 💡 스케줄링 활성화!
+public class SchedulingConfig {
+}
diff --git a/src/main/java/com/ccapp/ccgo/controller/AuthController.java b/src/main/java/com/ccapp/ccgo/controller/AuthController.java
index 965ccb5..51d93f7 100644
--- a/src/main/java/com/ccapp/ccgo/controller/AuthController.java
+++ b/src/main/java/com/ccapp/ccgo/controller/AuthController.java
@@ -1,5 +1,6 @@
package com.ccapp.ccgo.controller;
+import com.ccapp.ccgo.common.Role;
import com.ccapp.ccgo.dto.TokenResponseDto;
import com.ccapp.ccgo.jwt.LoginUserDetailsService;
import com.ccapp.ccgo.repository.TeamMemberRepository;
@@ -65,7 +66,7 @@ public ResponseEntity> login(@Valid @RequestBody LoginRequestDto requestDto )
Optional existingTeamMember = teamMemberRepository.findByUserAndIsActiveTrue(user);
if (existingTeamMember.isEmpty()) {
- if (user.getRole().equals("TeamLeader")) {
+ if (user.getRole().equals(Role.LEADER)) {
// 팀 생성 및 팀장 등록
Team team = new Team();
team.setTeamName(user.getName() + "의 팀");
@@ -76,18 +77,18 @@ public ResponseEntity> login(@Valid @RequestBody LoginRequestDto requestDto )
TeamMember teamMember = new TeamMember();
teamMember.setUser(user);
teamMember.setTeam(team);
- teamMember.setRole("TeamLeader");
+ teamMember.setRole(Role.LEADER);
teamMember.setActive(true);
teamMember.setJoinedAt(LocalDateTime.now());
teamMemberRepository.save(teamMember);
log.info("🆕 새 팀 생성 및 팀장 등록 완료");
- } else if (user.getRole().equals("TeamMember")) {
+ } else if (user.getRole().equals(Role.MEMBER)) {
// 팀원 등록 (팀 없음)
TeamMember teamMember = new TeamMember();
teamMember.setUser(user);
teamMember.setTeam(null); // 나중에 초대코드로 팀이 지정될 예정
- teamMember.setRole("TeamMember");
+ teamMember.setRole(Role.MEMBER);
teamMember.setActive(true);
teamMember.setJoinedAt(LocalDateTime.now());
teamMemberRepository.save(teamMember);
@@ -110,7 +111,7 @@ public ResponseEntity> login(@Valid @RequestBody LoginRequestDto requestDto )
.name(user.getName())
.teamId(team != null ? team.getTeamId() : null)
.teamName(team != null ? team.getTeamName() : null)
- .role(teamMember.getRole())
+ .role(teamMember.getRole().name())
.accessToken(accessToken)
.refreshToken(refreshToken)
.build();
diff --git a/src/main/java/com/ccapp/ccgo/controller/InviteCodeController.java b/src/main/java/com/ccapp/ccgo/controller/InviteCodeController.java
index aeb1abd..8006cd8 100644
--- a/src/main/java/com/ccapp/ccgo/controller/InviteCodeController.java
+++ b/src/main/java/com/ccapp/ccgo/controller/InviteCodeController.java
@@ -35,6 +35,8 @@ public ResponseEntity createInviteCode(
User user = userDetails.getUser();
System.out.print("코드 만듭니당");
+ System.out.println("ROLE: " + user.getRole());
+
// 초대코드 생성 서비스 호출
InviteCode inviteCode = inviteCodeService.createInviteCode(user);
System.out.print("만들었어용");
diff --git a/src/main/java/com/ccapp/ccgo/dto/LoginResponseDto.java b/src/main/java/com/ccapp/ccgo/dto/LoginResponseDto.java
index 7eafe6b..65c6aa9 100644
--- a/src/main/java/com/ccapp/ccgo/dto/LoginResponseDto.java
+++ b/src/main/java/com/ccapp/ccgo/dto/LoginResponseDto.java
@@ -17,4 +17,6 @@ public class LoginResponseDto {
//이 정보가 필요할지는 고민해봐야한다.
private Long teamId;
private String teamName;
+
+ private boolean isInterestCompleted; // 기본값 false
}
diff --git a/src/main/java/com/ccapp/ccgo/dto/UserMapper.java b/src/main/java/com/ccapp/ccgo/dto/UserMapper.java
index b76cfd6..b31aa16 100644
--- a/src/main/java/com/ccapp/ccgo/dto/UserMapper.java
+++ b/src/main/java/com/ccapp/ccgo/dto/UserMapper.java
@@ -29,7 +29,7 @@ public static UserResponseDto toDto(User user) {
.gender(user.getGender())
.birthdate(user.getBirthdate())
.createdAt(user.getCreatedAt())
- .role(user.getRole())
+ .role(user.getRole().name())
.build();
}
}
diff --git a/src/main/java/com/ccapp/ccgo/dto/UserRequestDto.java b/src/main/java/com/ccapp/ccgo/dto/UserRequestDto.java
index 8daccab..c85bda4 100644
--- a/src/main/java/com/ccapp/ccgo/dto/UserRequestDto.java
+++ b/src/main/java/com/ccapp/ccgo/dto/UserRequestDto.java
@@ -1,5 +1,6 @@
package com.ccapp.ccgo.dto;
+import com.ccapp.ccgo.common.Role;
import lombok.Getter;
import java.time.LocalDate;
import jakarta.validation.constraints.*;
@@ -16,5 +17,5 @@ public class UserRequestDto {
private String name;
private String gender;
private LocalDate birthdate;
- private String role;
+ private Role role;
}
diff --git a/src/main/java/com/ccapp/ccgo/jwt/LoginUserDetails.java b/src/main/java/com/ccapp/ccgo/jwt/LoginUserDetails.java
index 3737ec4..b384fdf 100644
--- a/src/main/java/com/ccapp/ccgo/jwt/LoginUserDetails.java
+++ b/src/main/java/com/ccapp/ccgo/jwt/LoginUserDetails.java
@@ -23,11 +23,11 @@ public LoginUserDetails(User user) {
// ✅ 기본 권한 비워둠 (나중에 ROLE_ 추가 가능)
@Override
public Collection extends GrantedAuthority> getAuthorities() {
- if (user.getRole() == null || user.getRole().isEmpty()) {
+ if (user.getRole() == null) {
return Collections.emptyList();
}
- // "TeamLeader" -> "ROLE_TeamLeader"
- return List.of(new SimpleGrantedAuthority(user.getRole()));
+ String roleName = user.getRole().name(); // enum 이름 기반 권한
+ return List.of(new SimpleGrantedAuthority(roleName));
}
// ✅ 로그인 시 사용할 비밀번호
diff --git a/src/main/java/com/ccapp/ccgo/repository/InviteCodeRepository.java b/src/main/java/com/ccapp/ccgo/repository/InviteCodeRepository.java
index f98c9d4..96d3f33 100644
--- a/src/main/java/com/ccapp/ccgo/repository/InviteCodeRepository.java
+++ b/src/main/java/com/ccapp/ccgo/repository/InviteCodeRepository.java
@@ -1,6 +1,7 @@
package com.ccapp.ccgo.repository;
import com.ccapp.ccgo.team.InviteCode;
+import com.ccapp.ccgo.team.Team;
import org.springframework.data.jpa.repository.JpaRepository;
import java.time.LocalDateTime;
@@ -22,4 +23,8 @@ public interface InviteCodeRepository extends JpaRepository
// 만료 코드 삭제
void deleteByExpiresAtBefore(LocalDateTime now);
+
+ // 특정 팀의 기존 초대코드 삭제
+ void deleteByTeam(Team team);
+
}
diff --git a/src/main/java/com/ccapp/ccgo/service/InviteCodeService.java b/src/main/java/com/ccapp/ccgo/service/InviteCodeService.java
index 937ca70..2b0b1bd 100644
--- a/src/main/java/com/ccapp/ccgo/service/InviteCodeService.java
+++ b/src/main/java/com/ccapp/ccgo/service/InviteCodeService.java
@@ -1,11 +1,13 @@
package com.ccapp.ccgo.service;
+import com.ccapp.ccgo.common.Role;
import com.ccapp.ccgo.exception.CustomException;
import com.ccapp.ccgo.repository.InviteCodeRepository;
import com.ccapp.ccgo.repository.TeamMemberRepository;
import com.ccapp.ccgo.team.InviteCode;
import com.ccapp.ccgo.team.Team;
import com.ccapp.ccgo.team.TeamMember;
+import org.springframework.scheduling.annotation.Scheduled;
import com.ccapp.ccgo.user.User;
import org.springframework.http.HttpStatus;
import org.springframework.transaction.annotation.Transactional;
@@ -55,7 +57,7 @@ public void joinTeamByInviteCode(User user, String inviteCode) {
TeamMember newMember = TeamMember.builder()
.user(user)
.team(code.getTeam())
- .role("TEAM_MEMBER")
+ .role(Role.MEMBER)
.isActive(true)
.joinedAt(LocalDateTime.now())
.build();
@@ -68,11 +70,13 @@ public void joinTeamByInviteCode(User user, String inviteCode) {
public InviteCode createInviteCode(User user) {
var teamMember = teamMemberRepository.findByUserAndIsActiveTrue(user)
.orElseThrow(() -> new CustomException("팀 소속이 아닙니다.", HttpStatus.BAD_REQUEST));
- if (!"TeamLeader".equals(teamMember.getRole())) {
+ if (teamMember.getRole() != Role.LEADER) {
throw new CustomException("팀장만 초대코드를 생성할 수 있습니다.", HttpStatus.FORBIDDEN);
}
Team team = teamMember.getTeam();
+ //기존 코드 삭제
+ inviteCodeRepository.deleteByTeam(team);
String code;
do {
@@ -87,5 +91,10 @@ public InviteCode createInviteCode(User user) {
return inviteCodeRepository.save(inviteCode);
}
- //
+ //현재 시각보다 이전인 초대코드를 삭제
+ @Scheduled(fixedRate = 60 * 60 * 1000) // 1시간마다 실행 (ms 단위)
+ @Transactional
+ public void deleteExpiredInviteCodes() {
+ inviteCodeRepository.deleteByExpiresAtBefore(LocalDateTime.now());
+ }
}
diff --git a/src/main/java/com/ccapp/ccgo/team/TeamMember.java b/src/main/java/com/ccapp/ccgo/team/TeamMember.java
index a9c2948..3b9ca19 100644
--- a/src/main/java/com/ccapp/ccgo/team/TeamMember.java
+++ b/src/main/java/com/ccapp/ccgo/team/TeamMember.java
@@ -1,5 +1,6 @@
package com.ccapp.ccgo.team;
+import com.ccapp.ccgo.common.Role;
import com.ccapp.ccgo.user.User;
import jakarta.persistence.*;
import lombok.*;
@@ -43,8 +44,9 @@ public class TeamMember {
private User user;
// 팀 내 역할 ("TEAM_LEADER" or "TEAM_MEMBER")
+ @Enumerated(EnumType.STRING)
@Column(nullable = false)
- private String role;
+ private Role role;
// 팀 가입 일시
private LocalDateTime joinedAt;
diff --git a/src/main/java/com/ccapp/ccgo/user/User.java b/src/main/java/com/ccapp/ccgo/user/User.java
index 48cccf0..78c7fc8 100644
--- a/src/main/java/com/ccapp/ccgo/user/User.java
+++ b/src/main/java/com/ccapp/ccgo/user/User.java
@@ -1,9 +1,10 @@
package com.ccapp.ccgo.user;
+import com.ccapp.ccgo.common.Role;
import jakarta.persistence.*;
- import lombok.*;
+import lombok.*;
- import java.time.LocalDate;
+import java.time.LocalDate;
import java.time.LocalDateTime;
/**
@@ -48,15 +49,20 @@ public class User {
@Column(name = "created_at", updatable = false)
private LocalDateTime createdAt;
- //role
+ //팀내 역할 (팀장/팀원)
+ @Enumerated(EnumType.STRING)
@Column(nullable = false)
- private String role;
+ private Role role;
// 회원 가입 시 자동으로 현재 시간 설정
@PrePersist
public void prePersist() {
this.createdAt = LocalDateTime.now();
}
+
+ //관심사 설문조사 완료여부
+ @Column(name = "is_interest_completed", nullable = false)
+ private boolean isInterestCompleted = false;
}
From a23893cbffe024641366187c3ff6d3b7fd1486ee Mon Sep 17 00:00:00 2001
From: bendy41
Date: Thu, 3 Jul 2025 19:02:45 +0900
Subject: [PATCH 004/132] fix teaminvitecode
---
.../ccgo/controller/InviteCodeController.java | 74 +++++++++++++++++++
.../ccgo/dto/InviteCodeJoinRequestDto.java | 5 ++
.../ccgo/dto/InviteCodeJoinResponseDto.java | 11 ++-
.../com/ccapp/ccgo/dto/TeamRequestDto.java | 8 +-
.../com/ccapp/ccgo/dto/TeamResponseDto.java | 7 +-
.../ccgo/repository/TeamMemberRepository.java | 5 ++
.../ccapp/ccgo/service/InviteCodeService.java | 20 +++++
7 files changed, 126 insertions(+), 4 deletions(-)
diff --git a/src/main/java/com/ccapp/ccgo/controller/InviteCodeController.java b/src/main/java/com/ccapp/ccgo/controller/InviteCodeController.java
index 8006cd8..89869e5 100644
--- a/src/main/java/com/ccapp/ccgo/controller/InviteCodeController.java
+++ b/src/main/java/com/ccapp/ccgo/controller/InviteCodeController.java
@@ -1,23 +1,37 @@
package com.ccapp.ccgo.controller;
+import com.ccapp.ccgo.common.Role;
import com.ccapp.ccgo.dto.InviteCodeCreateResponseDto;
+import com.ccapp.ccgo.dto.InviteCodeJoinRequestDto;
+import com.ccapp.ccgo.dto.InviteCodeJoinResponseDto;
+import com.ccapp.ccgo.dto.TeamRequestDto;
+import com.ccapp.ccgo.repository.InviteCodeRepository;
+import com.ccapp.ccgo.repository.TeamMemberRepository;
+import com.ccapp.ccgo.repository.UserRepository;
import com.ccapp.ccgo.service.InviteCodeService;
import com.ccapp.ccgo.team.InviteCode;
+import com.ccapp.ccgo.team.Team;
+import com.ccapp.ccgo.team.TeamMember;
import com.ccapp.ccgo.user.User;
import com.ccapp.ccgo.jwt.LoginUserDetails;
import lombok.RequiredArgsConstructor;
+import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.web.bind.annotation.*;
+import java.time.LocalDateTime;
+
@RestController
@RequestMapping("/api/invitecode")
@RequiredArgsConstructor
public class InviteCodeController {
private final InviteCodeService inviteCodeService;
+ private final InviteCodeRepository inviteCodeRepository;
+ private final TeamMemberRepository teamMemberRepository;
@PostMapping("/create")
public ResponseEntity createInviteCode(
@@ -47,4 +61,64 @@ public ResponseEntity createInviteCode(
System.out.print("무슨 dto생성해용");
return ResponseEntity.ok(responseDto);
}
+
+
+ //시작하기를 누르면 팀 이름을 db에 저장
+ @PostMapping("/teamname")
+ public ResponseEntity saveTeamName(
+ @AuthenticationPrincipal LoginUserDetails userDetails,
+ @RequestBody TeamRequestDto requestDto) {
+ if (userDetails == null) {
+ return ResponseEntity.status(401).build(); // 인증 정보 없으면 401 반환
+ }
+ User user = userDetails.getUser();
+ String teamName = requestDto.getTeamName();
+ // 팀 이름 저장 서비스 호출
+ inviteCodeService.saveTeamName(user, teamName);
+ return ResponseEntity.ok().build();
+ }
+
+ //팀원이 코드를 보냈으면 처리
+ @PostMapping("/join")
+ public ResponseEntity> joinByInviteCode(
+ @RequestBody InviteCodeJoinRequestDto requestDto,
+ @AuthenticationPrincipal LoginUserDetails userDetails) {
+
+ if (userDetails == null) {
+ return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("인증 정보가 없습니다.");
+ }
+
+ String code = requestDto.getInviteCode();
+ User user = userDetails.getUser();
+
+ // 유효한 초대 코드인지 확인
+ InviteCode inviteCode = inviteCodeRepository
+ .findByCodeAndExpiresAtAfter(code, LocalDateTime.now())
+ .orElseThrow(() -> new RuntimeException("초대 코드가 없거나 만료되었습니다."));
+
+ Team team = inviteCode.getTeam();
+ if (team == null) {
+ throw new RuntimeException("초대코드에 연결된 팀이 없습니다.");
+ }
+
+ // 이미 등록된 TeamMember 가져오기
+ TeamMember teamMember = teamMemberRepository.findByUser(user)
+ .orElseThrow(() -> new RuntimeException("TeamMember 정보가 없습니다."));
+
+ // 이미 팀이 설정되어 있다면 중복 가입 방지
+ if (teamMember.getTeam() != null) {
+ return ResponseEntity.badRequest().body("이미 다른 팀에 가입되어 있습니다.");
+ }
+
+ // 팀 할당 및 기타 정보 설정
+ teamMember.setTeam(team);
+ teamMember.setRole(Role.MEMBER); // 팀원으로 설정
+ teamMember.setJoinedAt(LocalDateTime.now());
+ teamMember.setActive(true);
+ teamMemberRepository.save(teamMember); // 업데이트 저장
+
+ return ResponseEntity.ok(new InviteCodeJoinResponseDto(team.getTeamName()));
+ }
+
+
}
diff --git a/src/main/java/com/ccapp/ccgo/dto/InviteCodeJoinRequestDto.java b/src/main/java/com/ccapp/ccgo/dto/InviteCodeJoinRequestDto.java
index 22093a5..1cf527c 100644
--- a/src/main/java/com/ccapp/ccgo/dto/InviteCodeJoinRequestDto.java
+++ b/src/main/java/com/ccapp/ccgo/dto/InviteCodeJoinRequestDto.java
@@ -1,5 +1,10 @@
package com.ccapp.ccgo.dto;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+@Getter
+@NoArgsConstructor
public class InviteCodeJoinRequestDto {
private String inviteCode;
}
diff --git a/src/main/java/com/ccapp/ccgo/dto/InviteCodeJoinResponseDto.java b/src/main/java/com/ccapp/ccgo/dto/InviteCodeJoinResponseDto.java
index 92d8c3a..0c17413 100644
--- a/src/main/java/com/ccapp/ccgo/dto/InviteCodeJoinResponseDto.java
+++ b/src/main/java/com/ccapp/ccgo/dto/InviteCodeJoinResponseDto.java
@@ -1,7 +1,14 @@
package com.ccapp.ccgo.dto;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+@Getter
+@Setter
+@NoArgsConstructor
+@AllArgsConstructor
public class InviteCodeJoinResponseDto {
- private Long teamId;
private String teamName;
- private String role; // TEAM_MEMBER
}
diff --git a/src/main/java/com/ccapp/ccgo/dto/TeamRequestDto.java b/src/main/java/com/ccapp/ccgo/dto/TeamRequestDto.java
index fa58a33..71cc0e9 100644
--- a/src/main/java/com/ccapp/ccgo/dto/TeamRequestDto.java
+++ b/src/main/java/com/ccapp/ccgo/dto/TeamRequestDto.java
@@ -1,6 +1,12 @@
package com.ccapp.ccgo.dto;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.AllArgsConstructor;
+
+@Getter
+@NoArgsConstructor
+@AllArgsConstructor
public class TeamRequestDto {
private String teamName;
}
-
diff --git a/src/main/java/com/ccapp/ccgo/dto/TeamResponseDto.java b/src/main/java/com/ccapp/ccgo/dto/TeamResponseDto.java
index 9d54809..8063ae4 100644
--- a/src/main/java/com/ccapp/ccgo/dto/TeamResponseDto.java
+++ b/src/main/java/com/ccapp/ccgo/dto/TeamResponseDto.java
@@ -1,6 +1,11 @@
package com.ccapp.ccgo.dto;
+import lombok.Getter;
+import lombok.AllArgsConstructor;
+
+@Getter
+@AllArgsConstructor
public class TeamResponseDto {
private Long teamId;
private String teamName;
-}
\ No newline at end of file
+}
diff --git a/src/main/java/com/ccapp/ccgo/repository/TeamMemberRepository.java b/src/main/java/com/ccapp/ccgo/repository/TeamMemberRepository.java
index 4cae0e3..9a8309c 100644
--- a/src/main/java/com/ccapp/ccgo/repository/TeamMemberRepository.java
+++ b/src/main/java/com/ccapp/ccgo/repository/TeamMemberRepository.java
@@ -19,7 +19,12 @@ public interface TeamMemberRepository extends JpaRepository {
// 현재 소속 중인 팀 찾기 (Soft Delete 고려)
Optional findByUserAndIsActiveTrue(User user);
+ //teammember에서 유저 조회
+ Optional findByUser(User user);
// 팀별 멤버 목록
List findAllByTeamAndIsActiveTrue(Team team);
+
+ // 이미 특정 유저가 특정 팀 인지 확인
+ boolean existsByUserAndTeam(User user, Team team);
}
diff --git a/src/main/java/com/ccapp/ccgo/service/InviteCodeService.java b/src/main/java/com/ccapp/ccgo/service/InviteCodeService.java
index 2b0b1bd..25a1e3a 100644
--- a/src/main/java/com/ccapp/ccgo/service/InviteCodeService.java
+++ b/src/main/java/com/ccapp/ccgo/service/InviteCodeService.java
@@ -4,9 +4,11 @@
import com.ccapp.ccgo.exception.CustomException;
import com.ccapp.ccgo.repository.InviteCodeRepository;
import com.ccapp.ccgo.repository.TeamMemberRepository;
+import com.ccapp.ccgo.repository.TeamRepository;
import com.ccapp.ccgo.team.InviteCode;
import com.ccapp.ccgo.team.Team;
import com.ccapp.ccgo.team.TeamMember;
+import lombok.NonNull;
import org.springframework.scheduling.annotation.Scheduled;
import com.ccapp.ccgo.user.User;
import org.springframework.http.HttpStatus;
@@ -23,6 +25,8 @@ public class InviteCodeService {
private final InviteCodeRepository inviteCodeRepository;
private final TeamMemberRepository teamMemberRepository;
+ private final TeamRepository teamRepository; // 팀 저장소 추가
+
private static final String CODE_CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
private static final int CODE_LENGTH = 8;
@@ -97,4 +101,20 @@ public InviteCode createInviteCode(User user) {
public void deleteExpiredInviteCodes() {
inviteCodeRepository.deleteByExpiresAtBefore(LocalDateTime.now());
}
+
+ @Transactional
+ public void saveTeamName(@NonNull User user, @NonNull String teamName) {
+ // 사용자 팀 멤버 조회
+ TeamMember teamMember = teamMemberRepository.findByUserAndIsActiveTrue(user)
+ .orElseThrow(() -> new CustomException("팀 소속이 아닙니다.", HttpStatus.BAD_REQUEST));
+
+ // 팀장만 팀 이름 변경 가능 (원한다면 이 조건 제거 가능)
+ if (teamMember.getRole() != Role.LEADER) {
+ throw new CustomException("팀장만 팀 이름을 변경할 수 있습니다.", HttpStatus.FORBIDDEN);
+ }
+
+ Team team = teamMember.getTeam();
+ team.setTeamName(teamName); // 팀 이름 변경
+ teamRepository.save(team);
+ }
}
From 28013dd49ba05cf1f446a87329c861a8db616257 Mon Sep 17 00:00:00 2001
From: losecow
Date: Fri, 4 Jul 2025 10:24:39 +0900
Subject: [PATCH 005/132] refactoring
---
.gitignore | 2 +-
src/main/java/com/ccapp/ccgo/controller/AuthController.java | 2 ++
src/main/java/com/ccapp/ccgo/service/InviteCodeService.java | 1 +
src/main/java/com/ccapp/ccgo/team/TeamMember.java | 3 +++
src/main/java/com/ccapp/ccgo/user/User.java | 2 +-
src/main/resources/application.properties | 2 +-
6 files changed, 9 insertions(+), 3 deletions(-)
diff --git a/.gitignore b/.gitignore
index 6cd1517..4143e02 100644
--- a/.gitignore
+++ b/.gitignore
@@ -203,6 +203,6 @@ application-*.properties
/bin/
# resources
-/src/main/resources/application.properties
+src/main/resources/application.properties
# End of https://www.toptal.com/developers/gitignore/api/windows,intellij,java,gradle
\ No newline at end of file
diff --git a/src/main/java/com/ccapp/ccgo/controller/AuthController.java b/src/main/java/com/ccapp/ccgo/controller/AuthController.java
index 51d93f7..e1adda8 100644
--- a/src/main/java/com/ccapp/ccgo/controller/AuthController.java
+++ b/src/main/java/com/ccapp/ccgo/controller/AuthController.java
@@ -80,6 +80,7 @@ public ResponseEntity> login(@Valid @RequestBody LoginRequestDto requestDto )
teamMember.setRole(Role.LEADER);
teamMember.setActive(true);
teamMember.setJoinedAt(LocalDateTime.now());
+ teamMember.setUserName(user.getName());
teamMemberRepository.save(teamMember);
log.info("🆕 새 팀 생성 및 팀장 등록 완료");
@@ -91,6 +92,7 @@ public ResponseEntity> login(@Valid @RequestBody LoginRequestDto requestDto )
teamMember.setRole(Role.MEMBER);
teamMember.setActive(true);
teamMember.setJoinedAt(LocalDateTime.now());
+ teamMember.setUserName(user.getName());
teamMemberRepository.save(teamMember);
log.info("🆕 팀원 등록 완료 (팀 없음)");
diff --git a/src/main/java/com/ccapp/ccgo/service/InviteCodeService.java b/src/main/java/com/ccapp/ccgo/service/InviteCodeService.java
index 2b0b1bd..db11918 100644
--- a/src/main/java/com/ccapp/ccgo/service/InviteCodeService.java
+++ b/src/main/java/com/ccapp/ccgo/service/InviteCodeService.java
@@ -60,6 +60,7 @@ public void joinTeamByInviteCode(User user, String inviteCode) {
.role(Role.MEMBER)
.isActive(true)
.joinedAt(LocalDateTime.now())
+ .userName(user.getName())
.build();
teamMemberRepository.save(newMember);
diff --git a/src/main/java/com/ccapp/ccgo/team/TeamMember.java b/src/main/java/com/ccapp/ccgo/team/TeamMember.java
index 3b9ca19..8f30687 100644
--- a/src/main/java/com/ccapp/ccgo/team/TeamMember.java
+++ b/src/main/java/com/ccapp/ccgo/team/TeamMember.java
@@ -43,6 +43,9 @@ public class TeamMember {
@JoinColumn(name = "user_id", nullable = false)
private User user;
+ @Column(name = "user_name", nullable = false)
+ private String userName;
+
// 팀 내 역할 ("TEAM_LEADER" or "TEAM_MEMBER")
@Enumerated(EnumType.STRING)
@Column(nullable = false)
diff --git a/src/main/java/com/ccapp/ccgo/user/User.java b/src/main/java/com/ccapp/ccgo/user/User.java
index 78c7fc8..34c99f6 100644
--- a/src/main/java/com/ccapp/ccgo/user/User.java
+++ b/src/main/java/com/ccapp/ccgo/user/User.java
@@ -61,7 +61,7 @@ public void prePersist() {
}
//관심사 설문조사 완료여부
- @Column(name = "is_interest_completed", nullable = false)
+ @Column(name = "test_completed", nullable = false)
private boolean isInterestCompleted = false;
}
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index 61bed74..e3dc7df 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -4,7 +4,7 @@ server.address=0.0.0.0
server.port=8080
spring.datasource.username = root
-spring.datasource.password = 06250730cc
+spring.datasource.password = qkrwlsdn
jwt.secret=????????????????????1234!@11111123451234432AVDSFUCKYOUSHITHOLY
jwt.access-token-expiration=86400000
From 9d0a34030ddcfa57cc0c8450751d2b1dbedfcf9c Mon Sep 17 00:00:00 2001
From: bendy41
Date: Fri, 4 Jul 2025 13:38:28 +0900
Subject: [PATCH 006/132] teaminvite work!
---
.../java/com/ccapp/ccgo/controller/InviteCodeController.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/main/java/com/ccapp/ccgo/controller/InviteCodeController.java b/src/main/java/com/ccapp/ccgo/controller/InviteCodeController.java
index 89869e5..aa14058 100644
--- a/src/main/java/com/ccapp/ccgo/controller/InviteCodeController.java
+++ b/src/main/java/com/ccapp/ccgo/controller/InviteCodeController.java
@@ -112,7 +112,7 @@ public ResponseEntity> joinByInviteCode(
// 팀 할당 및 기타 정보 설정
teamMember.setTeam(team);
- teamMember.setRole(Role.MEMBER); // 팀원으로 설정
+ teamMember.setRole(user.getRole()); // 유저의 역할로 설정
teamMember.setJoinedAt(LocalDateTime.now());
teamMember.setActive(true);
teamMemberRepository.save(teamMember); // 업데이트 저장
From e8287fbe61a01ac2f22e4b970ca5cb34cce478ec Mon Sep 17 00:00:00 2001
From: losecow
Date: Fri, 4 Jul 2025 14:44:08 +0900
Subject: [PATCH 007/132] ok
---
.idea/sqldialects.xml | 8 +++
build.gradle | 1 +
src/main/resources/MBTIdata.sql | 80 +++++++++++++++++++++++
src/main/resources/MBTIschema.sql | 6 ++
src/main/resources/application.properties | 5 +-
5 files changed, 99 insertions(+), 1 deletion(-)
create mode 100644 .idea/sqldialects.xml
create mode 100644 src/main/resources/MBTIdata.sql
create mode 100644 src/main/resources/MBTIschema.sql
diff --git a/.idea/sqldialects.xml b/.idea/sqldialects.xml
new file mode 100644
index 0000000..d21819a
--- /dev/null
+++ b/.idea/sqldialects.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
index ff67e6e..ff1237a 100644
--- a/build.gradle
+++ b/build.gradle
@@ -37,6 +37,7 @@ dependencies {
runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.11.5'
runtimeOnly 'io.jsonwebtoken:jjwt-jackson:0.11.5'
implementation 'org.springframework.boot:spring-boot-starter-validation'
+ implementation 'com.h2database:h2' // DB 정보 저장용 디펜던시
}
diff --git a/src/main/resources/MBTIdata.sql b/src/main/resources/MBTIdata.sql
new file mode 100644
index 0000000..6c393f5
--- /dev/null
+++ b/src/main/resources/MBTIdata.sql
@@ -0,0 +1,80 @@
+INSERT INTO mbti_score (from_mbti, to_mbti, score) VALUES
+ ('ENTJ','ISFP',16),('ENTJ','INFP',15),('ENTJ','ESFP',14),('ENTJ','ESTP',13),
+ ('ENTJ','ISTP',12),('ENTJ','INTP',11),('ENTJ','ENFP',10),('ENTJ','INFJ',9),
+ ('ENTJ','INTJ',8),('ENTJ','ENFJ',7),('ENTJ','ISTJ',6),('ENTJ','ENTP',5),
+ ('ENTJ','ESTJ',4),('ENTJ','ENTJ',3),('ENTJ','ESFJ',2),('ENTJ','ISFJ',1),
+
+ ('ENTP','ISFJ',16),('ENTP','ISTJ',15),('ENTP','ENTP',14),('ENTP','ESTJ',13),
+ ('ENTP','ESFJ',12),('ENTP','INFJ',11),('ENTP','INTJ',10),('ENTP','INFP',9),
+ ('ENTP','ENFJ',8),('ENTP','INTP',7),('ENTP','ISTP',6),('ENTP','ENFP',5),
+ ('ENTP','ESTP',4),('ENTP','ENTJ',3),('ENTP','ESFP',2),('ENTP','ISFP',1),
+
+ ('INTJ','ESFP',16),('INTJ','ESTP',15),('INTJ','ISFP',14),('INTJ','INFP',13),
+ ('INTJ','INFJ',12),('INTJ','ENFP',11),('INTJ','ENTP',10),('INTJ','ISTP',9),
+ ('INTJ','ENFJ',8),('INTJ','INTJ',7),('INTJ','ISTJ',6),('INTJ','ENTJ',5),
+ ('INTJ','INTP',4),('INTJ','ESTJ',3),('INTJ','ISFJ',2),('INTJ','ESFJ',1),
+
+ ('INTP','ESFJ',16),('INTP','ENFJ',15),('INTP','ISFJ',14),('INTP','INFJ',13),
+ ('INTP','ESTJ',12),('INTP','ISTJ',11),('INTP','ENTJ',10),('INTP','ENFP',9),
+ ('INTP','ENTP',8),('INTP','INTP',7),('INTP','INTJ',6),('INTP','ISTP',5),
+ ('INTP','INFP',4),('INTP','ESTP',3),('INTP','ISFP',2),('INTP','ESFP',1),
+
+ ('ESTJ','INFP',16),('ESTJ','ISFP',15),('ESTJ','INTP',14),('ESTJ','ENTP',13),
+ ('ESTJ','ISTP',12),('ESTJ','ESFP',11),('ESTJ','ENFP',10),('ESTJ','ISTJ',9),
+ ('ESTJ','ISFJ',8),('ESTJ','ESTJ',7),('ESTJ','ESFJ',6),('ESTJ','INTJ',5),
+ ('ESTJ','ENTJ',4),('ESTJ','ESTP',3),('ESTJ','ENFJ',2),('ESTJ','INFJ',1),
+
+ ('ESFJ','INTP',16),('ESFJ','ISTP',15),('ESFJ','ENTP',14),('ESFJ','ENFP',13),
+ ('ESFJ','INFP',12),('ESFJ','ISTJ',11),('ESFJ','ESFJ',10),('ESFJ','ESTP',9),
+ ('ESFJ','ISFP',8),('ESFJ','ENFJ',7),('ESFJ','ISFJ',6),('ESFJ','INFJ',5),
+ ('ESFJ','ESTJ',4),('ESFJ','ESFP',3),('ESFJ','ENTJ',2),('ESFJ','INTJ',1),
+
+ ('ISTJ','ENFP',16),('ISTJ','ENTP',15),('ISTJ','ISFP',14),('ISTJ','INFP',13),
+ ('ISTJ','ESTP',12),('ISTJ','ESFP',11),('ISTJ','INTP',10),('ISTJ','ESTJ',9),
+ ('ISTJ','ESFJ',8),('ISTJ','ISTJ',7),('ISTJ','INTJ',6),('ISTJ','ISFJ',5),
+ ('ISTJ','ISTP',4),('ISTJ','ENTJ',3),('ISTJ','INFJ',2),('ISTJ','ENFJ',1),
+
+ ('ISFJ','ENTP',16),('ISFJ','ENFP',15),('ISFJ','INTP',14),('ISFJ','ISTP',13),
+ ('ISFJ','ESFP',12),('ISFJ','ESTP',11),('ISFJ','ESTJ',10),('ISFJ','INFP',9),
+ ('ISFJ','ESFJ',8),('ISFJ','ISTJ',7),('ISFJ','ISFJ',6),('ISFJ','ENFJ',5),
+ ('ISFJ','INFJ',4),('ISFJ','ISFP',3),('ISFJ','INTJ',2),('ISFJ','ENTJ',1),
+
+ ('ENFJ','ISTP',16),('ENFJ','INTP',15),('ENFJ','ESTP',14),('ENFJ','ESFP',13),
+ ('ENFJ','ENFJ',12),('ENFJ','INFP',11),('ENFJ','ISFP',10),('ENFJ','ENTP',9),
+ ('ENFJ','INTJ',8),('ENFJ','ESFJ',7),('ENFJ','INFJ',6),('ENFJ','ENFP',5),
+ ('ENFJ','ENTJ',4),('ENFJ','ISFJ',3),('ENFJ','ESTJ',2),('ENFJ','ISTJ',1),
+
+ ('ENFP','ISTJ',16),('ENFP','ISFJ',15),('ENFP','ESFJ',14),('ENFP','ESTJ',13),
+ ('ENFP','INFJ',12),('ENFP','INTJ',11),('ENFP','ENTJ',10),('ENFP','ISFP',9),
+ ('ENFP','ENFP',8),('ENFP','INTP',7),('ENFP','INFP',6),('ENFP','ENFJ',5),
+ ('ENFP','ENTP',4),('ENFP','ESFP',3),('ENFP','ESTP',2),('ENFP','ISTP',1),
+
+ ('INFJ','ESTP',16),('INFJ','ESFP',15),('INFJ','ISTP',14),('INFJ','INTP',13),
+ ('INFJ','ENFP',12),('INFJ','ENTP',11),('INFJ','INTJ',10),('INFJ','ENTJ',9),
+ ('INFJ','INFJ',8),('INFJ','ISFP',7),('INFJ','ENFJ',6),('INFJ','ESFJ',5),
+ ('INFJ','ISFJ',4),('INFJ','INFP',3),('INFJ','ISTJ',2),('INFJ','ESTJ',1),
+
+ ('INFP','ESTJ',16),('INFP','ENTJ',15),('INFP','INTJ',14),('INFP','ISTJ',13),
+ ('INFP','ENFJ',12),('INFP','ESFJ',11),('INFP','ENTP',10),('INFP','INFP',9),
+ ('INFP','ISFJ',8),('INFP','INTP',7),('INFP','ESFP',6),('INFP','ENFP',5),
+ ('INFP','ISFP',4),('INFP','INFJ',3),('INFP','ISTP',2),('INFP','ESTP',1),
+
+ ('ESTP','INFJ',16),('ESTP','INTJ',15),('ESTP','ENFJ',14),('ESTP','ENTJ',13),
+ ('ESTP','ISFJ',12),('ESTP','ISTP',11),('ESTP','ISTJ',10),('ESTP','ESFJ',9),
+ ('ESTP','ESTP',8),('ESTP','ISFP',7),('ESTP','ESFP',6),('ESTP','INTP',5),
+ ('ESTP','ENTP',4),('ESTP','ESTJ',3),('ESTP','ENFP',2),('ESTP','INFP',1),
+
+ ('ESFP','INTJ',16),('ESFP','INFJ',15),('ESFP','ENTJ',14),('ESFP','ENFJ',13),
+ ('ESFP','ESTJ',12),('ESFP','ISTJ',11),('ESFP','ISFJ',10),('ESFP','ISFP',9),
+ ('ESFP','ISTP',8),('ESFP','INFP',7),('ESFP','ESFP',6),('ESFP','ESTP',5),
+ ('ESFP','ESFJ',4),('ESFP','ENFP',3),('ESFP','ENTP',2),('ESFP','INTP',1),
+
+ ('ISTP','ENFJ',16),('ISTP','ESFJ',15),('ISTP','INFJ',14),('ISTP','ISFJ',13),
+ ('ISTP','ENTJ',12),('ISTP','ESTJ',11),('ISTP','ESFP',10),('ISTP','ESTP',9),
+ ('ISTP','INTJ',8),('ISTP','ISTP',7),('ISTP','INTP',6),('ISTP','ENTP',5),
+ ('ISTP','ISTJ',4),('ISTP','ISFP',3),('ISTP','INFP',2),('ISTP','ENFP',1),
+
+ ('ISFP','ENTJ',16),('ISFP','ESTJ',15),('ISFP','INTJ',14),('ISFP','ISTJ',13),
+ ('ISFP','ENFJ',12),('ISFP','ESFJ',11),('ISFP','INFJ',10),('ISFP','ESFP',9),
+ ('ISFP','ISFP',8),('ISFP','ESTP',7),('ISFP','ENFP',6),('ISFP','INFP',5),
+ ('ISFP','ISTP',4),('ISFP','ISFJ',3),('ISFP','INTP',2),('ISFP','ENTP',1);
diff --git a/src/main/resources/MBTIschema.sql b/src/main/resources/MBTIschema.sql
new file mode 100644
index 0000000..ac9f504
--- /dev/null
+++ b/src/main/resources/MBTIschema.sql
@@ -0,0 +1,6 @@
+CREATE TABLE IF NOT EXISTS mbti_score (
+ from_mbti VARCHAR(4) NOT NULL,
+ to_mbti VARCHAR(4) NOT NULL,
+ score INT NOT NULL,
+ PRIMARY KEY (from_mbti, to_mbti)
+);
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index e3dc7df..22f7f7e 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -17,4 +17,7 @@ spring.jpa.hibernate.ddl-auto=update
#spring.jpa.show-sql=true
#spring.jpa.properties.hibernate.format_sql=true
-spring.jpa.database-platform=org.hibernate.dialect.MySQL8Dialect
\ No newline at end of file
+spring.jpa.database-platform=org.hibernate.dialect.MySQL8Dialect
+
+#resources ?? ?? sql ? ??
+spring.sql.init.mode=always
\ No newline at end of file
From a0ba1077fc433e0bcfd8c7c5319454cf351a9f8e Mon Sep 17 00:00:00 2001
From: bendy41
Date: Sat, 5 Jul 2025 22:08:44 +0900
Subject: [PATCH 008/132] fix db_structure
---
.../ccapp/ccgo/controller/AuthController.java | 60 +++++------------
.../ccgo/controller/InviteCodeController.java | 66 ++++++++++++++-----
.../com/ccapp/ccgo/dto/LoginResponseDto.java | 18 +++--
.../com/ccapp/ccgo/dto/TeamRequestDto.java | 8 +--
.../java/com/ccapp/ccgo/dto/UserMapper.java | 2 -
.../com/ccapp/ccgo/dto/UserRequestDto.java | 1 -
.../com/ccapp/ccgo/dto/UserResponseDto.java | 1 -
.../com/ccapp/ccgo/jwt/LoginUserDetails.java | 6 +-
.../ccgo/repository/TeamMemberRepository.java | 3 +
.../ccapp/ccgo/repository/TeamRepository.java | 7 +-
.../ccapp/ccgo/service/InviteCodeService.java | 13 ++--
.../com/ccapp/ccgo/service/UserService.java | 1 -
src/main/java/com/ccapp/ccgo/team/Team.java | 12 ++--
.../java/com/ccapp/ccgo/team/TeamMember.java | 7 +-
src/main/java/com/ccapp/ccgo/user/User.java | 8 ---
15 files changed, 107 insertions(+), 106 deletions(-)
diff --git a/src/main/java/com/ccapp/ccgo/controller/AuthController.java b/src/main/java/com/ccapp/ccgo/controller/AuthController.java
index 51d93f7..d08f181 100644
--- a/src/main/java/com/ccapp/ccgo/controller/AuthController.java
+++ b/src/main/java/com/ccapp/ccgo/controller/AuthController.java
@@ -27,6 +27,7 @@
import java.time.LocalDateTime;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
import java.util.Optional;
@@ -54,7 +55,6 @@ public ResponseEntity> login(@Valid @RequestBody LoginRequestDto requestDto )
requestDto.getEmail(), requestDto.getPassword()
)
);
- log.info("✅ 인증 성공: {}", authentication.getName());
String accessToken = jwtProvider.createAccessToken(authentication);
String refreshToken = jwtProvider.createRefreshToken(authentication);
@@ -62,56 +62,27 @@ public ResponseEntity> login(@Valid @RequestBody LoginRequestDto requestDto )
User user = userDetails.getUser();
log.info("🔍 로그인한 사용자: {}", user.getEmail());
- // ✅ 팀이 없으면 팀 생성 + 팀장 등록
- Optional existingTeamMember = teamMemberRepository.findByUserAndIsActiveTrue(user);
-
- if (existingTeamMember.isEmpty()) {
- if (user.getRole().equals(Role.LEADER)) {
- // 팀 생성 및 팀장 등록
- Team team = new Team();
- team.setTeamName(user.getName() + "의 팀");
- team.setCreatedAt(LocalDateTime.now());
- team.setCreatedBy(user.getId());
- teamRepository.save(team);
-
- TeamMember teamMember = new TeamMember();
- teamMember.setUser(user);
- teamMember.setTeam(team);
- teamMember.setRole(Role.LEADER);
- teamMember.setActive(true);
- teamMember.setJoinedAt(LocalDateTime.now());
- teamMemberRepository.save(teamMember);
-
- log.info("🆕 새 팀 생성 및 팀장 등록 완료");
- } else if (user.getRole().equals(Role.MEMBER)) {
- // 팀원 등록 (팀 없음)
- TeamMember teamMember = new TeamMember();
- teamMember.setUser(user);
- teamMember.setTeam(null); // 나중에 초대코드로 팀이 지정될 예정
- teamMember.setRole(Role.MEMBER);
- teamMember.setActive(true);
- teamMember.setJoinedAt(LocalDateTime.now());
- teamMemberRepository.save(teamMember);
-
- log.info("🆕 팀원 등록 완료 (팀 없음)");
- }
- }
-
- // ✅ 다시 조회 (혹은 Optional.get으로 바로 사용 가능)
- TeamMember teamMember = teamMemberRepository.findByUserAndIsActiveTrue(user)
- .orElseThrow(() -> new RuntimeException("TeamMember 레코드가 없습니다."));
+ // 유저가 활성화된 팀멤버 목록 조회
+ List teamMembers = teamMemberRepository.findAllByUserAndIsActiveTrue(user);
- HttpHeaders headers = createTokenCookies(accessToken, refreshToken);
- Team team = teamMember.getTeam();
+ // 팀멤버 정보를 LoginResponseDto.TeamInfo 리스트로 변환
+ List teams = teamMembers.stream()
+ .map(tm -> LoginResponseDto.TeamInfo.builder()
+ .teamId(tm.getTeam().getTeamId())
+ .teamName(tm.getTeam().getTeamName())
+ .role(tm.getRole().name())
+ .isSurveyCompleted(tm.isSurveyCompleted()) // 팀별 설문 완료 여부
+ .build())
+ .toList();
+
+ HttpHeaders headers = createTokenCookies(accessToken, refreshToken);
LoginResponseDto response = LoginResponseDto.builder()
.userId(user.getId())
.email(user.getEmail())
.name(user.getName())
- .teamId(team != null ? team.getTeamId() : null)
- .teamName(team != null ? team.getTeamName() : null)
- .role(teamMember.getRole().name())
+ .teams(teams)
.accessToken(accessToken)
.refreshToken(refreshToken)
.build();
@@ -121,7 +92,6 @@ public ResponseEntity> login(@Valid @RequestBody LoginRequestDto requestDto )
.body(response);
} catch (BadCredentialsException e) {
-
return ResponseEntity.status(401).body(Map.of("message", "이메일 또는 비밀번호가 잘못되었습니다."));
} catch (RuntimeException e) {
log.error("❌ 로그인 중 런타임 예외", e);
diff --git a/src/main/java/com/ccapp/ccgo/controller/InviteCodeController.java b/src/main/java/com/ccapp/ccgo/controller/InviteCodeController.java
index aa14058..33cfe53 100644
--- a/src/main/java/com/ccapp/ccgo/controller/InviteCodeController.java
+++ b/src/main/java/com/ccapp/ccgo/controller/InviteCodeController.java
@@ -5,8 +5,10 @@
import com.ccapp.ccgo.dto.InviteCodeJoinRequestDto;
import com.ccapp.ccgo.dto.InviteCodeJoinResponseDto;
import com.ccapp.ccgo.dto.TeamRequestDto;
+import com.ccapp.ccgo.exception.CustomException;
import com.ccapp.ccgo.repository.InviteCodeRepository;
import com.ccapp.ccgo.repository.TeamMemberRepository;
+import com.ccapp.ccgo.repository.TeamRepository;
import com.ccapp.ccgo.repository.UserRepository;
import com.ccapp.ccgo.service.InviteCodeService;
import com.ccapp.ccgo.team.InviteCode;
@@ -23,6 +25,7 @@
import org.springframework.web.bind.annotation.*;
import java.time.LocalDateTime;
+import java.util.List;
@RestController
@RequestMapping("/api/invitecode")
@@ -32,7 +35,9 @@ public class InviteCodeController {
private final InviteCodeService inviteCodeService;
private final InviteCodeRepository inviteCodeRepository;
private final TeamMemberRepository teamMemberRepository;
+ private final TeamRepository teamRepository;
+ //코드 만드는 부분
@PostMapping("/create")
public ResponseEntity createInviteCode(
@AuthenticationPrincipal LoginUserDetails userDetails) {
@@ -49,10 +54,19 @@ public ResponseEntity createInviteCode(
User user = userDetails.getUser();
System.out.print("코드 만듭니당");
- System.out.println("ROLE: " + user.getRole());
+
+ List teamMembers = teamMemberRepository.findAllByUserAndIsActiveTrue(user);
+
+ TeamMember teamMember = teamMembers.stream()
+ .filter(tm -> tm.getRole() == Role.LEADER)
+ .findFirst()
+ .orElseThrow(() -> new CustomException("팀장만 초대코드를 생성할 수 있습니다.", HttpStatus.FORBIDDEN));
+
+ System.out.println("여까진 됌 ");
// 초대코드 생성 서비스 호출
InviteCode inviteCode = inviteCodeService.createInviteCode(user);
+
System.out.print("만들었어용");
InviteCodeCreateResponseDto responseDto = InviteCodeCreateResponseDto.builder()
.code(inviteCode.getCode())
@@ -63,7 +77,7 @@ public ResponseEntity createInviteCode(
}
- //시작하기를 누르면 팀 이름을 db에 저장
+ //팀 생성하기를 누르면 팀이 만들어집니당
@PostMapping("/teamname")
public ResponseEntity saveTeamName(
@AuthenticationPrincipal LoginUserDetails userDetails,
@@ -73,8 +87,26 @@ public ResponseEntity saveTeamName(
}
User user = userDetails.getUser();
String teamName = requestDto.getTeamName();
- // 팀 이름 저장 서비스 호출
- inviteCodeService.saveTeamName(user, teamName);
+
+ //팀 생성 코드
+ // 팀 엔티티 생성 및 저장
+ Team team = Team.builder()
+ .teamName(teamName)
+ .createdBy(user.getId()) // 팀장 ID
+ .createdAt(LocalDateTime.now())
+ .build();
+ teamRepository.save(team);
+
+ // 팀장도 팀원으로 자동 등록
+ TeamMember teamMember = TeamMember.builder()
+ .team(team)
+ .user(user)
+ .joinedAt(LocalDateTime.now())
+ .isActive(true)
+ .role(Role.LEADER) // 팀장 역할
+ .build();
+ teamMemberRepository.save(teamMember);
+
return ResponseEntity.ok().build();
}
@@ -101,21 +133,21 @@ public ResponseEntity> joinByInviteCode(
throw new RuntimeException("초대코드에 연결된 팀이 없습니다.");
}
- // 이미 등록된 TeamMember 가져오기
- TeamMember teamMember = teamMemberRepository.findByUser(user)
- .orElseThrow(() -> new RuntimeException("TeamMember 정보가 없습니다."));
-
- // 이미 팀이 설정되어 있다면 중복 가입 방지
- if (teamMember.getTeam() != null) {
- return ResponseEntity.badRequest().body("이미 다른 팀에 가입되어 있습니다.");
+ boolean alreadyMember = teamMemberRepository.existsByUserAndTeam(user, team);
+ if (alreadyMember) {
+ return ResponseEntity.badRequest().body("이미 이 팀에 가입되어 있습니다.");
}
- // 팀 할당 및 기타 정보 설정
- teamMember.setTeam(team);
- teamMember.setRole(user.getRole()); // 유저의 역할로 설정
- teamMember.setJoinedAt(LocalDateTime.now());
- teamMember.setActive(true);
- teamMemberRepository.save(teamMember); // 업데이트 저장
+ // 새 TeamMember 생성 및 저장
+ TeamMember newMember = TeamMember.builder()
+ .user(user)
+ .team(team)
+ .joinedAt(LocalDateTime.now())
+ .isActive(true)
+ .role(Role.MEMBER) // 기본 역할로 MEMBER 지정, 필요하면 변경
+ .build();
+ teamMemberRepository.save(newMember);
+
return ResponseEntity.ok(new InviteCodeJoinResponseDto(team.getTeamName()));
}
diff --git a/src/main/java/com/ccapp/ccgo/dto/LoginResponseDto.java b/src/main/java/com/ccapp/ccgo/dto/LoginResponseDto.java
index 65c6aa9..8bba79c 100644
--- a/src/main/java/com/ccapp/ccgo/dto/LoginResponseDto.java
+++ b/src/main/java/com/ccapp/ccgo/dto/LoginResponseDto.java
@@ -1,8 +1,11 @@
package com.ccapp.ccgo.dto;
+import jakarta.persistence.Column;
import lombok.Builder;
import lombok.Getter;
+import java.util.List;
+
@Getter
@Builder
public class LoginResponseDto {
@@ -12,11 +15,16 @@ public class LoginResponseDto {
private Long userId;
private String email;
private String name;
- private String role;
- //이 정보가 필요할지는 고민해봐야한다.
- private Long teamId;
- private String teamName;
+ private List teams;
+
+ @Getter
+ @Builder
+ public static class TeamInfo {
+ private Long teamId;
+ private String teamName;
+ private String role; // 팀 내 역할 (예: "LEADER", "MEMBER")
+ private boolean isSurveyCompleted;
+ }
- private boolean isInterestCompleted; // 기본값 false
}
diff --git a/src/main/java/com/ccapp/ccgo/dto/TeamRequestDto.java b/src/main/java/com/ccapp/ccgo/dto/TeamRequestDto.java
index 71cc0e9..9477da0 100644
--- a/src/main/java/com/ccapp/ccgo/dto/TeamRequestDto.java
+++ b/src/main/java/com/ccapp/ccgo/dto/TeamRequestDto.java
@@ -1,12 +1,10 @@
package com.ccapp.ccgo.dto;
-import lombok.Getter;
-import lombok.NoArgsConstructor;
-import lombok.AllArgsConstructor;
+import lombok.*;
@Getter
-@NoArgsConstructor
-@AllArgsConstructor
+@Setter
+@Builder
public class TeamRequestDto {
private String teamName;
}
diff --git a/src/main/java/com/ccapp/ccgo/dto/UserMapper.java b/src/main/java/com/ccapp/ccgo/dto/UserMapper.java
index b31aa16..f4dbd1d 100644
--- a/src/main/java/com/ccapp/ccgo/dto/UserMapper.java
+++ b/src/main/java/com/ccapp/ccgo/dto/UserMapper.java
@@ -13,7 +13,6 @@ public static User toEntity(UserRequestDto dto, String encodedPassword) {
.password(encodedPassword)
.name(dto.getName())
.gender(dto.getGender())
- .role(dto.getRole())
.birthdate(dto.getBirthdate())
.build();
}
@@ -29,7 +28,6 @@ public static UserResponseDto toDto(User user) {
.gender(user.getGender())
.birthdate(user.getBirthdate())
.createdAt(user.getCreatedAt())
- .role(user.getRole().name())
.build();
}
}
diff --git a/src/main/java/com/ccapp/ccgo/dto/UserRequestDto.java b/src/main/java/com/ccapp/ccgo/dto/UserRequestDto.java
index c85bda4..de0d7fb 100644
--- a/src/main/java/com/ccapp/ccgo/dto/UserRequestDto.java
+++ b/src/main/java/com/ccapp/ccgo/dto/UserRequestDto.java
@@ -17,5 +17,4 @@ public class UserRequestDto {
private String name;
private String gender;
private LocalDate birthdate;
- private Role role;
}
diff --git a/src/main/java/com/ccapp/ccgo/dto/UserResponseDto.java b/src/main/java/com/ccapp/ccgo/dto/UserResponseDto.java
index 41d8190..c3fe00b 100644
--- a/src/main/java/com/ccapp/ccgo/dto/UserResponseDto.java
+++ b/src/main/java/com/ccapp/ccgo/dto/UserResponseDto.java
@@ -14,6 +14,5 @@ public class UserResponseDto {
private String gender;
private LocalDate birthdate;
private LocalDateTime createdAt;
- private String role;
}
diff --git a/src/main/java/com/ccapp/ccgo/jwt/LoginUserDetails.java b/src/main/java/com/ccapp/ccgo/jwt/LoginUserDetails.java
index b384fdf..81db6c0 100644
--- a/src/main/java/com/ccapp/ccgo/jwt/LoginUserDetails.java
+++ b/src/main/java/com/ccapp/ccgo/jwt/LoginUserDetails.java
@@ -23,11 +23,7 @@ public LoginUserDetails(User user) {
// ✅ 기본 권한 비워둠 (나중에 ROLE_ 추가 가능)
@Override
public Collection extends GrantedAuthority> getAuthorities() {
- if (user.getRole() == null) {
- return Collections.emptyList();
- }
- String roleName = user.getRole().name(); // enum 이름 기반 권한
- return List.of(new SimpleGrantedAuthority(roleName));
+ return Collections.emptyList();
}
// ✅ 로그인 시 사용할 비밀번호
diff --git a/src/main/java/com/ccapp/ccgo/repository/TeamMemberRepository.java b/src/main/java/com/ccapp/ccgo/repository/TeamMemberRepository.java
index 9a8309c..e7516d2 100644
--- a/src/main/java/com/ccapp/ccgo/repository/TeamMemberRepository.java
+++ b/src/main/java/com/ccapp/ccgo/repository/TeamMemberRepository.java
@@ -22,6 +22,9 @@ public interface TeamMemberRepository extends JpaRepository {
//teammember에서 유저 조회
Optional findByUser(User user);
+ // 유저(user)에 대해 isActive가 true인 TeamMember 리스트 반환
+ List findAllByUserAndIsActiveTrue(User user);
+
// 팀별 멤버 목록
List findAllByTeamAndIsActiveTrue(Team team);
diff --git a/src/main/java/com/ccapp/ccgo/repository/TeamRepository.java b/src/main/java/com/ccapp/ccgo/repository/TeamRepository.java
index b82f481..d844e81 100644
--- a/src/main/java/com/ccapp/ccgo/repository/TeamRepository.java
+++ b/src/main/java/com/ccapp/ccgo/repository/TeamRepository.java
@@ -3,6 +3,7 @@
import com.ccapp.ccgo.team.Team;
import org.springframework.data.jpa.repository.JpaRepository;
+import java.util.List;
import java.util.Optional;
/**
@@ -10,12 +11,12 @@
*/
public interface TeamRepository extends JpaRepository {
- // 특정 유저가 이미 팀을 만들었는지 확인
- boolean existsByCreatedBy(Long createdBy);
-
// 팀 ID로 조회
Optional findByTeamId(Long teamId);
+ // 유저 ID (팀장)로 팀 찾기
+ List findAllByCreatedBy(Long createdBy);
+
// 팀 이름 중복 방지
boolean existsByTeamName(String teamName);
diff --git a/src/main/java/com/ccapp/ccgo/service/InviteCodeService.java b/src/main/java/com/ccapp/ccgo/service/InviteCodeService.java
index 25a1e3a..ce1f76b 100644
--- a/src/main/java/com/ccapp/ccgo/service/InviteCodeService.java
+++ b/src/main/java/com/ccapp/ccgo/service/InviteCodeService.java
@@ -54,14 +54,19 @@ public void joinTeamByInviteCode(User user, String inviteCode) {
throw new CustomException("초대코드가 만료되었습니다.", HttpStatus.BAD_REQUEST);
}
- if (teamMemberRepository.findByUserAndIsActiveTrue(user).isPresent()) {
- throw new CustomException("이미 팀에 소속되어 있습니다.", HttpStatus.BAD_REQUEST);
+ Team teamToJoin = code.getTeam();
+
+ // 유저가 이미 이 팀에 가입했는지 체크
+ boolean alreadyJoined = teamMemberRepository.findAllByUserAndIsActiveTrue(user).stream()
+ .anyMatch(tm -> tm.getTeam().equals(teamToJoin));
+ if (alreadyJoined) {
+ throw new CustomException("이미 이 팀에 가입되어 있습니다.", HttpStatus.BAD_REQUEST);
}
TeamMember newMember = TeamMember.builder()
.user(user)
- .team(code.getTeam())
- .role(Role.MEMBER)
+ .team(teamToJoin)
+ .role(Role.MEMBER) // 기본 역할은 MEMBER
.isActive(true)
.joinedAt(LocalDateTime.now())
.build();
diff --git a/src/main/java/com/ccapp/ccgo/service/UserService.java b/src/main/java/com/ccapp/ccgo/service/UserService.java
index 49e6059..d592bcc 100644
--- a/src/main/java/com/ccapp/ccgo/service/UserService.java
+++ b/src/main/java/com/ccapp/ccgo/service/UserService.java
@@ -73,7 +73,6 @@ public UserResponseDto updateUser(Long id, UserRequestDto dto) {
user.setPassword(passwordEncoder.encode(dto.getPassword()));
}
user.setName(dto.getName());
- user.setRole(dto.getRole());
user.setGender(dto.getGender());
user.setBirthdate(dto.getBirthdate());
diff --git a/src/main/java/com/ccapp/ccgo/team/Team.java b/src/main/java/com/ccapp/ccgo/team/Team.java
index e7543c6..dc7f07a 100644
--- a/src/main/java/com/ccapp/ccgo/team/Team.java
+++ b/src/main/java/com/ccapp/ccgo/team/Team.java
@@ -17,12 +17,8 @@
@NoArgsConstructor
@AllArgsConstructor
@Builder
-@Table(
- name = "team",
- uniqueConstraints = {
- @UniqueConstraint(columnNames = "createdBy")
- }
-)
+@Table(name = "team")
+
public class Team {
// PK - 팀 ID
@@ -34,8 +30,8 @@ public class Team {
@Column(nullable = false)
private String teamName;
- // 팀장 유저 ID (User.id 참조), UNIQUE
- @Column(nullable = false, unique = true, name="created_by")
+ // 팀장 유저 ID (User.id 참조)
+ @Column(nullable = false, name = "created_by")
private Long createdBy;
//생성된 시간
diff --git a/src/main/java/com/ccapp/ccgo/team/TeamMember.java b/src/main/java/com/ccapp/ccgo/team/TeamMember.java
index 3b9ca19..8fd4c50 100644
--- a/src/main/java/com/ccapp/ccgo/team/TeamMember.java
+++ b/src/main/java/com/ccapp/ccgo/team/TeamMember.java
@@ -23,9 +23,10 @@
@Table(
name = "team_member",
uniqueConstraints = {
- @UniqueConstraint(columnNames = "user_id")
+ @UniqueConstraint(columnNames = {"user_id", "team_id"}) // ✅ 한 유저가 한 팀에만 한 번 참여 가능하도록 제한
}
)
+
public class TeamMember {
// PK - 팀 멤버 ID
@@ -55,4 +56,8 @@ public class TeamMember {
@Column(nullable = false)
private boolean isActive;
+ //설문조사를 햇슴까
+ @Column(nullable = false)
+ private boolean isSurveyCompleted = false; // 설문조사 기본값 false
+
}
diff --git a/src/main/java/com/ccapp/ccgo/user/User.java b/src/main/java/com/ccapp/ccgo/user/User.java
index 78c7fc8..cc3344a 100644
--- a/src/main/java/com/ccapp/ccgo/user/User.java
+++ b/src/main/java/com/ccapp/ccgo/user/User.java
@@ -49,20 +49,12 @@ public class User {
@Column(name = "created_at", updatable = false)
private LocalDateTime createdAt;
- //팀내 역할 (팀장/팀원)
- @Enumerated(EnumType.STRING)
- @Column(nullable = false)
- private Role role;
-
// 회원 가입 시 자동으로 현재 시간 설정
@PrePersist
public void prePersist() {
this.createdAt = LocalDateTime.now();
}
- //관심사 설문조사 완료여부
- @Column(name = "is_interest_completed", nullable = false)
- private boolean isInterestCompleted = false;
}
From 60c7feac8956bfc1ebb61988830117d9f2b6f628 Mon Sep 17 00:00:00 2001
From: bendy41
Date: Sun, 6 Jul 2025 14:29:05 +0900
Subject: [PATCH 009/132] Fix invitecontroller&service
---
.../ccgo/controller/InviteCodeController.java | 74 +++--------------
.../ccgo/repository/TeamMemberRepository.java | 2 +-
.../ccapp/ccgo/service/InviteCodeService.java | 79 +++++++++++--------
3 files changed, 55 insertions(+), 100 deletions(-)
diff --git a/src/main/java/com/ccapp/ccgo/controller/InviteCodeController.java b/src/main/java/com/ccapp/ccgo/controller/InviteCodeController.java
index 33cfe53..efa6b12 100644
--- a/src/main/java/com/ccapp/ccgo/controller/InviteCodeController.java
+++ b/src/main/java/com/ccapp/ccgo/controller/InviteCodeController.java
@@ -44,6 +44,7 @@ public ResponseEntity createInviteCode(
System.out.println("초대코드 생성 요청 들어옴");
System.out.println("userDetails: " + userDetails);
+ //작동확인 주석
if (userDetails != null) {
System.out.println("인증된 사용자 이메일: " + userDetails.getUsername());
System.out.println("사용자 권한: " + userDetails.getAuthorities());
@@ -52,28 +53,15 @@ public ResponseEntity createInviteCode(
}
User user = userDetails.getUser();
-
System.out.print("코드 만듭니당");
-
- List teamMembers = teamMemberRepository.findAllByUserAndIsActiveTrue(user);
-
- TeamMember teamMember = teamMembers.stream()
- .filter(tm -> tm.getRole() == Role.LEADER)
- .findFirst()
- .orElseThrow(() -> new CustomException("팀장만 초대코드를 생성할 수 있습니다.", HttpStatus.FORBIDDEN));
-
- System.out.println("여까진 됌 ");
-
- // 초대코드 생성 서비스 호출
InviteCode inviteCode = inviteCodeService.createInviteCode(user);
-
- System.out.print("만들었어용");
InviteCodeCreateResponseDto responseDto = InviteCodeCreateResponseDto.builder()
.code(inviteCode.getCode())
.expiresAt(inviteCode.getExpiresAt())
.build();
- System.out.print("무슨 dto생성해용");
+
return ResponseEntity.ok(responseDto);
+
}
@@ -83,31 +71,14 @@ public ResponseEntity saveTeamName(
@AuthenticationPrincipal LoginUserDetails userDetails,
@RequestBody TeamRequestDto requestDto) {
if (userDetails == null) {
- return ResponseEntity.status(401).build(); // 인증 정보 없으면 401 반환
+ return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build();
}
+
User user = userDetails.getUser();
- String teamName = requestDto.getTeamName();
-
- //팀 생성 코드
- // 팀 엔티티 생성 및 저장
- Team team = Team.builder()
- .teamName(teamName)
- .createdBy(user.getId()) // 팀장 ID
- .createdAt(LocalDateTime.now())
- .build();
- teamRepository.save(team);
-
- // 팀장도 팀원으로 자동 등록
- TeamMember teamMember = TeamMember.builder()
- .team(team)
- .user(user)
- .joinedAt(LocalDateTime.now())
- .isActive(true)
- .role(Role.LEADER) // 팀장 역할
- .build();
- teamMemberRepository.save(teamMember);
+ inviteCodeService.createTeamWithLeader(user, requestDto.getTeamName());
return ResponseEntity.ok().build();
+
}
//팀원이 코드를 보냈으면 처리
@@ -120,36 +91,11 @@ public ResponseEntity> joinByInviteCode(
return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("인증 정보가 없습니다.");
}
- String code = requestDto.getInviteCode();
User user = userDetails.getUser();
+ System.out.println("1. 컨트롤러 진입");
+ String teamName = inviteCodeService.joinTeamByInviteCode(requestDto.getInviteCode(), user);
- // 유효한 초대 코드인지 확인
- InviteCode inviteCode = inviteCodeRepository
- .findByCodeAndExpiresAtAfter(code, LocalDateTime.now())
- .orElseThrow(() -> new RuntimeException("초대 코드가 없거나 만료되었습니다."));
-
- Team team = inviteCode.getTeam();
- if (team == null) {
- throw new RuntimeException("초대코드에 연결된 팀이 없습니다.");
- }
-
- boolean alreadyMember = teamMemberRepository.existsByUserAndTeam(user, team);
- if (alreadyMember) {
- return ResponseEntity.badRequest().body("이미 이 팀에 가입되어 있습니다.");
- }
-
- // 새 TeamMember 생성 및 저장
- TeamMember newMember = TeamMember.builder()
- .user(user)
- .team(team)
- .joinedAt(LocalDateTime.now())
- .isActive(true)
- .role(Role.MEMBER) // 기본 역할로 MEMBER 지정, 필요하면 변경
- .build();
- teamMemberRepository.save(newMember);
-
-
- return ResponseEntity.ok(new InviteCodeJoinResponseDto(team.getTeamName()));
+ return ResponseEntity.ok(new InviteCodeJoinResponseDto(teamName));
}
diff --git a/src/main/java/com/ccapp/ccgo/repository/TeamMemberRepository.java b/src/main/java/com/ccapp/ccgo/repository/TeamMemberRepository.java
index e7516d2..02ad54f 100644
--- a/src/main/java/com/ccapp/ccgo/repository/TeamMemberRepository.java
+++ b/src/main/java/com/ccapp/ccgo/repository/TeamMemberRepository.java
@@ -17,7 +17,7 @@ public interface TeamMemberRepository extends JpaRepository {
boolean existsByUser(User user);
// 현재 소속 중인 팀 찾기 (Soft Delete 고려)
- Optional findByUserAndIsActiveTrue(User user);
+ List findByUserAndIsActiveTrue(User user);
//teammember에서 유저 조회
Optional findByUser(User user);
diff --git a/src/main/java/com/ccapp/ccgo/service/InviteCodeService.java b/src/main/java/com/ccapp/ccgo/service/InviteCodeService.java
index ce1f76b..e7d01d4 100644
--- a/src/main/java/com/ccapp/ccgo/service/InviteCodeService.java
+++ b/src/main/java/com/ccapp/ccgo/service/InviteCodeService.java
@@ -8,7 +8,6 @@
import com.ccapp.ccgo.team.InviteCode;
import com.ccapp.ccgo.team.Team;
import com.ccapp.ccgo.team.TeamMember;
-import lombok.NonNull;
import org.springframework.scheduling.annotation.Scheduled;
import com.ccapp.ccgo.user.User;
import org.springframework.http.HttpStatus;
@@ -18,6 +17,7 @@
import java.time.LocalDateTime;
import java.security.SecureRandom;
+import java.util.List;
@Service
@RequiredArgsConstructor
@@ -45,45 +45,45 @@ private String generateRandomCode() {
//코드로팀가입
@Transactional
- public void joinTeamByInviteCode(User user, String inviteCode) {
- InviteCode code = inviteCodeRepository.findById(inviteCode)
- .orElseThrow(() -> new CustomException("초대코드가 유효하지 않습니다.", HttpStatus.BAD_REQUEST));
+ public String joinTeamByInviteCode(String code, User user) {
- if (code.isExpired()) {
- inviteCodeRepository.delete(code); // 만료된 코드는 삭제
- throw new CustomException("초대코드가 만료되었습니다.", HttpStatus.BAD_REQUEST);
- }
+ InviteCode inviteCode = inviteCodeRepository
+ .findByCodeAndExpiresAtAfter(code, LocalDateTime.now())
+ .orElseThrow(() -> new CustomException("초대 코드가 없거나 만료되었습니다.", HttpStatus.BAD_REQUEST));
- Team teamToJoin = code.getTeam();
+ Team team = inviteCode.getTeam();
- // 유저가 이미 이 팀에 가입했는지 체크
- boolean alreadyJoined = teamMemberRepository.findAllByUserAndIsActiveTrue(user).stream()
- .anyMatch(tm -> tm.getTeam().equals(teamToJoin));
- if (alreadyJoined) {
+ boolean alreadyMember = teamMemberRepository.existsByUserAndTeam(user, team);
+ if (alreadyMember) {
throw new CustomException("이미 이 팀에 가입되어 있습니다.", HttpStatus.BAD_REQUEST);
}
-
TeamMember newMember = TeamMember.builder()
.user(user)
- .team(teamToJoin)
- .role(Role.MEMBER) // 기본 역할은 MEMBER
- .isActive(true)
+ .team(team)
.joinedAt(LocalDateTime.now())
+ .isActive(true)
+ .role(Role.MEMBER)
.build();
teamMemberRepository.save(newMember);
+
+ return team.getTeamName();
}
- //보안상 냅둬
+ //초대코드생성 부분
@Transactional
public InviteCode createInviteCode(User user) {
- var teamMember = teamMemberRepository.findByUserAndIsActiveTrue(user)
- .orElseThrow(() -> new CustomException("팀 소속이 아닙니다.", HttpStatus.BAD_REQUEST));
- if (teamMember.getRole() != Role.LEADER) {
- throw new CustomException("팀장만 초대코드를 생성할 수 있습니다.", HttpStatus.FORBIDDEN);
+ List teamMembers = teamMemberRepository.findByUserAndIsActiveTrue(user);
+ if (teamMembers.isEmpty()) {
+ throw new CustomException("팀 소속이 아닙니다.", HttpStatus.BAD_REQUEST);
}
- Team team = teamMember.getTeam();
+ TeamMember leader = teamMembers.stream()
+ .filter(tm -> tm.getRole() == Role.LEADER)
+ .findFirst()
+ .orElseThrow(() -> new CustomException("팀장만 초대코드를 생성할 수 있습니다.", HttpStatus.FORBIDDEN));
+
+ Team team = leader.getTeam();
//기존 코드 삭제
inviteCodeRepository.deleteByTeam(team);
@@ -107,19 +107,28 @@ public void deleteExpiredInviteCodes() {
inviteCodeRepository.deleteByExpiresAtBefore(LocalDateTime.now());
}
- @Transactional
- public void saveTeamName(@NonNull User user, @NonNull String teamName) {
- // 사용자 팀 멤버 조회
- TeamMember teamMember = teamMemberRepository.findByUserAndIsActiveTrue(user)
- .orElseThrow(() -> new CustomException("팀 소속이 아닙니다.", HttpStatus.BAD_REQUEST));
-
- // 팀장만 팀 이름 변경 가능 (원한다면 이 조건 제거 가능)
- if (teamMember.getRole() != Role.LEADER) {
- throw new CustomException("팀장만 팀 이름을 변경할 수 있습니다.", HttpStatus.FORBIDDEN);
- }
- Team team = teamMember.getTeam();
- team.setTeamName(teamName); // 팀 이름 변경
+
+ @Transactional
+ public void createTeamWithLeader(User user, String teamName) {
+ // 팀 생성
+ Team team = Team.builder()
+ .teamName(teamName)
+ .createdBy(user.getId())
+ .createdAt(LocalDateTime.now())
+ .build();
teamRepository.save(team);
+
+ // 팀장 등록
+ TeamMember teamMember = TeamMember.builder()
+ .team(team)
+ .user(user)
+ .joinedAt(LocalDateTime.now())
+ .isActive(true)
+ .role(Role.LEADER)
+ .build();
+ teamMemberRepository.save(teamMember);
}
+
+
}
From 0d95cd22ea2b2e58adae678fd8cf1b528eaa746a Mon Sep 17 00:00:00 2001
From: bendy41
Date: Sun, 6 Jul 2025 16:12:41 +0900
Subject: [PATCH 010/132] Add TeamController
---
.../ccapp/ccgo/controller/TeamController.java | 41 +++++++++++++++++++
1 file changed, 41 insertions(+)
create mode 100644 src/main/java/com/ccapp/ccgo/controller/TeamController.java
diff --git a/src/main/java/com/ccapp/ccgo/controller/TeamController.java b/src/main/java/com/ccapp/ccgo/controller/TeamController.java
new file mode 100644
index 0000000..10def72
--- /dev/null
+++ b/src/main/java/com/ccapp/ccgo/controller/TeamController.java
@@ -0,0 +1,41 @@
+package com.ccapp.ccgo.controller;
+import com.ccapp.ccgo.dto.TeamResponseDto;
+import com.ccapp.ccgo.user.User;
+import com.ccapp.ccgo.jwt.LoginUserDetails;
+import com.ccapp.ccgo.repository.TeamMemberRepository;
+
+import lombok.RequiredArgsConstructor;
+
+import org.springframework.http.ResponseEntity;
+import org.springframework.security.core.annotation.AuthenticationPrincipal;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("/api/team")
+public class TeamController {
+
+ private final TeamMemberRepository teamMemberRepository;
+
+ @GetMapping("/mine")
+ public ResponseEntity> getMyTeams(
+ @AuthenticationPrincipal LoginUserDetails userDetails) {
+
+ User user = userDetails.getUser();
+
+ List result = teamMemberRepository
+ .findAllByUserAndIsActiveTrue(user)
+ .stream()
+ .map(tm -> new TeamResponseDto(
+ tm.getTeam().getTeamId(), // getTeamId()로 변경
+ tm.getTeam().getTeamName()))
+ .collect(Collectors.toList());
+
+ return ResponseEntity.ok(result);
+ }
+}
\ No newline at end of file
From 5db78758df9b5c32800796d9a937bde5669fe278 Mon Sep 17 00:00:00 2001
From: losecow
Date: Mon, 7 Jul 2025 13:31:34 +0900
Subject: [PATCH 011/132] match service complete
---
.idea/modules/CC_Maker_BE.main.iml | 1 +
.idea/modules/CC_Maker_BE.test.iml | 1 +
.../ccgo/controller/MatchingController.java | 51 ++
.../com/ccapp/ccgo/dto/AnswerRequestDto.java | 14 +
.../ccapp/ccgo/dto/MatchingResponseDto.java | 15 +
.../com/ccapp/ccgo/dto/MatchingResultDto.java | 15 +
.../ccapp/ccgo/dto/QuestionRequestDto.java | 14 +
.../ccapp/ccgo/dto/QuestionResponseDto.java | 12 +
.../com/ccapp/ccgo/dto/QuestionUpdateDto.java | 11 +
.../com/ccapp/ccgo/dto/SingleAnswerDto.java | 12 +
.../com/ccapp/ccgo/dto/UserResponseDto.java | 1 +
.../java/com/ccapp/ccgo/matching/Answer.java | 39 ++
.../com/ccapp/ccgo/matching/MbtiScore.java | 26 ++
.../com/ccapp/ccgo/matching/MbtiScoreId.java | 13 +
.../ccgo/matching/MbtiScoreProvider.java | 37 ++
.../com/ccapp/ccgo/matching/Question.java | 33 ++
.../com/ccapp/ccgo/matching/SubGroup.java | 33 ++
.../ccapp/ccgo/matching/SubGroupMember.java | 33 ++
.../ccgo/repository/AnswerRepository.java | 13 +
.../ccgo/repository/MbtiScoreRepository.java | 11 +
.../ccgo/repository/QuestionRepository.java | 10 +
.../repository/SubGroupMemberRepository.java | 9 +
.../ccgo/repository/SubGroupRepository.java | 9 +
.../ccgo/repository/TeamMemberRepository.java | 2 +
.../ccapp/ccgo/service/MatchingService.java | 439 ++++++++++++++++++
src/main/java/com/ccapp/ccgo/user/User.java | 4 +
26 files changed, 858 insertions(+)
create mode 100644 src/main/java/com/ccapp/ccgo/controller/MatchingController.java
create mode 100644 src/main/java/com/ccapp/ccgo/dto/AnswerRequestDto.java
create mode 100644 src/main/java/com/ccapp/ccgo/dto/MatchingResponseDto.java
create mode 100644 src/main/java/com/ccapp/ccgo/dto/MatchingResultDto.java
create mode 100644 src/main/java/com/ccapp/ccgo/dto/QuestionRequestDto.java
create mode 100644 src/main/java/com/ccapp/ccgo/dto/QuestionResponseDto.java
create mode 100644 src/main/java/com/ccapp/ccgo/dto/QuestionUpdateDto.java
create mode 100644 src/main/java/com/ccapp/ccgo/dto/SingleAnswerDto.java
create mode 100644 src/main/java/com/ccapp/ccgo/matching/Answer.java
create mode 100644 src/main/java/com/ccapp/ccgo/matching/MbtiScore.java
create mode 100644 src/main/java/com/ccapp/ccgo/matching/MbtiScoreId.java
create mode 100644 src/main/java/com/ccapp/ccgo/matching/MbtiScoreProvider.java
create mode 100644 src/main/java/com/ccapp/ccgo/matching/Question.java
create mode 100644 src/main/java/com/ccapp/ccgo/matching/SubGroup.java
create mode 100644 src/main/java/com/ccapp/ccgo/matching/SubGroupMember.java
create mode 100644 src/main/java/com/ccapp/ccgo/repository/AnswerRepository.java
create mode 100644 src/main/java/com/ccapp/ccgo/repository/MbtiScoreRepository.java
create mode 100644 src/main/java/com/ccapp/ccgo/repository/QuestionRepository.java
create mode 100644 src/main/java/com/ccapp/ccgo/repository/SubGroupMemberRepository.java
create mode 100644 src/main/java/com/ccapp/ccgo/repository/SubGroupRepository.java
create mode 100644 src/main/java/com/ccapp/ccgo/service/MatchingService.java
diff --git a/.idea/modules/CC_Maker_BE.main.iml b/.idea/modules/CC_Maker_BE.main.iml
index 5491e61..ff0e05e 100644
--- a/.idea/modules/CC_Maker_BE.main.iml
+++ b/.idea/modules/CC_Maker_BE.main.iml
@@ -37,6 +37,7 @@
+
diff --git a/.idea/modules/CC_Maker_BE.test.iml b/.idea/modules/CC_Maker_BE.test.iml
index 3b1bc40..b041ee2 100644
--- a/.idea/modules/CC_Maker_BE.test.iml
+++ b/.idea/modules/CC_Maker_BE.test.iml
@@ -21,6 +21,7 @@
+
diff --git a/src/main/java/com/ccapp/ccgo/controller/MatchingController.java b/src/main/java/com/ccapp/ccgo/controller/MatchingController.java
new file mode 100644
index 0000000..fa48689
--- /dev/null
+++ b/src/main/java/com/ccapp/ccgo/controller/MatchingController.java
@@ -0,0 +1,51 @@
+package com.ccapp.ccgo.controller;
+
+import com.ccapp.ccgo.dto.*;
+import com.ccapp.ccgo.service.MatchingService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("/api/v1/matching") // 경로수정필요
+public class MatchingController {
+
+ private final MatchingService matchingService;
+
+ /**
+ * 팀장이 매칭 시작 버튼 누를 때 호출
+ */
+// @PreAuthorize("hasRole('TEAM_LEADER')") 매칭권한
+ @PostMapping("/start/{teamId}")
+ public MatchingResponseDto startMatching(@PathVariable Long teamId) {
+ return matchingService.performMatching(teamId);
+ }
+
+ @PostMapping("/answer")
+ public void saveAnswers(@RequestBody AnswerRequestDto requestDto) {
+ matchingService.saveAnswers(requestDto);
+ }
+
+ @PostMapping("/question")
+ public void createQuestions(@RequestBody QuestionRequestDto requestDto) {
+ matchingService.createQuestions(requestDto);
+ }
+
+ @GetMapping("/question")
+ public List getQuestions(@RequestParam Long teamId) {
+ return matchingService.getQuestions(teamId);
+ }
+
+ @PutMapping("/question/{questionId}")
+ public void updateQuestion(@PathVariable Long questionId,
+ @RequestBody QuestionUpdateDto dto) {
+ matchingService.updateQuestion(questionId, dto);
+ }
+
+ @DeleteMapping("/question/{questionId}")
+ public void deleteQuestion(@PathVariable Long questionId) {
+ matchingService.deleteQuestion(questionId);
+ }
+}
diff --git a/src/main/java/com/ccapp/ccgo/dto/AnswerRequestDto.java b/src/main/java/com/ccapp/ccgo/dto/AnswerRequestDto.java
new file mode 100644
index 0000000..d127921
--- /dev/null
+++ b/src/main/java/com/ccapp/ccgo/dto/AnswerRequestDto.java
@@ -0,0 +1,14 @@
+package com.ccapp.ccgo.dto;
+
+import lombok.*;
+
+import java.util.List;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class AnswerRequestDto {
+ private Long userId;
+ private List answers;
+}
diff --git a/src/main/java/com/ccapp/ccgo/dto/MatchingResponseDto.java b/src/main/java/com/ccapp/ccgo/dto/MatchingResponseDto.java
new file mode 100644
index 0000000..4edc3e6
--- /dev/null
+++ b/src/main/java/com/ccapp/ccgo/dto/MatchingResponseDto.java
@@ -0,0 +1,15 @@
+package com.ccapp.ccgo.dto;
+
+import lombok.*;
+
+import java.util.List;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class MatchingResponseDto {
+ private Long teamId;
+ private String teamName;
+ private List subGroups;
+}
diff --git a/src/main/java/com/ccapp/ccgo/dto/MatchingResultDto.java b/src/main/java/com/ccapp/ccgo/dto/MatchingResultDto.java
new file mode 100644
index 0000000..8250a4f
--- /dev/null
+++ b/src/main/java/com/ccapp/ccgo/dto/MatchingResultDto.java
@@ -0,0 +1,15 @@
+package com.ccapp.ccgo.dto;
+
+import lombok.*;
+
+import java.util.List;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class MatchingResultDto {
+ private Long subGroupId; // SubGroup PK
+ private String groupName; // SubGroup 이름 (팀이름+인덱스)
+ private List members; // 그룹 멤버 리스트
+}
diff --git a/src/main/java/com/ccapp/ccgo/dto/QuestionRequestDto.java b/src/main/java/com/ccapp/ccgo/dto/QuestionRequestDto.java
new file mode 100644
index 0000000..6b3599e
--- /dev/null
+++ b/src/main/java/com/ccapp/ccgo/dto/QuestionRequestDto.java
@@ -0,0 +1,14 @@
+package com.ccapp.ccgo.dto;
+
+import lombok.*;
+
+import java.util.List;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class QuestionRequestDto {
+ private Long teamId;
+ private List questions;
+}
diff --git a/src/main/java/com/ccapp/ccgo/dto/QuestionResponseDto.java b/src/main/java/com/ccapp/ccgo/dto/QuestionResponseDto.java
new file mode 100644
index 0000000..58227f7
--- /dev/null
+++ b/src/main/java/com/ccapp/ccgo/dto/QuestionResponseDto.java
@@ -0,0 +1,12 @@
+package com.ccapp.ccgo.dto;
+
+import lombok.*;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class QuestionResponseDto {
+ private Long id;
+ private String text;
+}
diff --git a/src/main/java/com/ccapp/ccgo/dto/QuestionUpdateDto.java b/src/main/java/com/ccapp/ccgo/dto/QuestionUpdateDto.java
new file mode 100644
index 0000000..d615536
--- /dev/null
+++ b/src/main/java/com/ccapp/ccgo/dto/QuestionUpdateDto.java
@@ -0,0 +1,11 @@
+package com.ccapp.ccgo.dto;
+
+import lombok.*;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class QuestionUpdateDto {
+ private String text;
+}
diff --git a/src/main/java/com/ccapp/ccgo/dto/SingleAnswerDto.java b/src/main/java/com/ccapp/ccgo/dto/SingleAnswerDto.java
new file mode 100644
index 0000000..145700e
--- /dev/null
+++ b/src/main/java/com/ccapp/ccgo/dto/SingleAnswerDto.java
@@ -0,0 +1,12 @@
+package com.ccapp.ccgo.dto;
+
+import lombok.*;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class SingleAnswerDto {
+ private Long questionId;
+ private Integer score;
+}
diff --git a/src/main/java/com/ccapp/ccgo/dto/UserResponseDto.java b/src/main/java/com/ccapp/ccgo/dto/UserResponseDto.java
index 41d8190..eecaff7 100644
--- a/src/main/java/com/ccapp/ccgo/dto/UserResponseDto.java
+++ b/src/main/java/com/ccapp/ccgo/dto/UserResponseDto.java
@@ -15,5 +15,6 @@ public class UserResponseDto {
private LocalDate birthdate;
private LocalDateTime createdAt;
private String role;
+ private String mbti; // mbti 값
}
diff --git a/src/main/java/com/ccapp/ccgo/matching/Answer.java b/src/main/java/com/ccapp/ccgo/matching/Answer.java
new file mode 100644
index 0000000..c9ce69f
--- /dev/null
+++ b/src/main/java/com/ccapp/ccgo/matching/Answer.java
@@ -0,0 +1,39 @@
+package com.ccapp.ccgo.matching;
+
+import com.ccapp.ccgo.user.User;
+import jakarta.persistence.*;
+import lombok.*;
+
+@Entity
+@Table(name = "answer")
+@Getter
+@Setter
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class Answer {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Long id;
+
+ /**
+ * 답변한 사용자
+ */
+ @ManyToOne(fetch = FetchType.LAZY)
+ @JoinColumn(name = "user_id", nullable = false)
+ private User user;
+
+ /**
+ * 어떤 질문에 대한 답변인지
+ */
+ @ManyToOne(fetch = FetchType.LAZY)
+ @JoinColumn(name = "question_id", nullable = false)
+ private Question question;
+
+ /**
+ * 유저가 선택한 점수 (1~5)
+ */
+ @Column(nullable = false)
+ private Integer score;
+}
diff --git a/src/main/java/com/ccapp/ccgo/matching/MbtiScore.java b/src/main/java/com/ccapp/ccgo/matching/MbtiScore.java
new file mode 100644
index 0000000..cc9c1f1
--- /dev/null
+++ b/src/main/java/com/ccapp/ccgo/matching/MbtiScore.java
@@ -0,0 +1,26 @@
+package com.ccapp.ccgo.matching;
+
+import jakarta.persistence.*;
+import lombok.*;
+
+@Entity
+@IdClass(MbtiScoreId.class)
+@Table(name = "mbti_score")
+@Getter
+@Setter
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class MbtiScore {
+
+ @Id
+ @Column(name = "from_mbti", length = 4)
+ private String fromMbti;
+
+ @Id
+ @Column(name = "to_mbti", length = 4)
+ private String toMbti;
+
+ @Column(nullable = false)
+ private Integer score;
+}
diff --git a/src/main/java/com/ccapp/ccgo/matching/MbtiScoreId.java b/src/main/java/com/ccapp/ccgo/matching/MbtiScoreId.java
new file mode 100644
index 0000000..fd1fb0f
--- /dev/null
+++ b/src/main/java/com/ccapp/ccgo/matching/MbtiScoreId.java
@@ -0,0 +1,13 @@
+package com.ccapp.ccgo.matching;
+
+import lombok.*;
+
+import java.io.Serializable;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class MbtiScoreId implements Serializable {
+ private String fromMbti;
+ private String toMbti;
+}
diff --git a/src/main/java/com/ccapp/ccgo/matching/MbtiScoreProvider.java b/src/main/java/com/ccapp/ccgo/matching/MbtiScoreProvider.java
new file mode 100644
index 0000000..a5e67d2
--- /dev/null
+++ b/src/main/java/com/ccapp/ccgo/matching/MbtiScoreProvider.java
@@ -0,0 +1,37 @@
+package com.ccapp.ccgo.matching;
+
+import com.ccapp.ccgo.repository.MbtiScoreRepository;
+import jakarta.annotation.PostConstruct;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Component;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+// Map 캐시 만들어주는 역할
+
+@Component
+@RequiredArgsConstructor
+public class MbtiScoreProvider {
+
+ private final MbtiScoreRepository mbtiScoreRepository;
+
+ private final Map> scoreMap = new HashMap<>();
+
+ @PostConstruct
+ public void loadMbtiScores() {
+ List scores = mbtiScoreRepository.findAll();
+ for (MbtiScore score : scores) {
+ scoreMap
+ .computeIfAbsent(score.getFromMbti(), k -> new HashMap<>())
+ .put(score.getToMbti(), score.getScore());
+ }
+ }
+
+ public int getScore(String fromMbti, String toMbti) {
+ return scoreMap
+ .getOrDefault(fromMbti, new HashMap<>())
+ .getOrDefault(toMbti, 0);
+ }
+}
diff --git a/src/main/java/com/ccapp/ccgo/matching/Question.java b/src/main/java/com/ccapp/ccgo/matching/Question.java
new file mode 100644
index 0000000..5986dec
--- /dev/null
+++ b/src/main/java/com/ccapp/ccgo/matching/Question.java
@@ -0,0 +1,33 @@
+package com.ccapp.ccgo.matching;
+
+import com.ccapp.ccgo.team.Team;
+import jakarta.persistence.*;
+import lombok.*;
+
+@Entity
+@Table(name = "question")
+@Getter
+@Setter
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class Question {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Long id;
+
+ /**
+ * 어떤 팀에서 작성한 질문인지
+ */
+ @ManyToOne(fetch = FetchType.LAZY)
+ @JoinColumn(name = "team_id", nullable = false)
+ private Team team;
+
+ /**
+ * 질문 텍스트
+ * ex) "당신의 주말 취미는 무엇인가요?"
+ */
+ @Column(nullable = false, length = 1000)
+ private String text;
+}
diff --git a/src/main/java/com/ccapp/ccgo/matching/SubGroup.java b/src/main/java/com/ccapp/ccgo/matching/SubGroup.java
new file mode 100644
index 0000000..228df01
--- /dev/null
+++ b/src/main/java/com/ccapp/ccgo/matching/SubGroup.java
@@ -0,0 +1,33 @@
+package com.ccapp.ccgo.matching;
+
+import com.ccapp.ccgo.team.Team;
+import jakarta.persistence.*;
+import lombok.*;
+
+@Entity
+@Table(name = "sub_group")
+@Getter
+@Setter
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class SubGroup {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Long id;
+
+ /**
+ * 어떤 팀 안에서 만들어진 그룹인지
+ */
+ @ManyToOne(fetch = FetchType.LAZY)
+ @JoinColumn(name = "team_id", nullable = false)
+ private Team team;
+
+ /**
+ * 그룹 이름
+ * 예) "A팀 매칭 그룹 1번"
+ */
+ @Column(nullable = false, length = 255)
+ private String name;
+}
diff --git a/src/main/java/com/ccapp/ccgo/matching/SubGroupMember.java b/src/main/java/com/ccapp/ccgo/matching/SubGroupMember.java
new file mode 100644
index 0000000..cd084a1
--- /dev/null
+++ b/src/main/java/com/ccapp/ccgo/matching/SubGroupMember.java
@@ -0,0 +1,33 @@
+package com.ccapp.ccgo.matching;
+
+import com.ccapp.ccgo.user.User;
+import jakarta.persistence.*;
+import lombok.*;
+
+@Entity
+@Table(name = "sub_group_member")
+@Getter
+@Setter
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class SubGroupMember {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Long id;
+
+ /**
+ * 어떤 SubGroup 에 소속되었는지
+ */
+ @ManyToOne(fetch = FetchType.LAZY)
+ @JoinColumn(name = "sub_group_id", nullable = false)
+ private SubGroup subGroup;
+
+ /**
+ * 소속된 사용자
+ */
+ @ManyToOne(fetch = FetchType.LAZY)
+ @JoinColumn(name = "user_id", nullable = false)
+ private User user;
+}
diff --git a/src/main/java/com/ccapp/ccgo/repository/AnswerRepository.java b/src/main/java/com/ccapp/ccgo/repository/AnswerRepository.java
new file mode 100644
index 0000000..6196564
--- /dev/null
+++ b/src/main/java/com/ccapp/ccgo/repository/AnswerRepository.java
@@ -0,0 +1,13 @@
+package com.ccapp.ccgo.repository;
+
+import com.ccapp.ccgo.matching.Answer;
+import org.springframework.data.jpa.repository.JpaRepository;
+import java.util.List;
+
+public interface AnswerRepository extends JpaRepository {
+
+ List findByUser_Id(Long userId);
+
+ List findByQuestion_Id(Long questionId);
+
+}
diff --git a/src/main/java/com/ccapp/ccgo/repository/MbtiScoreRepository.java b/src/main/java/com/ccapp/ccgo/repository/MbtiScoreRepository.java
new file mode 100644
index 0000000..96a6f88
--- /dev/null
+++ b/src/main/java/com/ccapp/ccgo/repository/MbtiScoreRepository.java
@@ -0,0 +1,11 @@
+package com.ccapp.ccgo.repository;
+
+import com.ccapp.ccgo.matching.MbtiScore;
+import com.ccapp.ccgo.matching.MbtiScoreId;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import java.util.List;
+
+public interface MbtiScoreRepository extends JpaRepository {
+ List findAll();
+}
diff --git a/src/main/java/com/ccapp/ccgo/repository/QuestionRepository.java b/src/main/java/com/ccapp/ccgo/repository/QuestionRepository.java
new file mode 100644
index 0000000..62c0333
--- /dev/null
+++ b/src/main/java/com/ccapp/ccgo/repository/QuestionRepository.java
@@ -0,0 +1,10 @@
+package com.ccapp.ccgo.repository;
+
+import com.ccapp.ccgo.matching.Question;
+import org.springframework.data.jpa.repository.JpaRepository;
+import java.util.List;
+
+public interface QuestionRepository extends JpaRepository {
+
+ List findByTeam_TeamId(Long teamId);
+}
diff --git a/src/main/java/com/ccapp/ccgo/repository/SubGroupMemberRepository.java b/src/main/java/com/ccapp/ccgo/repository/SubGroupMemberRepository.java
new file mode 100644
index 0000000..767ba1f
--- /dev/null
+++ b/src/main/java/com/ccapp/ccgo/repository/SubGroupMemberRepository.java
@@ -0,0 +1,9 @@
+package com.ccapp.ccgo.repository;
+
+import com.ccapp.ccgo.matching.SubGroupMember;
+import org.springframework.data.jpa.repository.JpaRepository;
+import java.util.List;
+
+public interface SubGroupMemberRepository extends JpaRepository {
+ List findBySubGroup_Id(Long subGroupId);
+}
diff --git a/src/main/java/com/ccapp/ccgo/repository/SubGroupRepository.java b/src/main/java/com/ccapp/ccgo/repository/SubGroupRepository.java
new file mode 100644
index 0000000..9c9ea59
--- /dev/null
+++ b/src/main/java/com/ccapp/ccgo/repository/SubGroupRepository.java
@@ -0,0 +1,9 @@
+package com.ccapp.ccgo.repository;
+
+import com.ccapp.ccgo.matching.SubGroup;
+import org.springframework.data.jpa.repository.JpaRepository;
+import java.util.List;
+
+public interface SubGroupRepository extends JpaRepository {
+ List findByTeam_TeamId(Long teamId);
+}
diff --git a/src/main/java/com/ccapp/ccgo/repository/TeamMemberRepository.java b/src/main/java/com/ccapp/ccgo/repository/TeamMemberRepository.java
index 9a8309c..26ceeac 100644
--- a/src/main/java/com/ccapp/ccgo/repository/TeamMemberRepository.java
+++ b/src/main/java/com/ccapp/ccgo/repository/TeamMemberRepository.java
@@ -27,4 +27,6 @@ public interface TeamMemberRepository extends JpaRepository {
// 이미 특정 유저가 특정 팀 인지 확인
boolean existsByUserAndTeam(User user, Team team);
+
+ List findActiveMembersByTeamId(Long teamId);
}
diff --git a/src/main/java/com/ccapp/ccgo/service/MatchingService.java b/src/main/java/com/ccapp/ccgo/service/MatchingService.java
new file mode 100644
index 0000000..d5df5ce
--- /dev/null
+++ b/src/main/java/com/ccapp/ccgo/service/MatchingService.java
@@ -0,0 +1,439 @@
+package com.ccapp.ccgo.service;
+
+import com.ccapp.ccgo.dto.*;
+import com.ccapp.ccgo.matching.*;
+import com.ccapp.ccgo.repository.*;
+import com.ccapp.ccgo.team.Team;
+import com.ccapp.ccgo.team.TeamMember;
+import com.ccapp.ccgo.user.User;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Service
+@RequiredArgsConstructor
+public class MatchingService {
+
+ private final TeamMemberRepository teamMemberRepository;
+ private final QuestionRepository questionRepository;
+ private final AnswerRepository answerRepository;
+ private final SubGroupRepository subGroupRepository;
+ private final SubGroupMemberRepository subGroupMemberRepository;
+ // 가중치
+ private static final double MBTI_WEIGHT = 0.5;
+ private static final double SIMILARITY_WEIGHT = 0.5;
+
+ private final MbtiScoreProvider mbtiScoreProvider;
+
+ @Transactional
+ public MatchingResponseDto performMatching(Long teamId) {
+
+ // 1. 팀 정보 가져오기
+ // 해당 팀에 소속된 팀원 전체 가져옴
+ // 팀원이 없다면 (비어있다면) IllegalArgumentException
+ List members = teamMemberRepository.findActiveMembersByTeamId(teamId);
+ Map memberMap = members.stream()
+ .collect(Collectors.toMap(tm -> tm.getUser().getId(), tm -> tm));
+
+
+ if (members.isEmpty()) {
+ throw new IllegalArgumentException("해당 팀(" + teamId + ")에 유저가 없습니다.");
+ }
+
+ Team team = members.get(0).getTeam();
+
+ // 2. 남/여 그룹 나누기
+
+ // 남자 리스트
+ List males = members.stream()
+ .filter(m -> "MALE".equalsIgnoreCase(m.getUser().getGender()))
+ .collect(Collectors.toList());
+
+ // 여자 리스트
+ List females = members.stream()
+ .filter(m -> "FEMALE".equalsIgnoreCase(m.getUser().getGender()))
+ .collect(Collectors.toList());
+
+ List groupA;
+ List groupB;
+
+ // 기준 잡기
+ // 수가 적은 쪽이 기준 / 수가 같을 경우 남자가 기준
+ if (males.size() < females.size()) {
+ groupA = males;
+ groupB = females;
+ } else if (females.size() < males.size()) {
+ groupA = females;
+ groupB = males;
+ } else {
+ groupA = males;
+ groupB = females;
+ }
+
+ // 3. 후보 리스트 Map 생성
+ // Map을 통한 후보 리스트 조합 생성 (groupA 의 각 멤버별로 groupB 와 전부 조합)
+ Map> candidateMap = createCandidateMap(groupA, groupB, teamId);
+
+ // 4. 모든 쌍 점수 계산
+ // 후보 Map에 담긴 후보들로 A-B 모든 쌍 생성, 다시 MBTI + 유사도 점수 합산
+ // PairMatch 객체에 저장
+ List pairMatches = generateAllPairMatches(candidateMap, memberMap);
+
+ // 5. 점수 내림차순 정렬
+ pairMatches.sort(Comparator.comparingDouble(PairMatch::getTotalScore).reversed());
+
+ // 6. Greedy 매칭 수행
+ // 이미 매칭된 유저가 포함된 쌍은 건너뜀
+ // 새로 생성되는 그룹은 SubGroup
+ // SubGroupMember 테이블에 두 사람 매핑
+ // 매칭 시 그룹명은 팀이름 + index (홍길통A1, 홍길동A2 ...)
+ Set matchedUserIds = new HashSet<>();
+ List subGroups = new ArrayList<>();
+ int groupIndex = 1;
+
+ for (PairMatch pair : pairMatches) {
+ if (matchedUserIds.contains(pair.userA.getUser().getId())
+ || matchedUserIds.contains(pair.userB.getUser().getId())) {
+ continue;
+ }
+
+ String groupName = team.getTeamName() + groupIndex;
+ SubGroup sg = SubGroup.builder()
+ .team(team)
+ .name(groupName)
+ .build();
+ subGroupRepository.save(sg);
+
+ saveSubGroupMember(sg, pair.userA.getUser());
+ saveSubGroupMember(sg, pair.userB.getUser());
+
+ matchedUserIds.add(pair.userA.getUser().getId());
+ matchedUserIds.add(pair.userB.getUser().getId());
+
+ subGroups.add(sg);
+ groupIndex++;
+ }
+
+ // 7. 잉여 처리
+ handleLeftovers(groupA, groupB, matchedUserIds, team, groupIndex, subGroups);
+
+ // 8. 결과 DTO 변환
+ return buildMatchingResponseDto(team, subGroups);
+ }
+
+ // groupA의 각 멤버에게 groupB 중 top N 후보자 리스트를 만들어줌
+ // 점수 높은 순서대로 5명 (동점자 포함) 까지
+ private Map> createCandidateMap(List groupA,
+ List groupB,
+ Long teamId) {
+ Map> candidateMap = new HashMap<>();
+
+ for (TeamMember tmA : groupA) {
+ List tempList = new ArrayList<>();
+
+ for (TeamMember tmB : groupB) {
+ int mbtiScore = calculateMbtiTotalScore(tmA.getUser(), tmB.getUser());
+ double similarityScore = calculateSimilarityScore(tmA.getUser(), tmB.getUser(), teamId);
+ // 가중치 계산으로 조정
+ double totalScore = mbtiScore * MBTI_WEIGHT + similarityScore * SIMILARITY_WEIGHT;
+
+ tempList.add(new PairMatch(tmA, tmB, totalScore));
+ }
+
+ tempList.sort(Comparator.comparingDouble(PairMatch::getTotalScore).reversed());
+
+ List topCandidates = new ArrayList<>();
+ double lastScore = -1;
+
+ for (int i = 0; i < tempList.size(); i++) {
+ PairMatch pm = tempList.get(i);
+ if (i < 5) {
+ topCandidates.add(pm);
+ lastScore = pm.totalScore;
+ } else if (pm.totalScore == lastScore) {
+ topCandidates.add(pm);
+ } else {
+ break;
+ }
+ }
+
+ candidateMap.put(tmA.getUser().getId(), topCandidates);
+ }
+
+ return candidateMap;
+ }
+
+ // candidateMap 기반으로 모든 (A,B) 쌍에 대해 PairMatch 생성
+ // 다시 MBTI 점수 + 질문 유사도 점수 계산
+ private List generateAllPairMatches(Map> candidateMap,
+ Map memberMap) {
+ List pairs = new ArrayList<>();
+
+ for (List pairList : candidateMap.values()) {
+ pairs.addAll(pairList);
+ }
+
+ return pairs;
+ }
+
+
+ // A→B, B→A MBTI 점수를 각각 구해서 합산
+ // 대칭적이지 않을 수도 있다는 점 고려 (현재 데이터는 대칭적임)
+ private int calculateMbtiTotalScore(User a, User b) {
+ int scoreAtoB = mbtiScoreProvider.getScore(a.getMbti(), b.getMbti());
+ int scoreBtoA = mbtiScoreProvider.getScore(b.getMbti(), a.getMbti());
+ return scoreAtoB + scoreBtoA;
+ }
+
+ // 팀별로 등록된 질문 리스트 조회
+ // 각 질문 별로 A와 B의 점수 차이를 계산 → 유사도 환산
+ // 차이가 0이면 유사도 5, 차이가 5면 유사도 0
+ // 전체 유사도 점수 → 100% 환산
+ private double calculateSimilarityScore(User a, User b, Long teamId) {
+ List answersA = answerRepository.findByUser_Id(a.getId());
+ List answersB = answerRepository.findByUser_Id(b.getId());
+
+ // 팀별 질문 수 확보
+ List questions = questionRepository.findByTeam_TeamId(teamId);
+ int totalQuestions = questions.size();
+
+ int totalSimilarity = 0;
+
+ for (Question q : questions) {
+ int scoreA = answersA.stream()
+ .filter(ans -> ans.getQuestion().getId().equals(q.getId()))
+ .map(Answer::getScore)
+ .findFirst()
+ .orElse(0);
+
+ int scoreB = answersB.stream()
+ .filter(ans -> ans.getQuestion().getId().equals(q.getId()))
+ .map(Answer::getScore)
+ .findFirst()
+ .orElse(0);
+
+ int diff = Math.abs(scoreA - scoreB);
+ int similarity = 5 - diff;
+ totalSimilarity += similarity;
+ }
+
+ double similarityRate = (double) totalSimilarity / (5 * totalQuestions);
+ return similarityRate * 100;
+ }
+
+ // 6. Greedy 매칭 결과 저장
+ private void saveSubGroupMember(SubGroup sg, User user) {
+ SubGroupMember sgm = SubGroupMember.builder()
+ .subGroup(sg)
+ .user(user)
+ .build();
+ subGroupMemberRepository.save(sgm);
+ }
+
+ // 7. 잉여 처리
+ private void handleLeftovers(List groupA,
+ List groupB,
+ Set matchedUserIds,
+ Team team,
+ int groupIndex,
+ List subGroups) {
+
+ // 그룹 이름 중복 방지
+ Set existingGroupNames = subGroups.stream()
+ .map(SubGroup::getName)
+ .collect(Collectors.toSet());
+
+ List leftovers = new ArrayList<>();
+ groupA.stream()
+ .filter(tm -> !matchedUserIds.contains(tm.getUser().getId()))
+ .forEach(leftovers::add);
+ groupB.stream()
+ .filter(tm -> !matchedUserIds.contains(tm.getUser().getId()))
+ .forEach(leftovers::add);
+
+ Iterator it = leftovers.iterator();
+
+ while (it.hasNext()) {
+ TeamMember tm1 = it.next();
+ if (it.hasNext()) {
+ TeamMember tm2 = it.next();
+
+ // 잉여 그룹 이름 생성
+ String groupName;
+ do {
+ groupName = team.getTeamName() + groupIndex;
+ groupIndex++;
+ } while (existingGroupNames.contains(groupName));
+ existingGroupNames.add(groupName);
+
+ SubGroup sg = SubGroup.builder()
+ .team(team)
+ .name(groupName)
+ .build();
+ subGroupRepository.save(sg);
+
+ saveSubGroupMember(sg, tm1.getUser());
+ saveSubGroupMember(sg, tm2.getUser());
+
+ subGroups.add(sg);
+
+ } else {
+ // 홀수 남음 → 기존 그룹 중 가장 점수 높은 그룹으로 편입
+ if (!subGroups.isEmpty()) {
+ SubGroup targetGroup = subGroups.stream()
+ .max(Comparator.comparing(sg -> {
+ List members = subGroupMemberRepository.findBySubGroup_Id(sg.getId());
+ return members.size();
+ }))
+ .orElse(subGroups.get(0));
+ saveSubGroupMember(targetGroup, tm1.getUser());
+ } else {
+ // 기존 그룹이 없으면 단독 그룹 생성
+ String groupName;
+ do {
+ groupName = team.getTeamName() + groupIndex;
+ groupIndex++;
+ } while (existingGroupNames.contains(groupName));
+ existingGroupNames.add(groupName);
+
+ SubGroup sg = SubGroup.builder()
+ .team(team)
+ .name(groupName)
+ .build();
+ subGroupRepository.save(sg);
+
+ saveSubGroupMember(sg, tm1.getUser());
+ subGroups.add(sg);
+ }
+ }
+ }
+ }
+
+ // 8. 결과 DTO 생성
+ private MatchingResponseDto buildMatchingResponseDto(Team team, List subGroups) {
+ List resultDtos = new ArrayList<>();
+
+ for (SubGroup sg : subGroups) {
+ List members = subGroupMemberRepository.findBySubGroup_Id(sg.getId());
+ List userDtos = members.stream()
+ .map(sgm -> {
+ User u = sgm.getUser();
+ return UserResponseDto.builder()
+ .id(u.getId())
+ .name(u.getName())
+ .email(u.getEmail())
+ .gender(u.getGender())
+ .mbti(u.getMbti())
+ .build();
+ })
+ .collect(Collectors.toList());
+
+ resultDtos.add(MatchingResultDto.builder()
+ .subGroupId(sg.getId())
+ .groupName(sg.getName())
+ .members(userDtos)
+ .build());
+ }
+
+ return MatchingResponseDto.builder()
+ .teamId(team.getTeamId())
+ .teamName(team.getTeamName())
+ .subGroups(resultDtos)
+ .build();
+ }
+
+ /**
+ * 내부 클래스 PairMatch
+ */
+ @Data
+ @AllArgsConstructor
+ static class PairMatch {
+ private TeamMember userA;
+ private TeamMember userB;
+ private double totalScore;
+ }
+
+
+ // 유저 ID 기준으로 기존 Answer 삭제
+ // 해당 유저의 기존 Answer를 삭제하고 새 Answer를 저장
+ // 새 Answer를 전부 INSERT
+ // MatchingService가 매칭 돌릴 때 최신 데이터를 사용
+ @Transactional
+ public void saveAnswers(AnswerRequestDto dto) {
+ Long userId = dto.getUserId();
+
+ // 기존 Answer 전부 삭제
+ List existingAnswers = answerRepository.findByUser_Id(userId);
+ answerRepository.deleteAll(existingAnswers);
+
+ // 새 Answer 저장
+ List newAnswers = dto.getAnswers().stream()
+ .map(single -> Answer.builder()
+ .user(User.builder().id(userId).build())
+ .question(Question.builder().id(single.getQuestionId()).build())
+ .score(single.getScore())
+ .build())
+ .collect(Collectors.toList());
+
+ answerRepository.saveAll(newAnswers);
+ }
+
+
+ // 한 번에 여러 개의 새로운 Question을 DB에 등록
+ @Transactional
+ public void createQuestions(QuestionRequestDto dto) {
+ Long teamId = dto.getTeamId();
+
+ List questions = dto.getQuestions().stream()
+ .map(q -> Question.builder()
+ .team(Team.builder().teamId(teamId).build())
+ .text(q)
+ .build())
+ .collect(Collectors.toList());
+
+ questionRepository.saveAll(questions);
+ }
+
+
+ // 특정 Question의 질문 내용을 수정
+ @Transactional
+ public void updateQuestion(Long questionId, QuestionUpdateDto dto) {
+ Question question = questionRepository.findById(questionId)
+ .orElseThrow(() -> new IllegalArgumentException("Question not found: " + questionId));
+
+ question.setText(dto.getText());
+ }
+
+
+ // 특정 팀의 모든 질문 리스트를 조회 (읽기 전용 트랜잭션)
+ @Transactional(readOnly = true)
+ public List getQuestions(Long teamId) {
+ List questions = questionRepository.findByTeam_TeamId(teamId);
+
+ return questions.stream()
+ .map(q -> QuestionResponseDto.builder()
+ .id(q.getId())
+ .text(q.getText())
+ .build())
+ .collect(Collectors.toList());
+ }
+
+
+ // Question에 연결된 Answer들을 먼저 삭제한 뒤, Question을 삭제
+ @Transactional
+ public void deleteQuestion(Long questionId) {
+ // 삭제할 Question과 연결된 모든 Answer 레코드 조회
+ List answers = answerRepository.findByQuestion_Id(questionId);
+ // 조회된 Answer 레코드 전부 삭제
+ answerRepository.deleteAll(answers);
+ // 마지막으로 Question 자체 삭제
+ questionRepository.deleteById(questionId);
+ }
+
+
+}
diff --git a/src/main/java/com/ccapp/ccgo/user/User.java b/src/main/java/com/ccapp/ccgo/user/User.java
index 34c99f6..5ee781d 100644
--- a/src/main/java/com/ccapp/ccgo/user/User.java
+++ b/src/main/java/com/ccapp/ccgo/user/User.java
@@ -54,6 +54,10 @@ public class User {
@Column(nullable = false)
private Role role;
+ // MBTI 필드
+ @Column(name = "mbti")
+ private String mbti;
+
// 회원 가입 시 자동으로 현재 시간 설정
@PrePersist
public void prePersist() {
From 98c3eedbfefcffe5ace0ded4c953764f90776f70 Mon Sep 17 00:00:00 2001
From: bendy41
Date: Mon, 7 Jul 2025 13:32:56 +0900
Subject: [PATCH 012/132] Add mission_sys
---
.../com/ccapp/ccgo/common/MissionStatus.java | 7 ++
.../ccgo/mission/MissionServiceImpl.java | 88 +++++++++++++++++++
.../ccapp/ccgo/mission/MissionTemplate.java | 26 ++++++
.../java/com/ccapp/ccgo/mission/Partner.java | 30 +++++++
.../ccapp/ccgo/mission/PartnerMission.java | 34 +++++++
.../ccgo/mission/PartnerServiceImpl.java | 71 +++++++++++++++
.../com/ccapp/ccgo/mission/UserMission.java | 37 ++++++++
.../repository/MissionTemplateRepository.java | 15 ++++
.../repository/PartnerMissionRepository.java | 16 ++++
.../mission/repository/PartnerRepository.java | 19 ++++
.../repository/UserMissionRepository.java | 11 +++
.../ccgo/mission/service/MissionService.java | 9 ++
.../ccgo/mission/service/PartnerService.java | 21 +++++
13 files changed, 384 insertions(+)
create mode 100644 src/main/java/com/ccapp/ccgo/common/MissionStatus.java
create mode 100644 src/main/java/com/ccapp/ccgo/mission/MissionServiceImpl.java
create mode 100644 src/main/java/com/ccapp/ccgo/mission/MissionTemplate.java
create mode 100644 src/main/java/com/ccapp/ccgo/mission/Partner.java
create mode 100644 src/main/java/com/ccapp/ccgo/mission/PartnerMission.java
create mode 100644 src/main/java/com/ccapp/ccgo/mission/PartnerServiceImpl.java
create mode 100644 src/main/java/com/ccapp/ccgo/mission/UserMission.java
create mode 100644 src/main/java/com/ccapp/ccgo/mission/repository/MissionTemplateRepository.java
create mode 100644 src/main/java/com/ccapp/ccgo/mission/repository/PartnerMissionRepository.java
create mode 100644 src/main/java/com/ccapp/ccgo/mission/repository/PartnerRepository.java
create mode 100644 src/main/java/com/ccapp/ccgo/mission/repository/UserMissionRepository.java
create mode 100644 src/main/java/com/ccapp/ccgo/mission/service/MissionService.java
create mode 100644 src/main/java/com/ccapp/ccgo/mission/service/PartnerService.java
diff --git a/src/main/java/com/ccapp/ccgo/common/MissionStatus.java b/src/main/java/com/ccapp/ccgo/common/MissionStatus.java
new file mode 100644
index 0000000..66777fb
--- /dev/null
+++ b/src/main/java/com/ccapp/ccgo/common/MissionStatus.java
@@ -0,0 +1,7 @@
+package com.ccapp.ccgo.common;
+
+
+public enum MissionStatus {
+ PENDING,
+ COMPLETE
+}
\ No newline at end of file
diff --git a/src/main/java/com/ccapp/ccgo/mission/MissionServiceImpl.java b/src/main/java/com/ccapp/ccgo/mission/MissionServiceImpl.java
new file mode 100644
index 0000000..da4b88a
--- /dev/null
+++ b/src/main/java/com/ccapp/ccgo/mission/MissionServiceImpl.java
@@ -0,0 +1,88 @@
+package com.ccapp.ccgo.mission;
+
+import com.ccapp.ccgo.common.MissionStatus;
+import com.ccapp.ccgo.mission.repository.MissionTemplateRepository;
+import com.ccapp.ccgo.mission.repository.PartnerMissionRepository;
+import com.ccapp.ccgo.mission.repository.PartnerRepository;
+import com.ccapp.ccgo.mission.repository.UserMissionRepository;
+import com.ccapp.ccgo.mission.service.MissionService;
+import com.ccapp.ccgo.repository.UserRepository;
+import com.ccapp.ccgo.user.User;
+import jakarta.transaction.*;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDate;
+import java.util.List;
+import java.util.Optional;
+
+@Service
+@RequiredArgsConstructor
+@Transactional
+public class MissionServiceImpl implements MissionService {
+
+ private final PartnerRepository partnerRepository;
+ private final PartnerMissionRepository partnerMissionRepository;
+ private final UserMissionRepository userMissionRepository;
+ private final MissionTemplateRepository missionTemplateRepository;
+ private final UserRepository userRepository;
+
+ @Override
+ public PartnerMission refreshPartnerMission(Long userId) {
+ // 1. 유저 정보 조회
+ User user = userRepository.findById(userId)
+ .orElseThrow(() -> new IllegalArgumentException("유저 없음"));
+
+ // 2. 유저가 속한 Partner 찾기 (user1 또는 user2인 Partner)
+ Partner partner = partnerRepository.findByUser1OrUser2(user, user)
+ .orElseThrow(() -> new IllegalStateException("해당 유저의 짝이 없음"));
+
+ // 3. 기존 활성 미션 비활성화 처리
+ List activeMissions = partnerMissionRepository.findByPartnerAndIsActiveTrue(partner);
+ for (PartnerMission pm : activeMissions) {
+ pm.setActive(false);
+ partnerMissionRepository.save(pm);
+ }
+
+ // 1. 마지막 미션 조회
+ Optional lastMission = partnerMissionRepository.findTopByPartnerOrderByIdDesc(partner);
+ Long nextTemplateId = lastMission.map(pm -> pm.getTemplate().getId() + 1).orElse(1L);
+ if (nextTemplateId > 50L) nextTemplateId = 1L; // 50개를 순환하면 다시 1로
+
+ // 2. 템플릿 미션 조회
+ MissionTemplate template = missionTemplateRepository.findById(nextTemplateId)
+ .orElseThrow(() -> new RuntimeException("템플릿 미션 없음"));
+
+ // 3. 템플릿 기반으로 PartnerMission 생성
+ PartnerMission newMission = PartnerMission.builder()
+ .partner(partner)
+ .template(template) // <-- template를 저장
+ .title(template.getTitle())
+ .description(template.getDescription())
+ .dueDate(LocalDate.now().plusDays(7))
+ .isActive(true)
+ .build();
+
+ partnerMissionRepository.save(newMission);
+
+ // 5. 기존 UserMission은 유지하거나 삭제 가능 (옵션)
+ // 새 UserMission 생성 (짝의 두 유저에게)
+ User user1 = partner.getUser1();
+ User user2 = partner.getUser2();
+
+ createUserMission(user1, newMission);
+ createUserMission(user2, newMission);
+
+ return newMission;
+ }
+
+ private void createUserMission(User user, PartnerMission mission) {
+ UserMission um = UserMission.builder()
+ .user(user)
+ .partnerMission(mission)
+ .status(MissionStatus.PENDING)
+ .build();
+
+ userMissionRepository.save(um);
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/ccapp/ccgo/mission/MissionTemplate.java b/src/main/java/com/ccapp/ccgo/mission/MissionTemplate.java
new file mode 100644
index 0000000..6b135f0
--- /dev/null
+++ b/src/main/java/com/ccapp/ccgo/mission/MissionTemplate.java
@@ -0,0 +1,26 @@
+package com.ccapp.ccgo.mission;
+
+import jakarta.persistence.Entity;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import lombok.*;
+
+
+@Entity
+@Getter
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class MissionTemplate {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Long id;
+
+ private String title;
+ private String description;
+
+ //1학점 3학점 5학점 10학점
+ private int score;
+}
\ No newline at end of file
diff --git a/src/main/java/com/ccapp/ccgo/mission/Partner.java b/src/main/java/com/ccapp/ccgo/mission/Partner.java
new file mode 100644
index 0000000..28a071b
--- /dev/null
+++ b/src/main/java/com/ccapp/ccgo/mission/Partner.java
@@ -0,0 +1,30 @@
+package com.ccapp.ccgo.mission;
+
+import com.ccapp.ccgo.team.Team;
+import com.ccapp.ccgo.user.User;
+import jakarta.persistence.*;
+import lombok.*;
+
+@Getter
+@Entity
+@NoArgsConstructor(access = AccessLevel.PROTECTED)
+@AllArgsConstructor
+@Builder
+public class Partner {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Long id;
+
+ @ManyToOne
+ @JoinColumn(name = "team_id")
+ private Team team;
+
+ @ManyToOne
+ @JoinColumn(name = "user1_id")
+ private User user1;
+
+ @ManyToOne
+ @JoinColumn(name = "user2_id")
+ private User user2;
+}
\ No newline at end of file
diff --git a/src/main/java/com/ccapp/ccgo/mission/PartnerMission.java b/src/main/java/com/ccapp/ccgo/mission/PartnerMission.java
new file mode 100644
index 0000000..e85c3d4
--- /dev/null
+++ b/src/main/java/com/ccapp/ccgo/mission/PartnerMission.java
@@ -0,0 +1,34 @@
+package com.ccapp.ccgo.mission;
+import jakarta.persistence.*;
+import lombok.*;
+
+import java.time.LocalDate;
+
+@Entity
+@Getter
+@Setter
+@NoArgsConstructor(access = AccessLevel.PROTECTED)
+@AllArgsConstructor
+@Builder
+public class PartnerMission {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Long id;
+
+ @ManyToOne
+ @JoinColumn(name = "template_id")
+ private MissionTemplate template;
+
+ @ManyToOne
+ @JoinColumn(name = "partner_id")
+ private Partner partner;
+
+ private String title;
+
+ private String description;
+
+ private LocalDate dueDate;
+
+ private boolean isActive;
+}
\ No newline at end of file
diff --git a/src/main/java/com/ccapp/ccgo/mission/PartnerServiceImpl.java b/src/main/java/com/ccapp/ccgo/mission/PartnerServiceImpl.java
new file mode 100644
index 0000000..e9f0dee
--- /dev/null
+++ b/src/main/java/com/ccapp/ccgo/mission/PartnerServiceImpl.java
@@ -0,0 +1,71 @@
+package com.ccapp.ccgo.mission;
+
+import com.ccapp.ccgo.mission.repository.PartnerRepository;
+import com.ccapp.ccgo.mission.service.PartnerService;
+import com.ccapp.ccgo.team.Team;
+import com.ccapp.ccgo.user.User;
+import jakarta.transaction.*;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
+
+@Service
+@RequiredArgsConstructor
+@Transactional
+public class PartnerServiceImpl implements PartnerService {
+
+ private final PartnerRepository partnerRepository;
+ private final SubGroupMemberRepository subGroupMemberRepository;
+
+ @Override
+ public List createPartnersFromSubGroups(List subGroups) {
+ List partners = new ArrayList<>();
+
+ for (SubGroup sg : subGroups) {
+ List members = subGroupMemberRepository.findBySubGroup_Id(sg.getId());
+
+ if (members.size() < 2) {
+ // 멤버가 2명 미만인 경우 처리 (예: 스킵하거나 예외 처리)
+ continue;
+ }
+
+ User user1 = members.get(0).getUser();
+ User user2 = members.get(1).getUser();
+ Team team = sg.getTeam();
+
+ // 중복 Partner 체크 (팀, user1, user2 기준)
+ boolean exists = partnerRepository.existsByTeamAndUser1AndUser2(team, user1, user2);
+ if (exists) {
+ continue;
+ }
+
+ Partner partner = Partner.builder()
+ .team(team)
+ .user1(user1)
+ .user2(user2)
+ .build();
+
+ partners.add(partnerRepository.save(partner));
+ }
+
+ return partners;
+ }
+
+ @Override
+ public List findPartnersByTeamId(Long teamId) {
+ return partnerRepository.findByTeamId(teamId);
+ }
+
+ @Override
+ public Optional findById(Long partnerId) {
+ return partnerRepository.findById(partnerId);
+ }
+
+ @Override
+ public void deletePartner(Long partnerId) {
+ partnerRepository.deleteById(partnerId);
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/ccapp/ccgo/mission/UserMission.java b/src/main/java/com/ccapp/ccgo/mission/UserMission.java
new file mode 100644
index 0000000..89f9ccb
--- /dev/null
+++ b/src/main/java/com/ccapp/ccgo/mission/UserMission.java
@@ -0,0 +1,37 @@
+package com.ccapp.ccgo.mission;
+
+import com.ccapp.ccgo.common.MissionStatus;
+import com.ccapp.ccgo.user.User;
+import jakarta.persistence.*;
+import lombok.*;
+
+import java.time.LocalDateTime;
+
+@Entity
+@Getter
+@NoArgsConstructor(access = AccessLevel.PROTECTED)
+@AllArgsConstructor
+@Builder
+public class UserMission {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Long id;
+
+ // 미션을 수행하는 유저
+ @ManyToOne
+ @JoinColumn(name = "user_id")
+ private User user;
+
+ // 짝 미션
+ @ManyToOne
+ @JoinColumn(name = "partner_mission_id")
+ private PartnerMission partnerMission;
+
+ // 미션 상태 (예: PENDING, COMPLETE)
+ @Enumerated(EnumType.STRING)
+ private MissionStatus status;
+
+ // 미션 제출 시간
+ private LocalDateTime submittedAt;
+}
\ No newline at end of file
diff --git a/src/main/java/com/ccapp/ccgo/mission/repository/MissionTemplateRepository.java b/src/main/java/com/ccapp/ccgo/mission/repository/MissionTemplateRepository.java
new file mode 100644
index 0000000..4d6c378
--- /dev/null
+++ b/src/main/java/com/ccapp/ccgo/mission/repository/MissionTemplateRepository.java
@@ -0,0 +1,15 @@
+package com.ccapp.ccgo.mission.repository;
+
+import com.ccapp.ccgo.mission.MissionTemplate;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+
+import java.util.List;
+
+public interface MissionTemplateRepository extends JpaRepository {
+
+ List findByScoreOrderById(int score);
+
+
+ Long findMaxId();
+}
diff --git a/src/main/java/com/ccapp/ccgo/mission/repository/PartnerMissionRepository.java b/src/main/java/com/ccapp/ccgo/mission/repository/PartnerMissionRepository.java
new file mode 100644
index 0000000..ab839db
--- /dev/null
+++ b/src/main/java/com/ccapp/ccgo/mission/repository/PartnerMissionRepository.java
@@ -0,0 +1,16 @@
+package com.ccapp.ccgo.mission.repository;
+import com.ccapp.ccgo.mission.Partner;
+import com.ccapp.ccgo.mission.PartnerMission;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import java.util.List;
+import java.util.Optional;
+
+public interface PartnerMissionRepository extends JpaRepository {
+
+ List findByPartnerId(Long partnerId);
+
+ List findByPartnerAndIsActiveTrue(Partner partner);
+
+ Optional findTopByPartnerOrderByIdDesc(Partner partner);
+}
\ No newline at end of file
diff --git a/src/main/java/com/ccapp/ccgo/mission/repository/PartnerRepository.java b/src/main/java/com/ccapp/ccgo/mission/repository/PartnerRepository.java
new file mode 100644
index 0000000..68d05a4
--- /dev/null
+++ b/src/main/java/com/ccapp/ccgo/mission/repository/PartnerRepository.java
@@ -0,0 +1,19 @@
+package com.ccapp.ccgo.mission.repository;
+
+import com.ccapp.ccgo.mission.Partner;
+import com.ccapp.ccgo.team.Team;
+import com.ccapp.ccgo.user.User;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import java.util.List;
+import java.util.Optional;
+
+public interface PartnerRepository extends JpaRepository {
+ // 추가로 필요한 커스텀 메서드 작성 가능
+ boolean existsByTeamAndUser1AndUser2(Team team, User user1, User user2);
+
+ List findByTeamId(Long teamId);
+
+ Optional findByUser1OrUser2(User user1, User user2);
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/ccapp/ccgo/mission/repository/UserMissionRepository.java b/src/main/java/com/ccapp/ccgo/mission/repository/UserMissionRepository.java
new file mode 100644
index 0000000..c026c7d
--- /dev/null
+++ b/src/main/java/com/ccapp/ccgo/mission/repository/UserMissionRepository.java
@@ -0,0 +1,11 @@
+package com.ccapp.ccgo.mission.repository;
+
+import com.ccapp.ccgo.mission.UserMission;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import java.util.List;
+
+public interface UserMissionRepository extends JpaRepository {
+ List findByUserId(Long userId);
+ List findByPartnerMissionId(Long partnerMissionId);
+}
\ No newline at end of file
diff --git a/src/main/java/com/ccapp/ccgo/mission/service/MissionService.java b/src/main/java/com/ccapp/ccgo/mission/service/MissionService.java
new file mode 100644
index 0000000..ec9a98b
--- /dev/null
+++ b/src/main/java/com/ccapp/ccgo/mission/service/MissionService.java
@@ -0,0 +1,9 @@
+package com.ccapp.ccgo.mission.service;
+
+import com.ccapp.ccgo.mission.PartnerMission;
+
+public interface MissionService {
+
+ // 유저가 새로고침 시 새로운 미션을 짝에 할당
+ PartnerMission refreshPartnerMission(Long userId);
+}
\ No newline at end of file
diff --git a/src/main/java/com/ccapp/ccgo/mission/service/PartnerService.java b/src/main/java/com/ccapp/ccgo/mission/service/PartnerService.java
new file mode 100644
index 0000000..dc96699
--- /dev/null
+++ b/src/main/java/com/ccapp/ccgo/mission/service/PartnerService.java
@@ -0,0 +1,21 @@
+package com.ccapp.ccgo.mission.service;
+
+import com.ccapp.ccgo.mission.Partner;
+
+import java.util.List;
+import java.util.Optional;
+
+public interface PartnerService {
+
+ // 매칭된 SubGroup 정보를 받아 Partner(짝) 생성
+ List createPartnersFromSubGroups(List subGroups);
+
+ // 팀별 Partner 목록 조회
+ List findPartnersByTeamId(Long teamId);
+
+ // Partner 조회
+ Optional findById(Long partnerId);
+
+ // Partner 삭제
+ void deletePartner(Long partnerId);
+}
\ No newline at end of file
From edb949c174d3109ab1aeff2ef15ed51b2ed4f17e Mon Sep 17 00:00:00 2001
From: bendy41
Date: Mon, 7 Jul 2025 13:57:09 +0900
Subject: [PATCH 013/132] fix
---
.../com/ccapp/ccgo/mission/PartnerServiceImpl.java | 10 ++++------
.../mission/repository/MissionTemplateRepository.java | 2 +-
.../ccgo/mission/repository/PartnerRepository.java | 3 ++-
.../com/ccapp/ccgo/mission/service/PartnerService.java | 1 +
.../ccapp/ccgo/repository/TeamMemberRepository.java | 3 ++-
.../java/com/ccapp/ccgo/service/MatchingService.java | 2 +-
src/main/resources/application.properties | 2 +-
7 files changed, 12 insertions(+), 11 deletions(-)
diff --git a/src/main/java/com/ccapp/ccgo/mission/PartnerServiceImpl.java b/src/main/java/com/ccapp/ccgo/mission/PartnerServiceImpl.java
index e9f0dee..1a8cd88 100644
--- a/src/main/java/com/ccapp/ccgo/mission/PartnerServiceImpl.java
+++ b/src/main/java/com/ccapp/ccgo/mission/PartnerServiceImpl.java
@@ -1,7 +1,10 @@
package com.ccapp.ccgo.mission;
+import com.ccapp.ccgo.matching.SubGroup;
+import com.ccapp.ccgo.matching.SubGroupMember;
import com.ccapp.ccgo.mission.repository.PartnerRepository;
import com.ccapp.ccgo.mission.service.PartnerService;
+import com.ccapp.ccgo.repository.SubGroupMemberRepository;
import com.ccapp.ccgo.team.Team;
import com.ccapp.ccgo.user.User;
import jakarta.transaction.*;
@@ -27,11 +30,6 @@ public List createPartnersFromSubGroups(List subGroups) {
for (SubGroup sg : subGroups) {
List members = subGroupMemberRepository.findBySubGroup_Id(sg.getId());
- if (members.size() < 2) {
- // 멤버가 2명 미만인 경우 처리 (예: 스킵하거나 예외 처리)
- continue;
- }
-
User user1 = members.get(0).getUser();
User user2 = members.get(1).getUser();
Team team = sg.getTeam();
@@ -56,7 +54,7 @@ public List createPartnersFromSubGroups(List subGroups) {
@Override
public List findPartnersByTeamId(Long teamId) {
- return partnerRepository.findByTeamId(teamId);
+ return partnerRepository.findByTeam_TeamId(teamId);
}
@Override
diff --git a/src/main/java/com/ccapp/ccgo/mission/repository/MissionTemplateRepository.java b/src/main/java/com/ccapp/ccgo/mission/repository/MissionTemplateRepository.java
index 4d6c378..d639fb0 100644
--- a/src/main/java/com/ccapp/ccgo/mission/repository/MissionTemplateRepository.java
+++ b/src/main/java/com/ccapp/ccgo/mission/repository/MissionTemplateRepository.java
@@ -10,6 +10,6 @@ public interface MissionTemplateRepository extends JpaRepository findByScoreOrderById(int score);
-
+ @Query("SELECT MAX(m.id) FROM MissionTemplate m")
Long findMaxId();
}
diff --git a/src/main/java/com/ccapp/ccgo/mission/repository/PartnerRepository.java b/src/main/java/com/ccapp/ccgo/mission/repository/PartnerRepository.java
index 68d05a4..8c20e09 100644
--- a/src/main/java/com/ccapp/ccgo/mission/repository/PartnerRepository.java
+++ b/src/main/java/com/ccapp/ccgo/mission/repository/PartnerRepository.java
@@ -12,7 +12,8 @@ public interface PartnerRepository extends JpaRepository {
// 추가로 필요한 커스텀 메서드 작성 가능
boolean existsByTeamAndUser1AndUser2(Team team, User user1, User user2);
- List findByTeamId(Long teamId);
+ List findByTeam_TeamId(Long teamId);
+
Optional findByUser1OrUser2(User user1, User user2);
diff --git a/src/main/java/com/ccapp/ccgo/mission/service/PartnerService.java b/src/main/java/com/ccapp/ccgo/mission/service/PartnerService.java
index dc96699..99df79c 100644
--- a/src/main/java/com/ccapp/ccgo/mission/service/PartnerService.java
+++ b/src/main/java/com/ccapp/ccgo/mission/service/PartnerService.java
@@ -1,5 +1,6 @@
package com.ccapp.ccgo.mission.service;
+import com.ccapp.ccgo.matching.SubGroup;
import com.ccapp.ccgo.mission.Partner;
import java.util.List;
diff --git a/src/main/java/com/ccapp/ccgo/repository/TeamMemberRepository.java b/src/main/java/com/ccapp/ccgo/repository/TeamMemberRepository.java
index 4d538c7..dee546e 100644
--- a/src/main/java/com/ccapp/ccgo/repository/TeamMemberRepository.java
+++ b/src/main/java/com/ccapp/ccgo/repository/TeamMemberRepository.java
@@ -31,5 +31,6 @@ public interface TeamMemberRepository extends JpaRepository {
// 이미 특정 유저가 특정 팀 인지 확인
boolean existsByUserAndTeam(User user, Team team);
- List findActiveMembersByTeamId(Long teamId);
+ List findByTeam_TeamIdAndIsActiveTrue(Long teamId);
+
}
diff --git a/src/main/java/com/ccapp/ccgo/service/MatchingService.java b/src/main/java/com/ccapp/ccgo/service/MatchingService.java
index d5df5ce..59a6fc6 100644
--- a/src/main/java/com/ccapp/ccgo/service/MatchingService.java
+++ b/src/main/java/com/ccapp/ccgo/service/MatchingService.java
@@ -36,7 +36,7 @@ public MatchingResponseDto performMatching(Long teamId) {
// 1. 팀 정보 가져오기
// 해당 팀에 소속된 팀원 전체 가져옴
// 팀원이 없다면 (비어있다면) IllegalArgumentException
- List members = teamMemberRepository.findActiveMembersByTeamId(teamId);
+ List members = teamMemberRepository.findByTeam_TeamIdAndIsActiveTrue(teamId);
Map memberMap = members.stream()
.collect(Collectors.toMap(tm -> tm.getUser().getId(), tm -> tm));
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index 22f7f7e..65d55a6 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -4,7 +4,7 @@ server.address=0.0.0.0
server.port=8080
spring.datasource.username = root
-spring.datasource.password = qkrwlsdn
+spring.datasource.password = 06250730cc
jwt.secret=????????????????????1234!@11111123451234432AVDSFUCKYOUSHITHOLY
jwt.access-token-expiration=86400000
From fbea4ac8314c10a72182ef68f2a50651481e121c Mon Sep 17 00:00:00 2001
From: bendy41
Date: Mon, 7 Jul 2025 18:54:17 +0900
Subject: [PATCH 014/132] Done merge
---
.../mission/controller/MissionController.java | 25 ++++++++
.../mission/{ => domain}/MissionTemplate.java | 2 +-
.../ccgo/mission/{ => domain}/Partner.java | 2 +-
.../mission/{ => domain}/PartnerMission.java | 2 +-
.../mission/{ => domain}/UserMission.java | 2 +-
.../ccgo/mission/dto/MissionTemplateDto.java | 24 ++++++++
.../ccapp/ccgo/mission/dto/PartnerDto.java | 24 ++++++++
.../ccgo/mission/dto/PartnerMissionDto.java | 30 ++++++++++
.../ccgo/mission/dto/UserMissionDto.java | 30 ++++++++++
.../repository/MissionTemplateRepository.java | 2 +-
.../repository/PartnerMissionRepository.java | 4 +-
.../mission/repository/PartnerRepository.java | 11 ++--
.../repository/UserMissionRepository.java | 2 +-
.../ccgo/mission/service/MissionService.java | 8 ++-
.../{ => service}/MissionServiceImpl.java | 60 +++++++++----------
.../ccgo/mission/service/PartnerService.java | 9 +--
.../{ => service}/PartnerServiceImpl.java | 51 +++++++---------
.../repository/SubGroupMemberRepository.java | 4 ++
.../ccapp/ccgo/service/MatchingService.java | 10 ++--
.../java/com/ccapp/ccgo/team/TeamMember.java | 3 -
src/main/java/com/ccapp/ccgo/user/User.java | 5 --
21 files changed, 210 insertions(+), 100 deletions(-)
create mode 100644 src/main/java/com/ccapp/ccgo/mission/controller/MissionController.java
rename src/main/java/com/ccapp/ccgo/mission/{ => domain}/MissionTemplate.java (92%)
rename src/main/java/com/ccapp/ccgo/mission/{ => domain}/Partner.java (93%)
rename src/main/java/com/ccapp/ccgo/mission/{ => domain}/PartnerMission.java (93%)
rename src/main/java/com/ccapp/ccgo/mission/{ => domain}/UserMission.java (95%)
create mode 100644 src/main/java/com/ccapp/ccgo/mission/dto/MissionTemplateDto.java
create mode 100644 src/main/java/com/ccapp/ccgo/mission/dto/PartnerDto.java
create mode 100644 src/main/java/com/ccapp/ccgo/mission/dto/PartnerMissionDto.java
create mode 100644 src/main/java/com/ccapp/ccgo/mission/dto/UserMissionDto.java
rename src/main/java/com/ccapp/ccgo/mission/{ => service}/MissionServiceImpl.java (53%)
rename src/main/java/com/ccapp/ccgo/mission/{ => service}/PartnerServiceImpl.java (56%)
diff --git a/src/main/java/com/ccapp/ccgo/mission/controller/MissionController.java b/src/main/java/com/ccapp/ccgo/mission/controller/MissionController.java
new file mode 100644
index 0000000..b8061a8
--- /dev/null
+++ b/src/main/java/com/ccapp/ccgo/mission/controller/MissionController.java
@@ -0,0 +1,25 @@
+package com.ccapp.ccgo.mission.controller;
+
+import com.ccapp.ccgo.mission.dto.PartnerMissionDto;
+import com.ccapp.ccgo.mission.service.MissionService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+@RestController
+@RequestMapping("/api/missions")
+@RequiredArgsConstructor
+public class MissionController {
+
+ private final MissionService missionService;
+
+ // 팀 ID와 유저 ID를 기반으로 미션 새로고침
+ @PostMapping("/refresh")
+ public ResponseEntity refreshPartnerMission(
+ @RequestParam Long teamId,
+ @RequestParam Long userId
+ ) {
+ PartnerMissionDto partnerMissionDto = missionService.refreshPartnerMission(teamId, userId);
+ return ResponseEntity.ok(partnerMissionDto);
+ }
+}
diff --git a/src/main/java/com/ccapp/ccgo/mission/MissionTemplate.java b/src/main/java/com/ccapp/ccgo/mission/domain/MissionTemplate.java
similarity index 92%
rename from src/main/java/com/ccapp/ccgo/mission/MissionTemplate.java
rename to src/main/java/com/ccapp/ccgo/mission/domain/MissionTemplate.java
index 6b135f0..2e5883a 100644
--- a/src/main/java/com/ccapp/ccgo/mission/MissionTemplate.java
+++ b/src/main/java/com/ccapp/ccgo/mission/domain/MissionTemplate.java
@@ -1,4 +1,4 @@
-package com.ccapp.ccgo.mission;
+package com.ccapp.ccgo.mission.domain;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
diff --git a/src/main/java/com/ccapp/ccgo/mission/Partner.java b/src/main/java/com/ccapp/ccgo/mission/domain/Partner.java
similarity index 93%
rename from src/main/java/com/ccapp/ccgo/mission/Partner.java
rename to src/main/java/com/ccapp/ccgo/mission/domain/Partner.java
index 28a071b..04fd3e8 100644
--- a/src/main/java/com/ccapp/ccgo/mission/Partner.java
+++ b/src/main/java/com/ccapp/ccgo/mission/domain/Partner.java
@@ -1,4 +1,4 @@
-package com.ccapp.ccgo.mission;
+package com.ccapp.ccgo.mission.domain;
import com.ccapp.ccgo.team.Team;
import com.ccapp.ccgo.user.User;
diff --git a/src/main/java/com/ccapp/ccgo/mission/PartnerMission.java b/src/main/java/com/ccapp/ccgo/mission/domain/PartnerMission.java
similarity index 93%
rename from src/main/java/com/ccapp/ccgo/mission/PartnerMission.java
rename to src/main/java/com/ccapp/ccgo/mission/domain/PartnerMission.java
index e85c3d4..879b868 100644
--- a/src/main/java/com/ccapp/ccgo/mission/PartnerMission.java
+++ b/src/main/java/com/ccapp/ccgo/mission/domain/PartnerMission.java
@@ -1,4 +1,4 @@
-package com.ccapp.ccgo.mission;
+package com.ccapp.ccgo.mission.domain;
import jakarta.persistence.*;
import lombok.*;
diff --git a/src/main/java/com/ccapp/ccgo/mission/UserMission.java b/src/main/java/com/ccapp/ccgo/mission/domain/UserMission.java
similarity index 95%
rename from src/main/java/com/ccapp/ccgo/mission/UserMission.java
rename to src/main/java/com/ccapp/ccgo/mission/domain/UserMission.java
index 89f9ccb..c714176 100644
--- a/src/main/java/com/ccapp/ccgo/mission/UserMission.java
+++ b/src/main/java/com/ccapp/ccgo/mission/domain/UserMission.java
@@ -1,4 +1,4 @@
-package com.ccapp.ccgo.mission;
+package com.ccapp.ccgo.mission.domain;
import com.ccapp.ccgo.common.MissionStatus;
import com.ccapp.ccgo.user.User;
diff --git a/src/main/java/com/ccapp/ccgo/mission/dto/MissionTemplateDto.java b/src/main/java/com/ccapp/ccgo/mission/dto/MissionTemplateDto.java
new file mode 100644
index 0000000..1762a7e
--- /dev/null
+++ b/src/main/java/com/ccapp/ccgo/mission/dto/MissionTemplateDto.java
@@ -0,0 +1,24 @@
+package com.ccapp.ccgo.mission.dto;
+
+import com.ccapp.ccgo.mission.domain.MissionTemplate;
+import lombok.Builder;
+import lombok.Data;
+
+@Data
+@Builder
+public class MissionTemplateDto {
+
+ private Long id;
+ private String title;
+ private String description;
+ private int score;
+
+ public static MissionTemplateDto fromEntity(MissionTemplate template) {
+ return MissionTemplateDto.builder()
+ .id(template.getId())
+ .title(template.getTitle())
+ .description(template.getDescription())
+ .score(template.getScore())
+ .build();
+ }
+}
diff --git a/src/main/java/com/ccapp/ccgo/mission/dto/PartnerDto.java b/src/main/java/com/ccapp/ccgo/mission/dto/PartnerDto.java
new file mode 100644
index 0000000..fe0a1d3
--- /dev/null
+++ b/src/main/java/com/ccapp/ccgo/mission/dto/PartnerDto.java
@@ -0,0 +1,24 @@
+package com.ccapp.ccgo.mission.dto;
+
+import com.ccapp.ccgo.mission.domain.Partner;
+import lombok.Builder;
+import lombok.Data;
+
+@Data
+@Builder
+public class PartnerDto {
+
+ private Long id;
+ private Long teamId;
+ private Long user1Id;
+ private Long user2Id;
+
+ public static PartnerDto fromEntity(Partner partner) {
+ return PartnerDto.builder()
+ .id(partner.getId())
+ .teamId(partner.getTeam().getTeamId())
+ .user1Id(partner.getUser1().getId())
+ .user2Id(partner.getUser2().getId())
+ .build();
+ }
+}
diff --git a/src/main/java/com/ccapp/ccgo/mission/dto/PartnerMissionDto.java b/src/main/java/com/ccapp/ccgo/mission/dto/PartnerMissionDto.java
new file mode 100644
index 0000000..1f0773e
--- /dev/null
+++ b/src/main/java/com/ccapp/ccgo/mission/dto/PartnerMissionDto.java
@@ -0,0 +1,30 @@
+package com.ccapp.ccgo.mission.dto;
+
+import com.ccapp.ccgo.mission.domain.PartnerMission;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.time.LocalDate;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class PartnerMissionDto {
+ private Long id;
+ private String title;
+ private String description;
+ private LocalDate dueDate;
+ private boolean isActive;
+
+ public static PartnerMissionDto fromEntity(PartnerMission pm) {
+ return new PartnerMissionDto(
+ pm.getId(),
+ pm.getTitle(),
+ pm.getDescription(),
+ pm.getDueDate(),
+ pm.isActive()
+ );
+ }
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/ccapp/ccgo/mission/dto/UserMissionDto.java b/src/main/java/com/ccapp/ccgo/mission/dto/UserMissionDto.java
new file mode 100644
index 0000000..b636618
--- /dev/null
+++ b/src/main/java/com/ccapp/ccgo/mission/dto/UserMissionDto.java
@@ -0,0 +1,30 @@
+package com.ccapp.ccgo.mission.dto;
+
+import com.ccapp.ccgo.common.MissionStatus;
+import com.ccapp.ccgo.mission.domain.UserMission;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.time.LocalDateTime;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class UserMissionDto {
+ private Long id;
+ private Long userId;
+ private Long partnerMissionId;
+ private MissionStatus status;
+ private LocalDateTime submittedAt;
+
+ public static UserMissionDto fromEntity(UserMission um) {
+ return new UserMissionDto(
+ um.getId(),
+ um.getUser().getId(),
+ um.getPartnerMission().getId(),
+ um.getStatus(),
+ um.getSubmittedAt()
+ );
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/ccapp/ccgo/mission/repository/MissionTemplateRepository.java b/src/main/java/com/ccapp/ccgo/mission/repository/MissionTemplateRepository.java
index d639fb0..dd30aff 100644
--- a/src/main/java/com/ccapp/ccgo/mission/repository/MissionTemplateRepository.java
+++ b/src/main/java/com/ccapp/ccgo/mission/repository/MissionTemplateRepository.java
@@ -1,6 +1,6 @@
package com.ccapp.ccgo.mission.repository;
-import com.ccapp.ccgo.mission.MissionTemplate;
+import com.ccapp.ccgo.mission.domain.MissionTemplate;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
diff --git a/src/main/java/com/ccapp/ccgo/mission/repository/PartnerMissionRepository.java b/src/main/java/com/ccapp/ccgo/mission/repository/PartnerMissionRepository.java
index ab839db..abe9ec5 100644
--- a/src/main/java/com/ccapp/ccgo/mission/repository/PartnerMissionRepository.java
+++ b/src/main/java/com/ccapp/ccgo/mission/repository/PartnerMissionRepository.java
@@ -1,6 +1,6 @@
package com.ccapp.ccgo.mission.repository;
-import com.ccapp.ccgo.mission.Partner;
-import com.ccapp.ccgo.mission.PartnerMission;
+import com.ccapp.ccgo.mission.domain.Partner;
+import com.ccapp.ccgo.mission.domain.PartnerMission;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
diff --git a/src/main/java/com/ccapp/ccgo/mission/repository/PartnerRepository.java b/src/main/java/com/ccapp/ccgo/mission/repository/PartnerRepository.java
index 8c20e09..9250c5c 100644
--- a/src/main/java/com/ccapp/ccgo/mission/repository/PartnerRepository.java
+++ b/src/main/java/com/ccapp/ccgo/mission/repository/PartnerRepository.java
@@ -1,6 +1,6 @@
package com.ccapp.ccgo.mission.repository;
-import com.ccapp.ccgo.mission.Partner;
+import com.ccapp.ccgo.mission.domain.Partner;
import com.ccapp.ccgo.team.Team;
import com.ccapp.ccgo.user.User;
import org.springframework.data.jpa.repository.JpaRepository;
@@ -9,12 +9,11 @@
import java.util.Optional;
public interface PartnerRepository extends JpaRepository {
- // 추가로 필요한 커스텀 메서드 작성 가능
+
boolean existsByTeamAndUser1AndUser2(Team team, User user1, User user2);
List findByTeam_TeamId(Long teamId);
-
- Optional findByUser1OrUser2(User user1, User user2);
-
-}
\ No newline at end of file
+ // ❗ 유저1 또는 유저2가 user이고, 특정 팀에 속한 Partner를 찾기
+ Optional findByTeamAndUser1OrTeamAndUser2(Team team1, User user1, Team team2, User user2);
+}
diff --git a/src/main/java/com/ccapp/ccgo/mission/repository/UserMissionRepository.java b/src/main/java/com/ccapp/ccgo/mission/repository/UserMissionRepository.java
index c026c7d..5f4e98d 100644
--- a/src/main/java/com/ccapp/ccgo/mission/repository/UserMissionRepository.java
+++ b/src/main/java/com/ccapp/ccgo/mission/repository/UserMissionRepository.java
@@ -1,6 +1,6 @@
package com.ccapp.ccgo.mission.repository;
-import com.ccapp.ccgo.mission.UserMission;
+import com.ccapp.ccgo.mission.domain.UserMission;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
diff --git a/src/main/java/com/ccapp/ccgo/mission/service/MissionService.java b/src/main/java/com/ccapp/ccgo/mission/service/MissionService.java
index ec9a98b..36443f6 100644
--- a/src/main/java/com/ccapp/ccgo/mission/service/MissionService.java
+++ b/src/main/java/com/ccapp/ccgo/mission/service/MissionService.java
@@ -1,9 +1,11 @@
package com.ccapp.ccgo.mission.service;
-import com.ccapp.ccgo.mission.PartnerMission;
+import com.ccapp.ccgo.mission.domain.PartnerMission;
+import com.ccapp.ccgo.mission.dto.PartnerMissionDto;
+import jakarta.transaction.Transactional;
public interface MissionService {
- // 유저가 새로고침 시 새로운 미션을 짝에 할당
- PartnerMission refreshPartnerMission(Long userId);
+ // 특정 팀 내에서 유저의 파트너 미션 갱신
+ PartnerMissionDto refreshPartnerMission(Long teamId, Long userId);
}
\ No newline at end of file
diff --git a/src/main/java/com/ccapp/ccgo/mission/MissionServiceImpl.java b/src/main/java/com/ccapp/ccgo/mission/service/MissionServiceImpl.java
similarity index 53%
rename from src/main/java/com/ccapp/ccgo/mission/MissionServiceImpl.java
rename to src/main/java/com/ccapp/ccgo/mission/service/MissionServiceImpl.java
index da4b88a..ea37b1f 100644
--- a/src/main/java/com/ccapp/ccgo/mission/MissionServiceImpl.java
+++ b/src/main/java/com/ccapp/ccgo/mission/service/MissionServiceImpl.java
@@ -1,20 +1,19 @@
-package com.ccapp.ccgo.mission;
+package com.ccapp.ccgo.mission.service;
import com.ccapp.ccgo.common.MissionStatus;
-import com.ccapp.ccgo.mission.repository.MissionTemplateRepository;
-import com.ccapp.ccgo.mission.repository.PartnerMissionRepository;
-import com.ccapp.ccgo.mission.repository.PartnerRepository;
-import com.ccapp.ccgo.mission.repository.UserMissionRepository;
-import com.ccapp.ccgo.mission.service.MissionService;
+import com.ccapp.ccgo.mission.domain.*;
+import com.ccapp.ccgo.mission.dto.PartnerMissionDto;
+import com.ccapp.ccgo.mission.repository.*;
import com.ccapp.ccgo.repository.UserRepository;
+import com.ccapp.ccgo.team.Team;
+import com.ccapp.ccgo.repository.TeamRepository;
import com.ccapp.ccgo.user.User;
-import jakarta.transaction.*;
+import jakarta.transaction.Transactional;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.time.LocalDate;
import java.util.List;
-import java.util.Optional;
@Service
@RequiredArgsConstructor
@@ -26,37 +25,38 @@ public class MissionServiceImpl implements MissionService {
private final UserMissionRepository userMissionRepository;
private final MissionTemplateRepository missionTemplateRepository;
private final UserRepository userRepository;
+ private final TeamRepository teamRepository;
@Override
- public PartnerMission refreshPartnerMission(Long userId) {
- // 1. 유저 정보 조회
+ public PartnerMissionDto refreshPartnerMission(Long teamId, Long userId) {
User user = userRepository.findById(userId)
.orElseThrow(() -> new IllegalArgumentException("유저 없음"));
- // 2. 유저가 속한 Partner 찾기 (user1 또는 user2인 Partner)
- Partner partner = partnerRepository.findByUser1OrUser2(user, user)
- .orElseThrow(() -> new IllegalStateException("해당 유저의 짝이 없음"));
+ Team team = teamRepository.findById(teamId)
+ .orElseThrow(() -> new IllegalArgumentException("팀 없음"));
- // 3. 기존 활성 미션 비활성화 처리
+ Partner partner = partnerRepository.findByTeamAndUser1OrTeamAndUser2(team, user, team, user)
+ .orElseThrow(() -> new IllegalStateException("해당 팀에서 짝이 없음"));
+
+ // 기존 활성 미션 비활성화
List activeMissions = partnerMissionRepository.findByPartnerAndIsActiveTrue(partner);
for (PartnerMission pm : activeMissions) {
pm.setActive(false);
partnerMissionRepository.save(pm);
}
- // 1. 마지막 미션 조회
- Optional lastMission = partnerMissionRepository.findTopByPartnerOrderByIdDesc(partner);
- Long nextTemplateId = lastMission.map(pm -> pm.getTemplate().getId() + 1).orElse(1L);
- if (nextTemplateId > 50L) nextTemplateId = 1L; // 50개를 순환하면 다시 1로
+ // 마지막 미션 기반으로 다음 템플릿 선택
+ Long nextTemplateId = partnerMissionRepository.findTopByPartnerOrderByIdDesc(partner)
+ .map(pm -> pm.getTemplate().getId() + 1)
+ .orElse(1L);
+ if (nextTemplateId > 50L) nextTemplateId = 1L;
- // 2. 템플릿 미션 조회
MissionTemplate template = missionTemplateRepository.findById(nextTemplateId)
.orElseThrow(() -> new RuntimeException("템플릿 미션 없음"));
- // 3. 템플릿 기반으로 PartnerMission 생성
PartnerMission newMission = PartnerMission.builder()
.partner(partner)
- .template(template) // <-- template를 저장
+ .template(template)
.title(template.getTitle())
.description(template.getDescription())
.dueDate(LocalDate.now().plusDays(7))
@@ -65,24 +65,18 @@ public PartnerMission refreshPartnerMission(Long userId) {
partnerMissionRepository.save(newMission);
- // 5. 기존 UserMission은 유지하거나 삭제 가능 (옵션)
- // 새 UserMission 생성 (짝의 두 유저에게)
- User user1 = partner.getUser1();
- User user2 = partner.getUser2();
-
- createUserMission(user1, newMission);
- createUserMission(user2, newMission);
+ createUserMission(partner.getUser1(), newMission);
+ createUserMission(partner.getUser2(), newMission);
- return newMission;
+ return PartnerMissionDto.fromEntity(newMission);
}
private void createUserMission(User user, PartnerMission mission) {
- UserMission um = UserMission.builder()
+ UserMission userMission = UserMission.builder()
.user(user)
.partnerMission(mission)
.status(MissionStatus.PENDING)
.build();
-
- userMissionRepository.save(um);
+ userMissionRepository.save(userMission);
}
-}
\ No newline at end of file
+}
diff --git a/src/main/java/com/ccapp/ccgo/mission/service/PartnerService.java b/src/main/java/com/ccapp/ccgo/mission/service/PartnerService.java
index 99df79c..c4ec809 100644
--- a/src/main/java/com/ccapp/ccgo/mission/service/PartnerService.java
+++ b/src/main/java/com/ccapp/ccgo/mission/service/PartnerService.java
@@ -1,7 +1,7 @@
package com.ccapp.ccgo.mission.service;
import com.ccapp.ccgo.matching.SubGroup;
-import com.ccapp.ccgo.mission.Partner;
+import com.ccapp.ccgo.mission.domain.Partner;
import java.util.List;
import java.util.Optional;
@@ -11,12 +11,5 @@ public interface PartnerService {
// 매칭된 SubGroup 정보를 받아 Partner(짝) 생성
List createPartnersFromSubGroups(List subGroups);
- // 팀별 Partner 목록 조회
- List findPartnersByTeamId(Long teamId);
- // Partner 조회
- Optional findById(Long partnerId);
-
- // Partner 삭제
- void deletePartner(Long partnerId);
}
\ No newline at end of file
diff --git a/src/main/java/com/ccapp/ccgo/mission/PartnerServiceImpl.java b/src/main/java/com/ccapp/ccgo/mission/service/PartnerServiceImpl.java
similarity index 56%
rename from src/main/java/com/ccapp/ccgo/mission/PartnerServiceImpl.java
rename to src/main/java/com/ccapp/ccgo/mission/service/PartnerServiceImpl.java
index 1a8cd88..df49b16 100644
--- a/src/main/java/com/ccapp/ccgo/mission/PartnerServiceImpl.java
+++ b/src/main/java/com/ccapp/ccgo/mission/service/PartnerServiceImpl.java
@@ -1,19 +1,21 @@
-package com.ccapp.ccgo.mission;
+package com.ccapp.ccgo.mission.service;
import com.ccapp.ccgo.matching.SubGroup;
import com.ccapp.ccgo.matching.SubGroupMember;
+import com.ccapp.ccgo.mission.domain.Partner;
import com.ccapp.ccgo.mission.repository.PartnerRepository;
-import com.ccapp.ccgo.mission.service.PartnerService;
import com.ccapp.ccgo.repository.SubGroupMemberRepository;
+import com.ccapp.ccgo.repository.TeamRepository;
+import com.ccapp.ccgo.repository.UserRepository;
import com.ccapp.ccgo.team.Team;
import com.ccapp.ccgo.user.User;
-import jakarta.transaction.*;
+import jakarta.transaction.Transactional;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
-import java.util.Optional;
+
@Service
@RequiredArgsConstructor
@@ -21,49 +23,38 @@
public class PartnerServiceImpl implements PartnerService {
private final PartnerRepository partnerRepository;
- private final SubGroupMemberRepository subGroupMemberRepository;
+ private final UserRepository userRepository;
+ private final TeamRepository teamRepository;
+ private final SubGroupMemberRepository subGroupMemberRepository; // 추가
@Override
public List createPartnersFromSubGroups(List subGroups) {
List partners = new ArrayList<>();
- for (SubGroup sg : subGroups) {
- List members = subGroupMemberRepository.findBySubGroup_Id(sg.getId());
+ for (SubGroup subGroup : subGroups) {
+ Team team = subGroup.getTeam();
- User user1 = members.get(0).getUser();
- User user2 = members.get(1).getUser();
- Team team = sg.getTeam();
+ // 해당 SubGroup의 멤버 2명 조회
+ List members = subGroupMemberRepository.findBySubGroup(subGroup);
- // 중복 Partner 체크 (팀, user1, user2 기준)
- boolean exists = partnerRepository.existsByTeamAndUser1AndUser2(team, user1, user2);
- if (exists) {
- continue;
+ if (members.size() != 2) {
+ throw new IllegalStateException("SubGroup에 멤버가 2명이 아닙니다: " + subGroup.getId());
}
+ User user1 = members.get(0).getUser();
+ User user2 = members.get(1).getUser();
+
Partner partner = Partner.builder()
.team(team)
.user1(user1)
.user2(user2)
.build();
- partners.add(partnerRepository.save(partner));
+ partnerRepository.save(partner);
+ partners.add(partner);
}
return partners;
}
- @Override
- public List findPartnersByTeamId(Long teamId) {
- return partnerRepository.findByTeam_TeamId(teamId);
- }
-
- @Override
- public Optional findById(Long partnerId) {
- return partnerRepository.findById(partnerId);
- }
-
- @Override
- public void deletePartner(Long partnerId) {
- partnerRepository.deleteById(partnerId);
- }
-}
\ No newline at end of file
+}
diff --git a/src/main/java/com/ccapp/ccgo/repository/SubGroupMemberRepository.java b/src/main/java/com/ccapp/ccgo/repository/SubGroupMemberRepository.java
index 767ba1f..8e692df 100644
--- a/src/main/java/com/ccapp/ccgo/repository/SubGroupMemberRepository.java
+++ b/src/main/java/com/ccapp/ccgo/repository/SubGroupMemberRepository.java
@@ -1,9 +1,13 @@
package com.ccapp.ccgo.repository;
+import com.ccapp.ccgo.matching.SubGroup;
import com.ccapp.ccgo.matching.SubGroupMember;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
public interface SubGroupMemberRepository extends JpaRepository {
List findBySubGroup_Id(Long subGroupId);
+
+ // SubGroup 기준으로 멤버들 조회
+ List findBySubGroup(SubGroup subGroup);
}
diff --git a/src/main/java/com/ccapp/ccgo/service/MatchingService.java b/src/main/java/com/ccapp/ccgo/service/MatchingService.java
index 59a6fc6..e21ebfb 100644
--- a/src/main/java/com/ccapp/ccgo/service/MatchingService.java
+++ b/src/main/java/com/ccapp/ccgo/service/MatchingService.java
@@ -37,14 +37,16 @@ public MatchingResponseDto performMatching(Long teamId) {
// 해당 팀에 소속된 팀원 전체 가져옴
// 팀원이 없다면 (비어있다면) IllegalArgumentException
List members = teamMemberRepository.findByTeam_TeamIdAndIsActiveTrue(teamId);
- Map memberMap = members.stream()
- .collect(Collectors.toMap(tm -> tm.getUser().getId(), tm -> tm));
-
if (members.isEmpty()) {
throw new IllegalArgumentException("해당 팀(" + teamId + ")에 유저가 없습니다.");
}
+ Map memberMap = members.stream()
+ .collect(Collectors.toMap(tm -> tm.getUser().getId(), tm -> tm));
+
+
+
Team team = members.get(0).getTeam();
// 2. 남/여 그룹 나누기
@@ -222,7 +224,7 @@ private double calculateSimilarityScore(User a, User b, Long teamId) {
totalSimilarity += similarity;
}
- double similarityRate = (double) totalSimilarity / (5 * totalQuestions);
+ Double similarityRate = (double) totalSimilarity / (5 * totalQuestions);
return similarityRate * 100;
}
diff --git a/src/main/java/com/ccapp/ccgo/team/TeamMember.java b/src/main/java/com/ccapp/ccgo/team/TeamMember.java
index a6a2eed..8fd4c50 100644
--- a/src/main/java/com/ccapp/ccgo/team/TeamMember.java
+++ b/src/main/java/com/ccapp/ccgo/team/TeamMember.java
@@ -44,9 +44,6 @@ public class TeamMember {
@JoinColumn(name = "user_id", nullable = false)
private User user;
- @Column(name = "user_name", nullable = false)
- private String userName;
-
// 팀 내 역할 ("TEAM_LEADER" or "TEAM_MEMBER")
@Enumerated(EnumType.STRING)
@Column(nullable = false)
diff --git a/src/main/java/com/ccapp/ccgo/user/User.java b/src/main/java/com/ccapp/ccgo/user/User.java
index 5ee781d..e217400 100644
--- a/src/main/java/com/ccapp/ccgo/user/User.java
+++ b/src/main/java/com/ccapp/ccgo/user/User.java
@@ -49,11 +49,6 @@ public class User {
@Column(name = "created_at", updatable = false)
private LocalDateTime createdAt;
- //팀내 역할 (팀장/팀원)
- @Enumerated(EnumType.STRING)
- @Column(nullable = false)
- private Role role;
-
// MBTI 필드
@Column(name = "mbti")
private String mbti;
From d1114146d468258b1f7e95eabd77f66f043c27d8 Mon Sep 17 00:00:00 2001
From: losecow
Date: Tue, 8 Jul 2025 10:26:14 +0900
Subject: [PATCH 015/132] tested by postman
---
.idea/dataSources.xml | 1 +
.idea/sqldialects.xml | 2 +-
.../com/ccapp/ccgo/jwt/SecurityConfig.java | 2 +-
.../ccapp/ccgo/user/BcryptTestController.java | 25 +++++++++++++++++++
src/main/resources/application.properties | 2 +-
5 files changed, 29 insertions(+), 3 deletions(-)
create mode 100644 src/main/java/com/ccapp/ccgo/user/BcryptTestController.java
diff --git a/.idea/dataSources.xml b/.idea/dataSources.xml
index 7a4f374..aeb9e05 100644
--- a/.idea/dataSources.xml
+++ b/.idea/dataSources.xml
@@ -9,6 +9,7 @@
+
$ProjectFileDir$
diff --git a/.idea/sqldialects.xml b/.idea/sqldialects.xml
index d21819a..2cb6d30 100644
--- a/.idea/sqldialects.xml
+++ b/.idea/sqldialects.xml
@@ -2,7 +2,7 @@
-
+
\ No newline at end of file
diff --git a/src/main/java/com/ccapp/ccgo/jwt/SecurityConfig.java b/src/main/java/com/ccapp/ccgo/jwt/SecurityConfig.java
index 69b6ff5..b1173b4 100644
--- a/src/main/java/com/ccapp/ccgo/jwt/SecurityConfig.java
+++ b/src/main/java/com/ccapp/ccgo/jwt/SecurityConfig.java
@@ -54,7 +54,7 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Excepti
.csrf(AbstractHttpConfigurer::disable)
.sessionManagement(sm -> sm.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
.authorizeHttpRequests(auth -> auth
- .requestMatchers("/api/auth/login", "/register").permitAll() // 로그인, 회원가입 허용
+ .requestMatchers("/api/auth/login","/bcrypt-test", "/register").permitAll() // 로그인, 회원가입 허용, "/bcrypt-test"
.anyRequest().authenticated() // 그 외는 인증 필요
)
.authenticationProvider(authenticationProvider())
diff --git a/src/main/java/com/ccapp/ccgo/user/BcryptTestController.java b/src/main/java/com/ccapp/ccgo/user/BcryptTestController.java
new file mode 100644
index 0000000..e02c282
--- /dev/null
+++ b/src/main/java/com/ccapp/ccgo/user/BcryptTestController.java
@@ -0,0 +1,25 @@
+package com.ccapp.ccgo.user;
+
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+public class BcryptTestController {
+
+// @GetMapping("/bcrypt-test")
+// public String test() {
+// String rawPw = "Test@1234";
+// String hash = "$2a$10$plQyO8OH8Sv5uBrm/fRO1OaXOCfcR5fZ0miWJ0OTZzzZEv6AfCMAO";
+//
+// boolean matches = new BCryptPasswordEncoder().matches(rawPw, hash);
+// return "비밀번호 일치 여부: " + matches;
+// }
+ @GetMapping("/bcrypt-test")
+ public String generate() {
+ BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
+ String rawPw = "Test@1234";
+ String encodedPw = encoder.encode(rawPw);
+ return encodedPw;
+}
+}
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index 65d55a6..22f7f7e 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -4,7 +4,7 @@ server.address=0.0.0.0
server.port=8080
spring.datasource.username = root
-spring.datasource.password = 06250730cc
+spring.datasource.password = qkrwlsdn
jwt.secret=????????????????????1234!@11111123451234432AVDSFUCKYOUSHITHOLY
jwt.access-token-expiration=86400000
From 83df87ce3205b4f6dc78ff9a0e26a9441ef765dc Mon Sep 17 00:00:00 2001
From: bendy41
Date: Tue, 8 Jul 2025 12:35:15 +0900
Subject: [PATCH 016/132] Add sql
---
src/main/resources/MissionInsert.sql | 117 +++++++++++++++++++++++++++
1 file changed, 117 insertions(+)
create mode 100644 src/main/resources/MissionInsert.sql
diff --git a/src/main/resources/MissionInsert.sql b/src/main/resources/MissionInsert.sql
new file mode 100644
index 0000000..3963e49
--- /dev/null
+++ b/src/main/resources/MissionInsert.sql
@@ -0,0 +1,117 @@
+INSERT INTO mission_template (title, description, score)
+VALUES
+-- 1학점
+ (' 미션 1', '서로의 첫인상 공유하기', 1),
+ (' 미션 2', '인스타 맞팔하기', 1),
+ (' 미션 3', '매점가서 서로 아이스크림 사주기', 1),
+ (' 미션 4', '기도제목 공유하기', 1),
+ (' 미션 5', '셀카 같이 찍기', 1),
+ (' 미션 6', '노래 추천해주기', 1),
+ (' 미션 7', '공통 관심사 하나 찾기', 1),
+ (' 미션 8', '간식 선물하기', 1),
+ (' 미션 9', '서로 MBTI 말해주기', 1),
+ (' 미션 10', '닮은꼴 캐릭터 찾기', 1),
+ (' 미션 11', '최애 유튜버 추천하기', 1),
+ (' 미션 12', '좋아하는 음식 추천하기', 1),
+ (' 미션 13', '서로의 TMI 하나씩 공유하기', 1),
+ (' 미션 14', '큐티 나눔하기', 1),
+ (' 미션 15', '서로 별명 지어주기', 1),
+ (' 미션 16', '서로 생일 말해주기', 1),
+ (' 미션 17', '좋아하는 성경구절/명언 공유하기', 1),
+ (' 미션 18', '서로 이름 3행시 짓기', 1),
+ (' 미션 19', '옛날 사진 공유하기', 1),
+ (' 미션 20', '짧은 응원 메시지 보내기', 1),
+ (' 미션 21', '최근 꾼 꿈 공유하기', 1),
+ (' 미션 22', '가위 바위 보', 1),
+ (' 미션 23', '게시판에서 흥미로운 공지 찾아 사진 찍기', 1),
+ (' 미션 24', '에타 시간표 공유하기', 1),
+ (' 미션 25', '교내에서 처음 가보는 건물 탐방하기', 1),
+ (' 미션 26', '키우는 동물사진 보여주기', 1),
+ (' 미션 27', '자주 가는 장소 찍어오기', 1),
+ (' 미션 28', '같이 노래 한 곡 부르기', 1),
+ (' 미션 29', '팔씨름 하기', 1),
+ (' 미션 30', '카톡 이름 애칭으로 바꾸기', 1),
+
+-- 3 학점 짜리
+ (' 미션 1', '초상화 그려주기', 3),
+ (' 미션 2', '교내 카페 음료 마시기', 3),
+ (' 미션 3', '매점가서 서로 아이스크림 사주기', 3),
+ (' 미션 4', '한한하기', 3),
+ (' 미션 5', '학식 같이 먹기', 3),
+ (' 미션 6', '모닝콜 해주기', 3),
+ (' 미션 7', '5분이상 통화하기', 3),
+ (' 미션 8', '커플 프사 하기', 3),
+ (' 미션 9', '평봉에서 누워 하늘 사진 찍기', 3),
+ (' 미션 10', '다른 CC랑 스몰토크 5분', 3),
+ (' 미션 11', '도서관에서 아무 책 들고 사진 찍기', 3),
+ (' 미션 12', '안 먹어본 음료 뽑아먹기', 3),
+ (' 미션 13', '같은 표정으로 셀카 3장 찍기', 3),
+ (' 미션 14', '손으로 하트 사진 찍기', 3),
+ (' 미션 15', '다른 CC랑 간식 나눠먹기', 3),
+ (' 미션 16', '모두 다른 포즈로 점프샷 3장 찍기', 3),
+ (' 미션 17', '영화 포스터 따라한 사진 찍기', 3),
+ (' 미션 18', '롤모델이 누구인지 물어보기', 3),
+ (' 미션 19', '교내 농구대에서 슛 3번 던져보기', 3),
+ (' 미션 20', '활주로 내려갔다가 돌아오기', 3),
+ (' 미션 21', '팀 구호 외치며 영상 찍기', 3),
+ (' 미션 22', '10초 내 자기소개 릴레이 찍기', 3),
+ (' 미션 23', '스터디룸 예약해서 30분 이상 사용하기', 3),
+ (' 미션 24', '학생식당 메뉴 중 랜덤으로 고르고 먹기', 3),
+ (' 미션 25', '손하트 영상 찍기', 3),
+ (' 미션 26', '캠퍼스 둘레길 돌아보고 풍경 영상 찍기', 3),
+ (' 미션 27', '교내 운동기구 사용해보기', 3),
+ (' 미션 28', '제일 큰 나무 찾아서 사진 찍기', 3),
+ (' 미션 29', '같이 공부하기', 3),
+ (' 미션 30', '옷 맞춰입기', 3),
+
+-- 5학점
+ (' 미션 1', '옷 맞춰입기', 1),
+ (' 미션 2', '인스타 맞팔하기', 1),
+ (' 미션 3', '매점가서 서로 아이스크림 사주기', 1),
+ (' 미션 4', '기도제목 공유하기', 1),
+ (' 미션 5', '셀카 같이 찍기', 1),
+ (' 미션 6', '노래 추천해주기', 1),
+ (' 미션 7', '공통 관심사 하나 찾기', 1),
+ (' 미션 8', '간식 선물하기', 1),
+ (' 미션 9', '서로 MBTI 말해주기', 1),
+ (' 미션 10', '닮은꼴 캐릭터 찾기', 1),
+ (' 미션 11', '', 1),
+ (' 미션 12', '옷 맞춰입기', 1),
+ (' 미션 13', '옷 맞춰입기', 1),
+ (' 미션 14', '옷 맞춰입기', 1),
+ (' 미션 15', '옷 맞춰입기', 1),
+ (' 미션 16', '옷 맞춰입기', 1),
+ (' 미션 17', '옷 맞춰입기', 1),
+ (' 미션 18', '옷 맞춰입기', 1),
+ (' 미션 19', '옷 맞춰입기', 1),
+ (' 미션 20', '옷 맞춰입기', 1),
+ (' 미션 21', '옷 맞춰입기', 1),
+ (' 미션 22', '옷 맞춰입기', 1),
+ (' 미션 23', '옷 맞춰입기', 1),
+ (' 미션 24', '옷 맞춰입기', 1),
+ (' 미션 25', '옷 맞춰입기', 1),
+ (' 미션 26', '옷 맞춰입기', 1),
+ (' 미션 27', '옷 맞춰입기', 1),
+ (' 미션 28', '옷 맞춰입기', 1),
+ (' 미션 29', '옷 맞춰입기', 1),
+ (' 미션 30', '옷 맞춰입기', 1),
+ (' 미션 31', '옷 맞춰입기', 1),
+ (' 미션 32', '옷 맞춰입기', 1),
+ (' 미션 33', '옷 맞춰입기', 1),
+ (' 미션 34', '옷 맞춰입기', 1),
+ (' 미션 35', '옷 맞춰입기', 1),
+ (' 미션 36', '옷 맞춰입기', 1),
+ (' 미션 37', '옷 맞춰입기', 1),
+ (' 미션 38', '옷 맞춰입기', 1),
+ (' 미션 39', '옷 맞춰입기', 1),
+ (' 미션 40', '옷 맞춰입기', 1),
+ (' 미션 41', '옷 맞춰입기', 1),
+ (' 미션 42', '옷 맞춰입기', 1),
+ (' 미션 43', '옷 맞춰입기', 1),
+ (' 미션 44', '옷 맞춰입기', 1),
+ (' 미션 45', '옷 맞춰입기', 1),
+ (' 미션 46', '옷 맞춰입기', 1),
+ (' 미션 47', '옷 맞춰입기', 1),
+ (' 미션 48', '옷 맞춰입기', 1),
+ (' 미션 49', '옷 맞춰입기', 1),
+ (' 미션 50', '옷 맞춰입기', 1);
From fb28137ab5faf3011aa935f9cc528a15875612d0 Mon Sep 17 00:00:00 2001
From: bendy41
Date: Wed, 9 Jul 2025 12:44:16 +0900
Subject: [PATCH 017/132] Add Survey_result
---
.../ccapp/ccgo/controller/TeamController.java | 21 +++-
.../ccapp/ccgo/dto/SurveyCompleteRequest.java | 8 ++
.../mission/controller/MissionController.java | 5 +-
.../repository/MissionTemplateRepository.java | 2 +-
.../repository/PartnerMissionRepository.java | 9 +-
.../ccgo/mission/service/MissionService.java | 4 +-
.../mission/service/MissionServiceImpl.java | 45 +++++---
.../ccgo/repository/TeamMemberRepository.java | 3 +
.../ccapp/ccgo/service/TeamMemberService.java | 24 ++++
src/main/resources/MissionInsert.sql | 104 ++++++++----------
src/main/resources/application.properties | 2 +-
11 files changed, 141 insertions(+), 86 deletions(-)
create mode 100644 src/main/java/com/ccapp/ccgo/dto/SurveyCompleteRequest.java
create mode 100644 src/main/java/com/ccapp/ccgo/service/TeamMemberService.java
diff --git a/src/main/java/com/ccapp/ccgo/controller/TeamController.java b/src/main/java/com/ccapp/ccgo/controller/TeamController.java
index 10def72..4942589 100644
--- a/src/main/java/com/ccapp/ccgo/controller/TeamController.java
+++ b/src/main/java/com/ccapp/ccgo/controller/TeamController.java
@@ -1,5 +1,7 @@
package com.ccapp.ccgo.controller;
+import com.ccapp.ccgo.dto.SurveyCompleteRequest;
import com.ccapp.ccgo.dto.TeamResponseDto;
+import com.ccapp.ccgo.service.TeamMemberService;
import com.ccapp.ccgo.user.User;
import com.ccapp.ccgo.jwt.LoginUserDetails;
import com.ccapp.ccgo.repository.TeamMemberRepository;
@@ -8,9 +10,7 @@
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.stream.Collectors;
@@ -20,6 +20,7 @@
@RequestMapping("/api/team")
public class TeamController {
+ private final TeamMemberService teamMemberService;
private final TeamMemberRepository teamMemberRepository;
@GetMapping("/mine")
@@ -38,4 +39,18 @@ public ResponseEntity> getMyTeams(
return ResponseEntity.ok(result);
}
+
+
+ @PostMapping("/survey/complete")
+ public ResponseEntity completeSurvey(@RequestBody SurveyCompleteRequest request,
+ @AuthenticationPrincipal LoginUserDetails loginUserDetails) {
+ System.out.print("프로그램ㅅ ㅣ작");
+ User currentUser = loginUserDetails.getUser();
+ System.out.print("1");
+ teamMemberService.markSurveyCompleted(currentUser.getId(), request.getTeamId());
+ System.out.print("2");
+ return ResponseEntity.ok().build();
+ }
+
+
}
\ No newline at end of file
diff --git a/src/main/java/com/ccapp/ccgo/dto/SurveyCompleteRequest.java b/src/main/java/com/ccapp/ccgo/dto/SurveyCompleteRequest.java
new file mode 100644
index 0000000..cb18155
--- /dev/null
+++ b/src/main/java/com/ccapp/ccgo/dto/SurveyCompleteRequest.java
@@ -0,0 +1,8 @@
+package com.ccapp.ccgo.dto;
+
+import lombok.Getter;
+
+@Getter
+public class SurveyCompleteRequest {
+ private Long teamId;
+}
diff --git a/src/main/java/com/ccapp/ccgo/mission/controller/MissionController.java b/src/main/java/com/ccapp/ccgo/mission/controller/MissionController.java
index b8061a8..edf8d3d 100644
--- a/src/main/java/com/ccapp/ccgo/mission/controller/MissionController.java
+++ b/src/main/java/com/ccapp/ccgo/mission/controller/MissionController.java
@@ -17,9 +17,10 @@ public class MissionController {
@PostMapping("/refresh")
public ResponseEntity refreshPartnerMission(
@RequestParam Long teamId,
- @RequestParam Long userId
+ @RequestParam Long userId,
+ @RequestParam int score
) {
- PartnerMissionDto partnerMissionDto = missionService.refreshPartnerMission(teamId, userId);
+ PartnerMissionDto partnerMissionDto = missionService.refreshPartnerMission(teamId, userId,score);
return ResponseEntity.ok(partnerMissionDto);
}
}
diff --git a/src/main/java/com/ccapp/ccgo/mission/repository/MissionTemplateRepository.java b/src/main/java/com/ccapp/ccgo/mission/repository/MissionTemplateRepository.java
index dd30aff..3a196b9 100644
--- a/src/main/java/com/ccapp/ccgo/mission/repository/MissionTemplateRepository.java
+++ b/src/main/java/com/ccapp/ccgo/mission/repository/MissionTemplateRepository.java
@@ -8,7 +8,7 @@
public interface MissionTemplateRepository extends JpaRepository {
- List findByScoreOrderById(int score);
+ List findByScore(int score);
@Query("SELECT MAX(m.id) FROM MissionTemplate m")
Long findMaxId();
diff --git a/src/main/java/com/ccapp/ccgo/mission/repository/PartnerMissionRepository.java b/src/main/java/com/ccapp/ccgo/mission/repository/PartnerMissionRepository.java
index abe9ec5..fbc6d14 100644
--- a/src/main/java/com/ccapp/ccgo/mission/repository/PartnerMissionRepository.java
+++ b/src/main/java/com/ccapp/ccgo/mission/repository/PartnerMissionRepository.java
@@ -1,4 +1,5 @@
package com.ccapp.ccgo.mission.repository;
+import com.ccapp.ccgo.mission.domain.MissionTemplate;
import com.ccapp.ccgo.mission.domain.Partner;
import com.ccapp.ccgo.mission.domain.PartnerMission;
import org.springframework.data.jpa.repository.JpaRepository;
@@ -7,10 +8,10 @@
import java.util.Optional;
public interface PartnerMissionRepository extends JpaRepository {
+ // 활성화된 점수별 미션 조회
+ List findByPartnerAndIsActiveTrueAndTemplateScore(Partner partner, int score);
- List findByPartnerId(Long partnerId);
+ // 최근 3개 미션 조회 (dueDate 기준 내림차순)
+ List findTop3ByPartnerOrderByDueDateDesc(Partner partner);
- List findByPartnerAndIsActiveTrue(Partner partner);
-
- Optional findTopByPartnerOrderByIdDesc(Partner partner);
}
\ No newline at end of file
diff --git a/src/main/java/com/ccapp/ccgo/mission/service/MissionService.java b/src/main/java/com/ccapp/ccgo/mission/service/MissionService.java
index 36443f6..507b824 100644
--- a/src/main/java/com/ccapp/ccgo/mission/service/MissionService.java
+++ b/src/main/java/com/ccapp/ccgo/mission/service/MissionService.java
@@ -6,6 +6,6 @@
public interface MissionService {
- // 특정 팀 내에서 유저의 파트너 미션 갱신
- PartnerMissionDto refreshPartnerMission(Long teamId, Long userId);
+ PartnerMissionDto refreshPartnerMission(Long teamId, Long userId, int score);
+
}
\ No newline at end of file
diff --git a/src/main/java/com/ccapp/ccgo/mission/service/MissionServiceImpl.java b/src/main/java/com/ccapp/ccgo/mission/service/MissionServiceImpl.java
index ea37b1f..2baafa9 100644
--- a/src/main/java/com/ccapp/ccgo/mission/service/MissionServiceImpl.java
+++ b/src/main/java/com/ccapp/ccgo/mission/service/MissionServiceImpl.java
@@ -14,6 +14,7 @@
import java.time.LocalDate;
import java.util.List;
+import java.util.stream.Collectors;
@Service
@RequiredArgsConstructor
@@ -28,7 +29,7 @@ public class MissionServiceImpl implements MissionService {
private final TeamRepository teamRepository;
@Override
- public PartnerMissionDto refreshPartnerMission(Long teamId, Long userId) {
+ public PartnerMissionDto refreshPartnerMission(Long teamId, Long userId, int score) {
User user = userRepository.findById(userId)
.orElseThrow(() -> new IllegalArgumentException("유저 없음"));
@@ -38,28 +39,44 @@ public PartnerMissionDto refreshPartnerMission(Long teamId, Long userId) {
Partner partner = partnerRepository.findByTeamAndUser1OrTeamAndUser2(team, user, team, user)
.orElseThrow(() -> new IllegalStateException("해당 팀에서 짝이 없음"));
- // 기존 활성 미션 비활성화
- List activeMissions = partnerMissionRepository.findByPartnerAndIsActiveTrue(partner);
+ // 해당 점수 미션 중 기존 활성 미션 비활성화
+ List activeMissions = partnerMissionRepository
+ .findByPartnerAndIsActiveTrueAndTemplateScore(partner, score);
for (PartnerMission pm : activeMissions) {
pm.setActive(false);
partnerMissionRepository.save(pm);
}
- // 마지막 미션 기반으로 다음 템플릿 선택
- Long nextTemplateId = partnerMissionRepository.findTopByPartnerOrderByIdDesc(partner)
- .map(pm -> pm.getTemplate().getId() + 1)
- .orElse(1L);
- if (nextTemplateId > 50L) nextTemplateId = 1L;
+ // 최근 3개 미션 조회해서 제외할 템플릿 ID 리스트 만들기
+ List recentMissions = partnerMissionRepository
+ .findTop3ByPartnerOrderByDueDateDesc(partner);
+ List excludeIds = recentMissions.stream()
+ .map(pm -> pm.getTemplate().getId())
+ .collect(Collectors.toList());
- MissionTemplate template = missionTemplateRepository.findById(nextTemplateId)
- .orElseThrow(() -> new RuntimeException("템플릿 미션 없음"));
+ // 점수별 전체 미션 리스트 조회
+ List allTemplates = missionTemplateRepository.findByScore(score);
+
+ // 제외 리스트에 없는 미션만 후보로 필터링
+ List candidateTemplates = allTemplates.stream()
+ .filter(mt -> !excludeIds.contains(mt.getId()))
+ .collect(Collectors.toList());
+
+ // 후보가 없으면 전체에서 랜덤 선택
+ if (candidateTemplates.isEmpty()) {
+ candidateTemplates = allTemplates;
+ }
+
+ // 랜덤 미션 선택
+ int randomIndex = (int) (Math.random() * candidateTemplates.size());
+ MissionTemplate selectedTemplate = candidateTemplates.get(randomIndex);
PartnerMission newMission = PartnerMission.builder()
.partner(partner)
- .template(template)
- .title(template.getTitle())
- .description(template.getDescription())
- .dueDate(LocalDate.now().plusDays(7))
+ .template(selectedTemplate)
+ .title(selectedTemplate.getTitle())
+ .description(selectedTemplate.getDescription())
+ .dueDate(LocalDate.now().plusDays(14))
.isActive(true)
.build();
diff --git a/src/main/java/com/ccapp/ccgo/repository/TeamMemberRepository.java b/src/main/java/com/ccapp/ccgo/repository/TeamMemberRepository.java
index dee546e..7f42592 100644
--- a/src/main/java/com/ccapp/ccgo/repository/TeamMemberRepository.java
+++ b/src/main/java/com/ccapp/ccgo/repository/TeamMemberRepository.java
@@ -13,6 +13,9 @@
*/
public interface TeamMemberRepository extends JpaRepository {
+ Optional findByUser_IdAndTeam_TeamId(Long userId, Long teamId);
+
+
// 한 유저가 이미 어떤 팀에 속해있는지 검사
boolean existsByUser(User user);
diff --git a/src/main/java/com/ccapp/ccgo/service/TeamMemberService.java b/src/main/java/com/ccapp/ccgo/service/TeamMemberService.java
new file mode 100644
index 0000000..0130511
--- /dev/null
+++ b/src/main/java/com/ccapp/ccgo/service/TeamMemberService.java
@@ -0,0 +1,24 @@
+package com.ccapp.ccgo.service;
+
+import com.ccapp.ccgo.repository.TeamMemberRepository;
+import com.ccapp.ccgo.team.TeamMember;
+import jakarta.transaction.Transactional;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+@Service
+@RequiredArgsConstructor
+public class TeamMemberService {
+
+ private final TeamMemberRepository teamMemberRepository;
+
+ @Transactional
+ public void markSurveyCompleted(Long userId, Long teamId) {
+ TeamMember teamMember = teamMemberRepository
+ .findByUser_IdAndTeam_TeamId(userId, teamId)
+ .orElseThrow(() -> new RuntimeException("팀 멤버를 찾을 수 없습니다."));
+
+ teamMember.setSurveyCompleted(true); // ← 여기서 DB의 isSurveyCompleted를 true로 변경
+ }
+
+}
diff --git a/src/main/resources/MissionInsert.sql b/src/main/resources/MissionInsert.sql
index 3963e49..7b8b21d 100644
--- a/src/main/resources/MissionInsert.sql
+++ b/src/main/resources/MissionInsert.sql
@@ -1,6 +1,5 @@
-INSERT INTO mission_template (title, description, score)
-VALUES
--- 1학점
+USE newuser;
+INSERT INTO mission_template (title, description, score) VALUES
(' 미션 1', '서로의 첫인상 공유하기', 1),
(' 미션 2', '인스타 맞팔하기', 1),
(' 미션 3', '매점가서 서로 아이스크림 사주기', 1),
@@ -22,7 +21,7 @@ VALUES
(' 미션 19', '옛날 사진 공유하기', 1),
(' 미션 20', '짧은 응원 메시지 보내기', 1),
(' 미션 21', '최근 꾼 꿈 공유하기', 1),
- (' 미션 22', '가위 바위 보', 1),
+ (' 미션 22', '가위 바위 보 진사람이 딱밤맞기', 1),
(' 미션 23', '게시판에서 흥미로운 공지 찾아 사진 찍기', 1),
(' 미션 24', '에타 시간표 공유하기', 1),
(' 미션 25', '교내에서 처음 가보는 건물 탐방하기', 1),
@@ -30,9 +29,7 @@ VALUES
(' 미션 27', '자주 가는 장소 찍어오기', 1),
(' 미션 28', '같이 노래 한 곡 부르기', 1),
(' 미션 29', '팔씨름 하기', 1),
- (' 미션 30', '카톡 이름 애칭으로 바꾸기', 1),
-
--- 3 학점 짜리
+ (' 미션 30', '상대방 카톡 별명으로 바꾸기', 1),
(' 미션 1', '초상화 그려주기', 3),
(' 미션 2', '교내 카페 음료 마시기', 3),
(' 미션 3', '매점가서 서로 아이스크림 사주기', 3),
@@ -63,55 +60,44 @@ VALUES
(' 미션 28', '제일 큰 나무 찾아서 사진 찍기', 3),
(' 미션 29', '같이 공부하기', 3),
(' 미션 30', '옷 맞춰입기', 3),
-
--- 5학점
- (' 미션 1', '옷 맞춰입기', 1),
- (' 미션 2', '인스타 맞팔하기', 1),
- (' 미션 3', '매점가서 서로 아이스크림 사주기', 1),
- (' 미션 4', '기도제목 공유하기', 1),
- (' 미션 5', '셀카 같이 찍기', 1),
- (' 미션 6', '노래 추천해주기', 1),
- (' 미션 7', '공통 관심사 하나 찾기', 1),
- (' 미션 8', '간식 선물하기', 1),
- (' 미션 9', '서로 MBTI 말해주기', 1),
- (' 미션 10', '닮은꼴 캐릭터 찾기', 1),
- (' 미션 11', '', 1),
- (' 미션 12', '옷 맞춰입기', 1),
- (' 미션 13', '옷 맞춰입기', 1),
- (' 미션 14', '옷 맞춰입기', 1),
- (' 미션 15', '옷 맞춰입기', 1),
- (' 미션 16', '옷 맞춰입기', 1),
- (' 미션 17', '옷 맞춰입기', 1),
- (' 미션 18', '옷 맞춰입기', 1),
- (' 미션 19', '옷 맞춰입기', 1),
- (' 미션 20', '옷 맞춰입기', 1),
- (' 미션 21', '옷 맞춰입기', 1),
- (' 미션 22', '옷 맞춰입기', 1),
- (' 미션 23', '옷 맞춰입기', 1),
- (' 미션 24', '옷 맞춰입기', 1),
- (' 미션 25', '옷 맞춰입기', 1),
- (' 미션 26', '옷 맞춰입기', 1),
- (' 미션 27', '옷 맞춰입기', 1),
- (' 미션 28', '옷 맞춰입기', 1),
- (' 미션 29', '옷 맞춰입기', 1),
- (' 미션 30', '옷 맞춰입기', 1),
- (' 미션 31', '옷 맞춰입기', 1),
- (' 미션 32', '옷 맞춰입기', 1),
- (' 미션 33', '옷 맞춰입기', 1),
- (' 미션 34', '옷 맞춰입기', 1),
- (' 미션 35', '옷 맞춰입기', 1),
- (' 미션 36', '옷 맞춰입기', 1),
- (' 미션 37', '옷 맞춰입기', 1),
- (' 미션 38', '옷 맞춰입기', 1),
- (' 미션 39', '옷 맞춰입기', 1),
- (' 미션 40', '옷 맞춰입기', 1),
- (' 미션 41', '옷 맞춰입기', 1),
- (' 미션 42', '옷 맞춰입기', 1),
- (' 미션 43', '옷 맞춰입기', 1),
- (' 미션 44', '옷 맞춰입기', 1),
- (' 미션 45', '옷 맞춰입기', 1),
- (' 미션 46', '옷 맞춰입기', 1),
- (' 미션 47', '옷 맞춰입기', 1),
- (' 미션 48', '옷 맞춰입기', 1),
- (' 미션 49', '옷 맞춰입기', 1),
- (' 미션 50', '옷 맞춰입기', 1);
+ (' 미션 1', '둘이서 야식먹기', 5),
+ (' 미션 2', '손편지 써주기', 5),
+ (' 미션 3', '3시간 이상 같이 있기', 5),
+ (' 미션 4', '둘이서 천마지 가기', 5),
+ (' 미션 5', '그레이스스쿨 별 보러 가기', 5),
+ (' 미션 6', 'SNS에 태그하기', 5),
+ (' 미션 7', '강물 예배가기', 5),
+ (' 미션 8', '서로 노래 불러주기', 5),
+ (' 미션 9', '다른 cc팀이랑 밥먹기', 5),
+ (' 미션 10', '엽사 찍기', 5),
+ (' 미션 11', '둘만의 단톡방 만들기', 5),
+ (' 미션 12', '1분 동안 눈 마주치기', 5),
+ (' 미션 13', '하루동안 서로 반말쓰기', 5),
+ (' 미션 14', '서로 눈 감고 서로 그리기', 5),
+ (' 미션 15', '같이 보드게임 하기', 5),
+ (' 미션 16', '볼에 스티커 붙이고 다니기', 5),
+ (' 미션 17', '같이 게임 하기', 5),
+ (' 미션 18', '당연하지 게임하기(총 10번)', 5),
+ (' 미션 19', '같이 운동하기', 5),
+ (' 미션 20', '교내 모든 건물 앞에서 사진 찍기', 5),
+(' 미션 1', '인생네컷 찍기', 10),
+(' 미션 2', '전화 10분이상하기', 10),
+(' 미션 3', '노래방 가기', 10),
+(' 미션 4', '단둘이 교내에서 영화 보기', 10),
+(' 미션 5', '교외 카페 가기', 10),
+(' 미션 6', '같이 바다가서 인증샷 찍기', 10),
+(' 미션 7', '같이 릴스 찍기', 10),
+(' 미션 8', '모든 팀사람과 사진 찍기', 10),
+(' 미션 9', '영일대 놀러가기', 10),
+(' 미션 10', '더블 데이트', 10),
+(' 미션 11', '같이 새벽 예배가기', 10),
+(' 미션 12', '우산 1개 쓰고 한한하기', 10),
+(' 미션 13', '스페이스워크에서 사진찍기', 10),
+(' 미션 14', '2인 브이로그 찍기', 10),
+(' 미션 15', '둘이서 밤 산책하기', 10),
+(' 미션 16', '서로 프로필 사진 만들어주기', 10),
+(' 미션 17', '틱톡 챌린지 따라하기', 10),
+(' 미션 18', '같이 드라마 보기', 10),
+(' 미션 19', '영일대 불꽃놀이 하기', 10),
+(' 미션 20', '두 사람만의 엽기 포즈 찍기', 10);
+
\ No newline at end of file
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index 22f7f7e..65d55a6 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -4,7 +4,7 @@ server.address=0.0.0.0
server.port=8080
spring.datasource.username = root
-spring.datasource.password = qkrwlsdn
+spring.datasource.password = 06250730cc
jwt.secret=????????????????????1234!@11111123451234432AVDSFUCKYOUSHITHOLY
jwt.access-token-expiration=86400000
From 252064b022ef1f8a30e303a70da4b3410d6feff3 Mon Sep 17 00:00:00 2001
From: bendy41
Date: Wed, 9 Jul 2025 16:11:26 +0900
Subject: [PATCH 018/132] Edit mbti
---
src/main/java/com/ccapp/ccgo/team/TeamMember.java | 5 +++++
src/main/java/com/ccapp/ccgo/user/User.java | 4 ----
2 files changed, 5 insertions(+), 4 deletions(-)
diff --git a/src/main/java/com/ccapp/ccgo/team/TeamMember.java b/src/main/java/com/ccapp/ccgo/team/TeamMember.java
index 8fd4c50..873faf4 100644
--- a/src/main/java/com/ccapp/ccgo/team/TeamMember.java
+++ b/src/main/java/com/ccapp/ccgo/team/TeamMember.java
@@ -60,4 +60,9 @@ public class TeamMember {
@Column(nullable = false)
private boolean isSurveyCompleted = false; // 설문조사 기본값 false
+ // MBTI 필드
+ @Column(name = "mbti")
+ private String mbti;
+
+
}
diff --git a/src/main/java/com/ccapp/ccgo/user/User.java b/src/main/java/com/ccapp/ccgo/user/User.java
index e217400..cfbcc0a 100644
--- a/src/main/java/com/ccapp/ccgo/user/User.java
+++ b/src/main/java/com/ccapp/ccgo/user/User.java
@@ -49,10 +49,6 @@ public class User {
@Column(name = "created_at", updatable = false)
private LocalDateTime createdAt;
- // MBTI 필드
- @Column(name = "mbti")
- private String mbti;
-
// 회원 가입 시 자동으로 현재 시간 설정
@PrePersist
public void prePersist() {
From eeeb4ccce9975e84deba1b381c4e6c2652d6a0bd Mon Sep 17 00:00:00 2001
From: bendy41
Date: Wed, 9 Jul 2025 17:27:08 +0900
Subject: [PATCH 019/132] .
---
.../com/ccapp/ccgo/dto/AnswerRequestDto.java | 2 +
.../ccapp/ccgo/service/MatchingService.java | 72 ++++++++++++++-----
src/main/java/com/ccapp/ccgo/user/User.java | 1 +
3 files changed, 57 insertions(+), 18 deletions(-)
diff --git a/src/main/java/com/ccapp/ccgo/dto/AnswerRequestDto.java b/src/main/java/com/ccapp/ccgo/dto/AnswerRequestDto.java
index d127921..a0001d9 100644
--- a/src/main/java/com/ccapp/ccgo/dto/AnswerRequestDto.java
+++ b/src/main/java/com/ccapp/ccgo/dto/AnswerRequestDto.java
@@ -10,5 +10,7 @@
@Builder
public class AnswerRequestDto {
private Long userId;
+ private String mbti;
+ private Long teamId;
private List answers;
}
diff --git a/src/main/java/com/ccapp/ccgo/service/MatchingService.java b/src/main/java/com/ccapp/ccgo/service/MatchingService.java
index e21ebfb..124bad7 100644
--- a/src/main/java/com/ccapp/ccgo/service/MatchingService.java
+++ b/src/main/java/com/ccapp/ccgo/service/MatchingService.java
@@ -29,6 +29,7 @@ public class MatchingService {
private static final double SIMILARITY_WEIGHT = 0.5;
private final MbtiScoreProvider mbtiScoreProvider;
+ private final UserRepository userRepository;
@Transactional
public MatchingResponseDto performMatching(Long teamId) {
@@ -139,8 +140,8 @@ private Map> createCandidateMap(List groupA,
List tempList = new ArrayList<>();
for (TeamMember tmB : groupB) {
- int mbtiScore = calculateMbtiTotalScore(tmA.getUser(), tmB.getUser());
- double similarityScore = calculateSimilarityScore(tmA.getUser(), tmB.getUser(), teamId);
+ int mbtiScore = calculateMbtiTotalScore(tmA, tmB);
+ double similarityScore = calculateSimilarityScore(tmA, tmB, teamId);
// 가중치 계산으로 조정
double totalScore = mbtiScore * MBTI_WEIGHT + similarityScore * SIMILARITY_WEIGHT;
@@ -186,9 +187,14 @@ private List generateAllPairMatches(Map> candid
// A→B, B→A MBTI 점수를 각각 구해서 합산
// 대칭적이지 않을 수도 있다는 점 고려 (현재 데이터는 대칭적임)
- private int calculateMbtiTotalScore(User a, User b) {
- int scoreAtoB = mbtiScoreProvider.getScore(a.getMbti(), b.getMbti());
- int scoreBtoA = mbtiScoreProvider.getScore(b.getMbti(), a.getMbti());
+ private int calculateMbtiTotalScore(TeamMember a, TeamMember b) {
+ String mbtiA = a.getMbti();
+ String mbtiB = b.getMbti();
+ if (mbtiA == null || mbtiB == null) {
+ return 0; // mbti가 없으면 점수 0 처리하거나, 다른 정책 적용
+ }
+ int scoreAtoB = mbtiScoreProvider.getScore(mbtiA, mbtiB);
+ int scoreBtoA = mbtiScoreProvider.getScore(mbtiB, mbtiA);
return scoreAtoB + scoreBtoA;
}
@@ -196,9 +202,12 @@ private int calculateMbtiTotalScore(User a, User b) {
// 각 질문 별로 A와 B의 점수 차이를 계산 → 유사도 환산
// 차이가 0이면 유사도 5, 차이가 5면 유사도 0
// 전체 유사도 점수 → 100% 환산
- private double calculateSimilarityScore(User a, User b, Long teamId) {
- List answersA = answerRepository.findByUser_Id(a.getId());
- List answersB = answerRepository.findByUser_Id(b.getId());
+ private double calculateSimilarityScore(TeamMember a, TeamMember b, Long teamId) {
+ Long userIdA = a.getUser().getId();
+ Long userIdB = b.getUser().getId();
+
+ List answersA = answerRepository.findByUser_Id(userIdA);
+ List answersB = answerRepository.findByUser_Id(userIdB);
// 팀별 질문 수 확보
List questions = questionRepository.findByTeam_TeamId(teamId);
@@ -322,15 +331,21 @@ private MatchingResponseDto buildMatchingResponseDto(Team team, List s
for (SubGroup sg : subGroups) {
List members = subGroupMemberRepository.findBySubGroup_Id(sg.getId());
+
List userDtos = members.stream()
.map(sgm -> {
- User u = sgm.getUser();
+ User user = sgm.getUser();
+
+ // 유저와 팀 기반으로 TeamMember 정보 조회
+ TeamMember teamMember = teamMemberRepository.findByUser_IdAndTeam_TeamId(user.getId(), team.getTeamId())
+ .orElseThrow(() -> new IllegalArgumentException("TeamMember not found"));
+
return UserResponseDto.builder()
- .id(u.getId())
- .name(u.getName())
- .email(u.getEmail())
- .gender(u.getGender())
- .mbti(u.getMbti())
+ .id(user.getId())
+ .name(user.getName())
+ .email(user.getEmail())
+ .gender(user.getGender())
+ .mbti(teamMember.getMbti()) // ✅ 여기에서 MBTI 가져오기
.build();
})
.collect(Collectors.toList());
@@ -349,6 +364,7 @@ private MatchingResponseDto buildMatchingResponseDto(Team team, List s
.build();
}
+
/**
* 내부 클래스 PairMatch
*/
@@ -368,21 +384,41 @@ static class PairMatch {
@Transactional
public void saveAnswers(AnswerRequestDto dto) {
Long userId = dto.getUserId();
+ Long teamId = dto.getTeamId();
- // 기존 Answer 전부 삭제
- List existingAnswers = answerRepository.findByUser_Id(userId);
+ // 해당 팀의 질문만 필터링해서 삭제
+ List teamQuestions = questionRepository.findByTeam_TeamId(teamId);
+ List teamQuestionIds = teamQuestions.stream()
+ .map(Question::getId)
+ .collect(Collectors.toList());
+ List existingAnswers = answerRepository.findByUser_Id(userId).stream()
+ .filter(ans -> teamQuestionIds.contains(ans.getQuestion().getId()))
+ .collect(Collectors.toList());
answerRepository.deleteAll(existingAnswers);
- // 새 Answer 저장
+ // 새로 저장 << 이게 무슨 뜻이징
+
+ User user = userRepository.findById(userId)
+ .orElseThrow(() -> new IllegalArgumentException("User not found"));
+
List newAnswers = dto.getAnswers().stream()
.map(single -> Answer.builder()
- .user(User.builder().id(userId).build())
+ .user(user) // 영속 상태의 User 엔티티
.question(Question.builder().id(single.getQuestionId()).build())
.score(single.getScore())
.build())
.collect(Collectors.toList());
answerRepository.saveAll(newAnswers);
+
+ if (dto.getMbti() != null && !dto.getMbti().isEmpty()) {
+ TeamMember teamMember = teamMemberRepository
+ .findByUser_IdAndTeam_TeamId(userId, teamId)
+ .orElseThrow(() -> new IllegalArgumentException("TeamMember not found"));
+
+ teamMember.setMbti(dto.getMbti());
+ teamMemberRepository.save(teamMember);
+ }
}
diff --git a/src/main/java/com/ccapp/ccgo/user/User.java b/src/main/java/com/ccapp/ccgo/user/User.java
index cfbcc0a..6b1a492 100644
--- a/src/main/java/com/ccapp/ccgo/user/User.java
+++ b/src/main/java/com/ccapp/ccgo/user/User.java
@@ -58,6 +58,7 @@ public void prePersist() {
//관심사 설문조사 완료여부
@Column(name = "test_completed", nullable = false)
private boolean isInterestCompleted = false;
+
}
From a757f13734368c219dc77a63916d1c663c9e3b37 Mon Sep 17 00:00:00 2001
From: Losecow <100589396+Losecow@users.noreply.github.com>
Date: Thu, 10 Jul 2025 16:59:27 +0900
Subject: [PATCH 020/132] refacroting
---
.../{ => auth}/controller/AuthController.java | 30 +++++++---------
.../ccgo/{ => auth}/dto/LoginRequestDto.java | 2 +-
.../ccgo/{ => auth}/dto/LoginResponseDto.java | 3 +-
.../ccgo/{ => auth}/dto/TokenResponseDto.java | 2 +-
.../jwt/JwtAuthenticationFilter.java | 3 +-
.../ccgo/{ => auth}/jwt/JwtProvider.java | 2 +-
.../ccapp/ccgo/{ => auth}/jwt/JwtToken.java | 2 +-
.../ccgo/{ => auth}/jwt/LoginUserDetails.java | 6 ++--
.../ccgo/{ => auth}/jwt/SecurityConfig.java | 3 +-
.../service}/LoginUserDetailsService.java | 7 ++--
.../exception/CustomException.java | 2 +-
.../exception/GlobalExceptionHandler.java | 2 +-
.../test}/BcryptTestController.java | 2 +-
.../controller/InviteCodeController.java | 34 +++++++------------
.../dto/InviteCodeCreateRequestDto.java | 2 +-
.../dto/InviteCodeCreateResponseDto.java | 2 +-
.../dto/InviteCodeJoinRequestDto.java | 2 +-
.../dto/InviteCodeJoinResponseDto.java | 2 +-
.../repository/InviteCodeRepository.java | 6 ++--
.../service/InviteCodeService.java | 18 +++++-----
.../controller/MatchingController.java | 12 ++++---
.../matching/{ => domain}/MbtiScoreId.java | 2 +-
.../{ => domain}/MbtiScoreProvider.java | 5 +--
.../matching/{ => domain/entity}/Answer.java | 4 +--
.../{ => domain/entity}/MbtiScore.java | 3 +-
.../{ => domain/entity}/Question.java | 4 +--
.../{ => domain/entity}/SubGroup.java | 4 +--
.../{ => domain/entity}/SubGroupMember.java | 4 +--
.../dto/MatchingResponseDto.java | 2 +-
.../{ => matching}/dto/MatchingResultDto.java | 3 +-
.../repository/MbtiScoreRepository.java | 6 ++--
.../repository/SubGroupMemberRepository.java | 6 ++--
.../repository/SubGroupRepository.java | 4 +--
.../service/MatchingService.java | 30 +++++++++++-----
.../ccgo/mission/dto/MissionTemplateDto.java | 2 +-
.../ccapp/ccgo/mission/dto/PartnerDto.java | 2 +-
.../ccgo/mission/dto/PartnerMissionDto.java | 2 +-
.../ccgo/mission/dto/UserMissionDto.java | 2 +-
.../{domain => entity}/MissionTemplate.java | 2 +-
.../mission/{domain => entity}/Partner.java | 6 ++--
.../{domain => entity}/PartnerMission.java | 2 +-
.../{domain => entity}/UserMission.java | 4 +--
.../repository/MissionTemplateRepository.java | 2 +-
.../repository/PartnerMissionRepository.java | 4 +--
.../mission/repository/PartnerRepository.java | 6 ++--
.../repository/UserMissionRepository.java | 2 +-
.../ccgo/mission/service/MissionService.java | 2 --
.../mission/service/MissionServiceImpl.java | 10 +++---
.../ccgo/mission/service/PartnerService.java | 5 ++-
.../mission/service/PartnerServiceImpl.java | 16 ++++-----
.../{ => question}/dto/AnswerRequestDto.java | 2 +-
.../dto/QuestionRequestDto.java | 2 +-
.../dto/QuestionResponseDto.java | 2 +-
.../{ => question}/dto/QuestionUpdateDto.java | 2 +-
.../{ => question}/dto/SingleAnswerDto.java | 2 +-
.../repository/AnswerRepository.java | 4 +--
.../repository/QuestionRepository.java | 4 +--
.../{ => team}/controller/TeamController.java | 10 +++---
.../{ => team}/dto/TeamMemberResponseDto.java | 2 +-
.../ccgo/{ => team}/dto/TeamRequestDto.java | 2 +-
.../ccgo/{ => team}/dto/TeamResponseDto.java | 2 +-
.../ccgo/team/{ => entity}/InviteCode.java | 2 +-
.../ccapp/ccgo/team/{ => entity}/Team.java | 2 +-
.../ccgo/team/{ => entity}/TeamMember.java | 4 +--
.../repository/TeamMemberRepository.java | 8 ++---
.../{ => team}/repository/TeamRepository.java | 4 +--
.../{ => user}/controller/UserController.java | 8 ++---
.../ccgo/{ => user}/dto/UserRequestDto.java | 3 +-
.../ccgo/{ => user}/dto/UserResponseDto.java | 2 +-
.../ccapp/ccgo/user/{ => entity}/User.java | 3 +-
.../ccgo/{dto => user/mapper}/UserMapper.java | 6 ++--
.../{ => user}/repository/UserRepository.java | 4 +--
.../ccgo/{ => user}/service/UserService.java | 16 ++++-----
73 files changed, 195 insertions(+), 191 deletions(-)
rename src/main/java/com/ccapp/ccgo/{ => auth}/controller/AuthController.java (89%)
rename src/main/java/com/ccapp/ccgo/{ => auth}/dto/LoginRequestDto.java (94%)
rename src/main/java/com/ccapp/ccgo/{ => auth}/dto/LoginResponseDto.java (90%)
rename src/main/java/com/ccapp/ccgo/{ => auth}/dto/TokenResponseDto.java (87%)
rename src/main/java/com/ccapp/ccgo/{ => auth}/jwt/JwtAuthenticationFilter.java (96%)
rename src/main/java/com/ccapp/ccgo/{ => auth}/jwt/JwtProvider.java (98%)
rename src/main/java/com/ccapp/ccgo/{ => auth}/jwt/JwtToken.java (89%)
rename src/main/java/com/ccapp/ccgo/{ => auth}/jwt/LoginUserDetails.java (88%)
rename src/main/java/com/ccapp/ccgo/{ => auth}/jwt/SecurityConfig.java (97%)
rename src/main/java/com/ccapp/ccgo/{jwt => auth/service}/LoginUserDetailsService.java (83%)
rename src/main/java/com/ccapp/ccgo/{ => common}/exception/CustomException.java (91%)
rename src/main/java/com/ccapp/ccgo/{ => common}/exception/GlobalExceptionHandler.java (98%)
rename src/main/java/com/ccapp/ccgo/{user => common/test}/BcryptTestController.java (95%)
rename src/main/java/com/ccapp/ccgo/{ => invitecode}/controller/InviteCodeController.java (78%)
rename src/main/java/com/ccapp/ccgo/{ => invitecode}/dto/InviteCodeCreateRequestDto.java (63%)
rename src/main/java/com/ccapp/ccgo/{ => invitecode}/dto/InviteCodeCreateResponseDto.java (83%)
rename src/main/java/com/ccapp/ccgo/{ => invitecode}/dto/InviteCodeJoinRequestDto.java (80%)
rename src/main/java/com/ccapp/ccgo/{ => invitecode}/dto/InviteCodeJoinResponseDto.java (86%)
rename src/main/java/com/ccapp/ccgo/{ => invitecode}/repository/InviteCodeRepository.java (84%)
rename src/main/java/com/ccapp/ccgo/{ => invitecode}/service/InviteCodeService.java (90%)
rename src/main/java/com/ccapp/ccgo/{ => matching}/controller/MatchingController.java (80%)
rename src/main/java/com/ccapp/ccgo/matching/{ => domain}/MbtiScoreId.java (83%)
rename src/main/java/com/ccapp/ccgo/matching/{ => domain}/MbtiScoreProvider.java (86%)
rename src/main/java/com/ccapp/ccgo/matching/{ => domain/entity}/Answer.java (89%)
rename src/main/java/com/ccapp/ccgo/matching/{ => domain/entity}/MbtiScore.java (81%)
rename src/main/java/com/ccapp/ccgo/matching/{ => domain/entity}/Question.java (87%)
rename src/main/java/com/ccapp/ccgo/matching/{ => domain/entity}/SubGroup.java (87%)
rename src/main/java/com/ccapp/ccgo/matching/{ => domain/entity}/SubGroupMember.java (87%)
rename src/main/java/com/ccapp/ccgo/{ => matching}/dto/MatchingResponseDto.java (86%)
rename src/main/java/com/ccapp/ccgo/{ => matching}/dto/MatchingResultDto.java (80%)
rename src/main/java/com/ccapp/ccgo/{ => matching}/repository/MbtiScoreRepository.java (57%)
rename src/main/java/com/ccapp/ccgo/{ => matching}/repository/SubGroupMemberRepository.java (68%)
rename src/main/java/com/ccapp/ccgo/{ => matching}/repository/SubGroupRepository.java (68%)
rename src/main/java/com/ccapp/ccgo/{ => matching}/service/MatchingService.java (93%)
rename src/main/java/com/ccapp/ccgo/mission/{domain => entity}/MissionTemplate.java (92%)
rename src/main/java/com/ccapp/ccgo/mission/{domain => entity}/Partner.java (80%)
rename src/main/java/com/ccapp/ccgo/mission/{domain => entity}/PartnerMission.java (93%)
rename src/main/java/com/ccapp/ccgo/mission/{domain => entity}/UserMission.java (90%)
rename src/main/java/com/ccapp/ccgo/{ => question}/dto/AnswerRequestDto.java (84%)
rename src/main/java/com/ccapp/ccgo/{ => question}/dto/QuestionRequestDto.java (83%)
rename src/main/java/com/ccapp/ccgo/{ => question}/dto/QuestionResponseDto.java (80%)
rename src/main/java/com/ccapp/ccgo/{ => question}/dto/QuestionUpdateDto.java (78%)
rename src/main/java/com/ccapp/ccgo/{ => question}/dto/SingleAnswerDto.java (81%)
rename src/main/java/com/ccapp/ccgo/{ => question}/repository/AnswerRepository.java (72%)
rename src/main/java/com/ccapp/ccgo/{ => question}/repository/QuestionRepository.java (68%)
rename src/main/java/com/ccapp/ccgo/{ => team}/controller/TeamController.java (83%)
rename src/main/java/com/ccapp/ccgo/{ => team}/dto/TeamMemberResponseDto.java (84%)
rename src/main/java/com/ccapp/ccgo/{ => team}/dto/TeamRequestDto.java (76%)
rename src/main/java/com/ccapp/ccgo/{ => team}/dto/TeamResponseDto.java (83%)
rename src/main/java/com/ccapp/ccgo/team/{ => entity}/InviteCode.java (96%)
rename src/main/java/com/ccapp/ccgo/team/{ => entity}/Team.java (95%)
rename src/main/java/com/ccapp/ccgo/team/{ => entity}/TeamMember.java (95%)
rename src/main/java/com/ccapp/ccgo/{ => team}/repository/TeamMemberRepository.java (85%)
rename src/main/java/com/ccapp/ccgo/{ => team}/repository/TeamRepository.java (85%)
rename src/main/java/com/ccapp/ccgo/{ => user}/controller/UserController.java (81%)
rename src/main/java/com/ccapp/ccgo/{ => user}/dto/UserRequestDto.java (86%)
rename src/main/java/com/ccapp/ccgo/{ => user}/dto/UserResponseDto.java (92%)
rename src/main/java/com/ccapp/ccgo/user/{ => entity}/User.java (95%)
rename src/main/java/com/ccapp/ccgo/{dto => user/mapper}/UserMapper.java (83%)
rename src/main/java/com/ccapp/ccgo/{ => user}/repository/UserRepository.java (72%)
rename src/main/java/com/ccapp/ccgo/{ => user}/service/UserService.java (89%)
diff --git a/src/main/java/com/ccapp/ccgo/controller/AuthController.java b/src/main/java/com/ccapp/ccgo/auth/controller/AuthController.java
similarity index 89%
rename from src/main/java/com/ccapp/ccgo/controller/AuthController.java
rename to src/main/java/com/ccapp/ccgo/auth/controller/AuthController.java
index d08f181..bec1273 100644
--- a/src/main/java/com/ccapp/ccgo/controller/AuthController.java
+++ b/src/main/java/com/ccapp/ccgo/auth/controller/AuthController.java
@@ -1,18 +1,16 @@
-package com.ccapp.ccgo.controller;
-
-import com.ccapp.ccgo.common.Role;
-import com.ccapp.ccgo.dto.TokenResponseDto;
-import com.ccapp.ccgo.jwt.LoginUserDetailsService;
-import com.ccapp.ccgo.repository.TeamMemberRepository;
-import com.ccapp.ccgo.team.Team;
-import com.ccapp.ccgo.team.TeamMember;
-import com.ccapp.ccgo.user.User;
-import com.ccapp.ccgo.dto.LoginRequestDto;
-import com.ccapp.ccgo.dto.LoginResponseDto;
-import com.ccapp.ccgo.jwt.JwtProvider;
-import com.ccapp.ccgo.jwt.LoginUserDetails;
+package com.ccapp.ccgo.auth.controller;
+
+import com.ccapp.ccgo.auth.dto.LoginRequestDto;
+import com.ccapp.ccgo.auth.dto.LoginResponseDto;
+import com.ccapp.ccgo.auth.dto.TokenResponseDto;
+import com.ccapp.ccgo.auth.jwt.JwtProvider;
+import com.ccapp.ccgo.auth.jwt.LoginUserDetails;
+import com.ccapp.ccgo.auth.service.LoginUserDetailsService;
+import com.ccapp.ccgo.team.repository.TeamMemberRepository;
+import com.ccapp.ccgo.team.entity.TeamMember;
+import com.ccapp.ccgo.user.entity.User;
import lombok.extern.slf4j.Slf4j;
-import com.ccapp.ccgo.repository.TeamRepository;
+import com.ccapp.ccgo.team.repository.TeamRepository;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseCookie;
@@ -21,15 +19,11 @@
import org.springframework.security.authentication.BadCredentialsException;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
-import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.web.bind.annotation.*;
import org.springframework.http.HttpHeaders;
-import java.time.LocalDateTime;
-import java.util.HashMap;
import java.util.List;
import java.util.Map;
-import java.util.Optional;
@Slf4j
@RestController
diff --git a/src/main/java/com/ccapp/ccgo/dto/LoginRequestDto.java b/src/main/java/com/ccapp/ccgo/auth/dto/LoginRequestDto.java
similarity index 94%
rename from src/main/java/com/ccapp/ccgo/dto/LoginRequestDto.java
rename to src/main/java/com/ccapp/ccgo/auth/dto/LoginRequestDto.java
index 7230285..f31f832 100644
--- a/src/main/java/com/ccapp/ccgo/dto/LoginRequestDto.java
+++ b/src/main/java/com/ccapp/ccgo/auth/dto/LoginRequestDto.java
@@ -1,4 +1,4 @@
-package com.ccapp.ccgo.dto;
+package com.ccapp.ccgo.auth.dto;
import lombok.Getter;
import jakarta.validation.constraints.Email;
diff --git a/src/main/java/com/ccapp/ccgo/dto/LoginResponseDto.java b/src/main/java/com/ccapp/ccgo/auth/dto/LoginResponseDto.java
similarity index 90%
rename from src/main/java/com/ccapp/ccgo/dto/LoginResponseDto.java
rename to src/main/java/com/ccapp/ccgo/auth/dto/LoginResponseDto.java
index 8bba79c..7658443 100644
--- a/src/main/java/com/ccapp/ccgo/dto/LoginResponseDto.java
+++ b/src/main/java/com/ccapp/ccgo/auth/dto/LoginResponseDto.java
@@ -1,6 +1,5 @@
-package com.ccapp.ccgo.dto;
+package com.ccapp.ccgo.auth.dto;
-import jakarta.persistence.Column;
import lombok.Builder;
import lombok.Getter;
diff --git a/src/main/java/com/ccapp/ccgo/dto/TokenResponseDto.java b/src/main/java/com/ccapp/ccgo/auth/dto/TokenResponseDto.java
similarity index 87%
rename from src/main/java/com/ccapp/ccgo/dto/TokenResponseDto.java
rename to src/main/java/com/ccapp/ccgo/auth/dto/TokenResponseDto.java
index fd9e5cc..0adc131 100644
--- a/src/main/java/com/ccapp/ccgo/dto/TokenResponseDto.java
+++ b/src/main/java/com/ccapp/ccgo/auth/dto/TokenResponseDto.java
@@ -1,4 +1,4 @@
-package com.ccapp.ccgo.dto;
+package com.ccapp.ccgo.auth.dto;
import lombok.AllArgsConstructor;
import lombok.Data;
diff --git a/src/main/java/com/ccapp/ccgo/jwt/JwtAuthenticationFilter.java b/src/main/java/com/ccapp/ccgo/auth/jwt/JwtAuthenticationFilter.java
similarity index 96%
rename from src/main/java/com/ccapp/ccgo/jwt/JwtAuthenticationFilter.java
rename to src/main/java/com/ccapp/ccgo/auth/jwt/JwtAuthenticationFilter.java
index 693d646..0ae60eb 100644
--- a/src/main/java/com/ccapp/ccgo/jwt/JwtAuthenticationFilter.java
+++ b/src/main/java/com/ccapp/ccgo/auth/jwt/JwtAuthenticationFilter.java
@@ -1,5 +1,6 @@
-package com.ccapp.ccgo.jwt;
+package com.ccapp.ccgo.auth.jwt;
+import com.ccapp.ccgo.auth.service.LoginUserDetailsService;
import jakarta.servlet.FilterChain;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.ServletException;
diff --git a/src/main/java/com/ccapp/ccgo/jwt/JwtProvider.java b/src/main/java/com/ccapp/ccgo/auth/jwt/JwtProvider.java
similarity index 98%
rename from src/main/java/com/ccapp/ccgo/jwt/JwtProvider.java
rename to src/main/java/com/ccapp/ccgo/auth/jwt/JwtProvider.java
index bd6b35b..ccd2abe 100644
--- a/src/main/java/com/ccapp/ccgo/jwt/JwtProvider.java
+++ b/src/main/java/com/ccapp/ccgo/auth/jwt/JwtProvider.java
@@ -1,4 +1,4 @@
-package com.ccapp.ccgo.jwt;
+package com.ccapp.ccgo.auth.jwt;
import io.jsonwebtoken.*;
import io.jsonwebtoken.security.Keys;
import jakarta.annotation.PostConstruct;
diff --git a/src/main/java/com/ccapp/ccgo/jwt/JwtToken.java b/src/main/java/com/ccapp/ccgo/auth/jwt/JwtToken.java
similarity index 89%
rename from src/main/java/com/ccapp/ccgo/jwt/JwtToken.java
rename to src/main/java/com/ccapp/ccgo/auth/jwt/JwtToken.java
index 26fbaf1..1133e00 100644
--- a/src/main/java/com/ccapp/ccgo/jwt/JwtToken.java
+++ b/src/main/java/com/ccapp/ccgo/auth/jwt/JwtToken.java
@@ -1,4 +1,4 @@
-package com.ccapp.ccgo.jwt;
+package com.ccapp.ccgo.auth.jwt;
import lombok.AllArgsConstructor;
import lombok.Getter;
diff --git a/src/main/java/com/ccapp/ccgo/jwt/LoginUserDetails.java b/src/main/java/com/ccapp/ccgo/auth/jwt/LoginUserDetails.java
similarity index 88%
rename from src/main/java/com/ccapp/ccgo/jwt/LoginUserDetails.java
rename to src/main/java/com/ccapp/ccgo/auth/jwt/LoginUserDetails.java
index 81db6c0..e75c88b 100644
--- a/src/main/java/com/ccapp/ccgo/jwt/LoginUserDetails.java
+++ b/src/main/java/com/ccapp/ccgo/auth/jwt/LoginUserDetails.java
@@ -1,15 +1,13 @@
-package com.ccapp.ccgo.jwt;
+package com.ccapp.ccgo.auth.jwt;
-import com.ccapp.ccgo.user.User;
+import com.ccapp.ccgo.user.entity.User;
import lombok.Getter;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
-import org.springframework.security.core.authority.SimpleGrantedAuthority;
import java.util.Collection;
import java.util.Collections;
-import java.util.List;
@Getter
public class LoginUserDetails implements UserDetails {
diff --git a/src/main/java/com/ccapp/ccgo/jwt/SecurityConfig.java b/src/main/java/com/ccapp/ccgo/auth/jwt/SecurityConfig.java
similarity index 97%
rename from src/main/java/com/ccapp/ccgo/jwt/SecurityConfig.java
rename to src/main/java/com/ccapp/ccgo/auth/jwt/SecurityConfig.java
index b1173b4..5ece0f1 100644
--- a/src/main/java/com/ccapp/ccgo/jwt/SecurityConfig.java
+++ b/src/main/java/com/ccapp/ccgo/auth/jwt/SecurityConfig.java
@@ -1,5 +1,6 @@
-package com.ccapp.ccgo.jwt;
+package com.ccapp.ccgo.auth.jwt;
+import com.ccapp.ccgo.auth.service.LoginUserDetailsService;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
diff --git a/src/main/java/com/ccapp/ccgo/jwt/LoginUserDetailsService.java b/src/main/java/com/ccapp/ccgo/auth/service/LoginUserDetailsService.java
similarity index 83%
rename from src/main/java/com/ccapp/ccgo/jwt/LoginUserDetailsService.java
rename to src/main/java/com/ccapp/ccgo/auth/service/LoginUserDetailsService.java
index 3d5ea1d..97899f7 100644
--- a/src/main/java/com/ccapp/ccgo/jwt/LoginUserDetailsService.java
+++ b/src/main/java/com/ccapp/ccgo/auth/service/LoginUserDetailsService.java
@@ -1,7 +1,8 @@
-package com.ccapp.ccgo.jwt;
+package com.ccapp.ccgo.auth.service;
-import com.ccapp.ccgo.user.User;
-import com.ccapp.ccgo.repository.UserRepository;
+import com.ccapp.ccgo.auth.jwt.LoginUserDetails;
+import com.ccapp.ccgo.user.entity.User;
+import com.ccapp.ccgo.user.repository.UserRepository;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
diff --git a/src/main/java/com/ccapp/ccgo/exception/CustomException.java b/src/main/java/com/ccapp/ccgo/common/exception/CustomException.java
similarity index 91%
rename from src/main/java/com/ccapp/ccgo/exception/CustomException.java
rename to src/main/java/com/ccapp/ccgo/common/exception/CustomException.java
index 24b2320..89e4d37 100644
--- a/src/main/java/com/ccapp/ccgo/exception/CustomException.java
+++ b/src/main/java/com/ccapp/ccgo/common/exception/CustomException.java
@@ -1,4 +1,4 @@
-package com.ccapp.ccgo.exception;
+package com.ccapp.ccgo.common.exception;
import org.springframework.http.HttpStatus;
import lombok.Getter;
diff --git a/src/main/java/com/ccapp/ccgo/exception/GlobalExceptionHandler.java b/src/main/java/com/ccapp/ccgo/common/exception/GlobalExceptionHandler.java
similarity index 98%
rename from src/main/java/com/ccapp/ccgo/exception/GlobalExceptionHandler.java
rename to src/main/java/com/ccapp/ccgo/common/exception/GlobalExceptionHandler.java
index e6be98f..b3946ca 100644
--- a/src/main/java/com/ccapp/ccgo/exception/GlobalExceptionHandler.java
+++ b/src/main/java/com/ccapp/ccgo/common/exception/GlobalExceptionHandler.java
@@ -1,4 +1,4 @@
-package com.ccapp.ccgo.exception;
+package com.ccapp.ccgo.common.exception;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
diff --git a/src/main/java/com/ccapp/ccgo/user/BcryptTestController.java b/src/main/java/com/ccapp/ccgo/common/test/BcryptTestController.java
similarity index 95%
rename from src/main/java/com/ccapp/ccgo/user/BcryptTestController.java
rename to src/main/java/com/ccapp/ccgo/common/test/BcryptTestController.java
index e02c282..a34c230 100644
--- a/src/main/java/com/ccapp/ccgo/user/BcryptTestController.java
+++ b/src/main/java/com/ccapp/ccgo/common/test/BcryptTestController.java
@@ -1,4 +1,4 @@
-package com.ccapp.ccgo.user;
+package com.ccapp.ccgo.common.test;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.web.bind.annotation.GetMapping;
diff --git a/src/main/java/com/ccapp/ccgo/controller/InviteCodeController.java b/src/main/java/com/ccapp/ccgo/invitecode/controller/InviteCodeController.java
similarity index 78%
rename from src/main/java/com/ccapp/ccgo/controller/InviteCodeController.java
rename to src/main/java/com/ccapp/ccgo/invitecode/controller/InviteCodeController.java
index efa6b12..3554ae3 100644
--- a/src/main/java/com/ccapp/ccgo/controller/InviteCodeController.java
+++ b/src/main/java/com/ccapp/ccgo/invitecode/controller/InviteCodeController.java
@@ -1,21 +1,16 @@
-package com.ccapp.ccgo.controller;
-
-import com.ccapp.ccgo.common.Role;
-import com.ccapp.ccgo.dto.InviteCodeCreateResponseDto;
-import com.ccapp.ccgo.dto.InviteCodeJoinRequestDto;
-import com.ccapp.ccgo.dto.InviteCodeJoinResponseDto;
-import com.ccapp.ccgo.dto.TeamRequestDto;
-import com.ccapp.ccgo.exception.CustomException;
-import com.ccapp.ccgo.repository.InviteCodeRepository;
-import com.ccapp.ccgo.repository.TeamMemberRepository;
-import com.ccapp.ccgo.repository.TeamRepository;
-import com.ccapp.ccgo.repository.UserRepository;
-import com.ccapp.ccgo.service.InviteCodeService;
-import com.ccapp.ccgo.team.InviteCode;
-import com.ccapp.ccgo.team.Team;
-import com.ccapp.ccgo.team.TeamMember;
-import com.ccapp.ccgo.user.User;
-import com.ccapp.ccgo.jwt.LoginUserDetails;
+package com.ccapp.ccgo.invitecode.controller;
+
+import com.ccapp.ccgo.invitecode.dto.InviteCodeCreateResponseDto;
+import com.ccapp.ccgo.invitecode.dto.InviteCodeJoinRequestDto;
+import com.ccapp.ccgo.invitecode.dto.InviteCodeJoinResponseDto;
+import com.ccapp.ccgo.team.dto.TeamRequestDto;
+import com.ccapp.ccgo.invitecode.repository.InviteCodeRepository;
+import com.ccapp.ccgo.team.repository.TeamMemberRepository;
+import com.ccapp.ccgo.team.repository.TeamRepository;
+import com.ccapp.ccgo.invitecode.service.InviteCodeService;
+import com.ccapp.ccgo.team.entity.InviteCode;
+import com.ccapp.ccgo.user.entity.User;
+import com.ccapp.ccgo.auth.jwt.LoginUserDetails;
import lombok.RequiredArgsConstructor;
@@ -24,9 +19,6 @@
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.web.bind.annotation.*;
-import java.time.LocalDateTime;
-import java.util.List;
-
@RestController
@RequestMapping("/api/invitecode")
@RequiredArgsConstructor
diff --git a/src/main/java/com/ccapp/ccgo/dto/InviteCodeCreateRequestDto.java b/src/main/java/com/ccapp/ccgo/invitecode/dto/InviteCodeCreateRequestDto.java
similarity index 63%
rename from src/main/java/com/ccapp/ccgo/dto/InviteCodeCreateRequestDto.java
rename to src/main/java/com/ccapp/ccgo/invitecode/dto/InviteCodeCreateRequestDto.java
index afef848..b8a864e 100644
--- a/src/main/java/com/ccapp/ccgo/dto/InviteCodeCreateRequestDto.java
+++ b/src/main/java/com/ccapp/ccgo/invitecode/dto/InviteCodeCreateRequestDto.java
@@ -1,4 +1,4 @@
-package com.ccapp.ccgo.dto;
+package com.ccapp.ccgo.invitecode.dto;
public class InviteCodeCreateRequestDto {
private Long teamId;
diff --git a/src/main/java/com/ccapp/ccgo/dto/InviteCodeCreateResponseDto.java b/src/main/java/com/ccapp/ccgo/invitecode/dto/InviteCodeCreateResponseDto.java
similarity index 83%
rename from src/main/java/com/ccapp/ccgo/dto/InviteCodeCreateResponseDto.java
rename to src/main/java/com/ccapp/ccgo/invitecode/dto/InviteCodeCreateResponseDto.java
index dfea86c..5faece4 100644
--- a/src/main/java/com/ccapp/ccgo/dto/InviteCodeCreateResponseDto.java
+++ b/src/main/java/com/ccapp/ccgo/invitecode/dto/InviteCodeCreateResponseDto.java
@@ -1,4 +1,4 @@
-package com.ccapp.ccgo.dto;
+package com.ccapp.ccgo.invitecode.dto;
import lombok.Builder;
import lombok.Getter;
diff --git a/src/main/java/com/ccapp/ccgo/dto/InviteCodeJoinRequestDto.java b/src/main/java/com/ccapp/ccgo/invitecode/dto/InviteCodeJoinRequestDto.java
similarity index 80%
rename from src/main/java/com/ccapp/ccgo/dto/InviteCodeJoinRequestDto.java
rename to src/main/java/com/ccapp/ccgo/invitecode/dto/InviteCodeJoinRequestDto.java
index 1cf527c..a57a53a 100644
--- a/src/main/java/com/ccapp/ccgo/dto/InviteCodeJoinRequestDto.java
+++ b/src/main/java/com/ccapp/ccgo/invitecode/dto/InviteCodeJoinRequestDto.java
@@ -1,4 +1,4 @@
-package com.ccapp.ccgo.dto;
+package com.ccapp.ccgo.invitecode.dto;
import lombok.Getter;
import lombok.NoArgsConstructor;
diff --git a/src/main/java/com/ccapp/ccgo/dto/InviteCodeJoinResponseDto.java b/src/main/java/com/ccapp/ccgo/invitecode/dto/InviteCodeJoinResponseDto.java
similarity index 86%
rename from src/main/java/com/ccapp/ccgo/dto/InviteCodeJoinResponseDto.java
rename to src/main/java/com/ccapp/ccgo/invitecode/dto/InviteCodeJoinResponseDto.java
index 0c17413..4baafe6 100644
--- a/src/main/java/com/ccapp/ccgo/dto/InviteCodeJoinResponseDto.java
+++ b/src/main/java/com/ccapp/ccgo/invitecode/dto/InviteCodeJoinResponseDto.java
@@ -1,4 +1,4 @@
-package com.ccapp.ccgo.dto;
+package com.ccapp.ccgo.invitecode.dto;
import lombok.AllArgsConstructor;
import lombok.Getter;
diff --git a/src/main/java/com/ccapp/ccgo/repository/InviteCodeRepository.java b/src/main/java/com/ccapp/ccgo/invitecode/repository/InviteCodeRepository.java
similarity index 84%
rename from src/main/java/com/ccapp/ccgo/repository/InviteCodeRepository.java
rename to src/main/java/com/ccapp/ccgo/invitecode/repository/InviteCodeRepository.java
index 96d3f33..6de8a3c 100644
--- a/src/main/java/com/ccapp/ccgo/repository/InviteCodeRepository.java
+++ b/src/main/java/com/ccapp/ccgo/invitecode/repository/InviteCodeRepository.java
@@ -1,7 +1,7 @@
-package com.ccapp.ccgo.repository;
+package com.ccapp.ccgo.invitecode.repository;
-import com.ccapp.ccgo.team.InviteCode;
-import com.ccapp.ccgo.team.Team;
+import com.ccapp.ccgo.team.entity.InviteCode;
+import com.ccapp.ccgo.team.entity.Team;
import org.springframework.data.jpa.repository.JpaRepository;
import java.time.LocalDateTime;
diff --git a/src/main/java/com/ccapp/ccgo/service/InviteCodeService.java b/src/main/java/com/ccapp/ccgo/invitecode/service/InviteCodeService.java
similarity index 90%
rename from src/main/java/com/ccapp/ccgo/service/InviteCodeService.java
rename to src/main/java/com/ccapp/ccgo/invitecode/service/InviteCodeService.java
index e7d01d4..a419cad 100644
--- a/src/main/java/com/ccapp/ccgo/service/InviteCodeService.java
+++ b/src/main/java/com/ccapp/ccgo/invitecode/service/InviteCodeService.java
@@ -1,15 +1,15 @@
-package com.ccapp.ccgo.service;
+package com.ccapp.ccgo.invitecode.service;
import com.ccapp.ccgo.common.Role;
-import com.ccapp.ccgo.exception.CustomException;
-import com.ccapp.ccgo.repository.InviteCodeRepository;
-import com.ccapp.ccgo.repository.TeamMemberRepository;
-import com.ccapp.ccgo.repository.TeamRepository;
-import com.ccapp.ccgo.team.InviteCode;
-import com.ccapp.ccgo.team.Team;
-import com.ccapp.ccgo.team.TeamMember;
+import com.ccapp.ccgo.common.exception.CustomException;
+import com.ccapp.ccgo.invitecode.repository.InviteCodeRepository;
+import com.ccapp.ccgo.team.repository.TeamMemberRepository;
+import com.ccapp.ccgo.team.repository.TeamRepository;
+import com.ccapp.ccgo.team.entity.InviteCode;
+import com.ccapp.ccgo.team.entity.Team;
+import com.ccapp.ccgo.team.entity.TeamMember;
import org.springframework.scheduling.annotation.Scheduled;
-import com.ccapp.ccgo.user.User;
+import com.ccapp.ccgo.user.entity.User;
import org.springframework.http.HttpStatus;
import org.springframework.transaction.annotation.Transactional;
import lombok.RequiredArgsConstructor;
diff --git a/src/main/java/com/ccapp/ccgo/controller/MatchingController.java b/src/main/java/com/ccapp/ccgo/matching/controller/MatchingController.java
similarity index 80%
rename from src/main/java/com/ccapp/ccgo/controller/MatchingController.java
rename to src/main/java/com/ccapp/ccgo/matching/controller/MatchingController.java
index fa48689..c4b3517 100644
--- a/src/main/java/com/ccapp/ccgo/controller/MatchingController.java
+++ b/src/main/java/com/ccapp/ccgo/matching/controller/MatchingController.java
@@ -1,7 +1,11 @@
-package com.ccapp.ccgo.controller;
-
-import com.ccapp.ccgo.dto.*;
-import com.ccapp.ccgo.service.MatchingService;
+package com.ccapp.ccgo.matching.controller;
+
+import com.ccapp.ccgo.question.dto.AnswerRequestDto;
+import com.ccapp.ccgo.matching.dto.MatchingResponseDto;
+import com.ccapp.ccgo.question.dto.QuestionRequestDto;
+import com.ccapp.ccgo.question.dto.QuestionResponseDto;
+import com.ccapp.ccgo.question.dto.QuestionUpdateDto;
+import com.ccapp.ccgo.matching.service.MatchingService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
diff --git a/src/main/java/com/ccapp/ccgo/matching/MbtiScoreId.java b/src/main/java/com/ccapp/ccgo/matching/domain/MbtiScoreId.java
similarity index 83%
rename from src/main/java/com/ccapp/ccgo/matching/MbtiScoreId.java
rename to src/main/java/com/ccapp/ccgo/matching/domain/MbtiScoreId.java
index fd1fb0f..3071a9b 100644
--- a/src/main/java/com/ccapp/ccgo/matching/MbtiScoreId.java
+++ b/src/main/java/com/ccapp/ccgo/matching/domain/MbtiScoreId.java
@@ -1,4 +1,4 @@
-package com.ccapp.ccgo.matching;
+package com.ccapp.ccgo.matching.domain;
import lombok.*;
diff --git a/src/main/java/com/ccapp/ccgo/matching/MbtiScoreProvider.java b/src/main/java/com/ccapp/ccgo/matching/domain/MbtiScoreProvider.java
similarity index 86%
rename from src/main/java/com/ccapp/ccgo/matching/MbtiScoreProvider.java
rename to src/main/java/com/ccapp/ccgo/matching/domain/MbtiScoreProvider.java
index a5e67d2..8f3d567 100644
--- a/src/main/java/com/ccapp/ccgo/matching/MbtiScoreProvider.java
+++ b/src/main/java/com/ccapp/ccgo/matching/domain/MbtiScoreProvider.java
@@ -1,6 +1,7 @@
-package com.ccapp.ccgo.matching;
+package com.ccapp.ccgo.matching.domain;
-import com.ccapp.ccgo.repository.MbtiScoreRepository;
+import com.ccapp.ccgo.matching.domain.entity.MbtiScore;
+import com.ccapp.ccgo.matching.repository.MbtiScoreRepository;
import jakarta.annotation.PostConstruct;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
diff --git a/src/main/java/com/ccapp/ccgo/matching/Answer.java b/src/main/java/com/ccapp/ccgo/matching/domain/entity/Answer.java
similarity index 89%
rename from src/main/java/com/ccapp/ccgo/matching/Answer.java
rename to src/main/java/com/ccapp/ccgo/matching/domain/entity/Answer.java
index c9ce69f..5dc0eb9 100644
--- a/src/main/java/com/ccapp/ccgo/matching/Answer.java
+++ b/src/main/java/com/ccapp/ccgo/matching/domain/entity/Answer.java
@@ -1,6 +1,6 @@
-package com.ccapp.ccgo.matching;
+package com.ccapp.ccgo.matching.domain.entity;
-import com.ccapp.ccgo.user.User;
+import com.ccapp.ccgo.user.entity.User;
import jakarta.persistence.*;
import lombok.*;
diff --git a/src/main/java/com/ccapp/ccgo/matching/MbtiScore.java b/src/main/java/com/ccapp/ccgo/matching/domain/entity/MbtiScore.java
similarity index 81%
rename from src/main/java/com/ccapp/ccgo/matching/MbtiScore.java
rename to src/main/java/com/ccapp/ccgo/matching/domain/entity/MbtiScore.java
index cc9c1f1..adba3c6 100644
--- a/src/main/java/com/ccapp/ccgo/matching/MbtiScore.java
+++ b/src/main/java/com/ccapp/ccgo/matching/domain/entity/MbtiScore.java
@@ -1,5 +1,6 @@
-package com.ccapp.ccgo.matching;
+package com.ccapp.ccgo.matching.domain.entity;
+import com.ccapp.ccgo.matching.domain.MbtiScoreId;
import jakarta.persistence.*;
import lombok.*;
diff --git a/src/main/java/com/ccapp/ccgo/matching/Question.java b/src/main/java/com/ccapp/ccgo/matching/domain/entity/Question.java
similarity index 87%
rename from src/main/java/com/ccapp/ccgo/matching/Question.java
rename to src/main/java/com/ccapp/ccgo/matching/domain/entity/Question.java
index 5986dec..d7e35d8 100644
--- a/src/main/java/com/ccapp/ccgo/matching/Question.java
+++ b/src/main/java/com/ccapp/ccgo/matching/domain/entity/Question.java
@@ -1,6 +1,6 @@
-package com.ccapp.ccgo.matching;
+package com.ccapp.ccgo.matching.domain.entity;
-import com.ccapp.ccgo.team.Team;
+import com.ccapp.ccgo.team.entity.Team;
import jakarta.persistence.*;
import lombok.*;
diff --git a/src/main/java/com/ccapp/ccgo/matching/SubGroup.java b/src/main/java/com/ccapp/ccgo/matching/domain/entity/SubGroup.java
similarity index 87%
rename from src/main/java/com/ccapp/ccgo/matching/SubGroup.java
rename to src/main/java/com/ccapp/ccgo/matching/domain/entity/SubGroup.java
index 228df01..50a9a68 100644
--- a/src/main/java/com/ccapp/ccgo/matching/SubGroup.java
+++ b/src/main/java/com/ccapp/ccgo/matching/domain/entity/SubGroup.java
@@ -1,6 +1,6 @@
-package com.ccapp.ccgo.matching;
+package com.ccapp.ccgo.matching.domain.entity;
-import com.ccapp.ccgo.team.Team;
+import com.ccapp.ccgo.team.entity.Team;
import jakarta.persistence.*;
import lombok.*;
diff --git a/src/main/java/com/ccapp/ccgo/matching/SubGroupMember.java b/src/main/java/com/ccapp/ccgo/matching/domain/entity/SubGroupMember.java
similarity index 87%
rename from src/main/java/com/ccapp/ccgo/matching/SubGroupMember.java
rename to src/main/java/com/ccapp/ccgo/matching/domain/entity/SubGroupMember.java
index cd084a1..4af679a 100644
--- a/src/main/java/com/ccapp/ccgo/matching/SubGroupMember.java
+++ b/src/main/java/com/ccapp/ccgo/matching/domain/entity/SubGroupMember.java
@@ -1,6 +1,6 @@
-package com.ccapp.ccgo.matching;
+package com.ccapp.ccgo.matching.domain.entity;
-import com.ccapp.ccgo.user.User;
+import com.ccapp.ccgo.user.entity.User;
import jakarta.persistence.*;
import lombok.*;
diff --git a/src/main/java/com/ccapp/ccgo/dto/MatchingResponseDto.java b/src/main/java/com/ccapp/ccgo/matching/dto/MatchingResponseDto.java
similarity index 86%
rename from src/main/java/com/ccapp/ccgo/dto/MatchingResponseDto.java
rename to src/main/java/com/ccapp/ccgo/matching/dto/MatchingResponseDto.java
index 4edc3e6..ba8bf85 100644
--- a/src/main/java/com/ccapp/ccgo/dto/MatchingResponseDto.java
+++ b/src/main/java/com/ccapp/ccgo/matching/dto/MatchingResponseDto.java
@@ -1,4 +1,4 @@
-package com.ccapp.ccgo.dto;
+package com.ccapp.ccgo.matching.dto;
import lombok.*;
diff --git a/src/main/java/com/ccapp/ccgo/dto/MatchingResultDto.java b/src/main/java/com/ccapp/ccgo/matching/dto/MatchingResultDto.java
similarity index 80%
rename from src/main/java/com/ccapp/ccgo/dto/MatchingResultDto.java
rename to src/main/java/com/ccapp/ccgo/matching/dto/MatchingResultDto.java
index 8250a4f..0f423b4 100644
--- a/src/main/java/com/ccapp/ccgo/dto/MatchingResultDto.java
+++ b/src/main/java/com/ccapp/ccgo/matching/dto/MatchingResultDto.java
@@ -1,5 +1,6 @@
-package com.ccapp.ccgo.dto;
+package com.ccapp.ccgo.matching.dto;
+import com.ccapp.ccgo.user.dto.UserResponseDto;
import lombok.*;
import java.util.List;
diff --git a/src/main/java/com/ccapp/ccgo/repository/MbtiScoreRepository.java b/src/main/java/com/ccapp/ccgo/matching/repository/MbtiScoreRepository.java
similarity index 57%
rename from src/main/java/com/ccapp/ccgo/repository/MbtiScoreRepository.java
rename to src/main/java/com/ccapp/ccgo/matching/repository/MbtiScoreRepository.java
index 96a6f88..8e13654 100644
--- a/src/main/java/com/ccapp/ccgo/repository/MbtiScoreRepository.java
+++ b/src/main/java/com/ccapp/ccgo/matching/repository/MbtiScoreRepository.java
@@ -1,7 +1,7 @@
-package com.ccapp.ccgo.repository;
+package com.ccapp.ccgo.matching.repository;
-import com.ccapp.ccgo.matching.MbtiScore;
-import com.ccapp.ccgo.matching.MbtiScoreId;
+import com.ccapp.ccgo.matching.domain.entity.MbtiScore;
+import com.ccapp.ccgo.matching.domain.MbtiScoreId;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
diff --git a/src/main/java/com/ccapp/ccgo/repository/SubGroupMemberRepository.java b/src/main/java/com/ccapp/ccgo/matching/repository/SubGroupMemberRepository.java
similarity index 68%
rename from src/main/java/com/ccapp/ccgo/repository/SubGroupMemberRepository.java
rename to src/main/java/com/ccapp/ccgo/matching/repository/SubGroupMemberRepository.java
index 8e692df..063812f 100644
--- a/src/main/java/com/ccapp/ccgo/repository/SubGroupMemberRepository.java
+++ b/src/main/java/com/ccapp/ccgo/matching/repository/SubGroupMemberRepository.java
@@ -1,7 +1,7 @@
-package com.ccapp.ccgo.repository;
+package com.ccapp.ccgo.matching.repository;
-import com.ccapp.ccgo.matching.SubGroup;
-import com.ccapp.ccgo.matching.SubGroupMember;
+import com.ccapp.ccgo.matching.domain.entity.SubGroup;
+import com.ccapp.ccgo.matching.domain.entity.SubGroupMember;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
diff --git a/src/main/java/com/ccapp/ccgo/repository/SubGroupRepository.java b/src/main/java/com/ccapp/ccgo/matching/repository/SubGroupRepository.java
similarity index 68%
rename from src/main/java/com/ccapp/ccgo/repository/SubGroupRepository.java
rename to src/main/java/com/ccapp/ccgo/matching/repository/SubGroupRepository.java
index 9c9ea59..b7ad959 100644
--- a/src/main/java/com/ccapp/ccgo/repository/SubGroupRepository.java
+++ b/src/main/java/com/ccapp/ccgo/matching/repository/SubGroupRepository.java
@@ -1,6 +1,6 @@
-package com.ccapp.ccgo.repository;
+package com.ccapp.ccgo.matching.repository;
-import com.ccapp.ccgo.matching.SubGroup;
+import com.ccapp.ccgo.matching.domain.entity.SubGroup;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
diff --git a/src/main/java/com/ccapp/ccgo/service/MatchingService.java b/src/main/java/com/ccapp/ccgo/matching/service/MatchingService.java
similarity index 93%
rename from src/main/java/com/ccapp/ccgo/service/MatchingService.java
rename to src/main/java/com/ccapp/ccgo/matching/service/MatchingService.java
index e21ebfb..84726c1 100644
--- a/src/main/java/com/ccapp/ccgo/service/MatchingService.java
+++ b/src/main/java/com/ccapp/ccgo/matching/service/MatchingService.java
@@ -1,11 +1,25 @@
-package com.ccapp.ccgo.service;
-
-import com.ccapp.ccgo.dto.*;
-import com.ccapp.ccgo.matching.*;
-import com.ccapp.ccgo.repository.*;
-import com.ccapp.ccgo.team.Team;
-import com.ccapp.ccgo.team.TeamMember;
-import com.ccapp.ccgo.user.User;
+package com.ccapp.ccgo.matching.service;
+
+import com.ccapp.ccgo.matching.domain.MbtiScoreProvider;
+import com.ccapp.ccgo.matching.domain.entity.Answer;
+import com.ccapp.ccgo.matching.domain.entity.Question;
+import com.ccapp.ccgo.matching.domain.entity.SubGroup;
+import com.ccapp.ccgo.matching.domain.entity.SubGroupMember;
+import com.ccapp.ccgo.question.dto.AnswerRequestDto;
+import com.ccapp.ccgo.matching.dto.MatchingResponseDto;
+import com.ccapp.ccgo.matching.dto.MatchingResultDto;
+import com.ccapp.ccgo.matching.repository.SubGroupMemberRepository;
+import com.ccapp.ccgo.matching.repository.SubGroupRepository;
+import com.ccapp.ccgo.question.dto.QuestionRequestDto;
+import com.ccapp.ccgo.question.dto.QuestionResponseDto;
+import com.ccapp.ccgo.question.dto.QuestionUpdateDto;
+import com.ccapp.ccgo.question.repository.AnswerRepository;
+import com.ccapp.ccgo.question.repository.QuestionRepository;
+import com.ccapp.ccgo.team.repository.TeamMemberRepository;
+import com.ccapp.ccgo.user.dto.UserResponseDto;
+import com.ccapp.ccgo.team.entity.Team;
+import com.ccapp.ccgo.team.entity.TeamMember;
+import com.ccapp.ccgo.user.entity.User;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.RequiredArgsConstructor;
diff --git a/src/main/java/com/ccapp/ccgo/mission/dto/MissionTemplateDto.java b/src/main/java/com/ccapp/ccgo/mission/dto/MissionTemplateDto.java
index 1762a7e..ee06c13 100644
--- a/src/main/java/com/ccapp/ccgo/mission/dto/MissionTemplateDto.java
+++ b/src/main/java/com/ccapp/ccgo/mission/dto/MissionTemplateDto.java
@@ -1,6 +1,6 @@
package com.ccapp.ccgo.mission.dto;
-import com.ccapp.ccgo.mission.domain.MissionTemplate;
+import com.ccapp.ccgo.mission.entity.MissionTemplate;
import lombok.Builder;
import lombok.Data;
diff --git a/src/main/java/com/ccapp/ccgo/mission/dto/PartnerDto.java b/src/main/java/com/ccapp/ccgo/mission/dto/PartnerDto.java
index fe0a1d3..c6f2b9a 100644
--- a/src/main/java/com/ccapp/ccgo/mission/dto/PartnerDto.java
+++ b/src/main/java/com/ccapp/ccgo/mission/dto/PartnerDto.java
@@ -1,6 +1,6 @@
package com.ccapp.ccgo.mission.dto;
-import com.ccapp.ccgo.mission.domain.Partner;
+import com.ccapp.ccgo.mission.entity.Partner;
import lombok.Builder;
import lombok.Data;
diff --git a/src/main/java/com/ccapp/ccgo/mission/dto/PartnerMissionDto.java b/src/main/java/com/ccapp/ccgo/mission/dto/PartnerMissionDto.java
index 1f0773e..0f35cd5 100644
--- a/src/main/java/com/ccapp/ccgo/mission/dto/PartnerMissionDto.java
+++ b/src/main/java/com/ccapp/ccgo/mission/dto/PartnerMissionDto.java
@@ -1,6 +1,6 @@
package com.ccapp.ccgo.mission.dto;
-import com.ccapp.ccgo.mission.domain.PartnerMission;
+import com.ccapp.ccgo.mission.entity.PartnerMission;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
diff --git a/src/main/java/com/ccapp/ccgo/mission/dto/UserMissionDto.java b/src/main/java/com/ccapp/ccgo/mission/dto/UserMissionDto.java
index b636618..d872214 100644
--- a/src/main/java/com/ccapp/ccgo/mission/dto/UserMissionDto.java
+++ b/src/main/java/com/ccapp/ccgo/mission/dto/UserMissionDto.java
@@ -1,7 +1,7 @@
package com.ccapp.ccgo.mission.dto;
import com.ccapp.ccgo.common.MissionStatus;
-import com.ccapp.ccgo.mission.domain.UserMission;
+import com.ccapp.ccgo.mission.entity.UserMission;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
diff --git a/src/main/java/com/ccapp/ccgo/mission/domain/MissionTemplate.java b/src/main/java/com/ccapp/ccgo/mission/entity/MissionTemplate.java
similarity index 92%
rename from src/main/java/com/ccapp/ccgo/mission/domain/MissionTemplate.java
rename to src/main/java/com/ccapp/ccgo/mission/entity/MissionTemplate.java
index 2e5883a..0636332 100644
--- a/src/main/java/com/ccapp/ccgo/mission/domain/MissionTemplate.java
+++ b/src/main/java/com/ccapp/ccgo/mission/entity/MissionTemplate.java
@@ -1,4 +1,4 @@
-package com.ccapp.ccgo.mission.domain;
+package com.ccapp.ccgo.mission.entity;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
diff --git a/src/main/java/com/ccapp/ccgo/mission/domain/Partner.java b/src/main/java/com/ccapp/ccgo/mission/entity/Partner.java
similarity index 80%
rename from src/main/java/com/ccapp/ccgo/mission/domain/Partner.java
rename to src/main/java/com/ccapp/ccgo/mission/entity/Partner.java
index 04fd3e8..e3249c1 100644
--- a/src/main/java/com/ccapp/ccgo/mission/domain/Partner.java
+++ b/src/main/java/com/ccapp/ccgo/mission/entity/Partner.java
@@ -1,7 +1,7 @@
-package com.ccapp.ccgo.mission.domain;
+package com.ccapp.ccgo.mission.entity;
-import com.ccapp.ccgo.team.Team;
-import com.ccapp.ccgo.user.User;
+import com.ccapp.ccgo.team.entity.Team;
+import com.ccapp.ccgo.user.entity.User;
import jakarta.persistence.*;
import lombok.*;
diff --git a/src/main/java/com/ccapp/ccgo/mission/domain/PartnerMission.java b/src/main/java/com/ccapp/ccgo/mission/entity/PartnerMission.java
similarity index 93%
rename from src/main/java/com/ccapp/ccgo/mission/domain/PartnerMission.java
rename to src/main/java/com/ccapp/ccgo/mission/entity/PartnerMission.java
index 879b868..7800ade 100644
--- a/src/main/java/com/ccapp/ccgo/mission/domain/PartnerMission.java
+++ b/src/main/java/com/ccapp/ccgo/mission/entity/PartnerMission.java
@@ -1,4 +1,4 @@
-package com.ccapp.ccgo.mission.domain;
+package com.ccapp.ccgo.mission.entity;
import jakarta.persistence.*;
import lombok.*;
diff --git a/src/main/java/com/ccapp/ccgo/mission/domain/UserMission.java b/src/main/java/com/ccapp/ccgo/mission/entity/UserMission.java
similarity index 90%
rename from src/main/java/com/ccapp/ccgo/mission/domain/UserMission.java
rename to src/main/java/com/ccapp/ccgo/mission/entity/UserMission.java
index c714176..a0b80aa 100644
--- a/src/main/java/com/ccapp/ccgo/mission/domain/UserMission.java
+++ b/src/main/java/com/ccapp/ccgo/mission/entity/UserMission.java
@@ -1,7 +1,7 @@
-package com.ccapp.ccgo.mission.domain;
+package com.ccapp.ccgo.mission.entity;
import com.ccapp.ccgo.common.MissionStatus;
-import com.ccapp.ccgo.user.User;
+import com.ccapp.ccgo.user.entity.User;
import jakarta.persistence.*;
import lombok.*;
diff --git a/src/main/java/com/ccapp/ccgo/mission/repository/MissionTemplateRepository.java b/src/main/java/com/ccapp/ccgo/mission/repository/MissionTemplateRepository.java
index dd30aff..ba9ab6d 100644
--- a/src/main/java/com/ccapp/ccgo/mission/repository/MissionTemplateRepository.java
+++ b/src/main/java/com/ccapp/ccgo/mission/repository/MissionTemplateRepository.java
@@ -1,6 +1,6 @@
package com.ccapp.ccgo.mission.repository;
-import com.ccapp.ccgo.mission.domain.MissionTemplate;
+import com.ccapp.ccgo.mission.entity.MissionTemplate;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
diff --git a/src/main/java/com/ccapp/ccgo/mission/repository/PartnerMissionRepository.java b/src/main/java/com/ccapp/ccgo/mission/repository/PartnerMissionRepository.java
index abe9ec5..ec232b9 100644
--- a/src/main/java/com/ccapp/ccgo/mission/repository/PartnerMissionRepository.java
+++ b/src/main/java/com/ccapp/ccgo/mission/repository/PartnerMissionRepository.java
@@ -1,6 +1,6 @@
package com.ccapp.ccgo.mission.repository;
-import com.ccapp.ccgo.mission.domain.Partner;
-import com.ccapp.ccgo.mission.domain.PartnerMission;
+import com.ccapp.ccgo.mission.entity.Partner;
+import com.ccapp.ccgo.mission.entity.PartnerMission;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
diff --git a/src/main/java/com/ccapp/ccgo/mission/repository/PartnerRepository.java b/src/main/java/com/ccapp/ccgo/mission/repository/PartnerRepository.java
index 9250c5c..24ddef7 100644
--- a/src/main/java/com/ccapp/ccgo/mission/repository/PartnerRepository.java
+++ b/src/main/java/com/ccapp/ccgo/mission/repository/PartnerRepository.java
@@ -1,8 +1,8 @@
package com.ccapp.ccgo.mission.repository;
-import com.ccapp.ccgo.mission.domain.Partner;
-import com.ccapp.ccgo.team.Team;
-import com.ccapp.ccgo.user.User;
+import com.ccapp.ccgo.mission.entity.Partner;
+import com.ccapp.ccgo.team.entity.Team;
+import com.ccapp.ccgo.user.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
diff --git a/src/main/java/com/ccapp/ccgo/mission/repository/UserMissionRepository.java b/src/main/java/com/ccapp/ccgo/mission/repository/UserMissionRepository.java
index 5f4e98d..8488cc4 100644
--- a/src/main/java/com/ccapp/ccgo/mission/repository/UserMissionRepository.java
+++ b/src/main/java/com/ccapp/ccgo/mission/repository/UserMissionRepository.java
@@ -1,6 +1,6 @@
package com.ccapp.ccgo.mission.repository;
-import com.ccapp.ccgo.mission.domain.UserMission;
+import com.ccapp.ccgo.mission.entity.UserMission;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
diff --git a/src/main/java/com/ccapp/ccgo/mission/service/MissionService.java b/src/main/java/com/ccapp/ccgo/mission/service/MissionService.java
index 36443f6..7025816 100644
--- a/src/main/java/com/ccapp/ccgo/mission/service/MissionService.java
+++ b/src/main/java/com/ccapp/ccgo/mission/service/MissionService.java
@@ -1,8 +1,6 @@
package com.ccapp.ccgo.mission.service;
-import com.ccapp.ccgo.mission.domain.PartnerMission;
import com.ccapp.ccgo.mission.dto.PartnerMissionDto;
-import jakarta.transaction.Transactional;
public interface MissionService {
diff --git a/src/main/java/com/ccapp/ccgo/mission/service/MissionServiceImpl.java b/src/main/java/com/ccapp/ccgo/mission/service/MissionServiceImpl.java
index ea37b1f..c8f6306 100644
--- a/src/main/java/com/ccapp/ccgo/mission/service/MissionServiceImpl.java
+++ b/src/main/java/com/ccapp/ccgo/mission/service/MissionServiceImpl.java
@@ -1,13 +1,13 @@
package com.ccapp.ccgo.mission.service;
import com.ccapp.ccgo.common.MissionStatus;
-import com.ccapp.ccgo.mission.domain.*;
+import com.ccapp.ccgo.mission.entity.*;
import com.ccapp.ccgo.mission.dto.PartnerMissionDto;
import com.ccapp.ccgo.mission.repository.*;
-import com.ccapp.ccgo.repository.UserRepository;
-import com.ccapp.ccgo.team.Team;
-import com.ccapp.ccgo.repository.TeamRepository;
-import com.ccapp.ccgo.user.User;
+import com.ccapp.ccgo.user.repository.UserRepository;
+import com.ccapp.ccgo.team.entity.Team;
+import com.ccapp.ccgo.team.repository.TeamRepository;
+import com.ccapp.ccgo.user.entity.User;
import jakarta.transaction.Transactional;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
diff --git a/src/main/java/com/ccapp/ccgo/mission/service/PartnerService.java b/src/main/java/com/ccapp/ccgo/mission/service/PartnerService.java
index c4ec809..b2bba95 100644
--- a/src/main/java/com/ccapp/ccgo/mission/service/PartnerService.java
+++ b/src/main/java/com/ccapp/ccgo/mission/service/PartnerService.java
@@ -1,10 +1,9 @@
package com.ccapp.ccgo.mission.service;
-import com.ccapp.ccgo.matching.SubGroup;
-import com.ccapp.ccgo.mission.domain.Partner;
+import com.ccapp.ccgo.matching.domain.entity.SubGroup;
+import com.ccapp.ccgo.mission.entity.Partner;
import java.util.List;
-import java.util.Optional;
public interface PartnerService {
diff --git a/src/main/java/com/ccapp/ccgo/mission/service/PartnerServiceImpl.java b/src/main/java/com/ccapp/ccgo/mission/service/PartnerServiceImpl.java
index df49b16..5ef38ea 100644
--- a/src/main/java/com/ccapp/ccgo/mission/service/PartnerServiceImpl.java
+++ b/src/main/java/com/ccapp/ccgo/mission/service/PartnerServiceImpl.java
@@ -1,14 +1,14 @@
package com.ccapp.ccgo.mission.service;
-import com.ccapp.ccgo.matching.SubGroup;
-import com.ccapp.ccgo.matching.SubGroupMember;
-import com.ccapp.ccgo.mission.domain.Partner;
+import com.ccapp.ccgo.matching.domain.entity.SubGroup;
+import com.ccapp.ccgo.matching.domain.entity.SubGroupMember;
+import com.ccapp.ccgo.mission.entity.Partner;
import com.ccapp.ccgo.mission.repository.PartnerRepository;
-import com.ccapp.ccgo.repository.SubGroupMemberRepository;
-import com.ccapp.ccgo.repository.TeamRepository;
-import com.ccapp.ccgo.repository.UserRepository;
-import com.ccapp.ccgo.team.Team;
-import com.ccapp.ccgo.user.User;
+import com.ccapp.ccgo.matching.repository.SubGroupMemberRepository;
+import com.ccapp.ccgo.team.repository.TeamRepository;
+import com.ccapp.ccgo.user.repository.UserRepository;
+import com.ccapp.ccgo.team.entity.Team;
+import com.ccapp.ccgo.user.entity.User;
import jakarta.transaction.Transactional;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
diff --git a/src/main/java/com/ccapp/ccgo/dto/AnswerRequestDto.java b/src/main/java/com/ccapp/ccgo/question/dto/AnswerRequestDto.java
similarity index 84%
rename from src/main/java/com/ccapp/ccgo/dto/AnswerRequestDto.java
rename to src/main/java/com/ccapp/ccgo/question/dto/AnswerRequestDto.java
index d127921..34c0744 100644
--- a/src/main/java/com/ccapp/ccgo/dto/AnswerRequestDto.java
+++ b/src/main/java/com/ccapp/ccgo/question/dto/AnswerRequestDto.java
@@ -1,4 +1,4 @@
-package com.ccapp.ccgo.dto;
+package com.ccapp.ccgo.question.dto;
import lombok.*;
diff --git a/src/main/java/com/ccapp/ccgo/dto/QuestionRequestDto.java b/src/main/java/com/ccapp/ccgo/question/dto/QuestionRequestDto.java
similarity index 83%
rename from src/main/java/com/ccapp/ccgo/dto/QuestionRequestDto.java
rename to src/main/java/com/ccapp/ccgo/question/dto/QuestionRequestDto.java
index 6b3599e..69ab7d3 100644
--- a/src/main/java/com/ccapp/ccgo/dto/QuestionRequestDto.java
+++ b/src/main/java/com/ccapp/ccgo/question/dto/QuestionRequestDto.java
@@ -1,4 +1,4 @@
-package com.ccapp.ccgo.dto;
+package com.ccapp.ccgo.question.dto;
import lombok.*;
diff --git a/src/main/java/com/ccapp/ccgo/dto/QuestionResponseDto.java b/src/main/java/com/ccapp/ccgo/question/dto/QuestionResponseDto.java
similarity index 80%
rename from src/main/java/com/ccapp/ccgo/dto/QuestionResponseDto.java
rename to src/main/java/com/ccapp/ccgo/question/dto/QuestionResponseDto.java
index 58227f7..05b04e5 100644
--- a/src/main/java/com/ccapp/ccgo/dto/QuestionResponseDto.java
+++ b/src/main/java/com/ccapp/ccgo/question/dto/QuestionResponseDto.java
@@ -1,4 +1,4 @@
-package com.ccapp.ccgo.dto;
+package com.ccapp.ccgo.question.dto;
import lombok.*;
diff --git a/src/main/java/com/ccapp/ccgo/dto/QuestionUpdateDto.java b/src/main/java/com/ccapp/ccgo/question/dto/QuestionUpdateDto.java
similarity index 78%
rename from src/main/java/com/ccapp/ccgo/dto/QuestionUpdateDto.java
rename to src/main/java/com/ccapp/ccgo/question/dto/QuestionUpdateDto.java
index d615536..8a2364e 100644
--- a/src/main/java/com/ccapp/ccgo/dto/QuestionUpdateDto.java
+++ b/src/main/java/com/ccapp/ccgo/question/dto/QuestionUpdateDto.java
@@ -1,4 +1,4 @@
-package com.ccapp.ccgo.dto;
+package com.ccapp.ccgo.question.dto;
import lombok.*;
diff --git a/src/main/java/com/ccapp/ccgo/dto/SingleAnswerDto.java b/src/main/java/com/ccapp/ccgo/question/dto/SingleAnswerDto.java
similarity index 81%
rename from src/main/java/com/ccapp/ccgo/dto/SingleAnswerDto.java
rename to src/main/java/com/ccapp/ccgo/question/dto/SingleAnswerDto.java
index 145700e..25a4003 100644
--- a/src/main/java/com/ccapp/ccgo/dto/SingleAnswerDto.java
+++ b/src/main/java/com/ccapp/ccgo/question/dto/SingleAnswerDto.java
@@ -1,4 +1,4 @@
-package com.ccapp.ccgo.dto;
+package com.ccapp.ccgo.question.dto;
import lombok.*;
diff --git a/src/main/java/com/ccapp/ccgo/repository/AnswerRepository.java b/src/main/java/com/ccapp/ccgo/question/repository/AnswerRepository.java
similarity index 72%
rename from src/main/java/com/ccapp/ccgo/repository/AnswerRepository.java
rename to src/main/java/com/ccapp/ccgo/question/repository/AnswerRepository.java
index 6196564..0e0a987 100644
--- a/src/main/java/com/ccapp/ccgo/repository/AnswerRepository.java
+++ b/src/main/java/com/ccapp/ccgo/question/repository/AnswerRepository.java
@@ -1,6 +1,6 @@
-package com.ccapp.ccgo.repository;
+package com.ccapp.ccgo.question.repository;
-import com.ccapp.ccgo.matching.Answer;
+import com.ccapp.ccgo.matching.domain.entity.Answer;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
diff --git a/src/main/java/com/ccapp/ccgo/repository/QuestionRepository.java b/src/main/java/com/ccapp/ccgo/question/repository/QuestionRepository.java
similarity index 68%
rename from src/main/java/com/ccapp/ccgo/repository/QuestionRepository.java
rename to src/main/java/com/ccapp/ccgo/question/repository/QuestionRepository.java
index 62c0333..3e845c2 100644
--- a/src/main/java/com/ccapp/ccgo/repository/QuestionRepository.java
+++ b/src/main/java/com/ccapp/ccgo/question/repository/QuestionRepository.java
@@ -1,6 +1,6 @@
-package com.ccapp.ccgo.repository;
+package com.ccapp.ccgo.question.repository;
-import com.ccapp.ccgo.matching.Question;
+import com.ccapp.ccgo.matching.domain.entity.Question;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
diff --git a/src/main/java/com/ccapp/ccgo/controller/TeamController.java b/src/main/java/com/ccapp/ccgo/team/controller/TeamController.java
similarity index 83%
rename from src/main/java/com/ccapp/ccgo/controller/TeamController.java
rename to src/main/java/com/ccapp/ccgo/team/controller/TeamController.java
index 10def72..d9c9b96 100644
--- a/src/main/java/com/ccapp/ccgo/controller/TeamController.java
+++ b/src/main/java/com/ccapp/ccgo/team/controller/TeamController.java
@@ -1,8 +1,8 @@
-package com.ccapp.ccgo.controller;
-import com.ccapp.ccgo.dto.TeamResponseDto;
-import com.ccapp.ccgo.user.User;
-import com.ccapp.ccgo.jwt.LoginUserDetails;
-import com.ccapp.ccgo.repository.TeamMemberRepository;
+package com.ccapp.ccgo.team.controller;
+import com.ccapp.ccgo.team.dto.TeamResponseDto;
+import com.ccapp.ccgo.user.entity.User;
+import com.ccapp.ccgo.auth.jwt.LoginUserDetails;
+import com.ccapp.ccgo.team.repository.TeamMemberRepository;
import lombok.RequiredArgsConstructor;
diff --git a/src/main/java/com/ccapp/ccgo/dto/TeamMemberResponseDto.java b/src/main/java/com/ccapp/ccgo/team/dto/TeamMemberResponseDto.java
similarity index 84%
rename from src/main/java/com/ccapp/ccgo/dto/TeamMemberResponseDto.java
rename to src/main/java/com/ccapp/ccgo/team/dto/TeamMemberResponseDto.java
index 4f3ff66..22fdf3c 100644
--- a/src/main/java/com/ccapp/ccgo/dto/TeamMemberResponseDto.java
+++ b/src/main/java/com/ccapp/ccgo/team/dto/TeamMemberResponseDto.java
@@ -1,4 +1,4 @@
-package com.ccapp.ccgo.dto;
+package com.ccapp.ccgo.team.dto;
import lombok.Builder;
import lombok.Getter;
diff --git a/src/main/java/com/ccapp/ccgo/dto/TeamRequestDto.java b/src/main/java/com/ccapp/ccgo/team/dto/TeamRequestDto.java
similarity index 76%
rename from src/main/java/com/ccapp/ccgo/dto/TeamRequestDto.java
rename to src/main/java/com/ccapp/ccgo/team/dto/TeamRequestDto.java
index 9477da0..060044f 100644
--- a/src/main/java/com/ccapp/ccgo/dto/TeamRequestDto.java
+++ b/src/main/java/com/ccapp/ccgo/team/dto/TeamRequestDto.java
@@ -1,4 +1,4 @@
-package com.ccapp.ccgo.dto;
+package com.ccapp.ccgo.team.dto;
import lombok.*;
diff --git a/src/main/java/com/ccapp/ccgo/dto/TeamResponseDto.java b/src/main/java/com/ccapp/ccgo/team/dto/TeamResponseDto.java
similarity index 83%
rename from src/main/java/com/ccapp/ccgo/dto/TeamResponseDto.java
rename to src/main/java/com/ccapp/ccgo/team/dto/TeamResponseDto.java
index 8063ae4..aeb207e 100644
--- a/src/main/java/com/ccapp/ccgo/dto/TeamResponseDto.java
+++ b/src/main/java/com/ccapp/ccgo/team/dto/TeamResponseDto.java
@@ -1,4 +1,4 @@
-package com.ccapp.ccgo.dto;
+package com.ccapp.ccgo.team.dto;
import lombok.Getter;
import lombok.AllArgsConstructor;
diff --git a/src/main/java/com/ccapp/ccgo/team/InviteCode.java b/src/main/java/com/ccapp/ccgo/team/entity/InviteCode.java
similarity index 96%
rename from src/main/java/com/ccapp/ccgo/team/InviteCode.java
rename to src/main/java/com/ccapp/ccgo/team/entity/InviteCode.java
index 570ba2c..2ca27b6 100644
--- a/src/main/java/com/ccapp/ccgo/team/InviteCode.java
+++ b/src/main/java/com/ccapp/ccgo/team/entity/InviteCode.java
@@ -1,4 +1,4 @@
-package com.ccapp.ccgo.team;
+package com.ccapp.ccgo.team.entity;
import jakarta.persistence.*;
import lombok.*;
diff --git a/src/main/java/com/ccapp/ccgo/team/Team.java b/src/main/java/com/ccapp/ccgo/team/entity/Team.java
similarity index 95%
rename from src/main/java/com/ccapp/ccgo/team/Team.java
rename to src/main/java/com/ccapp/ccgo/team/entity/Team.java
index dc7f07a..9c9b029 100644
--- a/src/main/java/com/ccapp/ccgo/team/Team.java
+++ b/src/main/java/com/ccapp/ccgo/team/entity/Team.java
@@ -1,4 +1,4 @@
-package com.ccapp.ccgo.team;
+package com.ccapp.ccgo.team.entity;
import jakarta.persistence.*;
import lombok.*;
diff --git a/src/main/java/com/ccapp/ccgo/team/TeamMember.java b/src/main/java/com/ccapp/ccgo/team/entity/TeamMember.java
similarity index 95%
rename from src/main/java/com/ccapp/ccgo/team/TeamMember.java
rename to src/main/java/com/ccapp/ccgo/team/entity/TeamMember.java
index 8fd4c50..aecfd4b 100644
--- a/src/main/java/com/ccapp/ccgo/team/TeamMember.java
+++ b/src/main/java/com/ccapp/ccgo/team/entity/TeamMember.java
@@ -1,7 +1,7 @@
-package com.ccapp.ccgo.team;
+package com.ccapp.ccgo.team.entity;
import com.ccapp.ccgo.common.Role;
-import com.ccapp.ccgo.user.User;
+import com.ccapp.ccgo.user.entity.User;
import jakarta.persistence.*;
import lombok.*;
diff --git a/src/main/java/com/ccapp/ccgo/repository/TeamMemberRepository.java b/src/main/java/com/ccapp/ccgo/team/repository/TeamMemberRepository.java
similarity index 85%
rename from src/main/java/com/ccapp/ccgo/repository/TeamMemberRepository.java
rename to src/main/java/com/ccapp/ccgo/team/repository/TeamMemberRepository.java
index dee546e..532207f 100644
--- a/src/main/java/com/ccapp/ccgo/repository/TeamMemberRepository.java
+++ b/src/main/java/com/ccapp/ccgo/team/repository/TeamMemberRepository.java
@@ -1,8 +1,8 @@
-package com.ccapp.ccgo.repository;
+package com.ccapp.ccgo.team.repository;
-import com.ccapp.ccgo.team.TeamMember;
-import com.ccapp.ccgo.user.User;
-import com.ccapp.ccgo.team.Team;
+import com.ccapp.ccgo.team.entity.TeamMember;
+import com.ccapp.ccgo.user.entity.User;
+import com.ccapp.ccgo.team.entity.Team;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
diff --git a/src/main/java/com/ccapp/ccgo/repository/TeamRepository.java b/src/main/java/com/ccapp/ccgo/team/repository/TeamRepository.java
similarity index 85%
rename from src/main/java/com/ccapp/ccgo/repository/TeamRepository.java
rename to src/main/java/com/ccapp/ccgo/team/repository/TeamRepository.java
index d844e81..6863b95 100644
--- a/src/main/java/com/ccapp/ccgo/repository/TeamRepository.java
+++ b/src/main/java/com/ccapp/ccgo/team/repository/TeamRepository.java
@@ -1,6 +1,6 @@
-package com.ccapp.ccgo.repository;
+package com.ccapp.ccgo.team.repository;
-import com.ccapp.ccgo.team.Team;
+import com.ccapp.ccgo.team.entity.Team;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
diff --git a/src/main/java/com/ccapp/ccgo/controller/UserController.java b/src/main/java/com/ccapp/ccgo/user/controller/UserController.java
similarity index 81%
rename from src/main/java/com/ccapp/ccgo/controller/UserController.java
rename to src/main/java/com/ccapp/ccgo/user/controller/UserController.java
index 4b32d25..c319ef2 100644
--- a/src/main/java/com/ccapp/ccgo/controller/UserController.java
+++ b/src/main/java/com/ccapp/ccgo/user/controller/UserController.java
@@ -1,8 +1,8 @@
-package com.ccapp.ccgo.controller;
+package com.ccapp.ccgo.user.controller;
-import com.ccapp.ccgo.service.UserService;
-import com.ccapp.ccgo.dto.UserRequestDto;
-import com.ccapp.ccgo.dto.UserResponseDto;
+import com.ccapp.ccgo.user.service.UserService;
+import com.ccapp.ccgo.user.dto.UserRequestDto;
+import com.ccapp.ccgo.user.dto.UserResponseDto;
import org.springframework.http.HttpStatus;
import jakarta.validation.Valid;
import org.springframework.http.ResponseEntity;
diff --git a/src/main/java/com/ccapp/ccgo/dto/UserRequestDto.java b/src/main/java/com/ccapp/ccgo/user/dto/UserRequestDto.java
similarity index 86%
rename from src/main/java/com/ccapp/ccgo/dto/UserRequestDto.java
rename to src/main/java/com/ccapp/ccgo/user/dto/UserRequestDto.java
index de0d7fb..d80c777 100644
--- a/src/main/java/com/ccapp/ccgo/dto/UserRequestDto.java
+++ b/src/main/java/com/ccapp/ccgo/user/dto/UserRequestDto.java
@@ -1,6 +1,5 @@
-package com.ccapp.ccgo.dto;
+package com.ccapp.ccgo.user.dto;
-import com.ccapp.ccgo.common.Role;
import lombok.Getter;
import java.time.LocalDate;
import jakarta.validation.constraints.*;
diff --git a/src/main/java/com/ccapp/ccgo/dto/UserResponseDto.java b/src/main/java/com/ccapp/ccgo/user/dto/UserResponseDto.java
similarity index 92%
rename from src/main/java/com/ccapp/ccgo/dto/UserResponseDto.java
rename to src/main/java/com/ccapp/ccgo/user/dto/UserResponseDto.java
index eecaff7..df5822f 100644
--- a/src/main/java/com/ccapp/ccgo/dto/UserResponseDto.java
+++ b/src/main/java/com/ccapp/ccgo/user/dto/UserResponseDto.java
@@ -1,4 +1,4 @@
-package com.ccapp.ccgo.dto;
+package com.ccapp.ccgo.user.dto;
import lombok.Builder;
import lombok.Getter;
diff --git a/src/main/java/com/ccapp/ccgo/user/User.java b/src/main/java/com/ccapp/ccgo/user/entity/User.java
similarity index 95%
rename from src/main/java/com/ccapp/ccgo/user/User.java
rename to src/main/java/com/ccapp/ccgo/user/entity/User.java
index e217400..a3e1964 100644
--- a/src/main/java/com/ccapp/ccgo/user/User.java
+++ b/src/main/java/com/ccapp/ccgo/user/entity/User.java
@@ -1,6 +1,5 @@
-package com.ccapp.ccgo.user;
+package com.ccapp.ccgo.user.entity;
-import com.ccapp.ccgo.common.Role;
import jakarta.persistence.*;
import lombok.*;
diff --git a/src/main/java/com/ccapp/ccgo/dto/UserMapper.java b/src/main/java/com/ccapp/ccgo/user/mapper/UserMapper.java
similarity index 83%
rename from src/main/java/com/ccapp/ccgo/dto/UserMapper.java
rename to src/main/java/com/ccapp/ccgo/user/mapper/UserMapper.java
index f4dbd1d..a63d749 100644
--- a/src/main/java/com/ccapp/ccgo/dto/UserMapper.java
+++ b/src/main/java/com/ccapp/ccgo/user/mapper/UserMapper.java
@@ -1,6 +1,8 @@
-package com.ccapp.ccgo.dto;
+package com.ccapp.ccgo.user.mapper;
-import com.ccapp.ccgo.user.User;
+import com.ccapp.ccgo.user.dto.UserRequestDto;
+import com.ccapp.ccgo.user.dto.UserResponseDto;
+import com.ccapp.ccgo.user.entity.User;
public class UserMapper {
diff --git a/src/main/java/com/ccapp/ccgo/repository/UserRepository.java b/src/main/java/com/ccapp/ccgo/user/repository/UserRepository.java
similarity index 72%
rename from src/main/java/com/ccapp/ccgo/repository/UserRepository.java
rename to src/main/java/com/ccapp/ccgo/user/repository/UserRepository.java
index 5d79179..66c591f 100644
--- a/src/main/java/com/ccapp/ccgo/repository/UserRepository.java
+++ b/src/main/java/com/ccapp/ccgo/user/repository/UserRepository.java
@@ -1,6 +1,6 @@
-package com.ccapp.ccgo.repository;
+package com.ccapp.ccgo.user.repository;
-import com.ccapp.ccgo.user.User;
+import com.ccapp.ccgo.user.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.Optional;
diff --git a/src/main/java/com/ccapp/ccgo/service/UserService.java b/src/main/java/com/ccapp/ccgo/user/service/UserService.java
similarity index 89%
rename from src/main/java/com/ccapp/ccgo/service/UserService.java
rename to src/main/java/com/ccapp/ccgo/user/service/UserService.java
index d592bcc..d324df0 100644
--- a/src/main/java/com/ccapp/ccgo/service/UserService.java
+++ b/src/main/java/com/ccapp/ccgo/user/service/UserService.java
@@ -1,12 +1,12 @@
-package com.ccapp.ccgo.service;
+package com.ccapp.ccgo.user.service;
-import com.ccapp.ccgo.dto.UserRequestDto;
-import com.ccapp.ccgo.dto.UserResponseDto;
-import com.ccapp.ccgo.dto.UserMapper;
-import com.ccapp.ccgo.exception.CustomException;
-import com.ccapp.ccgo.jwt.JwtProvider;
-import com.ccapp.ccgo.repository.UserRepository;
-import com.ccapp.ccgo.user.User;
+import com.ccapp.ccgo.user.dto.UserRequestDto;
+import com.ccapp.ccgo.user.dto.UserResponseDto;
+import com.ccapp.ccgo.user.mapper.UserMapper;
+import com.ccapp.ccgo.common.exception.CustomException;
+import com.ccapp.ccgo.auth.jwt.JwtProvider;
+import com.ccapp.ccgo.user.repository.UserRepository;
+import com.ccapp.ccgo.user.entity.User;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.security.authentication.AuthenticationManager;
From 311e3d0f44ab110052e5e038e541c5d069c40436 Mon Sep 17 00:00:00 2001
From: bendy41
Date: Thu, 10 Jul 2025 17:31:30 +0900
Subject: [PATCH 021/132] Rebuild mission
---
.../ccgo/controller/MatchingController.java | 6 +-
.../ccapp/ccgo/matching/SubGroupMember.java | 3 +-
.../mission/controller/MissionController.java | 26 -----
.../controller/MissionTemplateController.java | 28 ++++++
.../ccapp/ccgo/mission/domain/Partner.java | 30 ------
.../ccgo/mission/domain/PartnerMission.java | 34 -------
.../ccgo/mission/domain/UserMission.java | 37 -------
.../ccgo/mission/dto/MissionTemplateDto.java | 24 -----
.../ccapp/ccgo/mission/dto/PartnerDto.java | 24 -----
.../ccgo/mission/dto/PartnerMissionDto.java | 30 ------
.../ccgo/mission/dto/UserMissionDto.java | 30 ------
.../repository/MissionTemplateRepository.java | 12 ++-
.../repository/PartnerMissionRepository.java | 17 ----
.../mission/repository/PartnerRepository.java | 19 ----
.../repository/UserMissionRepository.java | 11 ---
.../ccgo/mission/service/MissionService.java | 11 ---
.../mission/service/MissionServiceImpl.java | 99 -------------------
.../service/MissionTemplateService.java | 11 +++
.../service/MissionTemplateServiceImpl.java | 25 +++++
.../ccgo/mission/service/PartnerService.java | 15 ---
.../mission/service/PartnerServiceImpl.java | 60 -----------
21 files changed, 79 insertions(+), 473 deletions(-)
delete mode 100644 src/main/java/com/ccapp/ccgo/mission/controller/MissionController.java
create mode 100644 src/main/java/com/ccapp/ccgo/mission/controller/MissionTemplateController.java
delete mode 100644 src/main/java/com/ccapp/ccgo/mission/domain/Partner.java
delete mode 100644 src/main/java/com/ccapp/ccgo/mission/domain/PartnerMission.java
delete mode 100644 src/main/java/com/ccapp/ccgo/mission/domain/UserMission.java
delete mode 100644 src/main/java/com/ccapp/ccgo/mission/dto/MissionTemplateDto.java
delete mode 100644 src/main/java/com/ccapp/ccgo/mission/dto/PartnerDto.java
delete mode 100644 src/main/java/com/ccapp/ccgo/mission/dto/PartnerMissionDto.java
delete mode 100644 src/main/java/com/ccapp/ccgo/mission/dto/UserMissionDto.java
delete mode 100644 src/main/java/com/ccapp/ccgo/mission/repository/PartnerMissionRepository.java
delete mode 100644 src/main/java/com/ccapp/ccgo/mission/repository/PartnerRepository.java
delete mode 100644 src/main/java/com/ccapp/ccgo/mission/repository/UserMissionRepository.java
delete mode 100644 src/main/java/com/ccapp/ccgo/mission/service/MissionService.java
delete mode 100644 src/main/java/com/ccapp/ccgo/mission/service/MissionServiceImpl.java
create mode 100644 src/main/java/com/ccapp/ccgo/mission/service/MissionTemplateService.java
create mode 100644 src/main/java/com/ccapp/ccgo/mission/service/MissionTemplateServiceImpl.java
delete mode 100644 src/main/java/com/ccapp/ccgo/mission/service/PartnerService.java
delete mode 100644 src/main/java/com/ccapp/ccgo/mission/service/PartnerServiceImpl.java
diff --git a/src/main/java/com/ccapp/ccgo/controller/MatchingController.java b/src/main/java/com/ccapp/ccgo/controller/MatchingController.java
index fa48689..399dce1 100644
--- a/src/main/java/com/ccapp/ccgo/controller/MatchingController.java
+++ b/src/main/java/com/ccapp/ccgo/controller/MatchingController.java
@@ -3,6 +3,7 @@
import com.ccapp.ccgo.dto.*;
import com.ccapp.ccgo.service.MatchingService;
import lombok.RequiredArgsConstructor;
+import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@@ -18,9 +19,10 @@ public class MatchingController {
* 팀장이 매칭 시작 버튼 누를 때 호출
*/
// @PreAuthorize("hasRole('TEAM_LEADER')") 매칭권한
+ //이런식으로 ResponseEntity를 써야 한다.
@PostMapping("/start/{teamId}")
- public MatchingResponseDto startMatching(@PathVariable Long teamId) {
- return matchingService.performMatching(teamId);
+ public ResponseEntity startMatching(@PathVariable Long teamId) {
+ return ResponseEntity.ok(matchingService.performMatching(teamId));
}
@PostMapping("/answer")
diff --git a/src/main/java/com/ccapp/ccgo/matching/SubGroupMember.java b/src/main/java/com/ccapp/ccgo/matching/SubGroupMember.java
index cd084a1..e248b1f 100644
--- a/src/main/java/com/ccapp/ccgo/matching/SubGroupMember.java
+++ b/src/main/java/com/ccapp/ccgo/matching/SubGroupMember.java
@@ -11,7 +11,8 @@
@NoArgsConstructor
@AllArgsConstructor
@Builder
-public class SubGroupMember {
+public class
+SubGroupMember {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
diff --git a/src/main/java/com/ccapp/ccgo/mission/controller/MissionController.java b/src/main/java/com/ccapp/ccgo/mission/controller/MissionController.java
deleted file mode 100644
index edf8d3d..0000000
--- a/src/main/java/com/ccapp/ccgo/mission/controller/MissionController.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package com.ccapp.ccgo.mission.controller;
-
-import com.ccapp.ccgo.mission.dto.PartnerMissionDto;
-import com.ccapp.ccgo.mission.service.MissionService;
-import lombok.RequiredArgsConstructor;
-import org.springframework.http.ResponseEntity;
-import org.springframework.web.bind.annotation.*;
-
-@RestController
-@RequestMapping("/api/missions")
-@RequiredArgsConstructor
-public class MissionController {
-
- private final MissionService missionService;
-
- // 팀 ID와 유저 ID를 기반으로 미션 새로고침
- @PostMapping("/refresh")
- public ResponseEntity refreshPartnerMission(
- @RequestParam Long teamId,
- @RequestParam Long userId,
- @RequestParam int score
- ) {
- PartnerMissionDto partnerMissionDto = missionService.refreshPartnerMission(teamId, userId,score);
- return ResponseEntity.ok(partnerMissionDto);
- }
-}
diff --git a/src/main/java/com/ccapp/ccgo/mission/controller/MissionTemplateController.java b/src/main/java/com/ccapp/ccgo/mission/controller/MissionTemplateController.java
new file mode 100644
index 0000000..05569da
--- /dev/null
+++ b/src/main/java/com/ccapp/ccgo/mission/controller/MissionTemplateController.java
@@ -0,0 +1,28 @@
+package com.ccapp.ccgo.mission.controller;
+import com.ccapp.ccgo.mission.domain.MissionTemplate;
+import com.ccapp.ccgo.mission.service.MissionTemplateService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@RestController
+@RequestMapping("/api/missions")
+@RequiredArgsConstructor
+public class MissionTemplateController {
+
+ private final MissionTemplateService missionTemplateService;
+
+ @GetMapping("/score/{score}/six")
+ public ResponseEntity> getSixMissionsByScore(@PathVariable int score) {
+ return ResponseEntity.ok(missionTemplateService.getSixMissionsByScore(score));
+ }
+
+ @PostMapping("/score/{score}/refresh")
+ public ResponseEntity refreshMission(@PathVariable int score,
+ @RequestBody List excludedIds) {
+ MissionTemplate mission = missionTemplateService.refreshMission(score, excludedIds);
+ return ResponseEntity.ok(mission);
+ }
+}
diff --git a/src/main/java/com/ccapp/ccgo/mission/domain/Partner.java b/src/main/java/com/ccapp/ccgo/mission/domain/Partner.java
deleted file mode 100644
index 04fd3e8..0000000
--- a/src/main/java/com/ccapp/ccgo/mission/domain/Partner.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package com.ccapp.ccgo.mission.domain;
-
-import com.ccapp.ccgo.team.Team;
-import com.ccapp.ccgo.user.User;
-import jakarta.persistence.*;
-import lombok.*;
-
-@Getter
-@Entity
-@NoArgsConstructor(access = AccessLevel.PROTECTED)
-@AllArgsConstructor
-@Builder
-public class Partner {
-
- @Id
- @GeneratedValue(strategy = GenerationType.IDENTITY)
- private Long id;
-
- @ManyToOne
- @JoinColumn(name = "team_id")
- private Team team;
-
- @ManyToOne
- @JoinColumn(name = "user1_id")
- private User user1;
-
- @ManyToOne
- @JoinColumn(name = "user2_id")
- private User user2;
-}
\ No newline at end of file
diff --git a/src/main/java/com/ccapp/ccgo/mission/domain/PartnerMission.java b/src/main/java/com/ccapp/ccgo/mission/domain/PartnerMission.java
deleted file mode 100644
index 879b868..0000000
--- a/src/main/java/com/ccapp/ccgo/mission/domain/PartnerMission.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package com.ccapp.ccgo.mission.domain;
-import jakarta.persistence.*;
-import lombok.*;
-
-import java.time.LocalDate;
-
-@Entity
-@Getter
-@Setter
-@NoArgsConstructor(access = AccessLevel.PROTECTED)
-@AllArgsConstructor
-@Builder
-public class PartnerMission {
-
- @Id
- @GeneratedValue(strategy = GenerationType.IDENTITY)
- private Long id;
-
- @ManyToOne
- @JoinColumn(name = "template_id")
- private MissionTemplate template;
-
- @ManyToOne
- @JoinColumn(name = "partner_id")
- private Partner partner;
-
- private String title;
-
- private String description;
-
- private LocalDate dueDate;
-
- private boolean isActive;
-}
\ No newline at end of file
diff --git a/src/main/java/com/ccapp/ccgo/mission/domain/UserMission.java b/src/main/java/com/ccapp/ccgo/mission/domain/UserMission.java
deleted file mode 100644
index c714176..0000000
--- a/src/main/java/com/ccapp/ccgo/mission/domain/UserMission.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package com.ccapp.ccgo.mission.domain;
-
-import com.ccapp.ccgo.common.MissionStatus;
-import com.ccapp.ccgo.user.User;
-import jakarta.persistence.*;
-import lombok.*;
-
-import java.time.LocalDateTime;
-
-@Entity
-@Getter
-@NoArgsConstructor(access = AccessLevel.PROTECTED)
-@AllArgsConstructor
-@Builder
-public class UserMission {
-
- @Id
- @GeneratedValue(strategy = GenerationType.IDENTITY)
- private Long id;
-
- // 미션을 수행하는 유저
- @ManyToOne
- @JoinColumn(name = "user_id")
- private User user;
-
- // 짝 미션
- @ManyToOne
- @JoinColumn(name = "partner_mission_id")
- private PartnerMission partnerMission;
-
- // 미션 상태 (예: PENDING, COMPLETE)
- @Enumerated(EnumType.STRING)
- private MissionStatus status;
-
- // 미션 제출 시간
- private LocalDateTime submittedAt;
-}
\ No newline at end of file
diff --git a/src/main/java/com/ccapp/ccgo/mission/dto/MissionTemplateDto.java b/src/main/java/com/ccapp/ccgo/mission/dto/MissionTemplateDto.java
deleted file mode 100644
index 1762a7e..0000000
--- a/src/main/java/com/ccapp/ccgo/mission/dto/MissionTemplateDto.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package com.ccapp.ccgo.mission.dto;
-
-import com.ccapp.ccgo.mission.domain.MissionTemplate;
-import lombok.Builder;
-import lombok.Data;
-
-@Data
-@Builder
-public class MissionTemplateDto {
-
- private Long id;
- private String title;
- private String description;
- private int score;
-
- public static MissionTemplateDto fromEntity(MissionTemplate template) {
- return MissionTemplateDto.builder()
- .id(template.getId())
- .title(template.getTitle())
- .description(template.getDescription())
- .score(template.getScore())
- .build();
- }
-}
diff --git a/src/main/java/com/ccapp/ccgo/mission/dto/PartnerDto.java b/src/main/java/com/ccapp/ccgo/mission/dto/PartnerDto.java
deleted file mode 100644
index fe0a1d3..0000000
--- a/src/main/java/com/ccapp/ccgo/mission/dto/PartnerDto.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package com.ccapp.ccgo.mission.dto;
-
-import com.ccapp.ccgo.mission.domain.Partner;
-import lombok.Builder;
-import lombok.Data;
-
-@Data
-@Builder
-public class PartnerDto {
-
- private Long id;
- private Long teamId;
- private Long user1Id;
- private Long user2Id;
-
- public static PartnerDto fromEntity(Partner partner) {
- return PartnerDto.builder()
- .id(partner.getId())
- .teamId(partner.getTeam().getTeamId())
- .user1Id(partner.getUser1().getId())
- .user2Id(partner.getUser2().getId())
- .build();
- }
-}
diff --git a/src/main/java/com/ccapp/ccgo/mission/dto/PartnerMissionDto.java b/src/main/java/com/ccapp/ccgo/mission/dto/PartnerMissionDto.java
deleted file mode 100644
index 1f0773e..0000000
--- a/src/main/java/com/ccapp/ccgo/mission/dto/PartnerMissionDto.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package com.ccapp.ccgo.mission.dto;
-
-import com.ccapp.ccgo.mission.domain.PartnerMission;
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-import java.time.LocalDate;
-
-@Data
-@AllArgsConstructor
-@NoArgsConstructor
-public class PartnerMissionDto {
- private Long id;
- private String title;
- private String description;
- private LocalDate dueDate;
- private boolean isActive;
-
- public static PartnerMissionDto fromEntity(PartnerMission pm) {
- return new PartnerMissionDto(
- pm.getId(),
- pm.getTitle(),
- pm.getDescription(),
- pm.getDueDate(),
- pm.isActive()
- );
- }
-
-}
\ No newline at end of file
diff --git a/src/main/java/com/ccapp/ccgo/mission/dto/UserMissionDto.java b/src/main/java/com/ccapp/ccgo/mission/dto/UserMissionDto.java
deleted file mode 100644
index b636618..0000000
--- a/src/main/java/com/ccapp/ccgo/mission/dto/UserMissionDto.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package com.ccapp.ccgo.mission.dto;
-
-import com.ccapp.ccgo.common.MissionStatus;
-import com.ccapp.ccgo.mission.domain.UserMission;
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-import java.time.LocalDateTime;
-
-@Data
-@AllArgsConstructor
-@NoArgsConstructor
-public class UserMissionDto {
- private Long id;
- private Long userId;
- private Long partnerMissionId;
- private MissionStatus status;
- private LocalDateTime submittedAt;
-
- public static UserMissionDto fromEntity(UserMission um) {
- return new UserMissionDto(
- um.getId(),
- um.getUser().getId(),
- um.getPartnerMission().getId(),
- um.getStatus(),
- um.getSubmittedAt()
- );
- }
-}
\ No newline at end of file
diff --git a/src/main/java/com/ccapp/ccgo/mission/repository/MissionTemplateRepository.java b/src/main/java/com/ccapp/ccgo/mission/repository/MissionTemplateRepository.java
index 3a196b9..fe20f16 100644
--- a/src/main/java/com/ccapp/ccgo/mission/repository/MissionTemplateRepository.java
+++ b/src/main/java/com/ccapp/ccgo/mission/repository/MissionTemplateRepository.java
@@ -2,14 +2,20 @@
import com.ccapp.ccgo.mission.domain.MissionTemplate;
import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
import java.util.List;
+@Repository
public interface MissionTemplateRepository extends JpaRepository {
- List findByScore(int score);
+ @Query(value = "SELECT * FROM mission_template WHERE score = :score LIMIT 6", nativeQuery = true)
+ List findTop6ByScore(@Param("score") int score);
+
+ // 새로고침용, 기존 6개 제외하고 랜덤 1개 조회
+ @Query(value = "SELECT * FROM mission_template WHERE score = :score AND id NOT IN :excludedIds ORDER BY RAND() LIMIT 1", nativeQuery = true)
+ MissionTemplate findRandomByScoreExcludingIds(@Param("score") int score, @Param("excludedIds") List excludedIds);
- @Query("SELECT MAX(m.id) FROM MissionTemplate m")
- Long findMaxId();
}
diff --git a/src/main/java/com/ccapp/ccgo/mission/repository/PartnerMissionRepository.java b/src/main/java/com/ccapp/ccgo/mission/repository/PartnerMissionRepository.java
deleted file mode 100644
index fbc6d14..0000000
--- a/src/main/java/com/ccapp/ccgo/mission/repository/PartnerMissionRepository.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package com.ccapp.ccgo.mission.repository;
-import com.ccapp.ccgo.mission.domain.MissionTemplate;
-import com.ccapp.ccgo.mission.domain.Partner;
-import com.ccapp.ccgo.mission.domain.PartnerMission;
-import org.springframework.data.jpa.repository.JpaRepository;
-
-import java.util.List;
-import java.util.Optional;
-
-public interface PartnerMissionRepository extends JpaRepository {
- // 활성화된 점수별 미션 조회
- List findByPartnerAndIsActiveTrueAndTemplateScore(Partner partner, int score);
-
- // 최근 3개 미션 조회 (dueDate 기준 내림차순)
- List findTop3ByPartnerOrderByDueDateDesc(Partner partner);
-
-}
\ No newline at end of file
diff --git a/src/main/java/com/ccapp/ccgo/mission/repository/PartnerRepository.java b/src/main/java/com/ccapp/ccgo/mission/repository/PartnerRepository.java
deleted file mode 100644
index 9250c5c..0000000
--- a/src/main/java/com/ccapp/ccgo/mission/repository/PartnerRepository.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package com.ccapp.ccgo.mission.repository;
-
-import com.ccapp.ccgo.mission.domain.Partner;
-import com.ccapp.ccgo.team.Team;
-import com.ccapp.ccgo.user.User;
-import org.springframework.data.jpa.repository.JpaRepository;
-
-import java.util.List;
-import java.util.Optional;
-
-public interface PartnerRepository extends JpaRepository {
-
- boolean existsByTeamAndUser1AndUser2(Team team, User user1, User user2);
-
- List findByTeam_TeamId(Long teamId);
-
- // ❗ 유저1 또는 유저2가 user이고, 특정 팀에 속한 Partner를 찾기
- Optional findByTeamAndUser1OrTeamAndUser2(Team team1, User user1, Team team2, User user2);
-}
diff --git a/src/main/java/com/ccapp/ccgo/mission/repository/UserMissionRepository.java b/src/main/java/com/ccapp/ccgo/mission/repository/UserMissionRepository.java
deleted file mode 100644
index 5f4e98d..0000000
--- a/src/main/java/com/ccapp/ccgo/mission/repository/UserMissionRepository.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package com.ccapp.ccgo.mission.repository;
-
-import com.ccapp.ccgo.mission.domain.UserMission;
-import org.springframework.data.jpa.repository.JpaRepository;
-
-import java.util.List;
-
-public interface UserMissionRepository extends JpaRepository {
- List findByUserId(Long userId);
- List findByPartnerMissionId(Long partnerMissionId);
-}
\ No newline at end of file
diff --git a/src/main/java/com/ccapp/ccgo/mission/service/MissionService.java b/src/main/java/com/ccapp/ccgo/mission/service/MissionService.java
deleted file mode 100644
index 507b824..0000000
--- a/src/main/java/com/ccapp/ccgo/mission/service/MissionService.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package com.ccapp.ccgo.mission.service;
-
-import com.ccapp.ccgo.mission.domain.PartnerMission;
-import com.ccapp.ccgo.mission.dto.PartnerMissionDto;
-import jakarta.transaction.Transactional;
-
-public interface MissionService {
-
- PartnerMissionDto refreshPartnerMission(Long teamId, Long userId, int score);
-
-}
\ No newline at end of file
diff --git a/src/main/java/com/ccapp/ccgo/mission/service/MissionServiceImpl.java b/src/main/java/com/ccapp/ccgo/mission/service/MissionServiceImpl.java
deleted file mode 100644
index 2baafa9..0000000
--- a/src/main/java/com/ccapp/ccgo/mission/service/MissionServiceImpl.java
+++ /dev/null
@@ -1,99 +0,0 @@
-package com.ccapp.ccgo.mission.service;
-
-import com.ccapp.ccgo.common.MissionStatus;
-import com.ccapp.ccgo.mission.domain.*;
-import com.ccapp.ccgo.mission.dto.PartnerMissionDto;
-import com.ccapp.ccgo.mission.repository.*;
-import com.ccapp.ccgo.repository.UserRepository;
-import com.ccapp.ccgo.team.Team;
-import com.ccapp.ccgo.repository.TeamRepository;
-import com.ccapp.ccgo.user.User;
-import jakarta.transaction.Transactional;
-import lombok.RequiredArgsConstructor;
-import org.springframework.stereotype.Service;
-
-import java.time.LocalDate;
-import java.util.List;
-import java.util.stream.Collectors;
-
-@Service
-@RequiredArgsConstructor
-@Transactional
-public class MissionServiceImpl implements MissionService {
-
- private final PartnerRepository partnerRepository;
- private final PartnerMissionRepository partnerMissionRepository;
- private final UserMissionRepository userMissionRepository;
- private final MissionTemplateRepository missionTemplateRepository;
- private final UserRepository userRepository;
- private final TeamRepository teamRepository;
-
- @Override
- public PartnerMissionDto refreshPartnerMission(Long teamId, Long userId, int score) {
- User user = userRepository.findById(userId)
- .orElseThrow(() -> new IllegalArgumentException("유저 없음"));
-
- Team team = teamRepository.findById(teamId)
- .orElseThrow(() -> new IllegalArgumentException("팀 없음"));
-
- Partner partner = partnerRepository.findByTeamAndUser1OrTeamAndUser2(team, user, team, user)
- .orElseThrow(() -> new IllegalStateException("해당 팀에서 짝이 없음"));
-
- // 해당 점수 미션 중 기존 활성 미션 비활성화
- List activeMissions = partnerMissionRepository
- .findByPartnerAndIsActiveTrueAndTemplateScore(partner, score);
- for (PartnerMission pm : activeMissions) {
- pm.setActive(false);
- partnerMissionRepository.save(pm);
- }
-
- // 최근 3개 미션 조회해서 제외할 템플릿 ID 리스트 만들기
- List recentMissions = partnerMissionRepository
- .findTop3ByPartnerOrderByDueDateDesc(partner);
- List excludeIds = recentMissions.stream()
- .map(pm -> pm.getTemplate().getId())
- .collect(Collectors.toList());
-
- // 점수별 전체 미션 리스트 조회
- List allTemplates = missionTemplateRepository.findByScore(score);
-
- // 제외 리스트에 없는 미션만 후보로 필터링
- List candidateTemplates = allTemplates.stream()
- .filter(mt -> !excludeIds.contains(mt.getId()))
- .collect(Collectors.toList());
-
- // 후보가 없으면 전체에서 랜덤 선택
- if (candidateTemplates.isEmpty()) {
- candidateTemplates = allTemplates;
- }
-
- // 랜덤 미션 선택
- int randomIndex = (int) (Math.random() * candidateTemplates.size());
- MissionTemplate selectedTemplate = candidateTemplates.get(randomIndex);
-
- PartnerMission newMission = PartnerMission.builder()
- .partner(partner)
- .template(selectedTemplate)
- .title(selectedTemplate.getTitle())
- .description(selectedTemplate.getDescription())
- .dueDate(LocalDate.now().plusDays(14))
- .isActive(true)
- .build();
-
- partnerMissionRepository.save(newMission);
-
- createUserMission(partner.getUser1(), newMission);
- createUserMission(partner.getUser2(), newMission);
-
- return PartnerMissionDto.fromEntity(newMission);
- }
-
- private void createUserMission(User user, PartnerMission mission) {
- UserMission userMission = UserMission.builder()
- .user(user)
- .partnerMission(mission)
- .status(MissionStatus.PENDING)
- .build();
- userMissionRepository.save(userMission);
- }
-}
diff --git a/src/main/java/com/ccapp/ccgo/mission/service/MissionTemplateService.java b/src/main/java/com/ccapp/ccgo/mission/service/MissionTemplateService.java
new file mode 100644
index 0000000..7cbdb7d
--- /dev/null
+++ b/src/main/java/com/ccapp/ccgo/mission/service/MissionTemplateService.java
@@ -0,0 +1,11 @@
+package com.ccapp.ccgo.mission.service;
+import com.ccapp.ccgo.mission.domain.MissionTemplate;
+import java.util.List;
+
+
+public interface MissionTemplateService {
+
+ List getSixMissionsByScore(int score);
+
+ MissionTemplate refreshMission(int score, List excludedIds);
+}
diff --git a/src/main/java/com/ccapp/ccgo/mission/service/MissionTemplateServiceImpl.java b/src/main/java/com/ccapp/ccgo/mission/service/MissionTemplateServiceImpl.java
new file mode 100644
index 0000000..996c4e4
--- /dev/null
+++ b/src/main/java/com/ccapp/ccgo/mission/service/MissionTemplateServiceImpl.java
@@ -0,0 +1,25 @@
+package com.ccapp.ccgo.mission.service;
+
+import com.ccapp.ccgo.mission.domain.MissionTemplate;
+import com.ccapp.ccgo.mission.repository.MissionTemplateRepository;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+@RequiredArgsConstructor
+public class MissionTemplateServiceImpl implements MissionTemplateService {
+
+ private final MissionTemplateRepository missionTemplateRepository;
+
+ @Override
+ public List getSixMissionsByScore(int score) {
+ return missionTemplateRepository.findTop6ByScore(score);
+ }
+
+ @Override
+ public MissionTemplate refreshMission(int score, List excludedIds) {
+ return missionTemplateRepository.findRandomByScoreExcludingIds(score, excludedIds);
+ }
+}
diff --git a/src/main/java/com/ccapp/ccgo/mission/service/PartnerService.java b/src/main/java/com/ccapp/ccgo/mission/service/PartnerService.java
deleted file mode 100644
index c4ec809..0000000
--- a/src/main/java/com/ccapp/ccgo/mission/service/PartnerService.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.ccapp.ccgo.mission.service;
-
-import com.ccapp.ccgo.matching.SubGroup;
-import com.ccapp.ccgo.mission.domain.Partner;
-
-import java.util.List;
-import java.util.Optional;
-
-public interface PartnerService {
-
- // 매칭된 SubGroup 정보를 받아 Partner(짝) 생성
- List createPartnersFromSubGroups(List