From bb7d5e0721cf9b3e171bd963d7fb2fbae51a08d7 Mon Sep 17 00:00:00 2001 From: DaeunSon <130820902+DaeunSon@users.noreply.github.com> Date: Wed, 25 Jun 2025 23:57:49 +0900 Subject: [PATCH] =?UTF-8?q?Update=20:=20=EC=9C=A0=EC=A0=80=20=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=20=EC=A0=80=EC=9E=A5=20=EB=B0=8F=20cors=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/enjoy/config/SecurityConfig.java | 5 ++- .../example/enjoy/entity/FavoriteCourse.java | 25 +++++++++++ .../com/example/enjoy/entity/TrackCourse.java | 1 + .../com/example/enjoy/entity/user/User.java | 23 +++++++---- .../repository/FavoriteCourseRepository.java | 14 +++++++ .../enjoy/repository/UserRepository.java | 3 ++ .../enjoy/service/FavoriteCourseService.java | 41 +++++++++++++++++++ .../loginService/SejongLoginService.java | 14 +++++++ 8 files changed, 118 insertions(+), 8 deletions(-) create mode 100644 src/main/java/com/example/enjoy/entity/FavoriteCourse.java create mode 100644 src/main/java/com/example/enjoy/repository/FavoriteCourseRepository.java create mode 100644 src/main/java/com/example/enjoy/service/FavoriteCourseService.java diff --git a/src/main/java/com/example/enjoy/config/SecurityConfig.java b/src/main/java/com/example/enjoy/config/SecurityConfig.java index 74b92af..d903eca 100644 --- a/src/main/java/com/example/enjoy/config/SecurityConfig.java +++ b/src/main/java/com/example/enjoy/config/SecurityConfig.java @@ -32,7 +32,10 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { @Bean public CorsConfigurationSource corsConfigurationSource() { CorsConfiguration configuration = new CorsConfiguration(); - configuration.setAllowedOrigins(Arrays.asList("http://localhost:3000")); + configuration.setAllowedOrigins(Arrays.asList( + "http://localhost:3000", + "http://localhost:5173" // 추가된 부분 + )); configuration.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE", "OPTIONS")); configuration.setAllowedHeaders(Arrays.asList("*")); configuration.setAllowCredentials(true); diff --git a/src/main/java/com/example/enjoy/entity/FavoriteCourse.java b/src/main/java/com/example/enjoy/entity/FavoriteCourse.java new file mode 100644 index 0000000..f88bc52 --- /dev/null +++ b/src/main/java/com/example/enjoy/entity/FavoriteCourse.java @@ -0,0 +1,25 @@ +package com.example.enjoy.entity; + +import com.example.enjoy.entity.user.User; +import com.example.enjoy.util.BaseEntity; +import jakarta.persistence.*; +import lombok.Setter; + +import java.time.LocalDateTime; + +@Entity +@Setter +public class FavoriteCourse extends BaseEntity { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne + @JoinColumn(name = "user_id") + private User user; + + @ManyToOne + @JoinColumn(name = "track_course_id") + private TrackCourse trackCourse; + +} diff --git a/src/main/java/com/example/enjoy/entity/TrackCourse.java b/src/main/java/com/example/enjoy/entity/TrackCourse.java index c50ee73..7b82b14 100644 --- a/src/main/java/com/example/enjoy/entity/TrackCourse.java +++ b/src/main/java/com/example/enjoy/entity/TrackCourse.java @@ -16,6 +16,7 @@ public class TrackCourse { private String academicYear; // 이수 추천 학년 (DTO의 'year'에 해당) private String academicSemester; // 이수 추천 학기 (DTO의 'semester'에 해당) + @ManyToOne @JoinColumn(name = "track_id") private Track track; diff --git a/src/main/java/com/example/enjoy/entity/user/User.java b/src/main/java/com/example/enjoy/entity/user/User.java index 0ea12e9..9a8c8d4 100644 --- a/src/main/java/com/example/enjoy/entity/user/User.java +++ b/src/main/java/com/example/enjoy/entity/user/User.java @@ -16,18 +16,27 @@ public class User extends BaseTimeEntity { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - @Column(nullable = false, unique = true) - private String username; - - private String password; // local 로그인 사용자만 저장 + @Column(nullable = false) + private String studentId; @Column(nullable = false, unique = true) - private String email; + private String username; - private String loginType; //로그인 타입 + @Column(nullable = false) + private String major; - private String providerId; //소셜 로그인 시 제공자 ID + @Column(nullable = false) + private String grade; + @Column(nullable = false) + private String completedSemester; + public void updateUserInfo(String studentId, String username, String major, String grade, String completedSemester) { + this.studentId = studentId; + this.username = username; + this.major = major; + this.grade = grade; + this.completedSemester = completedSemester; + } } diff --git a/src/main/java/com/example/enjoy/repository/FavoriteCourseRepository.java b/src/main/java/com/example/enjoy/repository/FavoriteCourseRepository.java new file mode 100644 index 0000000..3e85f7a --- /dev/null +++ b/src/main/java/com/example/enjoy/repository/FavoriteCourseRepository.java @@ -0,0 +1,14 @@ +package com.example.enjoy.repository; + +import com.example.enjoy.entity.FavoriteCourse; +import com.example.enjoy.entity.TrackCourse; +import com.example.enjoy.entity.user.User; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.Optional; + +@Repository +public interface FavoriteCourseRepository extends JpaRepository { + Optional findByUserAndTrackCourse(User user, TrackCourse trackCourse); +} diff --git a/src/main/java/com/example/enjoy/repository/UserRepository.java b/src/main/java/com/example/enjoy/repository/UserRepository.java index 3cc6d9c..9855820 100644 --- a/src/main/java/com/example/enjoy/repository/UserRepository.java +++ b/src/main/java/com/example/enjoy/repository/UserRepository.java @@ -4,6 +4,9 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; +import java.util.Optional; + @Repository public interface UserRepository extends JpaRepository { + Optional findByStudentId(String studentId); } \ No newline at end of file diff --git a/src/main/java/com/example/enjoy/service/FavoriteCourseService.java b/src/main/java/com/example/enjoy/service/FavoriteCourseService.java new file mode 100644 index 0000000..d1b50fe --- /dev/null +++ b/src/main/java/com/example/enjoy/service/FavoriteCourseService.java @@ -0,0 +1,41 @@ +package com.example.enjoy.service; + +import com.example.enjoy.entity.FavoriteCourse; +import com.example.enjoy.entity.TrackCourse; +import com.example.enjoy.entity.user.User; +import com.example.enjoy.repository.FavoriteCourseRepository; +import com.example.enjoy.repository.TrackCourseRepository; +import com.example.enjoy.repository.UserRepository; +import jakarta.transaction.Transactional; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.Optional; + +@Service +@RequiredArgsConstructor +public class FavoriteCourseService { + private final FavoriteCourseRepository favoriteCourseRepository; + private final TrackCourseRepository trackCourseRepository; + private final UserRepository userRepository; + + @Transactional + public void toggleFavoriteCourse(Long userId, Long trackCourseId) { + User user = userRepository.findById(userId) + .orElseThrow(() -> new RuntimeException("사용자를 찾을 수 없습니다.")); + TrackCourse trackCourse = trackCourseRepository.findById(trackCourseId) + .orElseThrow(() -> new RuntimeException("과목을 찾을 수 없습니다.")); + + Optional existingFavorite = favoriteCourseRepository + .findByUserAndTrackCourse(user, trackCourse); + + if (existingFavorite.isPresent()) { + favoriteCourseRepository.delete(existingFavorite.get()); + } else { + FavoriteCourse favoriteCourse = new FavoriteCourse(); + favoriteCourse.setUser(user); + favoriteCourse.setTrackCourse(trackCourse); + favoriteCourseRepository.save(favoriteCourse); + } + } +} diff --git a/src/main/java/com/example/enjoy/service/loginService/SejongLoginService.java b/src/main/java/com/example/enjoy/service/loginService/SejongLoginService.java index 049d017..b08fcc5 100644 --- a/src/main/java/com/example/enjoy/service/loginService/SejongLoginService.java +++ b/src/main/java/com/example/enjoy/service/loginService/SejongLoginService.java @@ -5,8 +5,10 @@ import com.chuseok22.sejongportallogin.infrastructure.SejongPortalLoginService; import com.example.enjoy.dto.loginDto.MemberCommand; import com.example.enjoy.dto.loginDto.MemberDto; +import com.example.enjoy.entity.user.User; import com.example.enjoy.exception.CustomException; import com.example.enjoy.exception.ErrorCode; +import com.example.enjoy.repository.UserRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import okhttp3.*; @@ -29,9 +31,11 @@ public class SejongLoginService { private final SejongPortalLoginService sejongPortalLoginService; + private final UserRepository userRepository; public MemberDto login(MemberCommand memberCommand){ SejongMemberInfo info = sejongPortalLoginService.getMemberAuthInfos(memberCommand.getSejongPortalId(), memberCommand.getSejongPortalPassword()); + updateUserInfo(info.getStudentId(), info.getName(), info.getMajor(), info.getGrade(), info.getCompletedSemester()); //로그인 시 유저 정보 DB에 저장 return MemberDto.builder() .major(info.getMajor()) .studentIdString(info.getStudentId()) @@ -41,6 +45,14 @@ public MemberDto login(MemberCommand memberCommand){ .build(); } + private void updateUserInfo(String studentId, String username, String major, String grade, String completedSemester) { + User user = userRepository.findByStudentId(studentId) + .orElseThrow(() -> new CustomException(ErrorCode.USER_NOT_FOUND)); + + user.updateUserInfo(studentId, username, major, grade, completedSemester); + userRepository.save(user); + } + public MemberDto getMemberAuthInfos(MemberCommand memberCommand) throws IOException { try { SejongMemberInfo info = sejongPortalLoginService.getMemberAuthInfos(memberCommand.getSejongPortalId(), memberCommand.getSejongPortalPassword()); @@ -56,6 +68,8 @@ public MemberDto getMemberAuthInfos(MemberCommand memberCommand) throws IOExcept throw new CustomException(ErrorCode.SEJONG_AUTH_DATA_FETCH_ERROR); } } + + }