diff --git a/src/main/java/com/woowaSisters/woowaSisters/WoowaSistersApplication.java b/src/main/java/com/woowaSisters/woowaSisters/WoowaSistersApplication.java index 2a850df..30968ed 100644 --- a/src/main/java/com/woowaSisters/woowaSisters/WoowaSistersApplication.java +++ b/src/main/java/com/woowaSisters/woowaSisters/WoowaSistersApplication.java @@ -13,6 +13,8 @@ import com.woowaSisters.woowaSisters.domain.subBook.SubBookRepository; import com.woowaSisters.woowaSisters.domain.test.Test; import com.woowaSisters.woowaSisters.domain.test.TestRepository; +import com.woowaSisters.woowaSisters.domain.token.JwtToken; +import com.woowaSisters.woowaSisters.domain.token.JwtTokenRepository; import com.woowaSisters.woowaSisters.domain.user.UserRepository; import com.woowaSisters.woowaSisters.domain.park.Parks; import com.woowaSisters.woowaSisters.domain.user.User; @@ -22,8 +24,8 @@ import org.springframework.data.jpa.repository.config.EnableJpaRepositories; @SpringBootApplication -@EntityScan(basePackageClasses = {Parks.class, User.class, Meeting.class, Bookmark.class, Community.class, Test.class, Comment.class, Meeting.class, SubBook.class}) -@EnableJpaRepositories (basePackageClasses = {UserRepository.class, ParkRepository.class, MeetingRepository.class, BookmarkRepository.class, CommunityRepository.class, TestRepository.class, CommentRepository.class, MeetingRepository.class, SubBookRepository.class}) +@EntityScan(basePackageClasses = {Parks.class, User.class, Meeting.class, Bookmark.class, Community.class, Test.class, Comment.class, Meeting.class, SubBook.class, JwtToken.class}) +@EnableJpaRepositories (basePackageClasses = {UserRepository.class, ParkRepository.class, MeetingRepository.class, BookmarkRepository.class, CommunityRepository.class, TestRepository.class, CommentRepository.class, MeetingRepository.class, SubBookRepository.class, JwtTokenRepository.class}) public class WoowaSistersApplication { diff --git a/src/main/java/com/woowaSisters/woowaSisters/config/JpaConfig.java b/src/main/java/com/woowaSisters/woowaSisters/config/JpaConfig.java index b9e26c5..ef4467a 100644 --- a/src/main/java/com/woowaSisters/woowaSisters/config/JpaConfig.java +++ b/src/main/java/com/woowaSisters/woowaSisters/config/JpaConfig.java @@ -25,7 +25,9 @@ "com.woowaSisters.woowaSisters.domain.test", "com.woowaSisters.woowaSisters.domain.meeting", "com.woowaSisters.woowaSisters.domain.comment", - "com.woowaSisters.woowaSisters.domain.subBook" + "com.woowaSisters.woowaSisters.domain.subBook", + "com.woowaSisters.woowaSisters.domain.token", + }) public class JpaConfig { @Bean @@ -55,7 +57,8 @@ public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource da "com.woowaSisters.woowaSisters.domain.likes", "com.woowaSisters.woowaSisters.domain.test", "com.woowaSisters.woowaSisters.domain.comment", - "com.woowaSisters.woowaSisters.domain.subBook" + "com.woowaSisters.woowaSisters.domain.subBook", + "com.woowaSisters.woowaSisters.domain.token" ); JpaVendorAdapter jpaVendorAdapter = new HibernateJpaVendorAdapter(); diff --git a/src/main/java/com/woowaSisters/woowaSisters/controller/TestController.java b/src/main/java/com/woowaSisters/woowaSisters/controller/TestController.java index 467445d..69fdaa8 100644 --- a/src/main/java/com/woowaSisters/woowaSisters/controller/TestController.java +++ b/src/main/java/com/woowaSisters/woowaSisters/controller/TestController.java @@ -36,6 +36,8 @@ public class TestController { public TestController(TestService testService) { this.testService = testService; } + + // 회원가입 @PostMapping("/user") public ResponseEntity join(@Valid @RequestBody TestRequestDto joinRequest, BindingResult bindingResult) { diff --git a/src/main/java/com/woowaSisters/woowaSisters/controller/token/JwtTokenController.java b/src/main/java/com/woowaSisters/woowaSisters/controller/token/JwtTokenController.java new file mode 100644 index 0000000..c7b1b3f --- /dev/null +++ b/src/main/java/com/woowaSisters/woowaSisters/controller/token/JwtTokenController.java @@ -0,0 +1,27 @@ +package com.woowaSisters.woowaSisters.controller.token; + +import com.woowaSisters.woowaSisters.domain.token.JwtToken; +import com.woowaSisters.woowaSisters.service.token.JwtTokenService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.UUID; + +@RestController +@RequestMapping("/v1/token") +public class JwtTokenController { + + private final JwtTokenService jwtTokenService; + + @Autowired + public JwtTokenController(JwtTokenService jwtTokenService) { + this.jwtTokenService = jwtTokenService; + } + + @PostMapping("/save") + public ResponseEntity saveToken(@RequestBody String tokenValue) { + JwtToken jwtToken = jwtTokenService.saveToken(tokenValue); + return ResponseEntity.ok(jwtToken); + } +} diff --git a/src/main/java/com/woowaSisters/woowaSisters/domain/token/JwtToken.java b/src/main/java/com/woowaSisters/woowaSisters/domain/token/JwtToken.java new file mode 100644 index 0000000..acfdb08 --- /dev/null +++ b/src/main/java/com/woowaSisters/woowaSisters/domain/token/JwtToken.java @@ -0,0 +1,23 @@ +package com.woowaSisters.woowaSisters.domain.token; + +import lombok.*; +import javax.persistence.*; +import java.util.UUID; + +@Entity +@Getter +@Setter +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Table(name = "jwt_token") +public class JwtToken { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + @Column(name = "token_uuid", columnDefinition = "BINARY(16)") + private UUID tokenUuid; + + @Column(name = "token_value", nullable = false, unique = true, columnDefinition = "TEXT") + private String tokenValue; +} diff --git a/src/main/java/com/woowaSisters/woowaSisters/domain/token/JwtTokenRepository.java b/src/main/java/com/woowaSisters/woowaSisters/domain/token/JwtTokenRepository.java new file mode 100644 index 0000000..56d6d74 --- /dev/null +++ b/src/main/java/com/woowaSisters/woowaSisters/domain/token/JwtTokenRepository.java @@ -0,0 +1,12 @@ +package com.woowaSisters.woowaSisters.domain.token; + + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.UUID; + +@Repository +public interface JwtTokenRepository extends JpaRepository { +} + diff --git a/src/main/java/com/woowaSisters/woowaSisters/service/token/JwtTokenService.java b/src/main/java/com/woowaSisters/woowaSisters/service/token/JwtTokenService.java new file mode 100644 index 0000000..7c85f98 --- /dev/null +++ b/src/main/java/com/woowaSisters/woowaSisters/service/token/JwtTokenService.java @@ -0,0 +1,26 @@ +package com.woowaSisters.woowaSisters.service.token; + + +import com.woowaSisters.woowaSisters.domain.token.JwtToken; +import com.woowaSisters.woowaSisters.domain.token.JwtTokenRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + + +@Service +public class JwtTokenService { + + private final JwtTokenRepository jwtTokenRepository; + + @Autowired + public JwtTokenService(JwtTokenRepository jwtTokenRepository) { + this.jwtTokenRepository = jwtTokenRepository; + } + + public JwtToken saveToken(String tokenValue) { + JwtToken jwtToken = JwtToken.builder() + .tokenValue(tokenValue) + .build(); + return jwtTokenRepository.save(jwtToken); + } +} diff --git a/src/test/java/com/woowaSisters/woowaSisters/OAuthServiceTest.java b/src/test/java/com/woowaSisters/woowaSisters/OAuthServiceTest.java new file mode 100644 index 0000000..d622526 --- /dev/null +++ b/src/test/java/com/woowaSisters/woowaSisters/OAuthServiceTest.java @@ -0,0 +1,39 @@ +package com.woowaSisters.woowaSisters; + +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.web.client.TestRestTemplate; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; + +import static org.assertj.core.api.Assertions.assertThat; + +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +public class OAuthServiceTest { + + @Autowired + private TestRestTemplate restTemplate; + + @Test + public void givenUserLogin_whenRequestGoogleLogin_thenReceiveAuthToken() { + // 로그인 요청 시뮬레이션 + ResponseEntity response = restTemplate.getForEntity("/google/login", String.class); + + // 응답 상태 코드 확인 + assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK); + + // JWT 토큰이 포함되어 있는지 확인 + // 실제 테스트에서는 응답 바디나 헤더에서 JWT 토큰을 찾아야 합니다. + // 이 예시에서는 응답 헤더에 "Authorization" 키로 토큰이 포함되어 있다고 가정합니다. + // 실제로는 이 방식이 아닌, OAuth 프로세스에 따라 토큰이 반환되는 방식을 확인해야 합니다. + // String token = response.getHeaders().getFirst("Authorization"); + // assertThat(token).isNotNull(); + + // 아래는 응답 바디가 JSON 형태로 토큰을 포함하는 경우의 예시입니다. + // 실제로는 응답 형태에 맞춰서 JSON 파싱 로직을 추가해야 합니다. + // 예: JSON 객체에서 "access_token" 필드 값을 추출 + // String body = response.getBody(); + // assertThat(body).contains("access_token"); + } +}