From b6531eb9fac32353b5147382bf2c2f0b35a03d3e Mon Sep 17 00:00:00 2001 From: pricelees Date: Sat, 12 Jul 2025 18:19:13 +0900 Subject: [PATCH 01/37] =?UTF-8?q?refactor:=20=ED=8C=A8=ED=82=A4=EC=A7=80?= =?UTF-8?q?=20=EA=B5=AC=EC=A1=B0=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../member/{service => business}/MemberService.java | 10 +++++----- src/main/java/roomescape/member/domain/Role.java | 6 ------ .../{domain => infrastructure/entity}/Member.java | 2 +- .../entity}/MemberRepository.java | 4 +--- .../roomescape/member/infrastructure/entity/Role.java | 6 ++++++ .../member/{controller => web}/MemberController.java | 5 ++--- .../roomescape/member/{dto => web}/MemberResponse.java | 4 ++-- .../member/{dto => web}/MembersResponse.java | 2 +- .../roomescape/reservation/domain/Reservation.java | 2 +- .../reservation/dto/response/ReservationResponse.java | 2 +- .../reservation/service/ReservationService.java | 4 ++-- .../system/auth/interceptor/AdminInterceptor.java | 4 ++-- .../system/auth/interceptor/LoginInterceptor.java | 4 ++-- .../roomescape/system/auth/service/AuthService.java | 4 ++-- src/test/java/roomescape/common/Fixtures.kt | 4 ++-- .../member/controller/MemberControllerTest.java | 6 +++--- src/test/java/roomescape/member/domain/MemberTest.java | 2 ++ .../java/roomescape/payment/domain/PaymentTest.java | 4 ++-- .../roomescape/payment/service/PaymentServiceTest.java | 6 +++--- .../controller/ReservationControllerTest.java | 7 +++---- .../controller/ReservationTimeControllerTest.java | 6 +++--- .../roomescape/reservation/domain/ReservationTest.java | 4 ++-- .../repository/ReservationSearchSpecificationTest.java | 6 +++--- .../reservation/service/ReservationServiceTest.java | 8 ++++---- .../service/ReservationTimeServiceTest.java | 6 +++--- .../service/ReservationWithPaymentServiceTest.java | 6 +++--- .../system/auth/controller/AuthControllerTest.java | 6 +++--- .../system/auth/service/AuthServiceTest.java | 8 ++++---- .../theme/controller/ThemeControllerTest.java | 6 +++--- .../roomescape/theme/service/ThemeServiceTest.java | 8 ++++---- .../roomescape/view/controller/PageControllerTest.kt | 4 ++-- 31 files changed, 77 insertions(+), 79 deletions(-) rename src/main/java/roomescape/member/{service => business}/MemberService.java (84%) delete mode 100644 src/main/java/roomescape/member/domain/Role.java rename src/main/java/roomescape/member/{domain => infrastructure/entity}/Member.java (97%) rename src/main/java/roomescape/member/{domain/repository => infrastructure/entity}/MemberRepository.java (73%) create mode 100644 src/main/java/roomescape/member/infrastructure/entity/Role.java rename src/main/java/roomescape/member/{controller => web}/MemberController.java (90%) rename src/main/java/roomescape/member/{dto => web}/MemberResponse.java (84%) rename src/main/java/roomescape/member/{dto => web}/MembersResponse.java (91%) diff --git a/src/main/java/roomescape/member/service/MemberService.java b/src/main/java/roomescape/member/business/MemberService.java similarity index 84% rename from src/main/java/roomescape/member/service/MemberService.java rename to src/main/java/roomescape/member/business/MemberService.java index ff5dbd4c..b531a0fc 100644 --- a/src/main/java/roomescape/member/service/MemberService.java +++ b/src/main/java/roomescape/member/business/MemberService.java @@ -1,4 +1,4 @@ -package roomescape.member.service; +package roomescape.member.business; import java.util.List; @@ -6,10 +6,10 @@ import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import roomescape.member.domain.Member; -import roomescape.member.domain.repository.MemberRepository; -import roomescape.member.dto.MemberResponse; -import roomescape.member.dto.MembersResponse; +import roomescape.member.infrastructure.entity.Member; +import roomescape.member.infrastructure.entity.MemberRepository; +import roomescape.member.web.MemberResponse; +import roomescape.member.web.MembersResponse; import roomescape.system.exception.ErrorType; import roomescape.system.exception.RoomEscapeException; diff --git a/src/main/java/roomescape/member/domain/Role.java b/src/main/java/roomescape/member/domain/Role.java deleted file mode 100644 index e573fc02..00000000 --- a/src/main/java/roomescape/member/domain/Role.java +++ /dev/null @@ -1,6 +0,0 @@ -package roomescape.member.domain; - -public enum Role { - MEMBER, - ADMIN -} diff --git a/src/main/java/roomescape/member/domain/Member.java b/src/main/java/roomescape/member/infrastructure/entity/Member.java similarity index 97% rename from src/main/java/roomescape/member/domain/Member.java rename to src/main/java/roomescape/member/infrastructure/entity/Member.java index 5654a7da..8eb9023a 100644 --- a/src/main/java/roomescape/member/domain/Member.java +++ b/src/main/java/roomescape/member/infrastructure/entity/Member.java @@ -1,4 +1,4 @@ -package roomescape.member.domain; +package roomescape.member.infrastructure.entity; import org.springframework.http.HttpStatus; diff --git a/src/main/java/roomescape/member/domain/repository/MemberRepository.java b/src/main/java/roomescape/member/infrastructure/entity/MemberRepository.java similarity index 73% rename from src/main/java/roomescape/member/domain/repository/MemberRepository.java rename to src/main/java/roomescape/member/infrastructure/entity/MemberRepository.java index 4f039582..8c35fb30 100644 --- a/src/main/java/roomescape/member/domain/repository/MemberRepository.java +++ b/src/main/java/roomescape/member/infrastructure/entity/MemberRepository.java @@ -1,11 +1,9 @@ -package roomescape.member.domain.repository; +package roomescape.member.infrastructure.entity; import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; -import roomescape.member.domain.Member; - public interface MemberRepository extends JpaRepository { Optional findByEmailAndPassword(String email, String password); diff --git a/src/main/java/roomescape/member/infrastructure/entity/Role.java b/src/main/java/roomescape/member/infrastructure/entity/Role.java new file mode 100644 index 00000000..c42f70c8 --- /dev/null +++ b/src/main/java/roomescape/member/infrastructure/entity/Role.java @@ -0,0 +1,6 @@ +package roomescape.member.infrastructure.entity; + +public enum Role { + MEMBER, + ADMIN +} diff --git a/src/main/java/roomescape/member/controller/MemberController.java b/src/main/java/roomescape/member/web/MemberController.java similarity index 90% rename from src/main/java/roomescape/member/controller/MemberController.java rename to src/main/java/roomescape/member/web/MemberController.java index 96cf2728..40dddf7d 100644 --- a/src/main/java/roomescape/member/controller/MemberController.java +++ b/src/main/java/roomescape/member/web/MemberController.java @@ -1,4 +1,4 @@ -package roomescape.member.controller; +package roomescape.member.web; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.GetMapping; @@ -9,8 +9,7 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; -import roomescape.member.dto.MembersResponse; -import roomescape.member.service.MemberService; +import roomescape.member.business.MemberService; import roomescape.system.auth.annotation.Admin; import roomescape.system.dto.response.RoomEscapeApiResponse; diff --git a/src/main/java/roomescape/member/dto/MemberResponse.java b/src/main/java/roomescape/member/web/MemberResponse.java similarity index 84% rename from src/main/java/roomescape/member/dto/MemberResponse.java rename to src/main/java/roomescape/member/web/MemberResponse.java index 8683b6aa..876f5752 100644 --- a/src/main/java/roomescape/member/dto/MemberResponse.java +++ b/src/main/java/roomescape/member/web/MemberResponse.java @@ -1,7 +1,7 @@ -package roomescape.member.dto; +package roomescape.member.web; import io.swagger.v3.oas.annotations.media.Schema; -import roomescape.member.domain.Member; +import roomescape.member.infrastructure.entity.Member; @Schema(name = "회원 조회 응답", description = "회원 정보 조회 응답시 사용됩니다.") public record MemberResponse( diff --git a/src/main/java/roomescape/member/dto/MembersResponse.java b/src/main/java/roomescape/member/web/MembersResponse.java similarity index 91% rename from src/main/java/roomescape/member/dto/MembersResponse.java rename to src/main/java/roomescape/member/web/MembersResponse.java index 5a83c97d..92543779 100644 --- a/src/main/java/roomescape/member/dto/MembersResponse.java +++ b/src/main/java/roomescape/member/web/MembersResponse.java @@ -1,4 +1,4 @@ -package roomescape.member.dto; +package roomescape.member.web; import java.util.List; diff --git a/src/main/java/roomescape/reservation/domain/Reservation.java b/src/main/java/roomescape/reservation/domain/Reservation.java index 8fee6fc6..d038b04b 100644 --- a/src/main/java/roomescape/reservation/domain/Reservation.java +++ b/src/main/java/roomescape/reservation/domain/Reservation.java @@ -15,7 +15,7 @@ import jakarta.persistence.GenerationType; import jakarta.persistence.Id; import jakarta.persistence.JoinColumn; import jakarta.persistence.ManyToOne; -import roomescape.member.domain.Member; +import roomescape.member.infrastructure.entity.Member; import roomescape.system.exception.ErrorType; import roomescape.system.exception.RoomEscapeException; import roomescape.theme.domain.Theme; diff --git a/src/main/java/roomescape/reservation/dto/response/ReservationResponse.java b/src/main/java/roomescape/reservation/dto/response/ReservationResponse.java index c4d5c8fa..ba4ecb2b 100644 --- a/src/main/java/roomescape/reservation/dto/response/ReservationResponse.java +++ b/src/main/java/roomescape/reservation/dto/response/ReservationResponse.java @@ -5,7 +5,7 @@ import java.time.LocalDate; import com.fasterxml.jackson.annotation.JsonProperty; import io.swagger.v3.oas.annotations.media.Schema; -import roomescape.member.dto.MemberResponse; +import roomescape.member.web.MemberResponse; import roomescape.reservation.domain.Reservation; import roomescape.reservation.domain.ReservationStatus; import roomescape.theme.dto.ThemeResponse; diff --git a/src/main/java/roomescape/reservation/service/ReservationService.java b/src/main/java/roomescape/reservation/service/ReservationService.java index 05f22a41..b82d42eb 100644 --- a/src/main/java/roomescape/reservation/service/ReservationService.java +++ b/src/main/java/roomescape/reservation/service/ReservationService.java @@ -9,8 +9,8 @@ import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import roomescape.member.domain.Member; -import roomescape.member.service.MemberService; +import roomescape.member.infrastructure.entity.Member; +import roomescape.member.business.MemberService; import roomescape.reservation.domain.Reservation; import roomescape.reservation.domain.ReservationStatus; import roomescape.reservation.domain.ReservationTime; diff --git a/src/main/java/roomescape/system/auth/interceptor/AdminInterceptor.java b/src/main/java/roomescape/system/auth/interceptor/AdminInterceptor.java index 4304a37f..1e372aad 100644 --- a/src/main/java/roomescape/system/auth/interceptor/AdminInterceptor.java +++ b/src/main/java/roomescape/system/auth/interceptor/AdminInterceptor.java @@ -10,8 +10,8 @@ import org.springframework.web.servlet.HandlerInterceptor; import jakarta.servlet.http.Cookie; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; -import roomescape.member.domain.Member; -import roomescape.member.service.MemberService; +import roomescape.member.infrastructure.entity.Member; +import roomescape.member.business.MemberService; import roomescape.system.auth.annotation.Admin; import roomescape.system.auth.jwt.JwtHandler; import roomescape.system.exception.ErrorType; diff --git a/src/main/java/roomescape/system/auth/interceptor/LoginInterceptor.java b/src/main/java/roomescape/system/auth/interceptor/LoginInterceptor.java index 2aa0bafc..c82343eb 100644 --- a/src/main/java/roomescape/system/auth/interceptor/LoginInterceptor.java +++ b/src/main/java/roomescape/system/auth/interceptor/LoginInterceptor.java @@ -10,8 +10,8 @@ import org.springframework.web.servlet.HandlerInterceptor; import jakarta.servlet.http.Cookie; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; -import roomescape.member.domain.Member; -import roomescape.member.service.MemberService; +import roomescape.member.infrastructure.entity.Member; +import roomescape.member.business.MemberService; import roomescape.system.auth.annotation.LoginRequired; import roomescape.system.auth.jwt.JwtHandler; import roomescape.system.exception.ErrorType; diff --git a/src/main/java/roomescape/system/auth/service/AuthService.java b/src/main/java/roomescape/system/auth/service/AuthService.java index e8d43828..8fa1447a 100644 --- a/src/main/java/roomescape/system/auth/service/AuthService.java +++ b/src/main/java/roomescape/system/auth/service/AuthService.java @@ -2,8 +2,8 @@ package roomescape.system.auth.service; import org.springframework.stereotype.Service; -import roomescape.member.domain.Member; -import roomescape.member.service.MemberService; +import roomescape.member.infrastructure.entity.Member; +import roomescape.member.business.MemberService; import roomescape.system.auth.dto.LoginCheckResponse; import roomescape.system.auth.dto.LoginRequest; import roomescape.system.auth.jwt.JwtHandler; diff --git a/src/test/java/roomescape/common/Fixtures.kt b/src/test/java/roomescape/common/Fixtures.kt index 0eb6f562..2a6736bf 100644 --- a/src/test/java/roomescape/common/Fixtures.kt +++ b/src/test/java/roomescape/common/Fixtures.kt @@ -1,7 +1,7 @@ package roomescape.common -import roomescape.member.domain.Member -import roomescape.member.domain.Role +import roomescape.member.infrastructure.entity.Member +import roomescape.member.infrastructure.entity.Role import java.util.concurrent.atomic.AtomicLong object MemberFixture { diff --git a/src/test/java/roomescape/member/controller/MemberControllerTest.java b/src/test/java/roomescape/member/controller/MemberControllerTest.java index 5cf989d9..80744610 100644 --- a/src/test/java/roomescape/member/controller/MemberControllerTest.java +++ b/src/test/java/roomescape/member/controller/MemberControllerTest.java @@ -13,9 +13,9 @@ import org.springframework.test.context.jdbc.Sql; import io.restassured.RestAssured; import io.restassured.http.ContentType; import io.restassured.http.Header; -import roomescape.member.domain.Member; -import roomescape.member.domain.Role; -import roomescape.member.domain.repository.MemberRepository; +import roomescape.member.infrastructure.entity.Member; +import roomescape.member.infrastructure.entity.Role; +import roomescape.member.infrastructure.entity.MemberRepository; @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) @Sql(scripts = "/truncate.sql", executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD) diff --git a/src/test/java/roomescape/member/domain/MemberTest.java b/src/test/java/roomescape/member/domain/MemberTest.java index 666982fd..8f6473cc 100644 --- a/src/test/java/roomescape/member/domain/MemberTest.java +++ b/src/test/java/roomescape/member/domain/MemberTest.java @@ -4,6 +4,8 @@ import org.assertj.core.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import roomescape.member.infrastructure.entity.Member; +import roomescape.member.infrastructure.entity.Role; import roomescape.system.exception.RoomEscapeException; class MemberTest { diff --git a/src/test/java/roomescape/payment/domain/PaymentTest.java b/src/test/java/roomescape/payment/domain/PaymentTest.java index 3c6e1fbc..bfbe95f6 100644 --- a/src/test/java/roomescape/payment/domain/PaymentTest.java +++ b/src/test/java/roomescape/payment/domain/PaymentTest.java @@ -13,8 +13,8 @@ import org.junit.jupiter.params.provider.CsvSource; import org.junit.jupiter.params.provider.NullAndEmptySource; import org.junit.jupiter.params.provider.NullSource; -import roomescape.member.domain.Member; -import roomescape.member.domain.Role; +import roomescape.member.infrastructure.entity.Member; +import roomescape.member.infrastructure.entity.Role; import roomescape.reservation.domain.Reservation; import roomescape.reservation.domain.ReservationStatus; import roomescape.reservation.domain.ReservationTime; diff --git a/src/test/java/roomescape/payment/service/PaymentServiceTest.java b/src/test/java/roomescape/payment/service/PaymentServiceTest.java index 29a7ad75..486f40b0 100644 --- a/src/test/java/roomescape/payment/service/PaymentServiceTest.java +++ b/src/test/java/roomescape/payment/service/PaymentServiceTest.java @@ -13,9 +13,9 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.jdbc.Sql; import org.springframework.test.context.jdbc.Sql.ExecutionPhase; -import roomescape.member.domain.Member; -import roomescape.member.domain.Role; -import roomescape.member.domain.repository.MemberRepository; +import roomescape.member.infrastructure.entity.Member; +import roomescape.member.infrastructure.entity.Role; +import roomescape.member.infrastructure.entity.MemberRepository; import roomescape.payment.domain.repository.CanceledPaymentRepository; import roomescape.payment.dto.request.PaymentCancelRequest; import roomescape.payment.dto.response.PaymentResponse; diff --git a/src/test/java/roomescape/reservation/controller/ReservationControllerTest.java b/src/test/java/roomescape/reservation/controller/ReservationControllerTest.java index ffba15b6..91baa3d4 100644 --- a/src/test/java/roomescape/reservation/controller/ReservationControllerTest.java +++ b/src/test/java/roomescape/reservation/controller/ReservationControllerTest.java @@ -2,7 +2,6 @@ package roomescape.reservation.controller; import static org.assertj.core.api.Assertions.*; import static org.hamcrest.Matchers.*; -import static org.mockito.ArgumentMatchers.*; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.*; @@ -33,9 +32,9 @@ import org.springframework.test.context.jdbc.Sql.ExecutionPhase; import io.restassured.RestAssured; import io.restassured.http.ContentType; import io.restassured.http.Header; -import roomescape.member.domain.Member; -import roomescape.member.domain.Role; -import roomescape.member.domain.repository.MemberRepository; +import roomescape.member.infrastructure.entity.Member; +import roomescape.member.infrastructure.entity.Role; +import roomescape.member.infrastructure.entity.MemberRepository; import roomescape.payment.client.TossPaymentClient; import roomescape.payment.domain.CanceledPayment; import roomescape.payment.domain.Payment; diff --git a/src/test/java/roomescape/reservation/controller/ReservationTimeControllerTest.java b/src/test/java/roomescape/reservation/controller/ReservationTimeControllerTest.java index cefd9aff..f74f25a1 100644 --- a/src/test/java/roomescape/reservation/controller/ReservationTimeControllerTest.java +++ b/src/test/java/roomescape/reservation/controller/ReservationTimeControllerTest.java @@ -21,9 +21,9 @@ import org.springframework.test.context.jdbc.Sql.ExecutionPhase; import io.restassured.RestAssured; import io.restassured.http.ContentType; import io.restassured.http.Header; -import roomescape.member.domain.Member; -import roomescape.member.domain.Role; -import roomescape.member.domain.repository.MemberRepository; +import roomescape.member.infrastructure.entity.Member; +import roomescape.member.infrastructure.entity.Role; +import roomescape.member.infrastructure.entity.MemberRepository; import roomescape.reservation.domain.Reservation; import roomescape.reservation.domain.ReservationStatus; import roomescape.reservation.domain.ReservationTime; diff --git a/src/test/java/roomescape/reservation/domain/ReservationTest.java b/src/test/java/roomescape/reservation/domain/ReservationTest.java index f66623e6..e66b99e1 100644 --- a/src/test/java/roomescape/reservation/domain/ReservationTest.java +++ b/src/test/java/roomescape/reservation/domain/ReservationTest.java @@ -10,8 +10,8 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; -import roomescape.member.domain.Member; -import roomescape.member.domain.Role; +import roomescape.member.infrastructure.entity.Member; +import roomescape.member.infrastructure.entity.Role; import roomescape.system.exception.RoomEscapeException; import roomescape.theme.domain.Theme; diff --git a/src/test/java/roomescape/reservation/domain/repository/ReservationSearchSpecificationTest.java b/src/test/java/roomescape/reservation/domain/repository/ReservationSearchSpecificationTest.java index 62cb372f..f92a4ae6 100644 --- a/src/test/java/roomescape/reservation/domain/repository/ReservationSearchSpecificationTest.java +++ b/src/test/java/roomescape/reservation/domain/repository/ReservationSearchSpecificationTest.java @@ -13,9 +13,9 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.data.jpa.domain.Specification; -import roomescape.member.domain.Member; -import roomescape.member.domain.Role; -import roomescape.member.domain.repository.MemberRepository; +import roomescape.member.infrastructure.entity.Member; +import roomescape.member.infrastructure.entity.Role; +import roomescape.member.infrastructure.entity.MemberRepository; import roomescape.reservation.domain.Reservation; import roomescape.reservation.domain.ReservationStatus; import roomescape.reservation.domain.ReservationTime; diff --git a/src/test/java/roomescape/reservation/service/ReservationServiceTest.java b/src/test/java/roomescape/reservation/service/ReservationServiceTest.java index 59ecd913..d29fa51c 100644 --- a/src/test/java/roomescape/reservation/service/ReservationServiceTest.java +++ b/src/test/java/roomescape/reservation/service/ReservationServiceTest.java @@ -14,10 +14,10 @@ import org.springframework.context.annotation.Import; import org.springframework.test.context.jdbc.Sql; import org.springframework.test.context.jdbc.Sql.ExecutionPhase; -import roomescape.member.domain.Member; -import roomescape.member.domain.Role; -import roomescape.member.domain.repository.MemberRepository; -import roomescape.member.service.MemberService; +import roomescape.member.infrastructure.entity.Member; +import roomescape.member.infrastructure.entity.Role; +import roomescape.member.infrastructure.entity.MemberRepository; +import roomescape.member.business.MemberService; import roomescape.reservation.domain.Reservation; import roomescape.reservation.domain.ReservationStatus; import roomescape.reservation.domain.ReservationTime; diff --git a/src/test/java/roomescape/reservation/service/ReservationTimeServiceTest.java b/src/test/java/roomescape/reservation/service/ReservationTimeServiceTest.java index 5b3e57a9..135c550c 100644 --- a/src/test/java/roomescape/reservation/service/ReservationTimeServiceTest.java +++ b/src/test/java/roomescape/reservation/service/ReservationTimeServiceTest.java @@ -13,9 +13,9 @@ import org.springframework.context.annotation.Import; import org.springframework.test.context.jdbc.Sql; import org.springframework.test.context.jdbc.Sql.ExecutionPhase; -import roomescape.member.domain.Member; -import roomescape.member.domain.Role; -import roomescape.member.domain.repository.MemberRepository; +import roomescape.member.infrastructure.entity.Member; +import roomescape.member.infrastructure.entity.Role; +import roomescape.member.infrastructure.entity.MemberRepository; import roomescape.reservation.domain.Reservation; import roomescape.reservation.domain.ReservationStatus; import roomescape.reservation.domain.ReservationTime; diff --git a/src/test/java/roomescape/reservation/service/ReservationWithPaymentServiceTest.java b/src/test/java/roomescape/reservation/service/ReservationWithPaymentServiceTest.java index 973ccf03..863d01c0 100644 --- a/src/test/java/roomescape/reservation/service/ReservationWithPaymentServiceTest.java +++ b/src/test/java/roomescape/reservation/service/ReservationWithPaymentServiceTest.java @@ -13,9 +13,9 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.jdbc.Sql; import org.springframework.test.context.jdbc.Sql.ExecutionPhase; -import roomescape.member.domain.Member; -import roomescape.member.domain.Role; -import roomescape.member.domain.repository.MemberRepository; +import roomescape.member.infrastructure.entity.Member; +import roomescape.member.infrastructure.entity.Role; +import roomescape.member.infrastructure.entity.MemberRepository; import roomescape.payment.domain.repository.CanceledPaymentRepository; import roomescape.payment.domain.repository.PaymentRepository; import roomescape.payment.dto.request.PaymentCancelRequest; diff --git a/src/test/java/roomescape/system/auth/controller/AuthControllerTest.java b/src/test/java/roomescape/system/auth/controller/AuthControllerTest.java index fb3918e3..34e3d1c7 100644 --- a/src/test/java/roomescape/system/auth/controller/AuthControllerTest.java +++ b/src/test/java/roomescape/system/auth/controller/AuthControllerTest.java @@ -14,9 +14,9 @@ import org.springframework.test.context.jdbc.Sql; import io.restassured.RestAssured; import io.restassured.http.ContentType; -import roomescape.member.domain.Member; -import roomescape.member.domain.Role; -import roomescape.member.domain.repository.MemberRepository; +import roomescape.member.infrastructure.entity.Member; +import roomescape.member.infrastructure.entity.Role; +import roomescape.member.infrastructure.entity.MemberRepository; @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) @Sql(scripts = "/truncate.sql", executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD) diff --git a/src/test/java/roomescape/system/auth/service/AuthServiceTest.java b/src/test/java/roomescape/system/auth/service/AuthServiceTest.java index bf8a5af8..2aace90e 100644 --- a/src/test/java/roomescape/system/auth/service/AuthServiceTest.java +++ b/src/test/java/roomescape/system/auth/service/AuthServiceTest.java @@ -9,10 +9,10 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.Import; -import roomescape.member.domain.Member; -import roomescape.member.domain.Role; -import roomescape.member.domain.repository.MemberRepository; -import roomescape.member.service.MemberService; +import roomescape.member.infrastructure.entity.Member; +import roomescape.member.infrastructure.entity.Role; +import roomescape.member.infrastructure.entity.MemberRepository; +import roomescape.member.business.MemberService; import roomescape.system.auth.dto.LoginRequest; import roomescape.system.auth.jwt.JwtHandler; import roomescape.system.auth.jwt.dto.TokenDto; diff --git a/src/test/java/roomescape/theme/controller/ThemeControllerTest.java b/src/test/java/roomescape/theme/controller/ThemeControllerTest.java index 8eba3ab3..5b373a0c 100644 --- a/src/test/java/roomescape/theme/controller/ThemeControllerTest.java +++ b/src/test/java/roomescape/theme/controller/ThemeControllerTest.java @@ -18,9 +18,9 @@ import org.springframework.test.context.jdbc.Sql.ExecutionPhase; import io.restassured.RestAssured; import io.restassured.http.ContentType; import io.restassured.http.Header; -import roomescape.member.domain.Member; -import roomescape.member.domain.Role; -import roomescape.member.domain.repository.MemberRepository; +import roomescape.member.infrastructure.entity.Member; +import roomescape.member.infrastructure.entity.Role; +import roomescape.member.infrastructure.entity.MemberRepository; @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) @Sql(scripts = "/truncate.sql", executionPhase = ExecutionPhase.BEFORE_TEST_METHOD) diff --git a/src/test/java/roomescape/theme/service/ThemeServiceTest.java b/src/test/java/roomescape/theme/service/ThemeServiceTest.java index be91c3ca..d40970b8 100644 --- a/src/test/java/roomescape/theme/service/ThemeServiceTest.java +++ b/src/test/java/roomescape/theme/service/ThemeServiceTest.java @@ -13,10 +13,10 @@ import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.context.annotation.Import; import org.springframework.test.context.jdbc.Sql; -import roomescape.member.domain.Member; -import roomescape.member.domain.Role; -import roomescape.member.domain.repository.MemberRepository; -import roomescape.member.service.MemberService; +import roomescape.member.infrastructure.entity.Member; +import roomescape.member.infrastructure.entity.Role; +import roomescape.member.infrastructure.entity.MemberRepository; +import roomescape.member.business.MemberService; import roomescape.reservation.dto.request.ReservationRequest; import roomescape.reservation.dto.request.ReservationTimeRequest; import roomescape.reservation.dto.response.ReservationTimeResponse; diff --git a/src/test/java/roomescape/view/controller/PageControllerTest.kt b/src/test/java/roomescape/view/controller/PageControllerTest.kt index 170b397c..21d09e77 100644 --- a/src/test/java/roomescape/view/controller/PageControllerTest.kt +++ b/src/test/java/roomescape/view/controller/PageControllerTest.kt @@ -13,8 +13,8 @@ import org.springframework.boot.test.web.server.LocalServerPort import org.springframework.http.HttpStatus import roomescape.common.MemberFixture import roomescape.common.NoSqlInitialize -import roomescape.member.domain.Member -import roomescape.member.service.MemberService +import roomescape.member.infrastructure.entity.Member +import roomescape.member.business.MemberService import roomescape.system.auth.jwt.JwtHandler import roomescape.system.exception.ErrorType import roomescape.system.exception.RoomEscapeException -- 2.47.2 From a227a830536871f1246728f5b976f216c33b66e3 Mon Sep 17 00:00:00 2001 From: pricelees Date: Sat, 12 Jul 2025 19:52:48 +0900 Subject: [PATCH 02/37] =?UTF-8?q?feat:=20API=20Docs=20=EA=B4=80=EB=A0=A8?= =?UTF-8?q?=20=EC=84=A4=EC=A0=95=EC=9D=84=20=EB=B3=84=EB=8F=84=EC=9D=98=20?= =?UTF-8?q?=EC=9D=B8=ED=84=B0=ED=8E=98=EC=9D=B4=EC=8A=A4=EB=A1=9C=20?= =?UTF-8?q?=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/roomescape/member/web/MemberAPI.kt | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 src/main/java/roomescape/member/web/MemberAPI.kt diff --git a/src/main/java/roomescape/member/web/MemberAPI.kt b/src/main/java/roomescape/member/web/MemberAPI.kt new file mode 100644 index 00000000..5ce92093 --- /dev/null +++ b/src/main/java/roomescape/member/web/MemberAPI.kt @@ -0,0 +1,21 @@ +package roomescape.member.web + +import io.swagger.v3.oas.annotations.Operation +import io.swagger.v3.oas.annotations.responses.ApiResponse +import io.swagger.v3.oas.annotations.responses.ApiResponses +import io.swagger.v3.oas.annotations.tags.Tag +import org.springframework.http.HttpStatus +import org.springframework.web.bind.annotation.ResponseStatus +import roomescape.system.auth.annotation.Admin +import roomescape.system.dto.response.RoomEscapeApiResponse + +@Tag(name = "2. 회원 API", description = "회원 정보를 관리할 때 사용합니다.") +interface MemberAPI { + + @Admin + @Operation(summary = "모든 회원 조회", tags = ["관리자 로그인이 필요한 API"]) + @ApiResponses(ApiResponse(responseCode = "200", description = "성공", useReturnTypeSchema = true)) + @ResponseStatus(HttpStatus.OK) + fun readAllMembers(): RoomEscapeApiResponse + +} -- 2.47.2 From 4de0eb2cfcf70e51faab473820b63da7f2c56ef0 Mon Sep 17 00:00:00 2001 From: pricelees Date: Sat, 12 Jul 2025 19:53:27 +0900 Subject: [PATCH 03/37] Rename .java to .kt --- .../member/web/{MemberController.java => MemberController.kt} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/main/java/roomescape/member/web/{MemberController.java => MemberController.kt} (100%) diff --git a/src/main/java/roomescape/member/web/MemberController.java b/src/main/java/roomescape/member/web/MemberController.kt similarity index 100% rename from src/main/java/roomescape/member/web/MemberController.java rename to src/main/java/roomescape/member/web/MemberController.kt -- 2.47.2 From c563c61c1793b27990cf2cf2453b95dba0266236 Mon Sep 17 00:00:00 2001 From: pricelees Date: Sat, 12 Jul 2025 19:53:27 +0900 Subject: [PATCH 04/37] =?UTF-8?q?refactor:=20=ED=9A=8C=EC=9B=90=20?= =?UTF-8?q?=EC=BB=A8=ED=8A=B8=EB=A1=A4=EB=9F=AC=20&=20DTO=20=EC=BD=94?= =?UTF-8?q?=ED=8B=80=EB=A6=B0=20=EB=B3=80=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../roomescape/member/web/MemberController.kt | 72 +++++++++++-------- .../roomescape/member/web/MemberResponse.java | 14 ---- .../member/web/MembersResponse.java | 11 --- 3 files changed, 42 insertions(+), 55 deletions(-) delete mode 100644 src/main/java/roomescape/member/web/MemberResponse.java delete mode 100644 src/main/java/roomescape/member/web/MembersResponse.java diff --git a/src/main/java/roomescape/member/web/MemberController.kt b/src/main/java/roomescape/member/web/MemberController.kt index 40dddf7d..1d883be0 100644 --- a/src/main/java/roomescape/member/web/MemberController.kt +++ b/src/main/java/roomescape/member/web/MemberController.kt @@ -1,36 +1,48 @@ -package roomescape.member.web; +package roomescape.member.web -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.ResponseStatus; -import org.springframework.web.bind.annotation.RestController; - -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.responses.ApiResponse; -import io.swagger.v3.oas.annotations.responses.ApiResponses; -import io.swagger.v3.oas.annotations.tags.Tag; -import roomescape.member.business.MemberService; -import roomescape.system.auth.annotation.Admin; -import roomescape.system.dto.response.RoomEscapeApiResponse; +import io.swagger.v3.oas.annotations.media.Schema +import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.RestController +import roomescape.member.business.MemberService +import roomescape.member.infrastructure.entity.Member +import roomescape.system.dto.response.RoomEscapeApiResponse @RestController -@Tag(name = "2. 회원 API", description = "회원 정보를 관리할 때 사용합니다.") -public class MemberController { +class MemberController( + private val memberService: MemberService +) : MemberAPI { - private final MemberService memberService; + @GetMapping("/members") + override fun readAllMembers(): RoomEscapeApiResponse { + val result: MembersResponse = memberService.readAllMembers() - public MemberController(MemberService memberService) { - this.memberService = memberService; - } - - @Admin - @GetMapping("/members") - @ResponseStatus(HttpStatus.OK) - @Operation(summary = "모든 회원 조회", tags = "관리자 로그인이 필요한 API") - @ApiResponses({ - @ApiResponse(responseCode = "200", description = "성공", useReturnTypeSchema = true) - }) - public RoomEscapeApiResponse getAllMembers() { - return RoomEscapeApiResponse.success(memberService.findAllMembers()); - } + return RoomEscapeApiResponse.success(result) + } } + +@Schema(name = "회원 조회 응답", description = "회원 정보 조회 응답시 사용됩니다.") +data class MemberResponse( + @field:Schema(description = "회원의 고유 번호") + val id: Long, + + @field:Schema(description = "회원의 이름") + val name: String +) { + companion object { + @JvmStatic + fun fromEntity(member: Member): MemberResponse { + return MemberResponse(member.id!!, member.name) + } + } +} + +fun Member.toResponse(): MemberResponse = MemberResponse( + id = id!!, + name = name +) + +@Schema(name = "회원 목록 조회 응답", description = "모든 회원의 정보 조회 응답시 사용됩니다.") +data class MembersResponse( + @field:Schema(description = "모든 회원의 ID 및 이름") + val members: List +) diff --git a/src/main/java/roomescape/member/web/MemberResponse.java b/src/main/java/roomescape/member/web/MemberResponse.java deleted file mode 100644 index 876f5752..00000000 --- a/src/main/java/roomescape/member/web/MemberResponse.java +++ /dev/null @@ -1,14 +0,0 @@ -package roomescape.member.web; - -import io.swagger.v3.oas.annotations.media.Schema; -import roomescape.member.infrastructure.entity.Member; - -@Schema(name = "회원 조회 응답", description = "회원 정보 조회 응답시 사용됩니다.") -public record MemberResponse( - @Schema(description = "회원 번호. 회원을 식별할 때 사용합니다.") Long id, - @Schema(description = "회원의 이름") String name -) { - public static MemberResponse fromEntity(Member member) { - return new MemberResponse(member.getId(), member.getName()); - } -} diff --git a/src/main/java/roomescape/member/web/MembersResponse.java b/src/main/java/roomescape/member/web/MembersResponse.java deleted file mode 100644 index 92543779..00000000 --- a/src/main/java/roomescape/member/web/MembersResponse.java +++ /dev/null @@ -1,11 +0,0 @@ -package roomescape.member.web; - -import java.util.List; - -import io.swagger.v3.oas.annotations.media.Schema; - -@Schema(name = "회원 목록 조회 응답", description = "모든 회원의 정보 조회 응답시 사용됩니다.") -public record MembersResponse( - @Schema(description = "모든 회원의 ID 및 이름") List members -) { -} -- 2.47.2 From dde9a663ff212f0342473abb511b0f1f0f968602 Mon Sep 17 00:00:00 2001 From: pricelees Date: Sat, 12 Jul 2025 19:54:45 +0900 Subject: [PATCH 05/37] Rename .java to .kt --- .../member/infrastructure/entity/{Member.java => Member.kt} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/main/java/roomescape/member/infrastructure/entity/{Member.java => Member.kt} (100%) diff --git a/src/main/java/roomescape/member/infrastructure/entity/Member.java b/src/main/java/roomescape/member/infrastructure/entity/Member.kt similarity index 100% rename from src/main/java/roomescape/member/infrastructure/entity/Member.java rename to src/main/java/roomescape/member/infrastructure/entity/Member.kt -- 2.47.2 From 1e01e493130528527c9fa149cc6fad09cad16950 Mon Sep 17 00:00:00 2001 From: pricelees Date: Sat, 12 Jul 2025 19:54:45 +0900 Subject: [PATCH 06/37] =?UTF-8?q?refactor:=20=ED=9A=8C=EC=9B=90=20?= =?UTF-8?q?=EC=97=94=ED=8B=B0=ED=8B=B0=20=EC=BD=94=ED=8B=80=EB=A6=B0=20?= =?UTF-8?q?=EB=B3=80=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../member/infrastructure/entity/Member.kt | 111 +++--------------- .../member/infrastructure/entity/Role.java | 6 - .../roomescape/member/domain/MemberTest.java | 28 ----- .../payment/domain/PaymentTest.java | 2 +- .../payment/service/PaymentServiceTest.java | 8 +- .../controller/ReservationControllerTest.java | 46 ++++---- .../ReservationTimeControllerTest.java | 6 +- .../reservation/domain/ReservationTest.java | 6 +- .../ReservationSearchSpecificationTest.java | 4 +- .../service/ReservationServiceTest.java | 30 ++--- .../service/ReservationTimeServiceTest.java | 4 +- .../ReservationWithPaymentServiceTest.java | 10 +- .../auth/controller/AuthControllerTest.java | 6 +- .../system/auth/service/AuthServiceTest.java | 8 +- .../theme/controller/ThemeControllerTest.java | 4 +- .../theme/service/ThemeServiceTest.java | 8 +- 16 files changed, 92 insertions(+), 195 deletions(-) delete mode 100644 src/main/java/roomescape/member/infrastructure/entity/Role.java delete mode 100644 src/test/java/roomescape/member/domain/MemberTest.java diff --git a/src/main/java/roomescape/member/infrastructure/entity/Member.kt b/src/main/java/roomescape/member/infrastructure/entity/Member.kt index 8eb9023a..5b22934c 100644 --- a/src/main/java/roomescape/member/infrastructure/entity/Member.kt +++ b/src/main/java/roomescape/member/infrastructure/entity/Member.kt @@ -1,98 +1,23 @@ -package roomescape.member.infrastructure.entity; +package roomescape.member.infrastructure.entity -import org.springframework.http.HttpStatus; - -import jakarta.persistence.Entity; -import jakarta.persistence.EnumType; -import jakarta.persistence.Enumerated; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import roomescape.system.exception.ErrorType; -import roomescape.system.exception.RoomEscapeException; +import jakarta.persistence.* @Entity -public class Member { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; +class Member( + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + var id: Long? = null, + var name: String, + var email: String, + var password: String, - private String name; - - private String email; - - private String password; - - @Enumerated(value = EnumType.STRING) - private Role role; - - protected Member() { - } - - public Member( - String name, - String email, - String password, - Role role - ) { - this(null, name, email, password, role); - } - - public Member( - Long id, - String name, - String email, - String password, - Role role - ) { - this.id = id; - this.name = name; - this.email = email; - this.password = password; - this.role = role; - - validateRole(); - } - - private void validateRole() { - if (role == null) { - throw new RoomEscapeException(ErrorType.REQUEST_DATA_BLANK, String.format("[values: %s]", this), - HttpStatus.BAD_REQUEST); - } - } - - public boolean isAdmin() { - return this.role == Role.ADMIN; - } - - public Long getId() { - return id; - } - - public String getName() { - return name; - } - - public String getEmail() { - return email; - } - - public String getPassword() { - return password; - } - - public Role getRole() { - return role; - } - - @Override - public String toString() { - return "Member{" + - "id=" + id + - ", name=" + name + - ", email=" + email + - ", password=" + password + - ", role=" + role + - '}'; - } + @Enumerated(value = EnumType.STRING) + var role: Role +) { + fun isAdmin(): Boolean = role == Role.ADMIN +} + +enum class Role { + MEMBER, + ADMIN, } diff --git a/src/main/java/roomescape/member/infrastructure/entity/Role.java b/src/main/java/roomescape/member/infrastructure/entity/Role.java deleted file mode 100644 index c42f70c8..00000000 --- a/src/main/java/roomescape/member/infrastructure/entity/Role.java +++ /dev/null @@ -1,6 +0,0 @@ -package roomescape.member.infrastructure.entity; - -public enum Role { - MEMBER, - ADMIN -} diff --git a/src/test/java/roomescape/member/domain/MemberTest.java b/src/test/java/roomescape/member/domain/MemberTest.java deleted file mode 100644 index 8f6473cc..00000000 --- a/src/test/java/roomescape/member/domain/MemberTest.java +++ /dev/null @@ -1,28 +0,0 @@ -package roomescape.member.domain; - -import org.assertj.core.api.Assertions; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import roomescape.member.infrastructure.entity.Member; -import roomescape.member.infrastructure.entity.Role; -import roomescape.system.exception.RoomEscapeException; - -class MemberTest { - - @Test - @DisplayName("Member 객체를 생성할 때 Role은 반드시 입력되어야 한다.") - void createMemberWithoutRole() { - // given - String name = "name"; - String email = "email"; - String password = "password"; - - // when - Role role = null; - - // then - Assertions.assertThatThrownBy(() -> new Member(name, email, password, null)) - .isInstanceOf(RoomEscapeException.class); - } -} diff --git a/src/test/java/roomescape/payment/domain/PaymentTest.java b/src/test/java/roomescape/payment/domain/PaymentTest.java index bfbe95f6..9c0b52f9 100644 --- a/src/test/java/roomescape/payment/domain/PaymentTest.java +++ b/src/test/java/roomescape/payment/domain/PaymentTest.java @@ -30,7 +30,7 @@ class PaymentTest { LocalDate now = LocalDate.now(); ReservationTime reservationTime = new ReservationTime(LocalTime.now()); Theme theme = new Theme("name", "desc", "thumb"); - Member member = new Member("name", "email", "password", Role.MEMBER); + Member member = new Member(null, "name", "email", "password", Role.MEMBER); reservation = new Reservation(now, reservationTime, theme, member, ReservationStatus.CONFIRMED); } diff --git a/src/test/java/roomescape/payment/service/PaymentServiceTest.java b/src/test/java/roomescape/payment/service/PaymentServiceTest.java index 486f40b0..b42d0d95 100644 --- a/src/test/java/roomescape/payment/service/PaymentServiceTest.java +++ b/src/test/java/roomescape/payment/service/PaymentServiceTest.java @@ -14,8 +14,8 @@ import org.springframework.test.context.jdbc.Sql; import org.springframework.test.context.jdbc.Sql.ExecutionPhase; import roomescape.member.infrastructure.entity.Member; -import roomescape.member.infrastructure.entity.Role; import roomescape.member.infrastructure.entity.MemberRepository; +import roomescape.member.infrastructure.entity.Role; import roomescape.payment.domain.repository.CanceledPaymentRepository; import roomescape.payment.dto.request.PaymentCancelRequest; import roomescape.payment.dto.response.PaymentResponse; @@ -54,7 +54,7 @@ class PaymentServiceTest { LocalDateTime localDateTime = LocalDateTime.now().plusHours(1L); LocalDate date = localDateTime.toLocalDate(); ReservationTime time = reservationTimeRepository.save(new ReservationTime(localDateTime.toLocalTime())); - Member member = memberRepository.save(new Member("member", "email@email.com", "password", Role.MEMBER)); + Member member = memberRepository.save(new Member(null, "member", "email@email.com", "password", Role.MEMBER)); Theme theme = themeRepository.save(new Theme("name", "desc", "thumbnail")); Reservation reservation = reservationRepository.save(new Reservation(date, time, theme, member, ReservationStatus.CONFIRMED)); @@ -75,7 +75,7 @@ class PaymentServiceTest { LocalDateTime localDateTime = LocalDateTime.now().plusHours(1L); LocalDate date = localDateTime.toLocalDate(); ReservationTime time = reservationTimeRepository.save(new ReservationTime(localDateTime.toLocalTime())); - Member member = memberRepository.save(new Member("member", "email@email.com", "password", Role.MEMBER)); + Member member = memberRepository.save(new Member(null, "member", "email@email.com", "password", Role.MEMBER)); Theme theme = themeRepository.save(new Theme("name", "desc", "thumbnail")); Reservation reservation = reservationRepository.save(new Reservation(date, time, theme, member, ReservationStatus.CONFIRMED)); @@ -111,7 +111,7 @@ class PaymentServiceTest { LocalDateTime localDateTime = LocalDateTime.now().plusHours(1L); LocalDate date = localDateTime.toLocalDate(); ReservationTime time = reservationTimeRepository.save(new ReservationTime(localDateTime.toLocalTime())); - Member member = memberRepository.save(new Member("member", "email@email.com", "password", Role.MEMBER)); + Member member = memberRepository.save(new Member(null, "member", "email@email.com", "password", Role.MEMBER)); Theme theme = themeRepository.save(new Theme("name", "desc", "thumbnail")); Reservation reservation = reservationRepository.save(new Reservation(date, time, theme, member, ReservationStatus.CONFIRMED)); diff --git a/src/test/java/roomescape/reservation/controller/ReservationControllerTest.java b/src/test/java/roomescape/reservation/controller/ReservationControllerTest.java index 91baa3d4..8404274c 100644 --- a/src/test/java/roomescape/reservation/controller/ReservationControllerTest.java +++ b/src/test/java/roomescape/reservation/controller/ReservationControllerTest.java @@ -2,6 +2,7 @@ package roomescape.reservation.controller; import static org.assertj.core.api.Assertions.*; import static org.hamcrest.Matchers.*; +import static org.mockito.ArgumentMatchers.*; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.*; @@ -33,8 +34,8 @@ import io.restassured.RestAssured; import io.restassured.http.ContentType; import io.restassured.http.Header; import roomescape.member.infrastructure.entity.Member; -import roomescape.member.infrastructure.entity.Role; import roomescape.member.infrastructure.entity.MemberRepository; +import roomescape.member.infrastructure.entity.Role; import roomescape.payment.client.TossPaymentClient; import roomescape.payment.domain.CanceledPayment; import roomescape.payment.domain.Payment; @@ -123,12 +124,12 @@ public class ReservationControllerTest { @DisplayName("대기중인 예약을 취소한다.") void cancelWaiting() { // given - Member member = memberRepository.save(new Member("name", "email@email.com", "password", Role.MEMBER)); + Member member = memberRepository.save(new Member(null, "name", "email@email.com", "password", Role.MEMBER)); String accessTokenCookie = getAccessTokenCookieByLogin("email@email.com", "password"); ReservationTime reservationTime = reservationTimeRepository.save(new ReservationTime(LocalTime.of(17, 30))); Theme theme = themeRepository.save(new Theme("테마명", "설명", "썸네일URL")); - Member member1 = memberRepository.save(new Member("name1", "email1r@email.com", "password", Role.MEMBER)); + Member member1 = memberRepository.save(new Member(null, "name1", "email1r@email.com", "password", Role.MEMBER)); // when reservationRepository.save(new Reservation(LocalDate.now().plusDays(1), reservationTime, theme, member1, @@ -150,12 +151,14 @@ public class ReservationControllerTest { @DisplayName("회원은 자신이 아닌 다른 회원의 예약을 취소할 수 없다.") void cantCancelOtherMembersWaiting() { // given - Member confirmedMember = memberRepository.save(new Member("name", "email@email.com", "password", Role.MEMBER)); + Member confirmedMember = memberRepository.save( + new Member(null, "name", "email@email.com", "password", Role.MEMBER)); String accessTokenCookie = getAccessTokenCookieByLogin("email@email.com", "password"); ReservationTime reservationTime = reservationTimeRepository.save(new ReservationTime(LocalTime.of(17, 30))); Theme theme = themeRepository.save(new Theme("테마명", "설명", "썸네일URL")); - Member waitingMember = memberRepository.save(new Member("name1", "email1r@email.com", "password", Role.MEMBER)); + Member waitingMember = memberRepository.save( + new Member(null, "name1", "email1r@email.com", "password", Role.MEMBER)); // when reservationRepository.save(new Reservation(LocalDate.now().plusDays(1), reservationTime, theme, confirmedMember, @@ -181,7 +184,7 @@ public class ReservationControllerTest { ReservationTime reservationTime = reservationTimeRepository.save(new ReservationTime(LocalTime.of(17, 30))); Theme theme = themeRepository.save(new Theme("테마명", "설명", "썸네일URL")); - Member member = memberRepository.save(new Member("name", "email@email.com", "password", Role.MEMBER)); + Member member = memberRepository.save(new Member(null, "name", "email@email.com", "password", Role.MEMBER)); // when reservationRepository.save( @@ -205,7 +208,7 @@ public class ReservationControllerTest { @DisplayName("예약 취소는 관리자만 할 수 있다.") void canRemoveMyReservation() { // given - Member member = memberRepository.save(new Member("name", "email@email.com", "password", Role.MEMBER)); + Member member = memberRepository.save(new Member(null, "name", "email@email.com", "password", Role.MEMBER)); String accessTokenCookie = getAccessTokenCookieByLogin(member.getEmail(), member.getPassword()); ReservationTime reservationTime = reservationTimeRepository.save(new ReservationTime(LocalTime.of(17, 30))); @@ -230,8 +233,10 @@ public class ReservationControllerTest { ReservationTime reservationTime = reservationTimeRepository.save(new ReservationTime(LocalTime.of(17, 30))); Theme theme = themeRepository.save(new Theme("테마명", "설명", "썸네일URL")); - Member confirmedMember = memberRepository.save(new Member("name1", "email@email.com", "password", Role.MEMBER)); - Member waitingMember = memberRepository.save(new Member("name1", "email1@email.com", "password", Role.MEMBER)); + Member confirmedMember = memberRepository.save( + new Member(null, "name1", "email@email.com", "password", Role.MEMBER)); + Member waitingMember = memberRepository.save( + new Member(null, "name1", "email1@email.com", "password", Role.MEMBER)); reservationRepository.save( new Reservation(LocalDate.now(), reservationTime, theme, confirmedMember, ReservationStatus.CONFIRMED)); @@ -251,12 +256,13 @@ public class ReservationControllerTest { @DisplayName("본인의 예약이 아니더라도 관리자 권한이 있으면 예약 정보를 삭제할 수 있다.") void readReservationsSizeAfterPostAndDelete() { // given - Member member = memberRepository.save(new Member("name", "admin@admin.com", "password", Role.ADMIN)); + Member member = memberRepository.save(new Member(null, "name", "admin@admin.com", "password", Role.ADMIN)); String accessTokenCookie = getAccessTokenCookieByLogin(member.getEmail(), member.getPassword()); ReservationTime reservationTime = reservationTimeRepository.save(new ReservationTime(LocalTime.of(17, 30))); Theme theme = themeRepository.save(new Theme("테마명", "설명", "썸네일URL")); - Member anotherMember = memberRepository.save(new Member("name", "email@email.com", "password", Role.MEMBER)); + Member anotherMember = memberRepository.save( + new Member(null, "name", "email@email.com", "password", Role.MEMBER)); Reservation reservation = reservationRepository.save( new Reservation(LocalDate.now(), reservationTime, theme, anotherMember, ReservationStatus.CONFIRMED)); @@ -340,7 +346,7 @@ public class ReservationControllerTest { ReservationTime time1 = reservationTimeRepository.save(new ReservationTime(LocalTime.of(18, 30))); ReservationTime time2 = reservationTimeRepository.save(new ReservationTime(LocalTime.of(19, 30))); - Member member = memberRepository.save(new Member("name", "email@email.com", "password", Role.ADMIN)); + Member member = memberRepository.save(new Member(null, "name", "email@email.com", "password", Role.ADMIN)); String accessToken = getAccessTokenCookieByLogin("email@email.com", "password"); // when : 예약은 2개, 예약 대기는 1개 조회되어야 한다. @@ -370,7 +376,7 @@ public class ReservationControllerTest { // when Reservation saved = reservationRepository.save(new Reservation(date, time, theme, - memberRepository.save(new Member("name", "email@email.com", "password", Role.MEMBER)), + memberRepository.save(new Member(null, "name", "email@email.com", "password", Role.MEMBER)), ReservationStatus.CONFIRMED_PAYMENT_REQUIRED)); // then @@ -390,7 +396,7 @@ public class ReservationControllerTest { LocalDate date = LocalDate.now().plusDays(1); Theme theme = themeRepository.save(new Theme("테마명", "설명", "썸네일URL")); ReservationTime time = reservationTimeRepository.save(new ReservationTime(LocalTime.of(17, 30))); - Member member = memberRepository.save(new Member("name", "email@email.com", "password", Role.MEMBER)); + Member member = memberRepository.save(new Member(null, "name", "email@email.com", "password", Role.MEMBER)); Reservation saved = reservationRepository.save( new Reservation(date, time, theme, member, ReservationStatus.CONFIRMED)); @@ -420,7 +426,7 @@ public class ReservationControllerTest { LocalDate date = localDateTime.toLocalDate(); ReservationTime time = reservationTimeRepository.save(new ReservationTime(localDateTime.toLocalTime())); Theme theme = themeRepository.save(new Theme("테마명", "설명", "썸네일URL")); - Member member = memberRepository.save(new Member("name", "email@email.com", "password", Role.MEMBER)); + Member member = memberRepository.save(new Member(null, "name", "email@email.com", "password", Role.MEMBER)); String accessToken = getAccessTokenCookieByLogin(member.getEmail(), member.getPassword()); // when : 이전 날짜의 예약을 추가하여 결제 승인 이후 DB 저장 과정에서 예외를 발생시킨다. @@ -513,8 +519,8 @@ public class ReservationControllerTest { LocalDate date = localDateTime.toLocalDate(); ReservationTime time = reservationTimeRepository.save(new ReservationTime(localDateTime.toLocalTime())); Theme theme = themeRepository.save(new Theme("테마명", "설명", "썸네일URL")); - Member member = memberRepository.save(new Member("name", "email@email.com", "password", Role.MEMBER)); - Member member1 = memberRepository.save(new Member("name1", "email1@email.com", "password", Role.MEMBER)); + Member member = memberRepository.save(new Member(null, "name", "email@email.com", "password", Role.MEMBER)); + Member member1 = memberRepository.save(new Member(null, "name1", "email1@email.com", "password", Role.MEMBER)); String accessToken = getAccessTokenCookieByLogin(member.getEmail(), member.getPassword()); reservationRepository.save(new Reservation(date, time, theme, member1, ReservationStatus.CONFIRMED)); @@ -539,7 +545,7 @@ public class ReservationControllerTest { LocalDate date = localDateTime.toLocalDate(); ReservationTime time = reservationTimeRepository.save(new ReservationTime(localDateTime.toLocalTime())); Theme theme = themeRepository.save(new Theme("테마명", "설명", "썸네일URL")); - Member member = memberRepository.save(new Member("name", "email@email.com", "password", Role.MEMBER)); + Member member = memberRepository.save(new Member(null, "name", "email@email.com", "password", Role.MEMBER)); String accessToken = getAdminAccessTokenCookieByLogin("admin@email.com", "password"); Reservation waiting = reservationRepository.save( @@ -584,7 +590,7 @@ public class ReservationControllerTest { LocalDate date = localDateTime.toLocalDate(); ReservationTime time = reservationTimeRepository.save(new ReservationTime(localDateTime.toLocalTime())); Theme theme = themeRepository.save(new Theme("테마명", "설명", "썸네일URL")); - Member member = memberRepository.save(new Member("name", "email@email.com", "password", Role.MEMBER)); + Member member = memberRepository.save(new Member(null, "name", "email@email.com", "password", Role.MEMBER)); String adminAccessToken = getAdminAccessTokenCookieByLogin("admin@email.com", "password"); @@ -600,7 +606,7 @@ public class ReservationControllerTest { } private String getAdminAccessTokenCookieByLogin(final String email, final String password) { - memberRepository.save(new Member("이름", email, password, Role.ADMIN)); + memberRepository.save(new Member(null, "이름", email, password, Role.ADMIN)); Map loginParams = Map.of( "email", email, diff --git a/src/test/java/roomescape/reservation/controller/ReservationTimeControllerTest.java b/src/test/java/roomescape/reservation/controller/ReservationTimeControllerTest.java index f74f25a1..f7381e83 100644 --- a/src/test/java/roomescape/reservation/controller/ReservationTimeControllerTest.java +++ b/src/test/java/roomescape/reservation/controller/ReservationTimeControllerTest.java @@ -22,8 +22,8 @@ import io.restassured.RestAssured; import io.restassured.http.ContentType; import io.restassured.http.Header; import roomescape.member.infrastructure.entity.Member; -import roomescape.member.infrastructure.entity.Role; import roomescape.member.infrastructure.entity.MemberRepository; +import roomescape.member.infrastructure.entity.Role; import roomescape.reservation.domain.Reservation; import roomescape.reservation.domain.ReservationStatus; import roomescape.reservation.domain.ReservationTime; @@ -199,7 +199,7 @@ public class ReservationTimeControllerTest { } private String getAdminAccessTokenCookieByLogin(String email, String password) { - memberRepository.save(new Member("이름", email, password, Role.ADMIN)); + memberRepository.save(new Member(null, "이름", email, password, Role.ADMIN)); Map loginParams = Map.of( "email", email, @@ -225,7 +225,7 @@ public class ReservationTimeControllerTest { ReservationTime reservationTime2 = reservationTimeRepository.save(new ReservationTime(LocalTime.of(17, 30))); ReservationTime reservationTime3 = reservationTimeRepository.save(new ReservationTime(LocalTime.of(18, 30))); Theme theme = themeRepository.save(new Theme("테마명1", "설명", "썸네일URL")); - Member member = memberRepository.save(new Member("name", "email@email.com", "password", Role.MEMBER)); + Member member = memberRepository.save(new Member(null, "name", "email@email.com", "password", Role.MEMBER)); reservationRepository.save( new Reservation(today.plusDays(1), reservationTime1, theme, member, ReservationStatus.CONFIRMED)); diff --git a/src/test/java/roomescape/reservation/domain/ReservationTest.java b/src/test/java/roomescape/reservation/domain/ReservationTest.java index e66b99e1..8f9a9da1 100644 --- a/src/test/java/roomescape/reservation/domain/ReservationTest.java +++ b/src/test/java/roomescape/reservation/domain/ReservationTest.java @@ -34,17 +34,17 @@ public class ReservationTest { Arguments.of(null, new ReservationTime(LocalTime.now().plusHours(1)), new Theme("테마명", "설명", "썸네일URI"), - new Member("name", "email@email.com", "password", Role.MEMBER)), + new Member(null, "name", "email@email.com", "password", Role.MEMBER)), Arguments.of( LocalDate.now(), null, new Theme("테마명", "설명", "썸네일URI"), - new Member("name", "email@email.com", "password", Role.MEMBER)), + new Member(null, "name", "email@email.com", "password", Role.MEMBER)), Arguments.of( LocalDate.now(), new ReservationTime(LocalTime.now().plusHours(1)), null, - new Member("name", "email@email.com", "password", Role.MEMBER)), + new Member(null, "name", "email@email.com", "password", Role.MEMBER)), Arguments.of( LocalDate.now(), new ReservationTime(LocalTime.now().plusHours(1)), diff --git a/src/test/java/roomescape/reservation/domain/repository/ReservationSearchSpecificationTest.java b/src/test/java/roomescape/reservation/domain/repository/ReservationSearchSpecificationTest.java index f92a4ae6..dd672197 100644 --- a/src/test/java/roomescape/reservation/domain/repository/ReservationSearchSpecificationTest.java +++ b/src/test/java/roomescape/reservation/domain/repository/ReservationSearchSpecificationTest.java @@ -14,8 +14,8 @@ import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.data.jpa.domain.Specification; import roomescape.member.infrastructure.entity.Member; -import roomescape.member.infrastructure.entity.Role; import roomescape.member.infrastructure.entity.MemberRepository; +import roomescape.member.infrastructure.entity.Role; import roomescape.reservation.domain.Reservation; import roomescape.reservation.domain.ReservationStatus; import roomescape.reservation.domain.ReservationTime; @@ -50,7 +50,7 @@ class ReservationSearchSpecificationTest { @BeforeEach void setUp() { LocalDateTime dateTime = LocalDateTime.now(); - Member member = memberRepository.save(new Member("name", "email@email.com", "password", Role.MEMBER)); + Member member = memberRepository.save(new Member(null, "name", "email@email.com", "password", Role.MEMBER)); ReservationTime time = timeRepository.save(new ReservationTime(dateTime.toLocalTime())); Theme theme = themeRepository.save(new Theme("name", "description", "thumbnail")); diff --git a/src/test/java/roomescape/reservation/service/ReservationServiceTest.java b/src/test/java/roomescape/reservation/service/ReservationServiceTest.java index d29fa51c..b7bc072f 100644 --- a/src/test/java/roomescape/reservation/service/ReservationServiceTest.java +++ b/src/test/java/roomescape/reservation/service/ReservationServiceTest.java @@ -14,10 +14,10 @@ import org.springframework.context.annotation.Import; import org.springframework.test.context.jdbc.Sql; import org.springframework.test.context.jdbc.Sql.ExecutionPhase; -import roomescape.member.infrastructure.entity.Member; -import roomescape.member.infrastructure.entity.Role; -import roomescape.member.infrastructure.entity.MemberRepository; import roomescape.member.business.MemberService; +import roomescape.member.infrastructure.entity.Member; +import roomescape.member.infrastructure.entity.MemberRepository; +import roomescape.member.infrastructure.entity.Role; import roomescape.reservation.domain.Reservation; import roomescape.reservation.domain.ReservationStatus; import roomescape.reservation.domain.ReservationTime; @@ -53,8 +53,8 @@ class ReservationServiceTest { // given ReservationTime reservationTime = reservationTimeRepository.save(new ReservationTime(LocalTime.of(12, 30))); Theme theme = themeRepository.save(new Theme("테마명", "설명", "썸네일URL")); - Member member1 = memberRepository.save(new Member("name", "email@email.com", "password", Role.MEMBER)); - Member member2 = memberRepository.save(new Member("name2", "email2@email.com", "password", Role.MEMBER)); + Member member1 = memberRepository.save(new Member(null, "name", "email@email.com", "password", Role.MEMBER)); + Member member2 = memberRepository.save(new Member(null, "name2", "email2@email.com", "password", Role.MEMBER)); LocalDate date = LocalDate.now().plusDays(1L); // when @@ -75,7 +75,7 @@ class ReservationServiceTest { // given ReservationTime reservationTime = reservationTimeRepository.save(new ReservationTime(LocalTime.of(12, 30))); Theme theme = themeRepository.save(new Theme("테마명", "설명", "썸네일URL")); - Member member = memberRepository.save(new Member("name", "email@email.com", "password", Role.MEMBER)); + Member member = memberRepository.save(new Member(null, "name", "email@email.com", "password", Role.MEMBER)); LocalDate date = LocalDate.now().plusDays(1L); // when @@ -95,8 +95,8 @@ class ReservationServiceTest { // given ReservationTime reservationTime = reservationTimeRepository.save(new ReservationTime(LocalTime.of(12, 30))); Theme theme = themeRepository.save(new Theme("테마명", "설명", "썸네일URL")); - Member member = memberRepository.save(new Member("name", "email@email.com", "password", Role.MEMBER)); - Member member1 = memberRepository.save(new Member("name1", "email1@email.com", "password", Role.MEMBER)); + Member member = memberRepository.save(new Member(null, "name", "email@email.com", "password", Role.MEMBER)); + Member member1 = memberRepository.save(new Member(null, "name1", "email1@email.com", "password", Role.MEMBER)); LocalDate date = LocalDate.now().plusDays(1L); // when @@ -119,7 +119,7 @@ class ReservationServiceTest { // given ReservationTime reservationTime = reservationTimeRepository.save(new ReservationTime(LocalTime.of(12, 30))); Theme theme = themeRepository.save(new Theme("테마명", "설명", "썸네일URL")); - Member member = memberRepository.save(new Member("name", "email@email.com", "password", Role.MEMBER)); + Member member = memberRepository.save(new Member(null, "name", "email@email.com", "password", Role.MEMBER)); LocalDate beforeDate = LocalDate.now().minusDays(1L); // when & then @@ -136,7 +136,7 @@ class ReservationServiceTest { LocalDateTime beforeTime = LocalDateTime.now().minusHours(1L).withNano(0); ReservationTime reservationTime = reservationTimeRepository.save(new ReservationTime(beforeTime.toLocalTime())); Theme theme = themeRepository.save(new Theme("테마명", "설명", "썸네일URL")); - Member member = memberRepository.save(new Member("name", "email@email.com", "password", Role.MEMBER)); + Member member = memberRepository.save(new Member(null, "name", "email@email.com", "password", Role.MEMBER)); // when & then assertThatThrownBy(() -> reservationService.addReservation( @@ -180,9 +180,9 @@ class ReservationServiceTest { // given ReservationTime reservationTime = reservationTimeRepository.save(new ReservationTime(LocalTime.of(12, 30))); Theme theme = themeRepository.save(new Theme("테마명", "설명", "썸네일URL")); - Member admin = memberRepository.save(new Member("admin", "admin@email.com", "password", Role.ADMIN)); - Member member = memberRepository.save(new Member("name", "email@email.com", "password", Role.MEMBER)); - Member member1 = memberRepository.save(new Member("name1", "email1@email.com", "password", Role.MEMBER)); + Member admin = memberRepository.save(new Member(null, "admin", "admin@email.com", "password", Role.ADMIN)); + Member member = memberRepository.save(new Member(null, "name", "email@email.com", "password", Role.MEMBER)); + Member member1 = memberRepository.save(new Member(null, "name1", "email1@email.com", "password", Role.MEMBER)); reservationService.addReservation( new ReservationRequest(LocalDate.now().plusDays(1L), reservationTime.getId(), theme.getId(), @@ -203,8 +203,8 @@ class ReservationServiceTest { // given ReservationTime reservationTime = reservationTimeRepository.save(new ReservationTime(LocalTime.of(12, 30))); Theme theme = themeRepository.save(new Theme("테마명", "설명", "썸네일URL")); - Member admin = memberRepository.save(new Member("admin", "admin@email.com", "password", Role.ADMIN)); - Member member = memberRepository.save(new Member("name", "email@email.com", "password", Role.MEMBER)); + Member admin = memberRepository.save(new Member(null, "admin", "admin@email.com", "password", Role.ADMIN)); + Member member = memberRepository.save(new Member(null, "name", "email@email.com", "password", Role.MEMBER)); // when ReservationResponse waiting = reservationService.addWaiting( diff --git a/src/test/java/roomescape/reservation/service/ReservationTimeServiceTest.java b/src/test/java/roomescape/reservation/service/ReservationTimeServiceTest.java index 135c550c..8788a072 100644 --- a/src/test/java/roomescape/reservation/service/ReservationTimeServiceTest.java +++ b/src/test/java/roomescape/reservation/service/ReservationTimeServiceTest.java @@ -14,8 +14,8 @@ import org.springframework.test.context.jdbc.Sql; import org.springframework.test.context.jdbc.Sql.ExecutionPhase; import roomescape.member.infrastructure.entity.Member; -import roomescape.member.infrastructure.entity.Role; import roomescape.member.infrastructure.entity.MemberRepository; +import roomescape.member.infrastructure.entity.Role; import roomescape.reservation.domain.Reservation; import roomescape.reservation.domain.ReservationStatus; import roomescape.reservation.domain.ReservationTime; @@ -75,7 +75,7 @@ class ReservationTimeServiceTest { ReservationTime reservationTime = reservationTimeRepository.save( new ReservationTime(localDateTime.toLocalTime())); Theme theme = themeRepository.save(new Theme("테마명", "설명", "썸네일URL")); - Member member = memberRepository.save(new Member("name", "email@email.com", "password", Role.MEMBER)); + Member member = memberRepository.save(new Member(null, "name", "email@email.com", "password", Role.MEMBER)); // when reservationRepository.save(new Reservation(localDateTime.toLocalDate(), reservationTime, theme, member, diff --git a/src/test/java/roomescape/reservation/service/ReservationWithPaymentServiceTest.java b/src/test/java/roomescape/reservation/service/ReservationWithPaymentServiceTest.java index 863d01c0..32077e16 100644 --- a/src/test/java/roomescape/reservation/service/ReservationWithPaymentServiceTest.java +++ b/src/test/java/roomescape/reservation/service/ReservationWithPaymentServiceTest.java @@ -14,8 +14,8 @@ import org.springframework.test.context.jdbc.Sql; import org.springframework.test.context.jdbc.Sql.ExecutionPhase; import roomescape.member.infrastructure.entity.Member; -import roomescape.member.infrastructure.entity.Role; import roomescape.member.infrastructure.entity.MemberRepository; +import roomescape.member.infrastructure.entity.Role; import roomescape.payment.domain.repository.CanceledPaymentRepository; import roomescape.payment.domain.repository.PaymentRepository; import roomescape.payment.dto.request.PaymentCancelRequest; @@ -57,7 +57,7 @@ class ReservationWithPaymentServiceTest { LocalDateTime localDateTime = LocalDateTime.now().plusDays(1L).withNano(0); LocalDate date = localDateTime.toLocalDate(); ReservationTime time = reservationTimeRepository.save(new ReservationTime(localDateTime.toLocalTime())); - Member member = memberRepository.save(new Member("member", "email@email.com", "password", Role.MEMBER)); + Member member = memberRepository.save(new Member(null, "member", "email@email.com", "password", Role.MEMBER)); Theme theme = themeRepository.save(new Theme("name", "desc", "thumbnail")); ReservationRequest reservationRequest = new ReservationRequest(date, time.getId(), theme.getId(), "payment-key", "order-id", 10000L, "NORMAL"); @@ -92,7 +92,7 @@ class ReservationWithPaymentServiceTest { LocalDateTime localDateTime = LocalDateTime.now().plusDays(1L).withNano(0); LocalDate date = localDateTime.toLocalDate(); ReservationTime time = reservationTimeRepository.save(new ReservationTime(localDateTime.toLocalTime())); - Member member = memberRepository.save(new Member("member", "admin@email.com", "password", Role.ADMIN)); + Member member = memberRepository.save(new Member(null, "member", "admin@email.com", "password", Role.ADMIN)); Theme theme = themeRepository.save(new Theme("name", "desc", "thumbnail")); ReservationRequest reservationRequest = new ReservationRequest(date, time.getId(), theme.getId(), "payment-key", "order-id", 10000L, "NORMAL"); @@ -119,7 +119,7 @@ class ReservationWithPaymentServiceTest { LocalDateTime localDateTime = LocalDateTime.now().plusHours(1L); LocalDate date = localDateTime.toLocalDate(); ReservationTime time = reservationTimeRepository.save(new ReservationTime(localDateTime.toLocalTime())); - Member member = memberRepository.save(new Member("member", "admin@email.com", "password", Role.ADMIN)); + Member member = memberRepository.save(new Member(null, "member", "admin@email.com", "password", Role.ADMIN)); Theme theme = themeRepository.save(new Theme("name", "desc", "thumbnail")); Reservation saved = reservationRepository.save( @@ -140,7 +140,7 @@ class ReservationWithPaymentServiceTest { LocalDateTime localDateTime = LocalDateTime.now().plusDays(1L).withNano(0); LocalDate date = localDateTime.toLocalDate(); ReservationTime time = reservationTimeRepository.save(new ReservationTime(localDateTime.toLocalTime())); - Member member = memberRepository.save(new Member("member", "admin@email.com", "password", Role.ADMIN)); + Member member = memberRepository.save(new Member(null, "member", "admin@email.com", "password", Role.ADMIN)); Theme theme = themeRepository.save(new Theme("name", "desc", "thumbnail")); ReservationRequest reservationRequest = new ReservationRequest(date, time.getId(), theme.getId(), "payment-key", "order-id", 10000L, "NORMAL"); diff --git a/src/test/java/roomescape/system/auth/controller/AuthControllerTest.java b/src/test/java/roomescape/system/auth/controller/AuthControllerTest.java index 34e3d1c7..2fbcf1c3 100644 --- a/src/test/java/roomescape/system/auth/controller/AuthControllerTest.java +++ b/src/test/java/roomescape/system/auth/controller/AuthControllerTest.java @@ -15,8 +15,8 @@ import org.springframework.test.context.jdbc.Sql; import io.restassured.RestAssured; import io.restassured.http.ContentType; import roomescape.member.infrastructure.entity.Member; -import roomescape.member.infrastructure.entity.Role; import roomescape.member.infrastructure.entity.MemberRepository; +import roomescape.member.infrastructure.entity.Role; @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) @Sql(scripts = "/truncate.sql", executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD) @@ -34,7 +34,7 @@ class AuthControllerTest { // given String email = "test@email.com"; String password = "12341234"; - memberRepository.save(new Member("이름", email, password, Role.MEMBER)); + memberRepository.save(new Member(null, "이름", email, password, Role.MEMBER)); Map loginParams = Map.of( "email", email, @@ -99,7 +99,7 @@ class AuthControllerTest { } private String getAccessTokenCookieByLogin(final String email, final String password) { - memberRepository.save(new Member("이름", email, password, Role.ADMIN)); + memberRepository.save(new Member(null, "이름", email, password, Role.ADMIN)); Map loginParams = Map.of( "email", email, diff --git a/src/test/java/roomescape/system/auth/service/AuthServiceTest.java b/src/test/java/roomescape/system/auth/service/AuthServiceTest.java index 2aace90e..26bd6783 100644 --- a/src/test/java/roomescape/system/auth/service/AuthServiceTest.java +++ b/src/test/java/roomescape/system/auth/service/AuthServiceTest.java @@ -9,10 +9,10 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.Import; -import roomescape.member.infrastructure.entity.Member; -import roomescape.member.infrastructure.entity.Role; -import roomescape.member.infrastructure.entity.MemberRepository; import roomescape.member.business.MemberService; +import roomescape.member.infrastructure.entity.Member; +import roomescape.member.infrastructure.entity.MemberRepository; +import roomescape.member.infrastructure.entity.Role; import roomescape.system.auth.dto.LoginRequest; import roomescape.system.auth.jwt.JwtHandler; import roomescape.system.auth.jwt.dto.TokenDto; @@ -31,7 +31,7 @@ class AuthServiceTest { @DisplayName("로그인 성공시 JWT accessToken 을 반환한다.") void loginSuccess() { // given - Member member = memberRepository.save(new Member("이름", "test@test.com", "12341234", Role.MEMBER)); + Member member = memberRepository.save(new Member(null, "이름", "test@test.com", "12341234", Role.MEMBER)); // when TokenDto response = authService.login(new LoginRequest(member.getEmail(), member.getPassword())); diff --git a/src/test/java/roomescape/theme/controller/ThemeControllerTest.java b/src/test/java/roomescape/theme/controller/ThemeControllerTest.java index 5b373a0c..354d9be8 100644 --- a/src/test/java/roomescape/theme/controller/ThemeControllerTest.java +++ b/src/test/java/roomescape/theme/controller/ThemeControllerTest.java @@ -19,8 +19,8 @@ import io.restassured.RestAssured; import io.restassured.http.ContentType; import io.restassured.http.Header; import roomescape.member.infrastructure.entity.Member; -import roomescape.member.infrastructure.entity.Role; import roomescape.member.infrastructure.entity.MemberRepository; +import roomescape.member.infrastructure.entity.Role; @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) @Sql(scripts = "/truncate.sql", executionPhase = ExecutionPhase.BEFORE_TEST_METHOD) @@ -165,7 +165,7 @@ class ThemeControllerTest { } private String getAdminAccessTokenCookieByLogin(final String email, final String password) { - memberRepository.save(new Member("이름", email, password, Role.ADMIN)); + memberRepository.save(new Member(null, "이름", email, password, Role.ADMIN)); Map loginParams = Map.of( "email", email, diff --git a/src/test/java/roomescape/theme/service/ThemeServiceTest.java b/src/test/java/roomescape/theme/service/ThemeServiceTest.java index d40970b8..8f31529a 100644 --- a/src/test/java/roomescape/theme/service/ThemeServiceTest.java +++ b/src/test/java/roomescape/theme/service/ThemeServiceTest.java @@ -13,10 +13,10 @@ import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.context.annotation.Import; import org.springframework.test.context.jdbc.Sql; -import roomescape.member.infrastructure.entity.Member; -import roomescape.member.infrastructure.entity.Role; -import roomescape.member.infrastructure.entity.MemberRepository; import roomescape.member.business.MemberService; +import roomescape.member.infrastructure.entity.Member; +import roomescape.member.infrastructure.entity.MemberRepository; +import roomescape.member.infrastructure.entity.Role; import roomescape.reservation.dto.request.ReservationRequest; import roomescape.reservation.dto.request.ReservationTimeRequest; import roomescape.reservation.dto.response.ReservationTimeResponse; @@ -152,7 +152,7 @@ class ThemeServiceTest { ReservationTimeResponse time = reservationTimeService.addTime( new ReservationTimeRequest(dateTime.toLocalTime())); Theme theme = themeRepository.save(new Theme("name", "description", "thumbnail")); - Member member = memberRepository.save(new Member("member", "password", "name", Role.MEMBER)); + Member member = memberRepository.save(new Member(null, "member", "password", "name", Role.MEMBER)); reservationService.addReservation( new ReservationRequest(dateTime.toLocalDate(), time.id(), theme.getId(), "paymentKey", "orderId", 1000L, "NORMAL"), member.getId()); -- 2.47.2 From 6954baf95f57505c2b79e17a77597195a6839d74 Mon Sep 17 00:00:00 2001 From: pricelees Date: Sat, 12 Jul 2025 19:55:44 +0900 Subject: [PATCH 07/37] Rename .java to .kt --- .../member/business/{MemberService.java => MemberService.kt} | 0 .../entity/{MemberRepository.java => MemberRepository.kt} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename src/main/java/roomescape/member/business/{MemberService.java => MemberService.kt} (100%) rename src/main/java/roomescape/member/infrastructure/entity/{MemberRepository.java => MemberRepository.kt} (100%) diff --git a/src/main/java/roomescape/member/business/MemberService.java b/src/main/java/roomescape/member/business/MemberService.kt similarity index 100% rename from src/main/java/roomescape/member/business/MemberService.java rename to src/main/java/roomescape/member/business/MemberService.kt diff --git a/src/main/java/roomescape/member/infrastructure/entity/MemberRepository.java b/src/main/java/roomescape/member/infrastructure/entity/MemberRepository.kt similarity index 100% rename from src/main/java/roomescape/member/infrastructure/entity/MemberRepository.java rename to src/main/java/roomescape/member/infrastructure/entity/MemberRepository.kt -- 2.47.2 From 65eddf6b3cef9b9676d4956b2880d5b2bea3fbf8 Mon Sep 17 00:00:00 2001 From: pricelees Date: Sat, 12 Jul 2025 19:55:44 +0900 Subject: [PATCH 08/37] =?UTF-8?q?refactor:=20=ED=9A=8C=EC=9B=90=20reposito?= =?UTF-8?q?ry=20&=20service=20=EC=BD=94=ED=8B=80=EB=A6=B0=20=EB=B3=80?= =?UTF-8?q?=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../member/business/MemberService.kt | 75 +++++++++---------- .../infrastructure/entity/MemberRepository.kt | 11 +-- .../service/ReservationService.java | 6 +- .../auth/interceptor/AdminInterceptor.java | 4 +- .../auth/interceptor/LoginInterceptor.java | 4 +- .../system/auth/service/AuthService.java | 4 +- 6 files changed, 47 insertions(+), 57 deletions(-) diff --git a/src/main/java/roomescape/member/business/MemberService.kt b/src/main/java/roomescape/member/business/MemberService.kt index b531a0fc..2949740c 100644 --- a/src/main/java/roomescape/member/business/MemberService.kt +++ b/src/main/java/roomescape/member/business/MemberService.kt @@ -1,47 +1,40 @@ -package roomescape.member.business; +package roomescape.member.business -import java.util.List; - -import org.springframework.http.HttpStatus; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import roomescape.member.infrastructure.entity.Member; -import roomescape.member.infrastructure.entity.MemberRepository; -import roomescape.member.web.MemberResponse; -import roomescape.member.web.MembersResponse; -import roomescape.system.exception.ErrorType; -import roomescape.system.exception.RoomEscapeException; +import org.springframework.data.repository.findByIdOrNull +import org.springframework.http.HttpStatus +import org.springframework.stereotype.Service +import org.springframework.transaction.annotation.Transactional +import roomescape.member.infrastructure.entity.Member +import roomescape.member.infrastructure.entity.MemberRepository +import roomescape.member.web.MembersResponse +import roomescape.member.web.toResponse +import roomescape.system.exception.ErrorType +import roomescape.system.exception.RoomEscapeException @Service -public class MemberService { +@Transactional(readOnly = true) +class MemberService( + private val memberRepository: MemberRepository +) { + fun readAllMembers(): MembersResponse = MembersResponse( + memberRepository.findAll() + .map { it.toResponse() } + .toList() + ) - private final MemberRepository memberRepository; + fun findById(memberId: Long): Member = memberRepository.findByIdOrNull(memberId) + ?: throw RoomEscapeException( + ErrorType.MEMBER_NOT_FOUND, + String.format("[memberId: %d]", memberId), + HttpStatus.BAD_REQUEST + ) - public MemberService(MemberRepository memberRepository) { - this.memberRepository = memberRepository; - } - - @Transactional(readOnly = true) - public MembersResponse findAllMembers() { - List response = memberRepository.findAll().stream() - .map(MemberResponse::fromEntity) - .toList(); - - return new MembersResponse(response); - } - - @Transactional(readOnly = true) - public Member findMemberById(Long memberId) { - return memberRepository.findById(memberId) - .orElseThrow(() -> new RoomEscapeException(ErrorType.MEMBER_NOT_FOUND, - String.format("[memberId: %d]", memberId), HttpStatus.BAD_REQUEST)); - } - - @Transactional(readOnly = true) - public Member findMemberByEmailAndPassword(String email, String password) { - return memberRepository.findByEmailAndPassword(email, password) - .orElseThrow(() -> new RoomEscapeException(ErrorType.MEMBER_NOT_FOUND, - String.format("[email: %s, password: %s]", email, password), HttpStatus.BAD_REQUEST)); - } + fun findMemberByEmailAndPassword(email: String, password: String): Member = + memberRepository.findByEmailAndPassword(email, password) + ?: throw RoomEscapeException( + ErrorType.MEMBER_NOT_FOUND, + String.format("[email: %s, password: %s]", email, password), + HttpStatus.BAD_REQUEST + ) } + diff --git a/src/main/java/roomescape/member/infrastructure/entity/MemberRepository.kt b/src/main/java/roomescape/member/infrastructure/entity/MemberRepository.kt index 8c35fb30..a681120a 100644 --- a/src/main/java/roomescape/member/infrastructure/entity/MemberRepository.kt +++ b/src/main/java/roomescape/member/infrastructure/entity/MemberRepository.kt @@ -1,10 +1,7 @@ -package roomescape.member.infrastructure.entity; +package roomescape.member.infrastructure.entity -import java.util.Optional; +import org.springframework.data.jpa.repository.JpaRepository -import org.springframework.data.jpa.repository.JpaRepository; - -public interface MemberRepository extends JpaRepository { - - Optional findByEmailAndPassword(String email, String password); +interface MemberRepository : JpaRepository { + fun findByEmailAndPassword(email: String, password: String): Member? } diff --git a/src/main/java/roomescape/reservation/service/ReservationService.java b/src/main/java/roomescape/reservation/service/ReservationService.java index b82d42eb..9304e8fe 100644 --- a/src/main/java/roomescape/reservation/service/ReservationService.java +++ b/src/main/java/roomescape/reservation/service/ReservationService.java @@ -9,8 +9,8 @@ import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import roomescape.member.infrastructure.entity.Member; import roomescape.member.business.MemberService; +import roomescape.member.infrastructure.entity.Member; import roomescape.reservation.domain.Reservation; import roomescape.reservation.domain.ReservationStatus; import roomescape.reservation.domain.ReservationTime; @@ -147,7 +147,7 @@ public class ReservationService { ReservationStatus status) { ReservationTime time = reservationTimeService.findTimeById(timeId); Theme theme = themeService.findThemeById(themeId); - Member member = memberService.findMemberById(memberId); + Member member = memberService.findById(memberId); validateDateAndTime(date, time); return new Reservation(date, time, theme, member, status); @@ -213,7 +213,7 @@ public class ReservationService { } private void validateIsMemberAdmin(Long memberId) { - Member member = memberService.findMemberById(memberId); + Member member = memberService.findById(memberId); if (member.isAdmin()) { return; } diff --git a/src/main/java/roomescape/system/auth/interceptor/AdminInterceptor.java b/src/main/java/roomescape/system/auth/interceptor/AdminInterceptor.java index 1e372aad..0788419d 100644 --- a/src/main/java/roomescape/system/auth/interceptor/AdminInterceptor.java +++ b/src/main/java/roomescape/system/auth/interceptor/AdminInterceptor.java @@ -10,8 +10,8 @@ import org.springframework.web.servlet.HandlerInterceptor; import jakarta.servlet.http.Cookie; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; -import roomescape.member.infrastructure.entity.Member; import roomescape.member.business.MemberService; +import roomescape.member.infrastructure.entity.Member; import roomescape.system.auth.annotation.Admin; import roomescape.system.auth.jwt.JwtHandler; import roomescape.system.exception.ErrorType; @@ -44,7 +44,7 @@ public class AdminInterceptor implements HandlerInterceptor { try { Cookie token = getToken(request); Long memberId = jwtHandler.getMemberIdFromToken(token.getValue()); - member = memberService.findMemberById(memberId); + member = memberService.findById(memberId); } catch (RoomEscapeException e) { response.sendRedirect("/login"); throw e; diff --git a/src/main/java/roomescape/system/auth/interceptor/LoginInterceptor.java b/src/main/java/roomescape/system/auth/interceptor/LoginInterceptor.java index c82343eb..6522fb0a 100644 --- a/src/main/java/roomescape/system/auth/interceptor/LoginInterceptor.java +++ b/src/main/java/roomescape/system/auth/interceptor/LoginInterceptor.java @@ -10,8 +10,8 @@ import org.springframework.web.servlet.HandlerInterceptor; import jakarta.servlet.http.Cookie; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; -import roomescape.member.infrastructure.entity.Member; import roomescape.member.business.MemberService; +import roomescape.member.infrastructure.entity.Member; import roomescape.system.auth.annotation.LoginRequired; import roomescape.system.auth.jwt.JwtHandler; import roomescape.system.exception.ErrorType; @@ -44,7 +44,7 @@ public class LoginInterceptor implements HandlerInterceptor { try { Cookie token = getToken(request); Long memberId = jwtHandler.getMemberIdFromToken(token.getValue()); - member = memberService.findMemberById(memberId); + member = memberService.findById(memberId); return member != null; } catch (RoomEscapeException e) { response.sendRedirect("/login"); diff --git a/src/main/java/roomescape/system/auth/service/AuthService.java b/src/main/java/roomescape/system/auth/service/AuthService.java index 8fa1447a..695031f3 100644 --- a/src/main/java/roomescape/system/auth/service/AuthService.java +++ b/src/main/java/roomescape/system/auth/service/AuthService.java @@ -2,8 +2,8 @@ package roomescape.system.auth.service; import org.springframework.stereotype.Service; -import roomescape.member.infrastructure.entity.Member; import roomescape.member.business.MemberService; +import roomescape.member.infrastructure.entity.Member; import roomescape.system.auth.dto.LoginCheckResponse; import roomescape.system.auth.dto.LoginRequest; import roomescape.system.auth.jwt.JwtHandler; @@ -27,7 +27,7 @@ public class AuthService { } public LoginCheckResponse checkLogin(Long memberId) { - Member member = memberService.findMemberById(memberId); + Member member = memberService.findById(memberId); return new LoginCheckResponse(member.getName()); } -- 2.47.2 From 2c8146ff2da38a09210964d15b71b213a10358ef Mon Sep 17 00:00:00 2001 From: pricelees Date: Sat, 12 Jul 2025 19:57:33 +0900 Subject: [PATCH 09/37] =?UTF-8?q?feat:=20API=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EA=B5=AC=ED=98=84=20=EB=B0=8F?= =?UTF-8?q?=20=EA=B8=B0=EC=A1=B4=20=EC=BD=94=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../roomescape/common/RoomescapeApiTest.kt | 65 ++++++++++++++ .../view/controller/PageControllerTest.kt | 85 +++---------------- 2 files changed, 76 insertions(+), 74 deletions(-) create mode 100644 src/test/java/roomescape/common/RoomescapeApiTest.kt diff --git a/src/test/java/roomescape/common/RoomescapeApiTest.kt b/src/test/java/roomescape/common/RoomescapeApiTest.kt new file mode 100644 index 00000000..6f6c872d --- /dev/null +++ b/src/test/java/roomescape/common/RoomescapeApiTest.kt @@ -0,0 +1,65 @@ +package roomescape.common + +import com.ninjasquad.springmockk.MockkBean +import io.kotest.core.spec.style.BehaviorSpec +import io.mockk.every +import io.restassured.module.kotlin.extensions.Given +import io.restassured.module.kotlin.extensions.Then +import io.restassured.module.kotlin.extensions.When +import io.restassured.response.ValidatableResponse +import org.springframework.boot.test.context.SpringBootTest +import org.springframework.boot.test.web.server.LocalServerPort +import org.springframework.data.repository.findByIdOrNull +import roomescape.member.infrastructure.entity.Member +import roomescape.member.infrastructure.entity.MemberRepository +import roomescape.system.auth.jwt.JwtHandler + +const val NOT_LOGGED_IN_USERID: Long = 0; + +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +class RoomescapeApiTest( + @LocalServerPort val port: Int? = 9090, +) : BehaviorSpec() { + + @MockkBean + lateinit var memberRepository: MemberRepository + + @MockkBean + lateinit var jwtHandler: JwtHandler + + val admin: Member = MemberFixture.admin() + val user: Member = MemberFixture.user() + + fun runTest(endpoint: String, assert: ValidatableResponse.() -> Unit): ValidatableResponse { + return Given { + port(port!!) + header("Cookie", "accessToken=token") + } When { + get(endpoint) + } Then assert + } + + fun setUpAdmin() { + every { + jwtHandler.getMemberIdFromToken(any()) + } returns admin.id + + every { memberRepository.findByIdOrNull(admin.id!!) } returns admin + } + + fun setUpUser() { + every { + jwtHandler.getMemberIdFromToken(any()) + } returns user.id + + every { memberRepository.findByIdOrNull(user.id!!) } returns user + } + + fun setUpNotLoggedIn() { + every { + jwtHandler.getMemberIdFromToken(any()) + } returns NOT_LOGGED_IN_USERID + + every { memberRepository.findByIdOrNull(NOT_LOGGED_IN_USERID) } returns null + } +} \ No newline at end of file diff --git a/src/test/java/roomescape/view/controller/PageControllerTest.kt b/src/test/java/roomescape/view/controller/PageControllerTest.kt index 21d09e77..746c75fc 100644 --- a/src/test/java/roomescape/view/controller/PageControllerTest.kt +++ b/src/test/java/roomescape/view/controller/PageControllerTest.kt @@ -1,54 +1,26 @@ package roomescape.view.controller -import com.ninjasquad.springmockk.MockkBean -import io.kotest.core.spec.style.BehaviorSpec -import io.mockk.every -import io.restassured.module.kotlin.extensions.Given -import io.restassured.module.kotlin.extensions.Then -import io.restassured.module.kotlin.extensions.When -import io.restassured.response.ValidatableResponse import org.hamcrest.Matchers.containsString -import org.springframework.boot.test.context.SpringBootTest -import org.springframework.boot.test.web.server.LocalServerPort -import org.springframework.http.HttpStatus -import roomescape.common.MemberFixture import roomescape.common.NoSqlInitialize -import roomescape.member.infrastructure.entity.Member -import roomescape.member.business.MemberService -import roomescape.system.auth.jwt.JwtHandler -import roomescape.system.exception.ErrorType -import roomescape.system.exception.RoomEscapeException +import roomescape.common.RoomescapeApiTest -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) @NoSqlInitialize -class PageControllerTest( - @LocalServerPort val port: Int, -) : BehaviorSpec() { - - @MockkBean - private lateinit var jwtHandler: JwtHandler - - @MockkBean - private lateinit var memberService: MemberService - - private val admin: Member = MemberFixture.admin() - private val user: Member = MemberFixture.user() - +class PageControllerTest() : RoomescapeApiTest() { init { listOf("/", "/login").forEach { given("GET $it 요청은") { `when`("로그인 및 권한 여부와 관계없이 성공한다.") { then("비회원") { + setUpNotLoggedIn() + runTest(it) { statusCode(200) } } then("회원") { - every { - jwtHandler.getMemberIdFromToken(any()) - } returns user.id + setUpUser() runTest(it) { statusCode(200) @@ -56,9 +28,7 @@ class PageControllerTest( } then("관리자") { - every { - jwtHandler.getMemberIdFromToken(any()) - } returns admin.id + setUpAdmin() runTest(it) { statusCode(200) @@ -71,9 +41,7 @@ class PageControllerTest( listOf("/admin", "/admin/reservation", "/admin/time", "/admin/theme", "/admin/waiting").forEach { given("GET $it 요청을") { `when`("관리자가 보내면") { - every { - jwtHandler.getMemberIdFromToken(any()) - } returns admin.id + setUpAdmin() then("성공한다.") { runTest(it) { @@ -83,9 +51,7 @@ class PageControllerTest( } `when`("회원이 보내면") { - every { - jwtHandler.getMemberIdFromToken(any()) - } returns user.id + setUpUser() then("로그인 페이지로 이동한다.") { runTest(it) { @@ -101,18 +67,14 @@ class PageControllerTest( given("GET $it 요청을") { `when`("로그인 된 회원이 보내면 성공한다.") { then("회원") { - every { - jwtHandler.getMemberIdFromToken(any()) - } returns user.id + setUpUser() runTest(it) { statusCode(200) } } then("관리자") { - every { - jwtHandler.getMemberIdFromToken(any()) - } returns admin.id + setUpAdmin() runTest(it) { statusCode(200) @@ -122,9 +84,7 @@ class PageControllerTest( `when`("로그인 없이 보내면") { then("로그인 페이지로 이동한다.") { - every { - jwtHandler.getMemberIdFromToken(any()) - } returns null + setUpNotLoggedIn() runTest(it) { statusCode(200) @@ -135,27 +95,4 @@ class PageControllerTest( } } } - - fun runTest(endpoint: String, assert: ValidatableResponse.() -> Unit) { - setUpMocks() - - Given { - port(port) - header("Cookie", "accessToken=token") - } When { - get(endpoint) - } Then assert - } - - private fun setUpMocks() { - every { memberService.findMemberById(admin.id) } returns admin - - every { memberService.findMemberById(user.id) } returns user - - every { memberService.findMemberById(null) } throws RoomEscapeException( - ErrorType.MEMBER_NOT_FOUND, - String.format("[memberId: %d]", null), - HttpStatus.BAD_REQUEST - ) - } } \ No newline at end of file -- 2.47.2 From 3763e3c8b56c3559fdedc00dcc28267856f94923 Mon Sep 17 00:00:00 2001 From: pricelees Date: Sat, 12 Jul 2025 19:57:47 +0900 Subject: [PATCH 10/37] Rename .java to .kt --- .../{MemberControllerTest.java => MemberControllerTest.kt} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/test/java/roomescape/member/controller/{MemberControllerTest.java => MemberControllerTest.kt} (100%) diff --git a/src/test/java/roomescape/member/controller/MemberControllerTest.java b/src/test/java/roomescape/member/controller/MemberControllerTest.kt similarity index 100% rename from src/test/java/roomescape/member/controller/MemberControllerTest.java rename to src/test/java/roomescape/member/controller/MemberControllerTest.kt -- 2.47.2 From 7143948fd5671d79306b393568815c1d56f61ea8 Mon Sep 17 00:00:00 2001 From: pricelees Date: Sat, 12 Jul 2025 19:57:47 +0900 Subject: [PATCH 11/37] =?UTF-8?q?test:=20=ED=9A=8C=EC=9B=90=20API=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BD=94=ED=8B=80=EB=A6=B0=20?= =?UTF-8?q?=EB=B3=80=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../member/controller/MemberControllerTest.kt | 114 +++++++++--------- 1 file changed, 55 insertions(+), 59 deletions(-) diff --git a/src/test/java/roomescape/member/controller/MemberControllerTest.kt b/src/test/java/roomescape/member/controller/MemberControllerTest.kt index 80744610..2297c194 100644 --- a/src/test/java/roomescape/member/controller/MemberControllerTest.kt +++ b/src/test/java/roomescape/member/controller/MemberControllerTest.kt @@ -1,72 +1,68 @@ -package roomescape.member.controller; +package roomescape.member.controller -import java.util.Map; +import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper +import io.kotest.assertions.assertSoftly +import io.kotest.matchers.collections.shouldContainAll +import io.kotest.matchers.shouldBe +import io.mockk.every +import io.restassured.module.kotlin.extensions.Extract +import org.hamcrest.Matchers.containsString +import roomescape.common.MemberFixture +import roomescape.common.NoSqlInitialize +import roomescape.common.RoomescapeApiTest +import roomescape.member.web.MembersResponse -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -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.server.LocalServerPort; -import org.springframework.test.context.jdbc.Sql; +@NoSqlInitialize +class MemberControllerTest : RoomescapeApiTest() { -import io.restassured.RestAssured; -import io.restassured.http.ContentType; -import io.restassured.http.Header; -import roomescape.member.infrastructure.entity.Member; -import roomescape.member.infrastructure.entity.Role; -import roomescape.member.infrastructure.entity.MemberRepository; + init { + given("GET /members 요청을") { + val endpoint = "/members" -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) -@Sql(scripts = "/truncate.sql", executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD) -class MemberControllerTest { + every { memberRepository.findAll() } returns listOf( + MemberFixture.create(name = "name1"), + MemberFixture.create(name = "name2"), + MemberFixture.create(name = "name3"), + ) - @Autowired - private MemberRepository memberRepository; + `when`("관리자가 보내면") { + setUpAdmin() - @LocalServerPort - private int port; + then("성공한다.") { + val result: Any = runTest(endpoint) { + statusCode(200) + } Extract { + path("data") + } - @BeforeEach - void setUp() { - RestAssured.port = port; - } + val response: MembersResponse = jacksonObjectMapper().convertValue(result, MembersResponse::class.java) - @Test - @DisplayName("/members 로 GET 요청을 보내면 회원 정보와 200 OK 를 받는다.") - void getAdminPage() { - // given - String accessTokenCookie = getAdminAccessTokenCookieByLogin("admin@admin.com", "12341234"); + assertSoftly(response.members) { + it.size shouldBe 3 + it.map { m -> m.name } shouldContainAll listOf("name1", "name2", "name3") + } + } + } - memberRepository.save(new Member("이름1", "test@test.com", "password", Role.MEMBER)); - memberRepository.save(new Member("이름2", "test@test.com", "password", Role.MEMBER)); - memberRepository.save(new Member("이름3", "test@test.com", "password", Role.MEMBER)); - memberRepository.save(new Member("이름4", "test@test.com", "password", Role.MEMBER)); + `when`("관리자가 아니면 로그인 페이지로 이동한다.") { + then("비회원") { + setUpNotLoggedIn() - // when & then - RestAssured.given().log().all() - .port(port) - .header(new Header("Cookie", accessTokenCookie)) - .when().get("/members") - .then().log().all() - .statusCode(200); - } + runTest(endpoint) { + statusCode(200) + body(containsString("Login")) + } + } - private String getAdminAccessTokenCookieByLogin(final String email, final String password) { - memberRepository.save(new Member("이름", email, password, Role.ADMIN)); + then("일반 회원") { + setUpUser() - Map loginParams = Map.of( - "email", email, - "password", password - ); - - String accessToken = RestAssured.given().log().all() - .contentType(ContentType.JSON) - .port(port) - .body(loginParams) - .when().post("/login") - .then().log().all().extract().cookie("accessToken"); - - return "accessToken=" + accessToken; - } + runTest(endpoint) { + statusCode(200) + body(containsString("Login")) + } + } + } + } + } } -- 2.47.2 From 8ee759394e1d4b1b1815f06d3c8bfb8976fef3ee Mon Sep 17 00:00:00 2001 From: pricelees Date: Sun, 13 Jul 2025 16:14:33 +0900 Subject: [PATCH 12/37] =?UTF-8?q?chore:=20=ED=8C=A8=ED=82=A4=EC=A7=80?= =?UTF-8?q?=EB=AA=85=20=EC=88=98=EC=A0=95(entity=20->=20persistence)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/roomescape/member/business/MemberService.kt | 4 ++-- .../infrastructure/{entity => persistence}/Member.kt | 2 +- .../{entity => persistence}/MemberRepository.kt | 2 +- src/main/java/roomescape/member/web/MemberController.kt | 2 +- .../java/roomescape/reservation/domain/Reservation.java | 2 +- .../roomescape/reservation/service/ReservationService.java | 2 +- .../system/auth/interceptor/AdminInterceptor.java | 2 +- .../system/auth/interceptor/LoginInterceptor.java | 2 +- .../java/roomescape/system/auth/service/AuthService.java | 2 +- src/test/java/roomescape/common/Fixtures.kt | 4 ++-- src/test/java/roomescape/common/RoomescapeApiTest.kt | 4 ++-- src/test/java/roomescape/payment/domain/PaymentTest.java | 4 ++-- .../roomescape/payment/service/PaymentServiceTest.java | 6 +++--- .../reservation/controller/ReservationControllerTest.java | 7 +++---- .../controller/ReservationTimeControllerTest.java | 6 +++--- .../roomescape/reservation/domain/ReservationTest.java | 4 ++-- .../repository/ReservationSearchSpecificationTest.java | 6 +++--- .../reservation/service/ReservationServiceTest.java | 6 +++--- .../reservation/service/ReservationTimeServiceTest.java | 6 +++--- .../service/ReservationWithPaymentServiceTest.java | 6 +++--- .../system/auth/controller/AuthControllerTest.java | 6 +++--- .../roomescape/system/auth/service/AuthServiceTest.java | 6 +++--- .../roomescape/theme/controller/ThemeControllerTest.java | 6 +++--- .../java/roomescape/theme/service/ThemeServiceTest.java | 6 +++--- 24 files changed, 51 insertions(+), 52 deletions(-) rename src/main/java/roomescape/member/infrastructure/{entity => persistence}/Member.kt (88%) rename src/main/java/roomescape/member/infrastructure/{entity => persistence}/MemberRepository.kt (78%) diff --git a/src/main/java/roomescape/member/business/MemberService.kt b/src/main/java/roomescape/member/business/MemberService.kt index 2949740c..af7b60f1 100644 --- a/src/main/java/roomescape/member/business/MemberService.kt +++ b/src/main/java/roomescape/member/business/MemberService.kt @@ -4,8 +4,8 @@ import org.springframework.data.repository.findByIdOrNull import org.springframework.http.HttpStatus import org.springframework.stereotype.Service import org.springframework.transaction.annotation.Transactional -import roomescape.member.infrastructure.entity.Member -import roomescape.member.infrastructure.entity.MemberRepository +import roomescape.member.infrastructure.persistence.Member +import roomescape.member.infrastructure.persistence.MemberRepository import roomescape.member.web.MembersResponse import roomescape.member.web.toResponse import roomescape.system.exception.ErrorType diff --git a/src/main/java/roomescape/member/infrastructure/entity/Member.kt b/src/main/java/roomescape/member/infrastructure/persistence/Member.kt similarity index 88% rename from src/main/java/roomescape/member/infrastructure/entity/Member.kt rename to src/main/java/roomescape/member/infrastructure/persistence/Member.kt index 5b22934c..1e63e863 100644 --- a/src/main/java/roomescape/member/infrastructure/entity/Member.kt +++ b/src/main/java/roomescape/member/infrastructure/persistence/Member.kt @@ -1,4 +1,4 @@ -package roomescape.member.infrastructure.entity +package roomescape.member.infrastructure.persistence import jakarta.persistence.* diff --git a/src/main/java/roomescape/member/infrastructure/entity/MemberRepository.kt b/src/main/java/roomescape/member/infrastructure/persistence/MemberRepository.kt similarity index 78% rename from src/main/java/roomescape/member/infrastructure/entity/MemberRepository.kt rename to src/main/java/roomescape/member/infrastructure/persistence/MemberRepository.kt index a681120a..c08e3920 100644 --- a/src/main/java/roomescape/member/infrastructure/entity/MemberRepository.kt +++ b/src/main/java/roomescape/member/infrastructure/persistence/MemberRepository.kt @@ -1,4 +1,4 @@ -package roomescape.member.infrastructure.entity +package roomescape.member.infrastructure.persistence import org.springframework.data.jpa.repository.JpaRepository diff --git a/src/main/java/roomescape/member/web/MemberController.kt b/src/main/java/roomescape/member/web/MemberController.kt index 1d883be0..1889ebb3 100644 --- a/src/main/java/roomescape/member/web/MemberController.kt +++ b/src/main/java/roomescape/member/web/MemberController.kt @@ -4,7 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema import org.springframework.web.bind.annotation.GetMapping import org.springframework.web.bind.annotation.RestController import roomescape.member.business.MemberService -import roomescape.member.infrastructure.entity.Member +import roomescape.member.infrastructure.persistence.Member import roomescape.system.dto.response.RoomEscapeApiResponse @RestController diff --git a/src/main/java/roomescape/reservation/domain/Reservation.java b/src/main/java/roomescape/reservation/domain/Reservation.java index d038b04b..7d300176 100644 --- a/src/main/java/roomescape/reservation/domain/Reservation.java +++ b/src/main/java/roomescape/reservation/domain/Reservation.java @@ -15,7 +15,7 @@ import jakarta.persistence.GenerationType; import jakarta.persistence.Id; import jakarta.persistence.JoinColumn; import jakarta.persistence.ManyToOne; -import roomescape.member.infrastructure.entity.Member; +import roomescape.member.infrastructure.persistence.Member; import roomescape.system.exception.ErrorType; import roomescape.system.exception.RoomEscapeException; import roomescape.theme.domain.Theme; diff --git a/src/main/java/roomescape/reservation/service/ReservationService.java b/src/main/java/roomescape/reservation/service/ReservationService.java index 9304e8fe..20a856c6 100644 --- a/src/main/java/roomescape/reservation/service/ReservationService.java +++ b/src/main/java/roomescape/reservation/service/ReservationService.java @@ -10,7 +10,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import roomescape.member.business.MemberService; -import roomescape.member.infrastructure.entity.Member; +import roomescape.member.infrastructure.persistence.Member; import roomescape.reservation.domain.Reservation; import roomescape.reservation.domain.ReservationStatus; import roomescape.reservation.domain.ReservationTime; diff --git a/src/main/java/roomescape/system/auth/interceptor/AdminInterceptor.java b/src/main/java/roomescape/system/auth/interceptor/AdminInterceptor.java index 0788419d..8d5d38eb 100644 --- a/src/main/java/roomescape/system/auth/interceptor/AdminInterceptor.java +++ b/src/main/java/roomescape/system/auth/interceptor/AdminInterceptor.java @@ -11,7 +11,7 @@ import jakarta.servlet.http.Cookie; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import roomescape.member.business.MemberService; -import roomescape.member.infrastructure.entity.Member; +import roomescape.member.infrastructure.persistence.Member; import roomescape.system.auth.annotation.Admin; import roomescape.system.auth.jwt.JwtHandler; import roomescape.system.exception.ErrorType; diff --git a/src/main/java/roomescape/system/auth/interceptor/LoginInterceptor.java b/src/main/java/roomescape/system/auth/interceptor/LoginInterceptor.java index 6522fb0a..07152963 100644 --- a/src/main/java/roomescape/system/auth/interceptor/LoginInterceptor.java +++ b/src/main/java/roomescape/system/auth/interceptor/LoginInterceptor.java @@ -11,7 +11,7 @@ import jakarta.servlet.http.Cookie; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import roomescape.member.business.MemberService; -import roomescape.member.infrastructure.entity.Member; +import roomescape.member.infrastructure.persistence.Member; import roomescape.system.auth.annotation.LoginRequired; import roomescape.system.auth.jwt.JwtHandler; import roomescape.system.exception.ErrorType; diff --git a/src/main/java/roomescape/system/auth/service/AuthService.java b/src/main/java/roomescape/system/auth/service/AuthService.java index 695031f3..087fe05a 100644 --- a/src/main/java/roomescape/system/auth/service/AuthService.java +++ b/src/main/java/roomescape/system/auth/service/AuthService.java @@ -3,7 +3,7 @@ package roomescape.system.auth.service; import org.springframework.stereotype.Service; import roomescape.member.business.MemberService; -import roomescape.member.infrastructure.entity.Member; +import roomescape.member.infrastructure.persistence.Member; import roomescape.system.auth.dto.LoginCheckResponse; import roomescape.system.auth.dto.LoginRequest; import roomescape.system.auth.jwt.JwtHandler; diff --git a/src/test/java/roomescape/common/Fixtures.kt b/src/test/java/roomescape/common/Fixtures.kt index 2a6736bf..ebe4c439 100644 --- a/src/test/java/roomescape/common/Fixtures.kt +++ b/src/test/java/roomescape/common/Fixtures.kt @@ -1,7 +1,7 @@ package roomescape.common -import roomescape.member.infrastructure.entity.Member -import roomescape.member.infrastructure.entity.Role +import roomescape.member.infrastructure.persistence.Member +import roomescape.member.infrastructure.persistence.Role import java.util.concurrent.atomic.AtomicLong object MemberFixture { diff --git a/src/test/java/roomescape/common/RoomescapeApiTest.kt b/src/test/java/roomescape/common/RoomescapeApiTest.kt index 6f6c872d..f69fce78 100644 --- a/src/test/java/roomescape/common/RoomescapeApiTest.kt +++ b/src/test/java/roomescape/common/RoomescapeApiTest.kt @@ -10,8 +10,8 @@ import io.restassured.response.ValidatableResponse import org.springframework.boot.test.context.SpringBootTest import org.springframework.boot.test.web.server.LocalServerPort import org.springframework.data.repository.findByIdOrNull -import roomescape.member.infrastructure.entity.Member -import roomescape.member.infrastructure.entity.MemberRepository +import roomescape.member.infrastructure.persistence.Member +import roomescape.member.infrastructure.persistence.MemberRepository import roomescape.system.auth.jwt.JwtHandler const val NOT_LOGGED_IN_USERID: Long = 0; diff --git a/src/test/java/roomescape/payment/domain/PaymentTest.java b/src/test/java/roomescape/payment/domain/PaymentTest.java index 9c0b52f9..1544cbb0 100644 --- a/src/test/java/roomescape/payment/domain/PaymentTest.java +++ b/src/test/java/roomescape/payment/domain/PaymentTest.java @@ -13,8 +13,8 @@ import org.junit.jupiter.params.provider.CsvSource; import org.junit.jupiter.params.provider.NullAndEmptySource; import org.junit.jupiter.params.provider.NullSource; -import roomescape.member.infrastructure.entity.Member; -import roomescape.member.infrastructure.entity.Role; +import roomescape.member.infrastructure.persistence.Member; +import roomescape.member.infrastructure.persistence.Role; import roomescape.reservation.domain.Reservation; import roomescape.reservation.domain.ReservationStatus; import roomescape.reservation.domain.ReservationTime; diff --git a/src/test/java/roomescape/payment/service/PaymentServiceTest.java b/src/test/java/roomescape/payment/service/PaymentServiceTest.java index b42d0d95..66719b95 100644 --- a/src/test/java/roomescape/payment/service/PaymentServiceTest.java +++ b/src/test/java/roomescape/payment/service/PaymentServiceTest.java @@ -13,9 +13,9 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.jdbc.Sql; import org.springframework.test.context.jdbc.Sql.ExecutionPhase; -import roomescape.member.infrastructure.entity.Member; -import roomescape.member.infrastructure.entity.MemberRepository; -import roomescape.member.infrastructure.entity.Role; +import roomescape.member.infrastructure.persistence.Member; +import roomescape.member.infrastructure.persistence.MemberRepository; +import roomescape.member.infrastructure.persistence.Role; import roomescape.payment.domain.repository.CanceledPaymentRepository; import roomescape.payment.dto.request.PaymentCancelRequest; import roomescape.payment.dto.response.PaymentResponse; diff --git a/src/test/java/roomescape/reservation/controller/ReservationControllerTest.java b/src/test/java/roomescape/reservation/controller/ReservationControllerTest.java index 8404274c..b5f625b1 100644 --- a/src/test/java/roomescape/reservation/controller/ReservationControllerTest.java +++ b/src/test/java/roomescape/reservation/controller/ReservationControllerTest.java @@ -2,7 +2,6 @@ package roomescape.reservation.controller; import static org.assertj.core.api.Assertions.*; import static org.hamcrest.Matchers.*; -import static org.mockito.ArgumentMatchers.*; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.*; @@ -33,9 +32,9 @@ import org.springframework.test.context.jdbc.Sql.ExecutionPhase; import io.restassured.RestAssured; import io.restassured.http.ContentType; import io.restassured.http.Header; -import roomescape.member.infrastructure.entity.Member; -import roomescape.member.infrastructure.entity.MemberRepository; -import roomescape.member.infrastructure.entity.Role; +import roomescape.member.infrastructure.persistence.Member; +import roomescape.member.infrastructure.persistence.MemberRepository; +import roomescape.member.infrastructure.persistence.Role; import roomescape.payment.client.TossPaymentClient; import roomescape.payment.domain.CanceledPayment; import roomescape.payment.domain.Payment; diff --git a/src/test/java/roomescape/reservation/controller/ReservationTimeControllerTest.java b/src/test/java/roomescape/reservation/controller/ReservationTimeControllerTest.java index f7381e83..9f809fe9 100644 --- a/src/test/java/roomescape/reservation/controller/ReservationTimeControllerTest.java +++ b/src/test/java/roomescape/reservation/controller/ReservationTimeControllerTest.java @@ -21,9 +21,9 @@ import org.springframework.test.context.jdbc.Sql.ExecutionPhase; import io.restassured.RestAssured; import io.restassured.http.ContentType; import io.restassured.http.Header; -import roomescape.member.infrastructure.entity.Member; -import roomescape.member.infrastructure.entity.MemberRepository; -import roomescape.member.infrastructure.entity.Role; +import roomescape.member.infrastructure.persistence.Member; +import roomescape.member.infrastructure.persistence.MemberRepository; +import roomescape.member.infrastructure.persistence.Role; import roomescape.reservation.domain.Reservation; import roomescape.reservation.domain.ReservationStatus; import roomescape.reservation.domain.ReservationTime; diff --git a/src/test/java/roomescape/reservation/domain/ReservationTest.java b/src/test/java/roomescape/reservation/domain/ReservationTest.java index 8f9a9da1..757b27a5 100644 --- a/src/test/java/roomescape/reservation/domain/ReservationTest.java +++ b/src/test/java/roomescape/reservation/domain/ReservationTest.java @@ -10,8 +10,8 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; -import roomescape.member.infrastructure.entity.Member; -import roomescape.member.infrastructure.entity.Role; +import roomescape.member.infrastructure.persistence.Member; +import roomescape.member.infrastructure.persistence.Role; import roomescape.system.exception.RoomEscapeException; import roomescape.theme.domain.Theme; diff --git a/src/test/java/roomescape/reservation/domain/repository/ReservationSearchSpecificationTest.java b/src/test/java/roomescape/reservation/domain/repository/ReservationSearchSpecificationTest.java index dd672197..89dda95c 100644 --- a/src/test/java/roomescape/reservation/domain/repository/ReservationSearchSpecificationTest.java +++ b/src/test/java/roomescape/reservation/domain/repository/ReservationSearchSpecificationTest.java @@ -13,9 +13,9 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.data.jpa.domain.Specification; -import roomescape.member.infrastructure.entity.Member; -import roomescape.member.infrastructure.entity.MemberRepository; -import roomescape.member.infrastructure.entity.Role; +import roomescape.member.infrastructure.persistence.Member; +import roomescape.member.infrastructure.persistence.MemberRepository; +import roomescape.member.infrastructure.persistence.Role; import roomescape.reservation.domain.Reservation; import roomescape.reservation.domain.ReservationStatus; import roomescape.reservation.domain.ReservationTime; diff --git a/src/test/java/roomescape/reservation/service/ReservationServiceTest.java b/src/test/java/roomescape/reservation/service/ReservationServiceTest.java index b7bc072f..17cacf6d 100644 --- a/src/test/java/roomescape/reservation/service/ReservationServiceTest.java +++ b/src/test/java/roomescape/reservation/service/ReservationServiceTest.java @@ -15,9 +15,9 @@ import org.springframework.test.context.jdbc.Sql; import org.springframework.test.context.jdbc.Sql.ExecutionPhase; import roomescape.member.business.MemberService; -import roomescape.member.infrastructure.entity.Member; -import roomescape.member.infrastructure.entity.MemberRepository; -import roomescape.member.infrastructure.entity.Role; +import roomescape.member.infrastructure.persistence.Member; +import roomescape.member.infrastructure.persistence.MemberRepository; +import roomescape.member.infrastructure.persistence.Role; import roomescape.reservation.domain.Reservation; import roomescape.reservation.domain.ReservationStatus; import roomescape.reservation.domain.ReservationTime; diff --git a/src/test/java/roomescape/reservation/service/ReservationTimeServiceTest.java b/src/test/java/roomescape/reservation/service/ReservationTimeServiceTest.java index 8788a072..73682f55 100644 --- a/src/test/java/roomescape/reservation/service/ReservationTimeServiceTest.java +++ b/src/test/java/roomescape/reservation/service/ReservationTimeServiceTest.java @@ -13,9 +13,9 @@ import org.springframework.context.annotation.Import; import org.springframework.test.context.jdbc.Sql; import org.springframework.test.context.jdbc.Sql.ExecutionPhase; -import roomescape.member.infrastructure.entity.Member; -import roomescape.member.infrastructure.entity.MemberRepository; -import roomescape.member.infrastructure.entity.Role; +import roomescape.member.infrastructure.persistence.Member; +import roomescape.member.infrastructure.persistence.MemberRepository; +import roomescape.member.infrastructure.persistence.Role; import roomescape.reservation.domain.Reservation; import roomescape.reservation.domain.ReservationStatus; import roomescape.reservation.domain.ReservationTime; diff --git a/src/test/java/roomescape/reservation/service/ReservationWithPaymentServiceTest.java b/src/test/java/roomescape/reservation/service/ReservationWithPaymentServiceTest.java index 32077e16..fe0bec73 100644 --- a/src/test/java/roomescape/reservation/service/ReservationWithPaymentServiceTest.java +++ b/src/test/java/roomescape/reservation/service/ReservationWithPaymentServiceTest.java @@ -13,9 +13,9 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.jdbc.Sql; import org.springframework.test.context.jdbc.Sql.ExecutionPhase; -import roomescape.member.infrastructure.entity.Member; -import roomescape.member.infrastructure.entity.MemberRepository; -import roomescape.member.infrastructure.entity.Role; +import roomescape.member.infrastructure.persistence.Member; +import roomescape.member.infrastructure.persistence.MemberRepository; +import roomescape.member.infrastructure.persistence.Role; import roomescape.payment.domain.repository.CanceledPaymentRepository; import roomescape.payment.domain.repository.PaymentRepository; import roomescape.payment.dto.request.PaymentCancelRequest; diff --git a/src/test/java/roomescape/system/auth/controller/AuthControllerTest.java b/src/test/java/roomescape/system/auth/controller/AuthControllerTest.java index 2fbcf1c3..2bd51dd1 100644 --- a/src/test/java/roomescape/system/auth/controller/AuthControllerTest.java +++ b/src/test/java/roomescape/system/auth/controller/AuthControllerTest.java @@ -14,9 +14,9 @@ import org.springframework.test.context.jdbc.Sql; import io.restassured.RestAssured; import io.restassured.http.ContentType; -import roomescape.member.infrastructure.entity.Member; -import roomescape.member.infrastructure.entity.MemberRepository; -import roomescape.member.infrastructure.entity.Role; +import roomescape.member.infrastructure.persistence.Member; +import roomescape.member.infrastructure.persistence.MemberRepository; +import roomescape.member.infrastructure.persistence.Role; @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) @Sql(scripts = "/truncate.sql", executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD) diff --git a/src/test/java/roomescape/system/auth/service/AuthServiceTest.java b/src/test/java/roomescape/system/auth/service/AuthServiceTest.java index 26bd6783..776a4a54 100644 --- a/src/test/java/roomescape/system/auth/service/AuthServiceTest.java +++ b/src/test/java/roomescape/system/auth/service/AuthServiceTest.java @@ -10,9 +10,9 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.Import; import roomescape.member.business.MemberService; -import roomescape.member.infrastructure.entity.Member; -import roomescape.member.infrastructure.entity.MemberRepository; -import roomescape.member.infrastructure.entity.Role; +import roomescape.member.infrastructure.persistence.Member; +import roomescape.member.infrastructure.persistence.MemberRepository; +import roomescape.member.infrastructure.persistence.Role; import roomescape.system.auth.dto.LoginRequest; import roomescape.system.auth.jwt.JwtHandler; import roomescape.system.auth.jwt.dto.TokenDto; diff --git a/src/test/java/roomescape/theme/controller/ThemeControllerTest.java b/src/test/java/roomescape/theme/controller/ThemeControllerTest.java index 354d9be8..391ed044 100644 --- a/src/test/java/roomescape/theme/controller/ThemeControllerTest.java +++ b/src/test/java/roomescape/theme/controller/ThemeControllerTest.java @@ -18,9 +18,9 @@ import org.springframework.test.context.jdbc.Sql.ExecutionPhase; import io.restassured.RestAssured; import io.restassured.http.ContentType; import io.restassured.http.Header; -import roomescape.member.infrastructure.entity.Member; -import roomescape.member.infrastructure.entity.MemberRepository; -import roomescape.member.infrastructure.entity.Role; +import roomescape.member.infrastructure.persistence.Member; +import roomescape.member.infrastructure.persistence.MemberRepository; +import roomescape.member.infrastructure.persistence.Role; @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) @Sql(scripts = "/truncate.sql", executionPhase = ExecutionPhase.BEFORE_TEST_METHOD) diff --git a/src/test/java/roomescape/theme/service/ThemeServiceTest.java b/src/test/java/roomescape/theme/service/ThemeServiceTest.java index 8f31529a..3ef8b8b7 100644 --- a/src/test/java/roomescape/theme/service/ThemeServiceTest.java +++ b/src/test/java/roomescape/theme/service/ThemeServiceTest.java @@ -14,9 +14,9 @@ import org.springframework.context.annotation.Import; import org.springframework.test.context.jdbc.Sql; import roomescape.member.business.MemberService; -import roomescape.member.infrastructure.entity.Member; -import roomescape.member.infrastructure.entity.MemberRepository; -import roomescape.member.infrastructure.entity.Role; +import roomescape.member.infrastructure.persistence.Member; +import roomescape.member.infrastructure.persistence.MemberRepository; +import roomescape.member.infrastructure.persistence.Role; import roomescape.reservation.dto.request.ReservationRequest; import roomescape.reservation.dto.request.ReservationTimeRequest; import roomescape.reservation.dto.response.ReservationTimeResponse; -- 2.47.2 From 99315b5de8bcbc7b6858c34d1f9624d066aaaf97 Mon Sep 17 00:00:00 2001 From: pricelees Date: Sun, 13 Jul 2025 16:18:10 +0900 Subject: [PATCH 13/37] Rename .java to .kt --- .../roomescape/system/auth/{annotation => web/support}/Admin.java | 0 .../system/auth/{annotation => web/support}/LoginRequired.java | 0 .../system/auth/{annotation => web/support}/MemberId.java | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename src/main/java/roomescape/system/auth/{annotation => web/support}/Admin.java (100%) rename src/main/java/roomescape/system/auth/{annotation => web/support}/LoginRequired.java (100%) rename src/main/java/roomescape/system/auth/{annotation => web/support}/MemberId.java (100%) diff --git a/src/main/java/roomescape/system/auth/annotation/Admin.java b/src/main/java/roomescape/system/auth/web/support/Admin.java similarity index 100% rename from src/main/java/roomescape/system/auth/annotation/Admin.java rename to src/main/java/roomescape/system/auth/web/support/Admin.java diff --git a/src/main/java/roomescape/system/auth/annotation/LoginRequired.java b/src/main/java/roomescape/system/auth/web/support/LoginRequired.java similarity index 100% rename from src/main/java/roomescape/system/auth/annotation/LoginRequired.java rename to src/main/java/roomescape/system/auth/web/support/LoginRequired.java diff --git a/src/main/java/roomescape/system/auth/annotation/MemberId.java b/src/main/java/roomescape/system/auth/web/support/MemberId.java similarity index 100% rename from src/main/java/roomescape/system/auth/annotation/MemberId.java rename to src/main/java/roomescape/system/auth/web/support/MemberId.java -- 2.47.2 From 1202f4da2f8666a47f68ebf716be6363807c0998 Mon Sep 17 00:00:00 2001 From: pricelees Date: Sun, 13 Jul 2025 16:18:10 +0900 Subject: [PATCH 14/37] =?UTF-8?q?chore:=20auth=20=ED=8C=A8=ED=82=A4?= =?UTF-8?q?=EC=A7=80=20=EA=B5=AC=EC=A1=B0=20=EB=A6=AC=ED=8C=A9=ED=84=B0?= =?UTF-8?q?=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - web 관련(controller, 어노테이션, interceptor, argument_resolver) - business 관련(service..) - infrastructure 관련(jwt..) --- src/main/java/roomescape/member/web/MemberAPI.kt | 2 +- .../reservation/controller/ReservationController.java | 6 +++--- .../controller/ReservationTimeController.java | 4 ++-- .../auth/{ => infrastructure}/jwt/JwtHandler.java | 3 +-- .../system/auth/infrastructure/jwt/TokenDto.java | 4 ++++ .../java/roomescape/system/auth/jwt/dto/TokenDto.java | 4 ---- .../roomescape/system/auth/service/AuthService.java | 8 ++++---- .../auth/{controller => web}/AuthController.java | 10 ++++------ .../system/auth/{dto => web}/LoginCheckResponse.java | 2 +- .../system/auth/{dto => web}/LoginRequest.java | 2 +- .../java/roomescape/system/auth/web/support/Admin.java | 2 +- .../{interceptor => web/support}/AdminInterceptor.java | 5 ++--- .../{interceptor => web/support}/LoginInterceptor.java | 5 ++--- .../system/auth/web/support/LoginRequired.java | 2 +- .../roomescape/system/auth/web/support/MemberId.java | 2 +- .../{resolver => web/support}/MemberIdResolver.java | 5 ++--- .../java/roomescape/system/config/WebMvcConfig.java | 6 +++--- .../roomescape/theme/controller/ThemeController.java | 4 ++-- .../java/roomescape/view/controller/PageController.kt | 4 ++-- src/test/java/roomescape/common/RoomescapeApiTest.kt | 2 +- .../roomescape/global/auth/jwt/JwtHandlerTest.java | 2 +- .../auth/{service => business}/AuthServiceTest.java | 9 +++++---- .../auth/{controller => web}/AuthControllerTest.java | 2 +- 23 files changed, 45 insertions(+), 50 deletions(-) rename src/main/java/roomescape/system/auth/{ => infrastructure}/jwt/JwtHandler.java (96%) create mode 100644 src/main/java/roomescape/system/auth/infrastructure/jwt/TokenDto.java delete mode 100644 src/main/java/roomescape/system/auth/jwt/dto/TokenDto.java rename src/main/java/roomescape/system/auth/{controller => web}/AuthController.java (92%) rename src/main/java/roomescape/system/auth/{dto => web}/LoginCheckResponse.java (88%) rename src/main/java/roomescape/system/auth/{dto => web}/LoginRequest.java (95%) rename src/main/java/roomescape/system/auth/{interceptor => web/support}/AdminInterceptor.java (94%) rename src/main/java/roomescape/system/auth/{interceptor => web/support}/LoginInterceptor.java (94%) rename src/main/java/roomescape/system/auth/{resolver => web/support}/MemberIdResolver.java (92%) rename src/test/java/roomescape/system/auth/{service => business}/AuthServiceTest.java (88%) rename src/test/java/roomescape/system/auth/{controller => web}/AuthControllerTest.java (98%) diff --git a/src/main/java/roomescape/member/web/MemberAPI.kt b/src/main/java/roomescape/member/web/MemberAPI.kt index 5ce92093..92aa4bbd 100644 --- a/src/main/java/roomescape/member/web/MemberAPI.kt +++ b/src/main/java/roomescape/member/web/MemberAPI.kt @@ -6,7 +6,7 @@ import io.swagger.v3.oas.annotations.responses.ApiResponses import io.swagger.v3.oas.annotations.tags.Tag import org.springframework.http.HttpStatus import org.springframework.web.bind.annotation.ResponseStatus -import roomescape.system.auth.annotation.Admin +import roomescape.system.auth.web.support.Admin import roomescape.system.dto.response.RoomEscapeApiResponse @Tag(name = "2. 회원 API", description = "회원 정보를 관리할 때 사용합니다.") diff --git a/src/main/java/roomescape/reservation/controller/ReservationController.java b/src/main/java/roomescape/reservation/controller/ReservationController.java index 2836c12d..0b2c2705 100644 --- a/src/main/java/roomescape/reservation/controller/ReservationController.java +++ b/src/main/java/roomescape/reservation/controller/ReservationController.java @@ -37,9 +37,9 @@ import roomescape.reservation.dto.response.ReservationResponse; import roomescape.reservation.dto.response.ReservationsResponse; import roomescape.reservation.service.ReservationService; import roomescape.reservation.service.ReservationWithPaymentService; -import roomescape.system.auth.annotation.Admin; -import roomescape.system.auth.annotation.LoginRequired; -import roomescape.system.auth.annotation.MemberId; +import roomescape.system.auth.web.support.Admin; +import roomescape.system.auth.web.support.LoginRequired; +import roomescape.system.auth.web.support.MemberId; import roomescape.system.dto.response.ErrorResponse; import roomescape.system.dto.response.RoomEscapeApiResponse; import roomescape.system.exception.RoomEscapeException; diff --git a/src/main/java/roomescape/reservation/controller/ReservationTimeController.java b/src/main/java/roomescape/reservation/controller/ReservationTimeController.java index bd6d3fd8..6d804b1a 100644 --- a/src/main/java/roomescape/reservation/controller/ReservationTimeController.java +++ b/src/main/java/roomescape/reservation/controller/ReservationTimeController.java @@ -28,8 +28,8 @@ import roomescape.reservation.dto.response.ReservationTimeInfosResponse; import roomescape.reservation.dto.response.ReservationTimeResponse; import roomescape.reservation.dto.response.ReservationTimesResponse; import roomescape.reservation.service.ReservationTimeService; -import roomescape.system.auth.annotation.Admin; -import roomescape.system.auth.annotation.LoginRequired; +import roomescape.system.auth.web.support.Admin; +import roomescape.system.auth.web.support.LoginRequired; import roomescape.system.dto.response.ErrorResponse; import roomescape.system.dto.response.RoomEscapeApiResponse; diff --git a/src/main/java/roomescape/system/auth/jwt/JwtHandler.java b/src/main/java/roomescape/system/auth/infrastructure/jwt/JwtHandler.java similarity index 96% rename from src/main/java/roomescape/system/auth/jwt/JwtHandler.java rename to src/main/java/roomescape/system/auth/infrastructure/jwt/JwtHandler.java index d2f24a5f..5b8afc69 100644 --- a/src/main/java/roomescape/system/auth/jwt/JwtHandler.java +++ b/src/main/java/roomescape/system/auth/infrastructure/jwt/JwtHandler.java @@ -1,4 +1,4 @@ -package roomescape.system.auth.jwt; +package roomescape.system.auth.infrastructure.jwt; import java.util.Date; @@ -12,7 +12,6 @@ import io.jsonwebtoken.MalformedJwtException; import io.jsonwebtoken.SignatureAlgorithm; import io.jsonwebtoken.SignatureException; import io.jsonwebtoken.UnsupportedJwtException; -import roomescape.system.auth.jwt.dto.TokenDto; import roomescape.system.exception.ErrorType; import roomescape.system.exception.RoomEscapeException; diff --git a/src/main/java/roomescape/system/auth/infrastructure/jwt/TokenDto.java b/src/main/java/roomescape/system/auth/infrastructure/jwt/TokenDto.java new file mode 100644 index 00000000..70e0f4f3 --- /dev/null +++ b/src/main/java/roomescape/system/auth/infrastructure/jwt/TokenDto.java @@ -0,0 +1,4 @@ +package roomescape.system.auth.infrastructure.jwt; + +public record TokenDto(String accessToken) { +} diff --git a/src/main/java/roomescape/system/auth/jwt/dto/TokenDto.java b/src/main/java/roomescape/system/auth/jwt/dto/TokenDto.java deleted file mode 100644 index cd6302de..00000000 --- a/src/main/java/roomescape/system/auth/jwt/dto/TokenDto.java +++ /dev/null @@ -1,4 +0,0 @@ -package roomescape.system.auth.jwt.dto; - -public record TokenDto(String accessToken) { -} diff --git a/src/main/java/roomescape/system/auth/service/AuthService.java b/src/main/java/roomescape/system/auth/service/AuthService.java index 087fe05a..c2bf1a00 100644 --- a/src/main/java/roomescape/system/auth/service/AuthService.java +++ b/src/main/java/roomescape/system/auth/service/AuthService.java @@ -4,10 +4,10 @@ import org.springframework.stereotype.Service; import roomescape.member.business.MemberService; import roomescape.member.infrastructure.persistence.Member; -import roomescape.system.auth.dto.LoginCheckResponse; -import roomescape.system.auth.dto.LoginRequest; -import roomescape.system.auth.jwt.JwtHandler; -import roomescape.system.auth.jwt.dto.TokenDto; +import roomescape.system.auth.web.LoginCheckResponse; +import roomescape.system.auth.web.LoginRequest; +import roomescape.system.auth.infrastructure.jwt.JwtHandler; +import roomescape.system.auth.infrastructure.jwt.TokenDto; @Service public class AuthService { diff --git a/src/main/java/roomescape/system/auth/controller/AuthController.java b/src/main/java/roomescape/system/auth/web/AuthController.java similarity index 92% rename from src/main/java/roomescape/system/auth/controller/AuthController.java rename to src/main/java/roomescape/system/auth/web/AuthController.java index 4d2d87e5..d7e72f5a 100644 --- a/src/main/java/roomescape/system/auth/controller/AuthController.java +++ b/src/main/java/roomescape/system/auth/web/AuthController.java @@ -1,4 +1,4 @@ -package roomescape.system.auth.controller; +package roomescape.system.auth.web; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.GetMapping; @@ -18,11 +18,9 @@ import jakarta.servlet.http.Cookie; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.Valid; -import roomescape.system.auth.annotation.LoginRequired; -import roomescape.system.auth.annotation.MemberId; -import roomescape.system.auth.dto.LoginCheckResponse; -import roomescape.system.auth.dto.LoginRequest; -import roomescape.system.auth.jwt.dto.TokenDto; +import roomescape.system.auth.web.support.LoginRequired; +import roomescape.system.auth.web.support.MemberId; +import roomescape.system.auth.infrastructure.jwt.TokenDto; import roomescape.system.auth.service.AuthService; import roomescape.system.dto.response.ErrorResponse; import roomescape.system.dto.response.RoomEscapeApiResponse; diff --git a/src/main/java/roomescape/system/auth/dto/LoginCheckResponse.java b/src/main/java/roomescape/system/auth/web/LoginCheckResponse.java similarity index 88% rename from src/main/java/roomescape/system/auth/dto/LoginCheckResponse.java rename to src/main/java/roomescape/system/auth/web/LoginCheckResponse.java index 957012cb..3388aa5e 100644 --- a/src/main/java/roomescape/system/auth/dto/LoginCheckResponse.java +++ b/src/main/java/roomescape/system/auth/web/LoginCheckResponse.java @@ -1,4 +1,4 @@ -package roomescape.system.auth.dto; +package roomescape.system.auth.web; import io.swagger.v3.oas.annotations.media.Schema; diff --git a/src/main/java/roomescape/system/auth/dto/LoginRequest.java b/src/main/java/roomescape/system/auth/web/LoginRequest.java similarity index 95% rename from src/main/java/roomescape/system/auth/dto/LoginRequest.java rename to src/main/java/roomescape/system/auth/web/LoginRequest.java index 72a5125a..8c314df7 100644 --- a/src/main/java/roomescape/system/auth/dto/LoginRequest.java +++ b/src/main/java/roomescape/system/auth/web/LoginRequest.java @@ -1,4 +1,4 @@ -package roomescape.system.auth.dto; +package roomescape.system.auth.web; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.Email; diff --git a/src/main/java/roomescape/system/auth/web/support/Admin.java b/src/main/java/roomescape/system/auth/web/support/Admin.java index e525ecc6..683f151e 100644 --- a/src/main/java/roomescape/system/auth/web/support/Admin.java +++ b/src/main/java/roomescape/system/auth/web/support/Admin.java @@ -1,4 +1,4 @@ -package roomescape.system.auth.annotation; +package roomescape.system.auth.web.support; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/src/main/java/roomescape/system/auth/interceptor/AdminInterceptor.java b/src/main/java/roomescape/system/auth/web/support/AdminInterceptor.java similarity index 94% rename from src/main/java/roomescape/system/auth/interceptor/AdminInterceptor.java rename to src/main/java/roomescape/system/auth/web/support/AdminInterceptor.java index 8d5d38eb..6fc60e79 100644 --- a/src/main/java/roomescape/system/auth/interceptor/AdminInterceptor.java +++ b/src/main/java/roomescape/system/auth/web/support/AdminInterceptor.java @@ -1,4 +1,4 @@ -package roomescape.system.auth.interceptor; +package roomescape.system.auth.web.support; import java.util.Arrays; @@ -12,8 +12,7 @@ import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import roomescape.member.business.MemberService; import roomescape.member.infrastructure.persistence.Member; -import roomescape.system.auth.annotation.Admin; -import roomescape.system.auth.jwt.JwtHandler; +import roomescape.system.auth.infrastructure.jwt.JwtHandler; import roomescape.system.exception.ErrorType; import roomescape.system.exception.RoomEscapeException; diff --git a/src/main/java/roomescape/system/auth/interceptor/LoginInterceptor.java b/src/main/java/roomescape/system/auth/web/support/LoginInterceptor.java similarity index 94% rename from src/main/java/roomescape/system/auth/interceptor/LoginInterceptor.java rename to src/main/java/roomescape/system/auth/web/support/LoginInterceptor.java index 07152963..eed33819 100644 --- a/src/main/java/roomescape/system/auth/interceptor/LoginInterceptor.java +++ b/src/main/java/roomescape/system/auth/web/support/LoginInterceptor.java @@ -1,4 +1,4 @@ -package roomescape.system.auth.interceptor; +package roomescape.system.auth.web.support; import java.util.Arrays; @@ -12,8 +12,7 @@ import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import roomescape.member.business.MemberService; import roomescape.member.infrastructure.persistence.Member; -import roomescape.system.auth.annotation.LoginRequired; -import roomescape.system.auth.jwt.JwtHandler; +import roomescape.system.auth.infrastructure.jwt.JwtHandler; import roomescape.system.exception.ErrorType; import roomescape.system.exception.RoomEscapeException; diff --git a/src/main/java/roomescape/system/auth/web/support/LoginRequired.java b/src/main/java/roomescape/system/auth/web/support/LoginRequired.java index e2df7c1f..cbbfa3d7 100644 --- a/src/main/java/roomescape/system/auth/web/support/LoginRequired.java +++ b/src/main/java/roomescape/system/auth/web/support/LoginRequired.java @@ -1,4 +1,4 @@ -package roomescape.system.auth.annotation; +package roomescape.system.auth.web.support; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/src/main/java/roomescape/system/auth/web/support/MemberId.java b/src/main/java/roomescape/system/auth/web/support/MemberId.java index 208b6ee2..ca2b5752 100644 --- a/src/main/java/roomescape/system/auth/web/support/MemberId.java +++ b/src/main/java/roomescape/system/auth/web/support/MemberId.java @@ -1,4 +1,4 @@ -package roomescape.system.auth.annotation; +package roomescape.system.auth.web.support; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/src/main/java/roomescape/system/auth/resolver/MemberIdResolver.java b/src/main/java/roomescape/system/auth/web/support/MemberIdResolver.java similarity index 92% rename from src/main/java/roomescape/system/auth/resolver/MemberIdResolver.java rename to src/main/java/roomescape/system/auth/web/support/MemberIdResolver.java index d72c3d55..987b0985 100644 --- a/src/main/java/roomescape/system/auth/resolver/MemberIdResolver.java +++ b/src/main/java/roomescape/system/auth/web/support/MemberIdResolver.java @@ -1,4 +1,4 @@ -package roomescape.system.auth.resolver; +package roomescape.system.auth.web.support; import java.util.Arrays; @@ -12,8 +12,7 @@ import org.springframework.web.method.support.ModelAndViewContainer; import jakarta.servlet.http.Cookie; import jakarta.servlet.http.HttpServletRequest; -import roomescape.system.auth.annotation.MemberId; -import roomescape.system.auth.jwt.JwtHandler; +import roomescape.system.auth.infrastructure.jwt.JwtHandler; import roomescape.system.exception.ErrorType; import roomescape.system.exception.RoomEscapeException; diff --git a/src/main/java/roomescape/system/config/WebMvcConfig.java b/src/main/java/roomescape/system/config/WebMvcConfig.java index 000349bc..9c286cab 100644 --- a/src/main/java/roomescape/system/config/WebMvcConfig.java +++ b/src/main/java/roomescape/system/config/WebMvcConfig.java @@ -7,9 +7,9 @@ import org.springframework.web.method.support.HandlerMethodArgumentResolver; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; -import roomescape.system.auth.interceptor.AdminInterceptor; -import roomescape.system.auth.interceptor.LoginInterceptor; -import roomescape.system.auth.resolver.MemberIdResolver; +import roomescape.system.auth.web.support.AdminInterceptor; +import roomescape.system.auth.web.support.LoginInterceptor; +import roomescape.system.auth.web.support.MemberIdResolver; @Configuration public class WebMvcConfig implements WebMvcConfigurer { diff --git a/src/main/java/roomescape/theme/controller/ThemeController.java b/src/main/java/roomescape/theme/controller/ThemeController.java index d57f9da4..0c44bf4c 100644 --- a/src/main/java/roomescape/theme/controller/ThemeController.java +++ b/src/main/java/roomescape/theme/controller/ThemeController.java @@ -21,8 +21,8 @@ import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.Valid; import jakarta.validation.constraints.NotNull; -import roomescape.system.auth.annotation.Admin; -import roomescape.system.auth.annotation.LoginRequired; +import roomescape.system.auth.web.support.Admin; +import roomescape.system.auth.web.support.LoginRequired; import roomescape.system.dto.response.ErrorResponse; import roomescape.system.dto.response.RoomEscapeApiResponse; import roomescape.theme.dto.ThemeRequest; diff --git a/src/main/java/roomescape/view/controller/PageController.kt b/src/main/java/roomescape/view/controller/PageController.kt index 5bbe9afc..62504e7e 100644 --- a/src/main/java/roomescape/view/controller/PageController.kt +++ b/src/main/java/roomescape/view/controller/PageController.kt @@ -4,8 +4,8 @@ import org.springframework.stereotype.Controller import org.springframework.web.bind.annotation.GetMapping import org.springframework.web.bind.annotation.PathVariable import org.springframework.web.bind.annotation.RequestMapping -import roomescape.system.auth.annotation.Admin -import roomescape.system.auth.annotation.LoginRequired +import roomescape.system.auth.web.support.Admin +import roomescape.system.auth.web.support.LoginRequired @Controller class AuthPageController { diff --git a/src/test/java/roomescape/common/RoomescapeApiTest.kt b/src/test/java/roomescape/common/RoomescapeApiTest.kt index f69fce78..a67cf87e 100644 --- a/src/test/java/roomescape/common/RoomescapeApiTest.kt +++ b/src/test/java/roomescape/common/RoomescapeApiTest.kt @@ -12,7 +12,7 @@ import org.springframework.boot.test.web.server.LocalServerPort import org.springframework.data.repository.findByIdOrNull import roomescape.member.infrastructure.persistence.Member import roomescape.member.infrastructure.persistence.MemberRepository -import roomescape.system.auth.jwt.JwtHandler +import roomescape.system.auth.infrastructure.jwt.JwtHandler const val NOT_LOGGED_IN_USERID: Long = 0; diff --git a/src/test/java/roomescape/global/auth/jwt/JwtHandlerTest.java b/src/test/java/roomescape/global/auth/jwt/JwtHandlerTest.java index 8b22eb86..4a400666 100644 --- a/src/test/java/roomescape/global/auth/jwt/JwtHandlerTest.java +++ b/src/test/java/roomescape/global/auth/jwt/JwtHandlerTest.java @@ -17,7 +17,7 @@ import org.springframework.test.context.jdbc.Sql; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; import io.restassured.RestAssured; -import roomescape.system.auth.jwt.JwtHandler; +import roomescape.system.auth.infrastructure.jwt.JwtHandler; import roomescape.system.exception.ErrorType; import roomescape.system.exception.RoomEscapeException; diff --git a/src/test/java/roomescape/system/auth/service/AuthServiceTest.java b/src/test/java/roomescape/system/auth/business/AuthServiceTest.java similarity index 88% rename from src/test/java/roomescape/system/auth/service/AuthServiceTest.java rename to src/test/java/roomescape/system/auth/business/AuthServiceTest.java index 776a4a54..0bcfcd26 100644 --- a/src/test/java/roomescape/system/auth/service/AuthServiceTest.java +++ b/src/test/java/roomescape/system/auth/business/AuthServiceTest.java @@ -1,4 +1,4 @@ -package roomescape.system.auth.service; +package roomescape.system.auth.business; import static org.assertj.core.api.Assertions.*; @@ -13,9 +13,10 @@ import roomescape.member.business.MemberService; import roomescape.member.infrastructure.persistence.Member; import roomescape.member.infrastructure.persistence.MemberRepository; import roomescape.member.infrastructure.persistence.Role; -import roomescape.system.auth.dto.LoginRequest; -import roomescape.system.auth.jwt.JwtHandler; -import roomescape.system.auth.jwt.dto.TokenDto; +import roomescape.system.auth.service.AuthService; +import roomescape.system.auth.web.LoginRequest; +import roomescape.system.auth.infrastructure.jwt.JwtHandler; +import roomescape.system.auth.infrastructure.jwt.TokenDto; import roomescape.system.exception.RoomEscapeException; @SpringBootTest diff --git a/src/test/java/roomescape/system/auth/controller/AuthControllerTest.java b/src/test/java/roomescape/system/auth/web/AuthControllerTest.java similarity index 98% rename from src/test/java/roomescape/system/auth/controller/AuthControllerTest.java rename to src/test/java/roomescape/system/auth/web/AuthControllerTest.java index 2bd51dd1..a3c2a274 100644 --- a/src/test/java/roomescape/system/auth/controller/AuthControllerTest.java +++ b/src/test/java/roomescape/system/auth/web/AuthControllerTest.java @@ -1,4 +1,4 @@ -package roomescape.system.auth.controller; +package roomescape.system.auth.web; import static org.assertj.core.api.Assertions.*; import static org.hamcrest.Matchers.*; -- 2.47.2 From c4af933ee54b791e3d0906d6d43e4741176f9e08 Mon Sep 17 00:00:00 2001 From: pricelees Date: Sun, 13 Jul 2025 20:31:59 +0900 Subject: [PATCH 15/37] Rename .java to .kt --- .../roomescape/system/auth/web/support/{Admin.java => Admin.kt} | 0 .../auth/web/support/{LoginRequired.java => LoginRequired.kt} | 0 .../system/auth/web/support/{MemberId.java => MemberId.kt} | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename src/main/java/roomescape/system/auth/web/support/{Admin.java => Admin.kt} (100%) rename src/main/java/roomescape/system/auth/web/support/{LoginRequired.java => LoginRequired.kt} (100%) rename src/main/java/roomescape/system/auth/web/support/{MemberId.java => MemberId.kt} (100%) diff --git a/src/main/java/roomescape/system/auth/web/support/Admin.java b/src/main/java/roomescape/system/auth/web/support/Admin.kt similarity index 100% rename from src/main/java/roomescape/system/auth/web/support/Admin.java rename to src/main/java/roomescape/system/auth/web/support/Admin.kt diff --git a/src/main/java/roomescape/system/auth/web/support/LoginRequired.java b/src/main/java/roomescape/system/auth/web/support/LoginRequired.kt similarity index 100% rename from src/main/java/roomescape/system/auth/web/support/LoginRequired.java rename to src/main/java/roomescape/system/auth/web/support/LoginRequired.kt diff --git a/src/main/java/roomescape/system/auth/web/support/MemberId.java b/src/main/java/roomescape/system/auth/web/support/MemberId.kt similarity index 100% rename from src/main/java/roomescape/system/auth/web/support/MemberId.java rename to src/main/java/roomescape/system/auth/web/support/MemberId.kt -- 2.47.2 From 1a0ec9d428a220ba9c1a3f38163834c7741c3436 Mon Sep 17 00:00:00 2001 From: pricelees Date: Sun, 13 Jul 2025 20:31:59 +0900 Subject: [PATCH 16/37] =?UTF-8?q?refactor:=20=EC=96=B4=EB=85=B8=ED=85=8C?= =?UTF-8?q?=EC=9D=B4=EC=85=98=20=EC=BD=94=ED=8B=80=EB=A6=B0=20=EC=A0=84?= =?UTF-8?q?=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../roomescape/system/auth/web/support/Admin.kt | 14 ++++---------- .../system/auth/web/support/LoginRequired.kt | 14 ++++---------- .../roomescape/system/auth/web/support/MemberId.kt | 14 ++++---------- 3 files changed, 12 insertions(+), 30 deletions(-) diff --git a/src/main/java/roomescape/system/auth/web/support/Admin.kt b/src/main/java/roomescape/system/auth/web/support/Admin.kt index 683f151e..5e5285e7 100644 --- a/src/main/java/roomescape/system/auth/web/support/Admin.kt +++ b/src/main/java/roomescape/system/auth/web/support/Admin.kt @@ -1,11 +1,5 @@ -package roomescape.system.auth.web.support; +package roomescape.system.auth.web.support -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -@Target(ElementType.METHOD) -@Retention(RetentionPolicy.RUNTIME) -public @interface Admin { -} +@Target(AnnotationTarget.FUNCTION) +@Retention(AnnotationRetention.RUNTIME) +annotation class Admin diff --git a/src/main/java/roomescape/system/auth/web/support/LoginRequired.kt b/src/main/java/roomescape/system/auth/web/support/LoginRequired.kt index cbbfa3d7..0e751ded 100644 --- a/src/main/java/roomescape/system/auth/web/support/LoginRequired.kt +++ b/src/main/java/roomescape/system/auth/web/support/LoginRequired.kt @@ -1,11 +1,5 @@ -package roomescape.system.auth.web.support; +package roomescape.system.auth.web.support -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -@Target(ElementType.METHOD) -@Retention(RetentionPolicy.RUNTIME) -public @interface LoginRequired { -} +@Target(AnnotationTarget.FUNCTION) +@Retention(AnnotationRetention.RUNTIME) +annotation class LoginRequired diff --git a/src/main/java/roomescape/system/auth/web/support/MemberId.kt b/src/main/java/roomescape/system/auth/web/support/MemberId.kt index ca2b5752..45711d4f 100644 --- a/src/main/java/roomescape/system/auth/web/support/MemberId.kt +++ b/src/main/java/roomescape/system/auth/web/support/MemberId.kt @@ -1,11 +1,5 @@ -package roomescape.system.auth.web.support; +package roomescape.system.auth.web.support -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -@Target(ElementType.PARAMETER) -@Retention(RetentionPolicy.RUNTIME) -public @interface MemberId { -} +@Target(AnnotationTarget.VALUE_PARAMETER) +@Retention(AnnotationRetention.RUNTIME) +annotation class MemberId -- 2.47.2 From 636a4abe6be3d1085a3a7292630404e70e571378 Mon Sep 17 00:00:00 2001 From: pricelees Date: Sun, 13 Jul 2025 20:32:55 +0900 Subject: [PATCH 17/37] =?UTF-8?q?feat:=20=EC=BF=A0=ED=82=A4=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20=ED=99=95=EC=9E=A5=ED=95=A8=EC=88=98=EA=B0=80=20?= =?UTF-8?q?=EC=A0=95=EC=9D=98=EB=90=9C=20=EC=9C=A0=ED=8B=B8=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../system/auth/web/support/CookieUtils.kt | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 src/main/java/roomescape/system/auth/web/support/CookieUtils.kt diff --git a/src/main/java/roomescape/system/auth/web/support/CookieUtils.kt b/src/main/java/roomescape/system/auth/web/support/CookieUtils.kt new file mode 100644 index 00000000..77d33b44 --- /dev/null +++ b/src/main/java/roomescape/system/auth/web/support/CookieUtils.kt @@ -0,0 +1,27 @@ +package roomescape.system.auth.web.support + +import jakarta.servlet.http.Cookie +import jakarta.servlet.http.HttpServletRequest +import jakarta.servlet.http.HttpServletResponse +import roomescape.system.auth.web.TokenResponse + +const val ACCESS_TOKEN_COOKIE_NAME = "accessToken" + +fun Cookie.expire(): Unit { + this.value = "" + this.maxAge = 0 +} + +fun TokenResponse.toCookie(): Cookie = Cookie(ACCESS_TOKEN_COOKIE_NAME, this.accessToken) + .also { it.maxAge = 1800000 } + +fun HttpServletRequest.accessTokenCookie(): Cookie = this.cookies + ?.firstOrNull { it.name == ACCESS_TOKEN_COOKIE_NAME } + ?: Cookie(ACCESS_TOKEN_COOKIE_NAME, "") + +fun HttpServletResponse.addAccessTokenCookie(cookie: Cookie) { + cookie.isHttpOnly = true + cookie.secure = true + cookie.path = "/" + this.addCookie(cookie) +} -- 2.47.2 From f3cc46d8de22b80a731301f06bdc61e19c7ea731 Mon Sep 17 00:00:00 2001 From: pricelees Date: Sun, 13 Jul 2025 20:33:51 +0900 Subject: [PATCH 18/37] =?UTF-8?q?feat:=20'=EC=98=88=EC=83=81=EC=B9=98=20?= =?UTF-8?q?=EB=AA=BB=ED=95=9C=20=EC=98=88=EC=99=B8'=20=EC=BD=94=EB=93=9C?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/roomescape/system/exception/ErrorType.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/roomescape/system/exception/ErrorType.java b/src/main/java/roomescape/system/exception/ErrorType.java index ab026a3f..b99be8d1 100644 --- a/src/main/java/roomescape/system/exception/ErrorType.java +++ b/src/main/java/roomescape/system/exception/ErrorType.java @@ -43,6 +43,7 @@ public enum ErrorType { // 500 Internal Server Error, INTERNAL_SERVER_ERROR("서버 내부에서 에러가 발생하였습니다."), + UNEXPECTED_ERROR("예상치 못한 에러가 발생하였습니다. 잠시 후 다시 시도해주세요."), // Payment Error PAYMENT_ERROR("결제(취소)에 실패했습니다. 결제(취소) 정보를 확인해주세요."), -- 2.47.2 From 484bd9da04de7643dd0e5459582f36aba8b5d5f7 Mon Sep 17 00:00:00 2001 From: pricelees Date: Sun, 13 Jul 2025 20:34:31 +0900 Subject: [PATCH 19/37] =?UTF-8?q?feat:=20MemberService=EC=97=90=20id?= =?UTF-8?q?=EB=A1=9C=20=EC=A1=B4=EC=9E=AC=20=EC=97=AC=EB=B6=80=20=ED=99=95?= =?UTF-8?q?=EC=9D=B8=20=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/roomescape/member/business/MemberService.kt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/roomescape/member/business/MemberService.kt b/src/main/java/roomescape/member/business/MemberService.kt index af7b60f1..f52269f4 100644 --- a/src/main/java/roomescape/member/business/MemberService.kt +++ b/src/main/java/roomescape/member/business/MemberService.kt @@ -36,5 +36,8 @@ class MemberService( String.format("[email: %s, password: %s]", email, password), HttpStatus.BAD_REQUEST ) + + fun existsById(memberId: Long): Boolean = memberRepository.existsById(memberId) + } -- 2.47.2 From 4635699e460bbb921548ff0ccb2d469c7c9e186a Mon Sep 17 00:00:00 2001 From: pricelees Date: Sun, 13 Jul 2025 20:35:31 +0900 Subject: [PATCH 20/37] Rename .java to .kt --- .../web/support/{MemberIdResolver.java => MemberIdResolver.kt} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/main/java/roomescape/system/auth/web/support/{MemberIdResolver.java => MemberIdResolver.kt} (100%) diff --git a/src/main/java/roomescape/system/auth/web/support/MemberIdResolver.java b/src/main/java/roomescape/system/auth/web/support/MemberIdResolver.kt similarity index 100% rename from src/main/java/roomescape/system/auth/web/support/MemberIdResolver.java rename to src/main/java/roomescape/system/auth/web/support/MemberIdResolver.kt -- 2.47.2 From 8371559978f4598db91537a85991eb369cf950af Mon Sep 17 00:00:00 2001 From: pricelees Date: Sun, 13 Jul 2025 20:35:31 +0900 Subject: [PATCH 21/37] =?UTF-8?q?refactor:=20CookieUtils=EB=A5=BC=20?= =?UTF-8?q?=ED=99=9C=EC=9A=A9=ED=95=9C=20MemberIdResolver=20=EC=BD=94?= =?UTF-8?q?=ED=8B=80=EB=A6=B0=20=EC=A0=84=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../auth/web/support/MemberIdResolver.kt | 71 +++++++------------ 1 file changed, 26 insertions(+), 45 deletions(-) diff --git a/src/main/java/roomescape/system/auth/web/support/MemberIdResolver.kt b/src/main/java/roomescape/system/auth/web/support/MemberIdResolver.kt index 987b0985..a22d5fc5 100644 --- a/src/main/java/roomescape/system/auth/web/support/MemberIdResolver.kt +++ b/src/main/java/roomescape/system/auth/web/support/MemberIdResolver.kt @@ -1,52 +1,33 @@ -package roomescape.system.auth.web.support; +package roomescape.system.auth.web.support -import java.util.Arrays; - -import org.springframework.core.MethodParameter; -import org.springframework.http.HttpStatus; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.support.WebDataBinderFactory; -import org.springframework.web.context.request.NativeWebRequest; -import org.springframework.web.method.support.HandlerMethodArgumentResolver; -import org.springframework.web.method.support.ModelAndViewContainer; - -import jakarta.servlet.http.Cookie; -import jakarta.servlet.http.HttpServletRequest; -import roomescape.system.auth.infrastructure.jwt.JwtHandler; -import roomescape.system.exception.ErrorType; -import roomescape.system.exception.RoomEscapeException; +import jakarta.servlet.http.HttpServletRequest +import org.springframework.core.MethodParameter +import org.springframework.stereotype.Component +import org.springframework.web.bind.support.WebDataBinderFactory +import org.springframework.web.context.request.NativeWebRequest +import org.springframework.web.method.support.HandlerMethodArgumentResolver +import org.springframework.web.method.support.ModelAndViewContainer +import roomescape.system.auth.infrastructure.jwt.JwtHandler @Component -public class MemberIdResolver implements HandlerMethodArgumentResolver { +class MemberIdResolver( + private val jwtHandler: JwtHandler +) : HandlerMethodArgumentResolver { - private static final String ACCESS_TOKEN_COOKIE_NAME = "accessToken"; + override fun supportsParameter(parameter: MethodParameter): Boolean { + return parameter.hasParameterAnnotation(MemberId::class.java) + } - private final JwtHandler jwtHandler; + @Throws(Exception::class) + override fun resolveArgument( + parameter: MethodParameter, + mavContainer: ModelAndViewContainer?, + webRequest: NativeWebRequest, + binderFactory: WebDataBinderFactory? + ): Any { + val request: HttpServletRequest = webRequest.nativeRequest as HttpServletRequest + val token: String = request.accessTokenCookie().value - public MemberIdResolver(JwtHandler jwtHandler) { - this.jwtHandler = jwtHandler; - } - - @Override - public boolean supportsParameter(MethodParameter parameter) { - return parameter.hasParameterAnnotation(MemberId.class); - } - - @Override - public Object resolveArgument( - MethodParameter parameter, - ModelAndViewContainer mavContainer, - NativeWebRequest webRequest, - WebDataBinderFactory binderFactory - ) throws Exception { - Cookie[] cookies = webRequest.getNativeRequest(HttpServletRequest.class).getCookies(); - if (cookies == null) { - throw new RoomEscapeException(ErrorType.NOT_EXIST_COOKIE, HttpStatus.UNAUTHORIZED); - } - return Arrays.stream(cookies) - .filter(cookie -> cookie.getName().equals(ACCESS_TOKEN_COOKIE_NAME)) - .findAny() - .map(cookie -> jwtHandler.getMemberIdFromToken(cookie.getValue())) - .orElseThrow(() -> new RoomEscapeException(ErrorType.INVALID_TOKEN, HttpStatus.UNAUTHORIZED)); - } + return jwtHandler.getMemberIdFromToken(token) + } } -- 2.47.2 From 61ac2f15bf20f501b1cc29d879e439d020b79930 Mon Sep 17 00:00:00 2001 From: pricelees Date: Sun, 13 Jul 2025 20:46:37 +0900 Subject: [PATCH 22/37] =?UTF-8?q?refactor:=20=EC=9D=B8=ED=84=B0=EC=85=89?= =?UTF-8?q?=ED=84=B0=20=EC=BD=94=ED=8B=80=EB=A6=B0=20=EC=A0=84=ED=99=98=20?= =?UTF-8?q?=EB=B0=8F=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=ED=86=B5=ED=95=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../auth/web/support/AdminInterceptor.java | 85 ------------------ .../auth/web/support/AuthInterceptors.kt | 90 +++++++++++++++++++ .../auth/web/support/LoginInterceptor.java | 78 ---------------- 3 files changed, 90 insertions(+), 163 deletions(-) delete mode 100644 src/main/java/roomescape/system/auth/web/support/AdminInterceptor.java create mode 100644 src/main/java/roomescape/system/auth/web/support/AuthInterceptors.kt delete mode 100644 src/main/java/roomescape/system/auth/web/support/LoginInterceptor.java diff --git a/src/main/java/roomescape/system/auth/web/support/AdminInterceptor.java b/src/main/java/roomescape/system/auth/web/support/AdminInterceptor.java deleted file mode 100644 index 6fc60e79..00000000 --- a/src/main/java/roomescape/system/auth/web/support/AdminInterceptor.java +++ /dev/null @@ -1,85 +0,0 @@ -package roomescape.system.auth.web.support; - -import java.util.Arrays; - -import org.springframework.http.HttpStatus; -import org.springframework.stereotype.Component; -import org.springframework.web.method.HandlerMethod; -import org.springframework.web.servlet.HandlerInterceptor; - -import jakarta.servlet.http.Cookie; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; -import roomescape.member.business.MemberService; -import roomescape.member.infrastructure.persistence.Member; -import roomescape.system.auth.infrastructure.jwt.JwtHandler; -import roomescape.system.exception.ErrorType; -import roomescape.system.exception.RoomEscapeException; - -@Component -public class AdminInterceptor implements HandlerInterceptor { - - private static final String ACCESS_TOKEN_COOKIE_NAME = "accessToken"; - private final MemberService memberService; - private final JwtHandler jwtHandler; - - public AdminInterceptor(MemberService memberService, JwtHandler jwtHandler) { - this.memberService = memberService; - this.jwtHandler = jwtHandler; - } - - @Override - public boolean preHandle( - HttpServletRequest request, - HttpServletResponse response, - Object handler - ) - throws Exception { - if (isHandlerIrrelevantWithAdmin(handler)) { - return true; - } - - Member member; - try { - Cookie token = getToken(request); - Long memberId = jwtHandler.getMemberIdFromToken(token.getValue()); - member = memberService.findById(memberId); - } catch (RoomEscapeException e) { - response.sendRedirect("/login"); - throw e; - } - - if (member.isAdmin()) { - return true; - } else { - response.sendRedirect("/login"); - throw new RoomEscapeException(ErrorType.PERMISSION_DOES_NOT_EXIST, - String.format("[memberId: %d, Role: %s]", member.getId(), member.getRole()), HttpStatus.FORBIDDEN); - } - } - - private Cookie getToken(HttpServletRequest request) { - validateCookieHeader(request); - - Cookie[] cookies = request.getCookies(); - return Arrays.stream(cookies) - .filter(cookie -> cookie.getName().equals(ACCESS_TOKEN_COOKIE_NAME)) - .findAny() - .orElseThrow(() -> new RoomEscapeException(ErrorType.INVALID_TOKEN, HttpStatus.UNAUTHORIZED)); - } - - private void validateCookieHeader(HttpServletRequest request) { - String cookieHeader = request.getHeader("Cookie"); - if (cookieHeader == null) { - throw new RoomEscapeException(ErrorType.NOT_EXIST_COOKIE, HttpStatus.UNAUTHORIZED); - } - } - - private boolean isHandlerIrrelevantWithAdmin(Object handler) { - if (!(handler instanceof HandlerMethod handlerMethod)) { - return true; - } - Admin adminAnnotation = handlerMethod.getMethodAnnotation(Admin.class); - return adminAnnotation == null; - } -} diff --git a/src/main/java/roomescape/system/auth/web/support/AuthInterceptors.kt b/src/main/java/roomescape/system/auth/web/support/AuthInterceptors.kt new file mode 100644 index 00000000..7ef82712 --- /dev/null +++ b/src/main/java/roomescape/system/auth/web/support/AuthInterceptors.kt @@ -0,0 +1,90 @@ +package roomescape.system.auth.web.support + +import jakarta.servlet.http.HttpServletRequest +import jakarta.servlet.http.HttpServletResponse +import org.springframework.http.HttpStatus +import org.springframework.stereotype.Component +import org.springframework.web.method.HandlerMethod +import org.springframework.web.servlet.HandlerInterceptor +import roomescape.member.business.MemberService +import roomescape.member.infrastructure.persistence.Member +import roomescape.system.auth.infrastructure.jwt.JwtHandler +import roomescape.system.exception.ErrorType +import roomescape.system.exception.RoomEscapeException + +private fun Any.isIrrelevantWith(annotationType: Class): Boolean { + if (this !is HandlerMethod) { + return true + } + return !this.hasMethodAnnotation(annotationType) +} + +@Component +class LoginInterceptor( + private val memberService: MemberService, + private val jwtHandler: JwtHandler +) : HandlerInterceptor { + + @Throws(Exception::class) + override fun preHandle( + request: HttpServletRequest, + response: HttpServletResponse, + handler: Any + ): Boolean { + if (handler.isIrrelevantWith(LoginRequired::class.java)) { + return true + } + + try { + val token: String? = request.accessTokenCookie().value + val memberId: Long = jwtHandler.getMemberIdFromToken(token) + + return memberService.existsById(memberId) + } catch (e: RoomEscapeException) { + response.sendRedirect("/login") + throw RoomEscapeException(ErrorType.LOGIN_REQUIRED, HttpStatus.FORBIDDEN) + } + } +} + +@Component +class AdminInterceptor( + private val memberService: MemberService, + private val jwtHandler: JwtHandler +) : HandlerInterceptor { + + @Throws(Exception::class) + override fun preHandle( + request: HttpServletRequest, + response: HttpServletResponse, + handler: Any + ): Boolean { + if (handler.isIrrelevantWith(Admin::class.java)) { + return true + } + + val member: Member? + + try { + val token: String? = request.accessTokenCookie().value + val memberId: Long = jwtHandler.getMemberIdFromToken(token) + member = memberService.findById(memberId) + } catch (e: RoomEscapeException) { + response.sendRedirect("/login") + throw e + } + + with(member) { + if (this.isAdmin()) { + return true + } + + response.sendRedirect("/login") + throw RoomEscapeException( + ErrorType.PERMISSION_DOES_NOT_EXIST, + String.format("[memberId: %d, Role: %s]", this.id, this.role), + HttpStatus.FORBIDDEN + ) + } + } +} diff --git a/src/main/java/roomescape/system/auth/web/support/LoginInterceptor.java b/src/main/java/roomescape/system/auth/web/support/LoginInterceptor.java deleted file mode 100644 index eed33819..00000000 --- a/src/main/java/roomescape/system/auth/web/support/LoginInterceptor.java +++ /dev/null @@ -1,78 +0,0 @@ -package roomescape.system.auth.web.support; - -import java.util.Arrays; - -import org.springframework.http.HttpStatus; -import org.springframework.stereotype.Component; -import org.springframework.web.method.HandlerMethod; -import org.springframework.web.servlet.HandlerInterceptor; - -import jakarta.servlet.http.Cookie; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; -import roomescape.member.business.MemberService; -import roomescape.member.infrastructure.persistence.Member; -import roomescape.system.auth.infrastructure.jwt.JwtHandler; -import roomescape.system.exception.ErrorType; -import roomescape.system.exception.RoomEscapeException; - -@Component -public class LoginInterceptor implements HandlerInterceptor { - - private static final String ACCESS_TOKEN_COOKIE_NAME = "accessToken"; - private final MemberService memberService; - private final JwtHandler jwtHandler; - - public LoginInterceptor(MemberService memberService, JwtHandler jwtHandler) { - this.memberService = memberService; - this.jwtHandler = jwtHandler; - } - - @Override - public boolean preHandle( - HttpServletRequest request, - HttpServletResponse response, - Object handler - ) - throws Exception { - if (isHandlerIrrelevantWithLoginRequired(handler)) { - return true; - } - - Member member; - try { - Cookie token = getToken(request); - Long memberId = jwtHandler.getMemberIdFromToken(token.getValue()); - member = memberService.findById(memberId); - return member != null; - } catch (RoomEscapeException e) { - response.sendRedirect("/login"); - throw new RoomEscapeException(ErrorType.LOGIN_REQUIRED, HttpStatus.FORBIDDEN); - } - } - - private Cookie getToken(HttpServletRequest request) { - validateCookieHeader(request); - - Cookie[] cookies = request.getCookies(); - return Arrays.stream(cookies) - .filter(cookie -> cookie.getName().equals(ACCESS_TOKEN_COOKIE_NAME)) - .findAny() - .orElseThrow(() -> new RoomEscapeException(ErrorType.INVALID_TOKEN, HttpStatus.UNAUTHORIZED)); - } - - private void validateCookieHeader(HttpServletRequest request) { - String cookieHeader = request.getHeader("Cookie"); - if (cookieHeader == null) { - throw new RoomEscapeException(ErrorType.NOT_EXIST_COOKIE, HttpStatus.UNAUTHORIZED); - } - } - - private boolean isHandlerIrrelevantWithLoginRequired(Object handler) { - if (!(handler instanceof HandlerMethod handlerMethod)) { - return true; - } - LoginRequired loginRequiredAnnotation = handlerMethod.getMethodAnnotation(LoginRequired.class); - return loginRequiredAnnotation == null; - } -} \ No newline at end of file -- 2.47.2 From 21d96f28809791f6b79985093a1aa55582a05e13 Mon Sep 17 00:00:00 2001 From: pricelees Date: Sun, 13 Jul 2025 20:47:14 +0900 Subject: [PATCH 23/37] =?UTF-8?q?refactor:=20auth=20=ED=8C=A8=ED=82=A4?= =?UTF-8?q?=EC=A7=80=20=EB=82=B4=20DTO=20=EC=BD=94=ED=8B=80=EB=A6=B0=20?= =?UTF-8?q?=EC=A0=84=ED=99=98=20=EB=B0=8F=20=ED=81=B4=EB=9E=98=EC=8A=A4=20?= =?UTF-8?q?=ED=86=B5=ED=95=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../auth/infrastructure/jwt/TokenDto.java | 4 --- .../roomescape/system/auth/web/AuthDTO.kt | 30 +++++++++++++++++++ .../system/auth/web/LoginCheckResponse.java | 9 ------ .../system/auth/web/LoginRequest.java | 17 ----------- 4 files changed, 30 insertions(+), 30 deletions(-) delete mode 100644 src/main/java/roomescape/system/auth/infrastructure/jwt/TokenDto.java create mode 100644 src/main/java/roomescape/system/auth/web/AuthDTO.kt delete mode 100644 src/main/java/roomescape/system/auth/web/LoginCheckResponse.java delete mode 100644 src/main/java/roomescape/system/auth/web/LoginRequest.java diff --git a/src/main/java/roomescape/system/auth/infrastructure/jwt/TokenDto.java b/src/main/java/roomescape/system/auth/infrastructure/jwt/TokenDto.java deleted file mode 100644 index 70e0f4f3..00000000 --- a/src/main/java/roomescape/system/auth/infrastructure/jwt/TokenDto.java +++ /dev/null @@ -1,4 +0,0 @@ -package roomescape.system.auth.infrastructure.jwt; - -public record TokenDto(String accessToken) { -} diff --git a/src/main/java/roomescape/system/auth/web/AuthDTO.kt b/src/main/java/roomescape/system/auth/web/AuthDTO.kt new file mode 100644 index 00000000..05ef0b32 --- /dev/null +++ b/src/main/java/roomescape/system/auth/web/AuthDTO.kt @@ -0,0 +1,30 @@ +package roomescape.system.auth.web + +import io.swagger.v3.oas.annotations.media.Schema +import jakarta.validation.constraints.Email +import jakarta.validation.constraints.NotBlank + +@JvmRecord +data class TokenResponse( + val accessToken: String +) + + +@Schema(name = "로그인 체크 응답", description = "로그인 상태 체크 응답시 사용됩니다.") +@JvmRecord +data class LoginCheckResponse( + @field:Schema(description = "로그인된 회원의 이름") + val name: String +) + +@Schema(name = "로그인 요청", description = "로그인 요청 시 사용됩니다.") +@JvmRecord +data class LoginRequest( + @Email(message = "이메일 형식이 일치하지 않습니다. 예시: abc123@gmail.com") + @field:Schema(description = "필수 값이며, 이메일 형식으로 입력해야 합니다.", example = "abc123@gmail.com") + val email: String, + + @NotBlank(message = "비밀번호는 공백일 수 없습니다.") + @field:Schema(description = "최소 1글자 이상 입력해야 합니다.") + val password: String +) diff --git a/src/main/java/roomescape/system/auth/web/LoginCheckResponse.java b/src/main/java/roomescape/system/auth/web/LoginCheckResponse.java deleted file mode 100644 index 3388aa5e..00000000 --- a/src/main/java/roomescape/system/auth/web/LoginCheckResponse.java +++ /dev/null @@ -1,9 +0,0 @@ -package roomescape.system.auth.web; - -import io.swagger.v3.oas.annotations.media.Schema; - -@Schema(name = "로그인 체크 응답", description = "로그인 상태 체크 응답시 사용됩니다.") -public record LoginCheckResponse( - @Schema(description = "로그인된 회원의 이름") String name -) { -} diff --git a/src/main/java/roomescape/system/auth/web/LoginRequest.java b/src/main/java/roomescape/system/auth/web/LoginRequest.java deleted file mode 100644 index 8c314df7..00000000 --- a/src/main/java/roomescape/system/auth/web/LoginRequest.java +++ /dev/null @@ -1,17 +0,0 @@ -package roomescape.system.auth.web; - -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.Email; -import jakarta.validation.constraints.NotBlank; - -@Schema(name = "로그인 요청", description = "로그인 요청 시 사용됩니다.") -public record LoginRequest( - @NotBlank(message = "이메일은 null 또는 공백일 수 없습니다.") - @Email(message = "이메일 형식이 일치하지 않습니다. 예시: abc123@gmail.com)") - @Schema(description = "필수 값이며, 이메일 형식으로 입력해야 합니다.", example = "abc123@gmail.com") - String email, - @NotBlank(message = "비밀번호는 null 또는 공백일 수 없습니다.") - @Schema(description = "최소 1글자 이상 입력해야 합니다.") - String password -) { -} -- 2.47.2 From fb3b28e8cd84addc8be387e593b9f70914e6479a Mon Sep 17 00:00:00 2001 From: pricelees Date: Sun, 13 Jul 2025 20:48:04 +0900 Subject: [PATCH 24/37] Rename .java to .kt --- .../system/auth/web/{AuthController.java => AuthController.kt} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/main/java/roomescape/system/auth/web/{AuthController.java => AuthController.kt} (100%) diff --git a/src/main/java/roomescape/system/auth/web/AuthController.java b/src/main/java/roomescape/system/auth/web/AuthController.kt similarity index 100% rename from src/main/java/roomescape/system/auth/web/AuthController.java rename to src/main/java/roomescape/system/auth/web/AuthController.kt -- 2.47.2 From 13b0de16e968c6220f4676c787f8f46f0a0249d6 Mon Sep 17 00:00:00 2001 From: pricelees Date: Sun, 13 Jul 2025 20:48:05 +0900 Subject: [PATCH 25/37] =?UTF-8?q?refactor:=20AuthController=20=EC=BD=94?= =?UTF-8?q?=ED=8B=80=EB=A6=B0=20=EC=A0=84=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - API Docs 관련 정보를 담고 있는 AuthAPI 추가 및 구현 - CookieUtils를 사용하여 불필요한 컨트롤러 로직 제거 --- .../roomescape/system/auth/web/AuthAPI.kt | 67 +++++++++ .../system/auth/web/AuthController.kt | 132 ++++++------------ 2 files changed, 110 insertions(+), 89 deletions(-) create mode 100644 src/main/java/roomescape/system/auth/web/AuthAPI.kt diff --git a/src/main/java/roomescape/system/auth/web/AuthAPI.kt b/src/main/java/roomescape/system/auth/web/AuthAPI.kt new file mode 100644 index 00000000..27dd2ecd --- /dev/null +++ b/src/main/java/roomescape/system/auth/web/AuthAPI.kt @@ -0,0 +1,67 @@ +package roomescape.system.auth.web + +import io.swagger.v3.oas.annotations.Operation +import io.swagger.v3.oas.annotations.Parameter +import io.swagger.v3.oas.annotations.media.Content +import io.swagger.v3.oas.annotations.media.Schema +import io.swagger.v3.oas.annotations.responses.ApiResponse +import io.swagger.v3.oas.annotations.responses.ApiResponses +import io.swagger.v3.oas.annotations.tags.Tag +import jakarta.servlet.http.HttpServletRequest +import jakarta.servlet.http.HttpServletResponse +import jakarta.validation.Valid +import org.springframework.http.HttpStatus +import org.springframework.web.bind.annotation.RequestBody +import org.springframework.web.bind.annotation.ResponseStatus +import roomescape.system.auth.web.support.LoginRequired +import roomescape.system.auth.web.support.MemberId +import roomescape.system.dto.response.ErrorResponse +import roomescape.system.dto.response.RoomEscapeApiResponse + +@Tag(name = "1. 인증 / 인가 API", description = "로그인, 로그아웃 및 로그인 상태를 확인합니다") +interface AuthAPI { + + @ResponseStatus(HttpStatus.OK) + @Operation(summary = "로그인") + @ApiResponses( + ApiResponse( + responseCode = "200", + description = "로그인 성공시 쿠키에 토큰 정보를 저장합니다." + ), + ApiResponse( + responseCode = "400", + description = "존재하지 않는 회원이거나, 이메일 또는 비밀번호가 잘못 입력되었습니다.", + content = [Content(schema = Schema(implementation = ErrorResponse::class))] + ) + ) + fun login( + @Valid @RequestBody loginRequest: LoginRequest, + response: HttpServletResponse + ): RoomEscapeApiResponse + + @ResponseStatus(HttpStatus.OK) + @Operation(summary = "로그인 상태 확인") + @ApiResponses( + ApiResponse( + responseCode = "200", + description = "로그인 상태이며, 로그인된 회원의 이름을 반환합니다." + ), + ApiResponse( + responseCode = "400", + description = "쿠키에 있는 토큰 정보로 회원을 조회할 수 없습니다.", + content = [Content(schema = Schema(implementation = ErrorResponse::class))] + ), + ApiResponse( + responseCode = "401", + description = "토큰 정보가 없거나, 만료되었습니다.", + content = [Content(schema = Schema(implementation = ErrorResponse::class))] + ) + ) + fun checkLogin(@MemberId @Parameter(hidden = true) memberId: Long): RoomEscapeApiResponse + + @LoginRequired + @ResponseStatus(HttpStatus.OK) + @Operation(summary = "로그아웃", tags = ["로그인이 필요한 API"]) + @ApiResponses(ApiResponse(responseCode = "200", description = "로그아웃 성공시 쿠키에 저장된 토큰 정보를 삭제합니다.")) + fun logout(request: HttpServletRequest, response: HttpServletResponse): RoomEscapeApiResponse +} diff --git a/src/main/java/roomescape/system/auth/web/AuthController.kt b/src/main/java/roomescape/system/auth/web/AuthController.kt index d7e72f5a..2008a124 100644 --- a/src/main/java/roomescape/system/auth/web/AuthController.kt +++ b/src/main/java/roomescape/system/auth/web/AuthController.kt @@ -1,100 +1,54 @@ -package roomescape.system.auth.web; +package roomescape.system.auth.web -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.ResponseStatus; -import org.springframework.web.bind.annotation.RestController; - -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.media.Content; -import io.swagger.v3.oas.annotations.media.Schema; -import io.swagger.v3.oas.annotations.responses.ApiResponse; -import io.swagger.v3.oas.annotations.responses.ApiResponses; -import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.servlet.http.Cookie; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; -import jakarta.validation.Valid; -import roomescape.system.auth.web.support.LoginRequired; -import roomescape.system.auth.web.support.MemberId; -import roomescape.system.auth.infrastructure.jwt.TokenDto; -import roomescape.system.auth.service.AuthService; -import roomescape.system.dto.response.ErrorResponse; -import roomescape.system.dto.response.RoomEscapeApiResponse; +import io.swagger.v3.oas.annotations.Parameter +import jakarta.servlet.http.Cookie +import jakarta.servlet.http.HttpServletRequest +import jakarta.servlet.http.HttpServletResponse +import jakarta.validation.Valid +import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.PostMapping +import org.springframework.web.bind.annotation.RequestBody +import org.springframework.web.bind.annotation.RestController +import roomescape.system.auth.service.AuthService +import roomescape.system.auth.web.support.* +import roomescape.system.dto.response.RoomEscapeApiResponse @RestController -@Tag(name = "1. 인증 / 인가 API", description = "로그인, 로그아웃 및 로그인 상태를 확인합니다") -public class AuthController { +class AuthController( + private val authService: AuthService +) : AuthAPI { - private final AuthService authService; + @PostMapping("/login") + override fun login( + @Valid @RequestBody loginRequest: LoginRequest, + response: HttpServletResponse + ): RoomEscapeApiResponse { + val accessToken: TokenResponse = authService.login(loginRequest) + val cookie: Cookie = accessToken.toCookie() - public AuthController(AuthService authService) { - this.authService = authService; - } + response.addAccessTokenCookie(cookie) - @PostMapping("/login") - @ResponseStatus(HttpStatus.OK) - @Operation(summary = "로그인") - @ApiResponses({ - @ApiResponse(responseCode = "200", description = "로그인 성공시 쿠키에 토큰 정보를 저장합니다."), - @ApiResponse(responseCode = "400", description = "존재하지 않는 회원이거나, 이메일 또는 비밀번호가 잘못 입력되었습니다.", - content = @Content(schema = @Schema(implementation = ErrorResponse.class))) - }) - public RoomEscapeApiResponse login( - @Valid @RequestBody LoginRequest loginRequest, - HttpServletResponse response - ) { - TokenDto tokenInfo = authService.login(loginRequest); - addCookieToResponse(new Cookie("accessToken", tokenInfo.accessToken()), response); - return RoomEscapeApiResponse.success(); - } + return RoomEscapeApiResponse.success() + } - @GetMapping("/login/check") - @ResponseStatus(HttpStatus.OK) - @Operation(summary = "로그인 상태 확인") - @ApiResponses({ - @ApiResponse(responseCode = "200", description = "로그인 상태이며, 로그인된 회원의 이름을 반환합니다."), - @ApiResponse(responseCode = "400", description = "쿠키에 있는 토큰 정보로 회원을 조회할 수 없습니다.", - content = @Content(schema = @Schema(implementation = ErrorResponse.class))), - }) - public RoomEscapeApiResponse checkLogin(@MemberId @Parameter(hidden = true) Long memberId) { - LoginCheckResponse response = authService.checkLogin(memberId); - return RoomEscapeApiResponse.success(response); - } + @GetMapping("/login/check") + override fun checkLogin( + @MemberId @Parameter(hidden = true) memberId: Long + ): RoomEscapeApiResponse { + val response = authService.checkLogin(memberId) - @LoginRequired - @PostMapping("/logout") - @ResponseStatus(HttpStatus.OK) - @Operation(summary = "로그아웃", tags = "로그인이 필요한 API") - @ApiResponses({ - @ApiResponse(responseCode = "200", description = "로그아웃 성공시 쿠키에 저장된 토큰 정보를 삭제합니다.") - }) - public RoomEscapeApiResponse logout( - HttpServletRequest request, - HttpServletResponse response - ) { - Cookie cookie = getTokenCookie(request); - cookie.setValue(null); - cookie.setMaxAge(0); - addCookieToResponse(cookie, response); - return RoomEscapeApiResponse.success(); - } + return RoomEscapeApiResponse.success(response) + } - private Cookie getTokenCookie(HttpServletRequest request) { - for (Cookie cookie : request.getCookies()) { - if (cookie.getName().equals("accessToken")) { - return cookie; - } - } - return new Cookie("accessToken", null); - } + @PostMapping("/logout") + override fun logout( + request: HttpServletRequest, + response: HttpServletResponse + ): RoomEscapeApiResponse { + val cookie: Cookie = request.accessTokenCookie() + cookie.expire() + response.addAccessTokenCookie(cookie) - private void addCookieToResponse(Cookie cookie, HttpServletResponse response) { - cookie.setHttpOnly(true); - - response.addCookie(cookie); - } + return RoomEscapeApiResponse.success() + } } -- 2.47.2 From 62023f5fb0a4d7dffb1a9c3c3e3e4f9ec797c60d Mon Sep 17 00:00:00 2001 From: pricelees Date: Sun, 13 Jul 2025 20:48:36 +0900 Subject: [PATCH 26/37] Rename .java to .kt --- .../system/auth/service/{AuthService.java => AuthService.kt} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/main/java/roomescape/system/auth/service/{AuthService.java => AuthService.kt} (100%) diff --git a/src/main/java/roomescape/system/auth/service/AuthService.java b/src/main/java/roomescape/system/auth/service/AuthService.kt similarity index 100% rename from src/main/java/roomescape/system/auth/service/AuthService.java rename to src/main/java/roomescape/system/auth/service/AuthService.kt -- 2.47.2 From f0dfd68f82d424726d6e6d86dd6d894ec3ca2470 Mon Sep 17 00:00:00 2001 From: pricelees Date: Sun, 13 Jul 2025 20:48:36 +0900 Subject: [PATCH 27/37] =?UTF-8?q?refactor:=20AuthService=20=EC=BD=94?= =?UTF-8?q?=ED=8B=80=EB=A6=B0=20=EC=A0=84=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../system/auth/service/AuthService.kt | 50 +++++++++---------- 1 file changed, 24 insertions(+), 26 deletions(-) diff --git a/src/main/java/roomescape/system/auth/service/AuthService.kt b/src/main/java/roomescape/system/auth/service/AuthService.kt index c2bf1a00..b6394130 100644 --- a/src/main/java/roomescape/system/auth/service/AuthService.kt +++ b/src/main/java/roomescape/system/auth/service/AuthService.kt @@ -1,34 +1,32 @@ -package roomescape.system.auth.service; +package roomescape.system.auth.service -import org.springframework.stereotype.Service; - -import roomescape.member.business.MemberService; -import roomescape.member.infrastructure.persistence.Member; -import roomescape.system.auth.web.LoginCheckResponse; -import roomescape.system.auth.web.LoginRequest; -import roomescape.system.auth.infrastructure.jwt.JwtHandler; -import roomescape.system.auth.infrastructure.jwt.TokenDto; +import org.springframework.stereotype.Service +import roomescape.member.business.MemberService +import roomescape.member.infrastructure.persistence.Member +import roomescape.system.auth.infrastructure.jwt.JwtHandler +import roomescape.system.auth.web.LoginCheckResponse +import roomescape.system.auth.web.LoginRequest +import roomescape.system.auth.web.TokenResponse @Service -public class AuthService { +class AuthService( + private val memberService: MemberService, + private val jwtHandler: JwtHandler +) { + fun login(request: LoginRequest): TokenResponse { + val member: Member = memberService.findMemberByEmailAndPassword( + request.email, + request.password + ) - private final MemberService memberService; - private final JwtHandler jwtHandler; + val accessToken: String = jwtHandler.createToken(member.id!!) - public AuthService(MemberService memberService, JwtHandler jwtHandler) { - this.memberService = memberService; - this.jwtHandler = jwtHandler; - } + return TokenResponse(accessToken) + } - public TokenDto login(LoginRequest request) { - Member member = memberService.findMemberByEmailAndPassword(request.email(), request.password()); + fun checkLogin(memberId: Long): LoginCheckResponse { + val member = memberService.findById(memberId) - return jwtHandler.createToken(member.getId()); - } - - public LoginCheckResponse checkLogin(Long memberId) { - Member member = memberService.findById(memberId); - - return new LoginCheckResponse(member.getName()); - } + return LoginCheckResponse(member.name) + } } -- 2.47.2 From b954a2fdfb589c09c35dbceb805e28a1ef1c1790 Mon Sep 17 00:00:00 2001 From: pricelees Date: Sun, 13 Jul 2025 20:49:50 +0900 Subject: [PATCH 28/37] Rename .java to .kt --- .../auth/infrastructure/jwt/{JwtHandler.java => JwtHandler.kt} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/main/java/roomescape/system/auth/infrastructure/jwt/{JwtHandler.java => JwtHandler.kt} (100%) diff --git a/src/main/java/roomescape/system/auth/infrastructure/jwt/JwtHandler.java b/src/main/java/roomescape/system/auth/infrastructure/jwt/JwtHandler.kt similarity index 100% rename from src/main/java/roomescape/system/auth/infrastructure/jwt/JwtHandler.java rename to src/main/java/roomescape/system/auth/infrastructure/jwt/JwtHandler.kt -- 2.47.2 From cba22ce4cc1b313bae361ed28b62e42f39fd7721 Mon Sep 17 00:00:00 2001 From: pricelees Date: Sun, 13 Jul 2025 20:49:51 +0900 Subject: [PATCH 29/37] =?UTF-8?q?refactor:=20JwtHandler=20=EC=BD=94?= =?UTF-8?q?=ED=8B=80=EB=A6=B0=20=EC=A0=84=ED=99=98=20=EB=B0=8F=20=EC=A4=91?= =?UTF-8?q?=EB=B3=B5=20=EC=BD=94=EB=93=9C=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - getMemberIdFromToken의 파라미터를 nullable로 지정하였음. null인 경우 parseClaimJws에서 예외가 발생하기 때문 --- .../auth/infrastructure/jwt/JwtHandler.kt | 100 ++++++++---------- 1 file changed, 43 insertions(+), 57 deletions(-) diff --git a/src/main/java/roomescape/system/auth/infrastructure/jwt/JwtHandler.kt b/src/main/java/roomescape/system/auth/infrastructure/jwt/JwtHandler.kt index 5b8afc69..4afd8e3e 100644 --- a/src/main/java/roomescape/system/auth/infrastructure/jwt/JwtHandler.kt +++ b/src/main/java/roomescape/system/auth/infrastructure/jwt/JwtHandler.kt @@ -1,64 +1,50 @@ -package roomescape.system.auth.infrastructure.jwt; +package roomescape.system.auth.infrastructure.jwt -import java.util.Date; - -import org.springframework.beans.factory.annotation.Value; -import org.springframework.http.HttpStatus; -import org.springframework.stereotype.Component; - -import io.jsonwebtoken.ExpiredJwtException; -import io.jsonwebtoken.Jwts; -import io.jsonwebtoken.MalformedJwtException; -import io.jsonwebtoken.SignatureAlgorithm; -import io.jsonwebtoken.SignatureException; -import io.jsonwebtoken.UnsupportedJwtException; -import roomescape.system.exception.ErrorType; -import roomescape.system.exception.RoomEscapeException; +import io.jsonwebtoken.* +import org.springframework.beans.factory.annotation.Value +import org.springframework.http.HttpStatus +import org.springframework.stereotype.Component +import roomescape.system.exception.ErrorType +import roomescape.system.exception.RoomEscapeException +import java.util.* @Component -public class JwtHandler { +class JwtHandler( + @Value("\${security.jwt.token.secret-key}") + private val secretKey: String, - @Value("${security.jwt.token.secret-key}") - private String secretKey; + @Value("\${security.jwt.token.access.expire-length}") + private val accessTokenExpireTime: Long +) { + fun createToken(memberId: Long): String { + val date = Date() + val accessTokenExpiredAt = Date(date.time + accessTokenExpireTime) - @Value("${security.jwt.token.access.expire-length}") - private long accessTokenExpireTime; + return Jwts.builder() + .claim("memberId", memberId) + .setIssuedAt(date) + .setExpiration(accessTokenExpiredAt) + .signWith(SignatureAlgorithm.HS256, secretKey.toByteArray()) + .compact() + } - public TokenDto createToken(Long memberId) { - Date date = new Date(); - Date accessTokenExpiredAt = new Date(date.getTime() + accessTokenExpireTime); - - String accessToken = Jwts.builder() - .claim("memberId", memberId) - .setIssuedAt(date) - .setExpiration(accessTokenExpiredAt) - .signWith(SignatureAlgorithm.HS256, secretKey.getBytes()) - .compact(); - - return new TokenDto(accessToken); - } - - public Long getMemberIdFromToken(String token) { - validateToken(token); - - return Jwts.parser().setSigningKey(secretKey.getBytes()).parseClaimsJws(token) - .getBody() - .get("memberId", Long.class); - } - - public void validateToken(String token) { - try { - Jwts.parser().setSigningKey(secretKey.getBytes()).parseClaimsJws(token); - } catch (ExpiredJwtException e) { - throw new RoomEscapeException(ErrorType.EXPIRED_TOKEN, HttpStatus.UNAUTHORIZED); - } catch (UnsupportedJwtException e) { - throw new RoomEscapeException(ErrorType.UNSUPPORTED_TOKEN, HttpStatus.UNAUTHORIZED); - } catch (MalformedJwtException e) { - throw new RoomEscapeException(ErrorType.MALFORMED_TOKEN, HttpStatus.UNAUTHORIZED); - } catch (SignatureException e) { - throw new RoomEscapeException(ErrorType.INVALID_SIGNATURE_TOKEN, HttpStatus.UNAUTHORIZED); - } catch (IllegalArgumentException e) { - throw new RoomEscapeException(ErrorType.ILLEGAL_TOKEN, HttpStatus.UNAUTHORIZED); - } - } + fun getMemberIdFromToken(token: String?): Long { + try { + return Jwts.parser() + .setSigningKey(secretKey.toByteArray()) + .parseClaimsJws(token) + .getBody() + .get("memberId", Number::class.java) + .toLong() + } catch (e: Exception) { + when (e) { + is ExpiredJwtException -> throw RoomEscapeException(ErrorType.EXPIRED_TOKEN, HttpStatus.UNAUTHORIZED) + is UnsupportedJwtException -> throw RoomEscapeException(ErrorType.UNSUPPORTED_TOKEN, HttpStatus.UNAUTHORIZED) + is MalformedJwtException -> throw RoomEscapeException(ErrorType.MALFORMED_TOKEN, HttpStatus.UNAUTHORIZED) + is SignatureException -> throw RoomEscapeException(ErrorType.INVALID_SIGNATURE_TOKEN, HttpStatus.UNAUTHORIZED) + is IllegalArgumentException -> throw RoomEscapeException(ErrorType.INVALID_TOKEN, HttpStatus.UNAUTHORIZED) + else -> throw RoomEscapeException(ErrorType.UNEXPECTED_ERROR, HttpStatus.INTERNAL_SERVER_ERROR) + } + } + } } -- 2.47.2 From 69d96a6f81d8a5b02c0752725618b7181ad8db33 Mon Sep 17 00:00:00 2001 From: pricelees Date: Sun, 13 Jul 2025 20:51:07 +0900 Subject: [PATCH 30/37] =?UTF-8?q?test:=20RoomescapeApiTest=EC=97=90=20POST?= =?UTF-8?q?=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80=20=EB=B0=8F=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=EB=90=9C=20MemberRepository=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../roomescape/common/RoomescapeApiTest.kt | 38 ++++++++++++++++--- .../member/controller/MemberControllerTest.kt | 8 ++-- .../view/controller/PageControllerTest.kt | 18 ++++----- 3 files changed, 44 insertions(+), 20 deletions(-) diff --git a/src/test/java/roomescape/common/RoomescapeApiTest.kt b/src/test/java/roomescape/common/RoomescapeApiTest.kt index a67cf87e..6c4701ce 100644 --- a/src/test/java/roomescape/common/RoomescapeApiTest.kt +++ b/src/test/java/roomescape/common/RoomescapeApiTest.kt @@ -3,6 +3,7 @@ package roomescape.common import com.ninjasquad.springmockk.MockkBean import io.kotest.core.spec.style.BehaviorSpec import io.mockk.every +import io.restassured.http.ContentType import io.restassured.module.kotlin.extensions.Given import io.restassured.module.kotlin.extensions.Then import io.restassured.module.kotlin.extensions.When @@ -10,13 +11,17 @@ import io.restassured.response.ValidatableResponse import org.springframework.boot.test.context.SpringBootTest import org.springframework.boot.test.web.server.LocalServerPort import org.springframework.data.repository.findByIdOrNull +import org.springframework.http.HttpStatus import roomescape.member.infrastructure.persistence.Member import roomescape.member.infrastructure.persistence.MemberRepository import roomescape.system.auth.infrastructure.jwt.JwtHandler +import roomescape.system.exception.ErrorType +import roomescape.system.exception.RoomEscapeException const val NOT_LOGGED_IN_USERID: Long = 0; @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +@NoSqlInitialize class RoomescapeApiTest( @LocalServerPort val port: Int? = 9090, ) : BehaviorSpec() { @@ -27,31 +32,50 @@ class RoomescapeApiTest( @MockkBean lateinit var jwtHandler: JwtHandler + val admin: Member = MemberFixture.admin() val user: Member = MemberFixture.user() - fun runTest(endpoint: String, assert: ValidatableResponse.() -> Unit): ValidatableResponse { + fun runGetTest(endpoint: String, token: String? = "token", assert: ValidatableResponse.() -> Unit): ValidatableResponse { return Given { port(port!!) - header("Cookie", "accessToken=token") + header("Cookie", "accessToken=$token") } When { get(endpoint) } Then assert } + fun runPostTest( + endpoint: String, + token: String? = "token", + body: Any? = null, + assert: ValidatableResponse.() -> Unit + ): ValidatableResponse { + return Given { + port(port!!) + contentType(ContentType.JSON) + body?.let { body(it) } + header("Cookie", "accessToken=$token") + } When { + post(endpoint) + } Then assert + } + fun setUpAdmin() { every { jwtHandler.getMemberIdFromToken(any()) - } returns admin.id + } returns admin.id!! + every { memberRepository.existsById(admin.id!!) } returns true every { memberRepository.findByIdOrNull(admin.id!!) } returns admin } fun setUpUser() { every { jwtHandler.getMemberIdFromToken(any()) - } returns user.id + } returns user.id!! + every { memberRepository.existsById(user.id!!) } returns true every { memberRepository.findByIdOrNull(user.id!!) } returns user } @@ -60,6 +84,10 @@ class RoomescapeApiTest( jwtHandler.getMemberIdFromToken(any()) } returns NOT_LOGGED_IN_USERID + every { memberRepository.existsById(NOT_LOGGED_IN_USERID) } throws RoomEscapeException( + ErrorType.LOGIN_REQUIRED, + HttpStatus.FORBIDDEN + ) every { memberRepository.findByIdOrNull(NOT_LOGGED_IN_USERID) } returns null } -} \ No newline at end of file +} diff --git a/src/test/java/roomescape/member/controller/MemberControllerTest.kt b/src/test/java/roomescape/member/controller/MemberControllerTest.kt index 2297c194..f268c327 100644 --- a/src/test/java/roomescape/member/controller/MemberControllerTest.kt +++ b/src/test/java/roomescape/member/controller/MemberControllerTest.kt @@ -8,11 +8,9 @@ import io.mockk.every import io.restassured.module.kotlin.extensions.Extract import org.hamcrest.Matchers.containsString import roomescape.common.MemberFixture -import roomescape.common.NoSqlInitialize import roomescape.common.RoomescapeApiTest import roomescape.member.web.MembersResponse -@NoSqlInitialize class MemberControllerTest : RoomescapeApiTest() { init { @@ -29,7 +27,7 @@ class MemberControllerTest : RoomescapeApiTest() { setUpAdmin() then("성공한다.") { - val result: Any = runTest(endpoint) { + val result: Any = runGetTest(endpoint) { statusCode(200) } Extract { path("data") @@ -48,7 +46,7 @@ class MemberControllerTest : RoomescapeApiTest() { then("비회원") { setUpNotLoggedIn() - runTest(endpoint) { + runGetTest(endpoint) { statusCode(200) body(containsString("Login")) } @@ -57,7 +55,7 @@ class MemberControllerTest : RoomescapeApiTest() { then("일반 회원") { setUpUser() - runTest(endpoint) { + runGetTest(endpoint) { statusCode(200) body(containsString("Login")) } diff --git a/src/test/java/roomescape/view/controller/PageControllerTest.kt b/src/test/java/roomescape/view/controller/PageControllerTest.kt index 746c75fc..825467b5 100644 --- a/src/test/java/roomescape/view/controller/PageControllerTest.kt +++ b/src/test/java/roomescape/view/controller/PageControllerTest.kt @@ -1,10 +1,8 @@ package roomescape.view.controller import org.hamcrest.Matchers.containsString -import roomescape.common.NoSqlInitialize import roomescape.common.RoomescapeApiTest -@NoSqlInitialize class PageControllerTest() : RoomescapeApiTest() { init { @@ -14,7 +12,7 @@ class PageControllerTest() : RoomescapeApiTest() { then("비회원") { setUpNotLoggedIn() - runTest(it) { + runGetTest(it) { statusCode(200) } } @@ -22,7 +20,7 @@ class PageControllerTest() : RoomescapeApiTest() { then("회원") { setUpUser() - runTest(it) { + runGetTest(it) { statusCode(200) } } @@ -30,7 +28,7 @@ class PageControllerTest() : RoomescapeApiTest() { then("관리자") { setUpAdmin() - runTest(it) { + runGetTest(it) { statusCode(200) } } @@ -44,7 +42,7 @@ class PageControllerTest() : RoomescapeApiTest() { setUpAdmin() then("성공한다.") { - runTest(it) { + runGetTest(it) { statusCode(200) } } @@ -54,7 +52,7 @@ class PageControllerTest() : RoomescapeApiTest() { setUpUser() then("로그인 페이지로 이동한다.") { - runTest(it) { + runGetTest(it) { statusCode(200) body(containsString("Login")) } @@ -69,14 +67,14 @@ class PageControllerTest() : RoomescapeApiTest() { then("회원") { setUpUser() - runTest(it) { + runGetTest(it) { statusCode(200) } } then("관리자") { setUpAdmin() - runTest(it) { + runGetTest(it) { statusCode(200) } } @@ -86,7 +84,7 @@ class PageControllerTest() : RoomescapeApiTest() { then("로그인 페이지로 이동한다.") { setUpNotLoggedIn() - runTest(it) { + runGetTest(it) { statusCode(200) body(containsString("Login")) } -- 2.47.2 From 227e2999b416ff84e2c1fbbc573424efa8cdb1f7 Mon Sep 17 00:00:00 2001 From: pricelees Date: Sun, 13 Jul 2025 20:51:35 +0900 Subject: [PATCH 31/37] =?UTF-8?q?test:=20Fixtures=EC=97=90=20auth=20?= =?UTF-8?q?=EA=B4=80=EB=A0=A8=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/roomescape/common/Fixtures.kt | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/test/java/roomescape/common/Fixtures.kt b/src/test/java/roomescape/common/Fixtures.kt index ebe4c439..b53e7f3e 100644 --- a/src/test/java/roomescape/common/Fixtures.kt +++ b/src/test/java/roomescape/common/Fixtures.kt @@ -2,6 +2,8 @@ package roomescape.common import roomescape.member.infrastructure.persistence.Member import roomescape.member.infrastructure.persistence.Role +import roomescape.system.auth.infrastructure.jwt.JwtHandler +import roomescape.system.auth.web.LoginRequest import java.util.concurrent.atomic.AtomicLong object MemberFixture { @@ -16,5 +18,24 @@ object MemberFixture { ): Member = Member(id, name, "$account@email.com", password, role) fun admin(): Member = create(account = "admin", role = Role.ADMIN) + fun adminLoginRequest(): LoginRequest = LoginRequest( + email = admin().email, + password = admin().password + ) + fun user(): Member = create(account = "user", role = Role.MEMBER) + fun userLoginRequest(): LoginRequest = LoginRequest( + email = user().email, + password = user().password + ) +} + +object JwtFixture { + const val SECRET_KEY: String = "daijawligagaf@LIJ$@U)9nagnalkkgalijaddljfi" + const val EXPIRATION_TIME: Long = 1000 * 60 * 60 + + fun create( + secretKey: String = SECRET_KEY, + expirationTime: Long = EXPIRATION_TIME + ): JwtHandler = JwtHandler(secretKey, expirationTime) } -- 2.47.2 From 44005fbdd71e95de900b7e641cf3f8ba75e5d9ca Mon Sep 17 00:00:00 2001 From: pricelees Date: Sun, 13 Jul 2025 20:52:37 +0900 Subject: [PATCH 32/37] =?UTF-8?q?test:=20JwtHandlerTest=20=EC=BD=94?= =?UTF-8?q?=ED=8B=80=EB=A6=B0=20=EC=A0=84=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../global/auth/jwt/JwtHandlerTest.java | 118 ------------------ .../auth/infrastructure/jwt/JwtHandlerTest.kt | 61 +++++++++ 2 files changed, 61 insertions(+), 118 deletions(-) delete mode 100644 src/test/java/roomescape/global/auth/jwt/JwtHandlerTest.java create mode 100644 src/test/java/roomescape/system/auth/infrastructure/jwt/JwtHandlerTest.kt diff --git a/src/test/java/roomescape/global/auth/jwt/JwtHandlerTest.java b/src/test/java/roomescape/global/auth/jwt/JwtHandlerTest.java deleted file mode 100644 index 4a400666..00000000 --- a/src/test/java/roomescape/global/auth/jwt/JwtHandlerTest.java +++ /dev/null @@ -1,118 +0,0 @@ -package roomescape.global.auth.jwt; - -import static roomescape.system.exception.ErrorType.*; - -import java.util.Date; - -import org.assertj.core.api.Assertions; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.web.server.LocalServerPort; -import org.springframework.test.context.jdbc.Sql; - -import io.jsonwebtoken.Jwts; -import io.jsonwebtoken.SignatureAlgorithm; -import io.restassured.RestAssured; -import roomescape.system.auth.infrastructure.jwt.JwtHandler; -import roomescape.system.exception.ErrorType; -import roomescape.system.exception.RoomEscapeException; - -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) -@Sql(scripts = "/truncate.sql", executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD) -class JwtHandlerTest { - - @Autowired - private JwtHandler jwtHandler; - - @Value("${security.jwt.token.secret-key}") - private String secretKey; - - @LocalServerPort - private int port; - - @BeforeEach - void setUp() { - RestAssured.port = port; - } - - @Test - @DisplayName("토큰이 만료되면 401 Unauthorized 를 발생시킨다.") - void jwtExpired() { - //given - Date date = new Date(); - Date expiredAt = new Date(date.getTime() - 1); - - String accessToken = Jwts.builder() - .claim("memberId", 1L) - .setIssuedAt(date) - .setExpiration(expiredAt) - .signWith(SignatureAlgorithm.HS256, secretKey.getBytes()) - .compact(); - - // when & then - Assertions.assertThatThrownBy(() -> jwtHandler.getMemberIdFromToken(accessToken)) - .isInstanceOf(RoomEscapeException.class) - .hasMessage(EXPIRED_TOKEN.getDescription()); - } - - @Test - @DisplayName("지원하지 않는 토큰이면 401 Unauthorized 를 발생시킨다.") - void jwtMalformed() { - // given - Date date = new Date(); - Date expiredAt = new Date(date.getTime() + 100000); - - String accessToken = Jwts.builder() - .claim("memberId", 1L) - .setIssuedAt(date) - .setExpiration(expiredAt) - .signWith(SignatureAlgorithm.HS256, secretKey.getBytes()) - .compact(); - - String[] splitAccessToken = accessToken.split("\\."); - String unsupportedAccessToken = splitAccessToken[0] + "." + splitAccessToken[1]; - - // when & then - Assertions.assertThatThrownBy(() -> jwtHandler.getMemberIdFromToken(unsupportedAccessToken)) - .isInstanceOf(RoomEscapeException.class) - .hasMessage(ErrorType.MALFORMED_TOKEN.getDescription()); - } - - @Test - @DisplayName("토큰의 Signature 가 잘못되었다면 401 Unauthorized 를 발생시킨다.") - void jwtInvalidSignature() { - // given - Date date = new Date(); - Date expiredAt = new Date(date.getTime() + 100000); - - String invalidSecretKey = secretKey.substring(1); - - String accessToken = Jwts.builder() - .claim("memberId", 1L) - .setIssuedAt(date) - .setExpiration(expiredAt) - .signWith(SignatureAlgorithm.HS256, invalidSecretKey.getBytes()) // 기존은 HS256 알고리즘 - .compact(); - - // when & then - Assertions.assertThatThrownBy(() -> jwtHandler.getMemberIdFromToken(accessToken)) - .isInstanceOf(RoomEscapeException.class) - .hasMessage(ErrorType.INVALID_SIGNATURE_TOKEN.getDescription()); - } - - @Test - @DisplayName("토큰이 공백값이라면 401 Unauthorized 를 발생시킨다.") - void jwtIllegal() { - // given - String accessToken = ""; - - // when & then - Assertions.assertThatThrownBy(() -> jwtHandler.getMemberIdFromToken(accessToken)) - .isInstanceOf(RoomEscapeException.class) - .hasMessage(ErrorType.ILLEGAL_TOKEN.getDescription()); - } -} diff --git a/src/test/java/roomescape/system/auth/infrastructure/jwt/JwtHandlerTest.kt b/src/test/java/roomescape/system/auth/infrastructure/jwt/JwtHandlerTest.kt new file mode 100644 index 00000000..b7565255 --- /dev/null +++ b/src/test/java/roomescape/system/auth/infrastructure/jwt/JwtHandlerTest.kt @@ -0,0 +1,61 @@ +package roomescape.system.auth.infrastructure.jwt + +import io.jsonwebtoken.Jwts +import io.jsonwebtoken.SignatureAlgorithm +import io.kotest.assertions.throwables.shouldThrow +import io.kotest.core.spec.style.FunSpec +import io.kotest.matchers.shouldBe +import roomescape.common.JwtFixture +import roomescape.system.exception.ErrorType +import roomescape.system.exception.RoomEscapeException +import java.util.* +import kotlin.random.Random + +class JwtHandlerTest : FunSpec({ + + context("JWT 토큰 조회") { + val memberId = Random.nextLong() + val jwtHandler: JwtHandler = JwtFixture.create() + + test("토큰에서 멤버 ID를 올바르게 추출한다.") { + val token = jwtHandler.createToken(memberId) + val extractedMemberId = jwtHandler.getMemberIdFromToken(token) + + extractedMemberId shouldBe memberId + } + + test("만료된 토큰이면 예외를 던진다.") { + // given + val expirationTime = 0L + val shortExpirationTimeJwtHandler: JwtHandler = JwtFixture.create(expirationTime = expirationTime) + val token = shortExpirationTimeJwtHandler.createToken(memberId) + + Thread.sleep(expirationTime) // 만료 시간 이후로 대기 + + // when & then + shouldThrow { + shortExpirationTimeJwtHandler.getMemberIdFromToken(token) + }.errorType shouldBe ErrorType.EXPIRED_TOKEN + } + + test("토큰이 빈 값이면 예외를 던진다.") { + shouldThrow { + jwtHandler.getMemberIdFromToken("") + }.errorType shouldBe ErrorType.INVALID_TOKEN + } + + test("시크릿 키가 잘못된 경우 예외를 던진다.") { + val now: Date = Date() + val invalidSignatureToken: String = Jwts.builder() + .claim("memberId", memberId) + .setIssuedAt(now) + .setExpiration(Date(now.time + JwtFixture.EXPIRATION_TIME)) + .signWith(SignatureAlgorithm.HS256, JwtFixture.SECRET_KEY.substring(1).toByteArray()) + .compact() + + shouldThrow { + jwtHandler.getMemberIdFromToken(invalidSignatureToken) + }.errorType shouldBe ErrorType.INVALID_SIGNATURE_TOKEN + } + } +}) -- 2.47.2 From 26f7c554e74343a259e5dc248ab301add7c2ecb1 Mon Sep 17 00:00:00 2001 From: pricelees Date: Sun, 13 Jul 2025 20:53:03 +0900 Subject: [PATCH 33/37] Rename .java to .kt --- .../auth/business/{AuthServiceTest.java => AuthServiceTest.kt} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/test/java/roomescape/system/auth/business/{AuthServiceTest.java => AuthServiceTest.kt} (100%) diff --git a/src/test/java/roomescape/system/auth/business/AuthServiceTest.java b/src/test/java/roomescape/system/auth/business/AuthServiceTest.kt similarity index 100% rename from src/test/java/roomescape/system/auth/business/AuthServiceTest.java rename to src/test/java/roomescape/system/auth/business/AuthServiceTest.kt -- 2.47.2 From 4a014b9a6e79bf2a3b832b41a9cc578fd0cbf49c Mon Sep 17 00:00:00 2001 From: pricelees Date: Sun, 13 Jul 2025 20:53:03 +0900 Subject: [PATCH 34/37] =?UTF-8?q?test:=20AuthServiceTest=20=EC=BD=94?= =?UTF-8?q?=ED=8B=80=EB=A6=B0=20=EC=A0=84=ED=99=98=20=EB=B0=8F=20=EC=9D=BC?= =?UTF-8?q?=EB=B6=80=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../system/auth/business/AuthServiceTest.kt | 125 ++++++++++-------- 1 file changed, 71 insertions(+), 54 deletions(-) diff --git a/src/test/java/roomescape/system/auth/business/AuthServiceTest.kt b/src/test/java/roomescape/system/auth/business/AuthServiceTest.kt index 0bcfcd26..8e415266 100644 --- a/src/test/java/roomescape/system/auth/business/AuthServiceTest.kt +++ b/src/test/java/roomescape/system/auth/business/AuthServiceTest.kt @@ -1,66 +1,83 @@ -package roomescape.system.auth.business; +package roomescape.system.auth.business -import static org.assertj.core.api.Assertions.*; +import io.kotest.assertions.assertSoftly +import io.kotest.assertions.throwables.shouldThrow +import io.kotest.core.spec.style.BehaviorSpec +import io.kotest.matchers.shouldBe +import io.mockk.every +import io.mockk.mockk +import org.springframework.data.repository.findByIdOrNull +import roomescape.common.JwtFixture +import roomescape.common.MemberFixture +import roomescape.member.business.MemberService +import roomescape.member.infrastructure.persistence.Member +import roomescape.member.infrastructure.persistence.MemberRepository +import roomescape.system.auth.infrastructure.jwt.JwtHandler +import roomescape.system.auth.service.AuthService +import roomescape.system.exception.ErrorType +import roomescape.system.exception.RoomEscapeException -import org.assertj.core.api.Assertions; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.context.annotation.Import; -import roomescape.member.business.MemberService; -import roomescape.member.infrastructure.persistence.Member; -import roomescape.member.infrastructure.persistence.MemberRepository; -import roomescape.member.infrastructure.persistence.Role; -import roomescape.system.auth.service.AuthService; -import roomescape.system.auth.web.LoginRequest; -import roomescape.system.auth.infrastructure.jwt.JwtHandler; -import roomescape.system.auth.infrastructure.jwt.TokenDto; -import roomescape.system.exception.RoomEscapeException; +class AuthServiceTest : BehaviorSpec({ + val memberRepository: MemberRepository = mockk() + val memberService: MemberService = MemberService(memberRepository) + val jwtHandler: JwtHandler = JwtFixture.create() -@SpringBootTest -@Import({AuthService.class, JwtHandler.class, MemberService.class}) -class AuthServiceTest { + val authService = AuthService(memberService, jwtHandler) + val user: Member = MemberFixture.user() - @Autowired - private AuthService authService; - @Autowired - private MemberRepository memberRepository; + Given("로그인 요청을 받으면") { + When("이메일과 비밀번호로 회원을 찾고") { + val request = MemberFixture.userLoginRequest() - @Test - @DisplayName("로그인 성공시 JWT accessToken 을 반환한다.") - void loginSuccess() { - // given - Member member = memberRepository.save(new Member(null, "이름", "test@test.com", "12341234", Role.MEMBER)); + Then("회원이 있다면 JWT 토큰을 생성한 뒤 반환한다.") { + every { + memberRepository.findByEmailAndPassword(request.email, request.password) + } returns user - // when - TokenDto response = authService.login(new LoginRequest(member.getEmail(), member.getPassword())); + val accessToken: String = authService.login(request).accessToken - // then - assertThat(response.accessToken()).isNotNull(); - } + accessToken.isNotBlank() shouldBe true + jwtHandler.getMemberIdFromToken(accessToken) shouldBe user.id + } - @Test - @DisplayName("존재하지 않는 회원 email 또는 password로 로그인하면 예외가 발생한다.") - void loginFailByNotExistMemberInfo() { - // given - String notExistEmail = "invalid@test.com"; - String notExistPassword = "invalid1234"; + Then("회원이 없다면 예외를 던진다.") { + every { + memberRepository.findByEmailAndPassword(request.email, request.password) + } returns null - // when & then - Assertions.assertThatThrownBy(() -> authService.login(new LoginRequest(notExistEmail, notExistPassword))) - .isInstanceOf(RoomEscapeException.class); - } + val exception = shouldThrow { + authService.login(request) + } - @Test - @DisplayName("존재하지 않는 회원의 memberId로 로그인 여부를 체크하면 예외가 발생한다.") - void checkLoginFailByNotExistMemberInfo() { - // given - Long notExistMemberId = (long)(memberRepository.findAll().size() + 1); + exception.errorType shouldBe ErrorType.MEMBER_NOT_FOUND + } + } + } - // when & then - Assertions.assertThatThrownBy(() -> authService.checkLogin(notExistMemberId)) - .isInstanceOf(RoomEscapeException.class); - } -} + Given("로그인 확인 요청을 받으면") { + When("회원 ID로 회원을 찾고") { + val userId: Long = user.id!! + + Then("회원이 있다면 회원의 이름을 반환한다.") { + every { memberRepository.findByIdOrNull(userId) } returns user + + val response = authService.checkLogin(userId) + + assertSoftly(response) { + this.name shouldBe user.name + } + } + + Then("회원이 없다면 예외를 던진다.") { + every { memberRepository.findByIdOrNull(userId) } returns null + + val exception = shouldThrow { + authService.checkLogin(userId) + } + + exception.errorType shouldBe ErrorType.MEMBER_NOT_FOUND + } + } + } +}) -- 2.47.2 From 17de8e9709ac8a0a29f725ba599d852ad613a980 Mon Sep 17 00:00:00 2001 From: pricelees Date: Sun, 13 Jul 2025 20:53:18 +0900 Subject: [PATCH 35/37] Rename .java to .kt --- .../auth/web/{AuthControllerTest.java => AuthControllerTest.kt} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/test/java/roomescape/system/auth/web/{AuthControllerTest.java => AuthControllerTest.kt} (100%) diff --git a/src/test/java/roomescape/system/auth/web/AuthControllerTest.java b/src/test/java/roomescape/system/auth/web/AuthControllerTest.kt similarity index 100% rename from src/test/java/roomescape/system/auth/web/AuthControllerTest.java rename to src/test/java/roomescape/system/auth/web/AuthControllerTest.kt -- 2.47.2 From 8fdd4c4a03449f1f95e59569797e5552d4b94b62 Mon Sep 17 00:00:00 2001 From: pricelees Date: Sun, 13 Jul 2025 20:53:18 +0900 Subject: [PATCH 36/37] =?UTF-8?q?test:=20AuthControllerTest=20=EC=BD=94?= =?UTF-8?q?=ED=8B=80=EB=A6=B0=20=EC=A0=84=ED=99=98=20=EB=B0=8F=20=EC=9D=BC?= =?UTF-8?q?=EB=B6=80=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../system/auth/web/AuthControllerTest.kt | 215 ++++++++++-------- 1 file changed, 118 insertions(+), 97 deletions(-) diff --git a/src/test/java/roomescape/system/auth/web/AuthControllerTest.kt b/src/test/java/roomescape/system/auth/web/AuthControllerTest.kt index a3c2a274..7e6303c9 100644 --- a/src/test/java/roomescape/system/auth/web/AuthControllerTest.kt +++ b/src/test/java/roomescape/system/auth/web/AuthControllerTest.kt @@ -1,118 +1,139 @@ -package roomescape.system.auth.web; +package roomescape.system.auth.web -import static org.assertj.core.api.Assertions.*; -import static org.hamcrest.Matchers.*; +import io.mockk.every +import org.hamcrest.Matchers.containsString +import org.hamcrest.Matchers.`is` +import org.springframework.data.repository.findByIdOrNull +import roomescape.common.MemberFixture +import roomescape.common.RoomescapeApiTest +import roomescape.system.exception.ErrorType -import java.util.Map; +class AuthControllerTest : RoomescapeApiTest() { -import org.junit.jupiter.api.DisplayName; -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.server.LocalServerPort; -import org.springframework.test.context.jdbc.Sql; + val userRequest: LoginRequest = MemberFixture.userLoginRequest() -import io.restassured.RestAssured; -import io.restassured.http.ContentType; -import roomescape.member.infrastructure.persistence.Member; -import roomescape.member.infrastructure.persistence.MemberRepository; -import roomescape.member.infrastructure.persistence.Role; + init { + Given("로그인 요청을 보낼 때") { + val endpoint: String = "/login" -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) -@Sql(scripts = "/truncate.sql", executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD) -class AuthControllerTest { + When("로그인에 성공하면") { + val expectedToken: String = "expectedToken" - @Autowired - private MemberRepository memberRepository; + every { + memberRepository.findByEmailAndPassword(userRequest.email, userRequest.password) + } returns user - @LocalServerPort - private int port; + every { + jwtHandler.createToken(user.id!!) + } returns expectedToken - @Test - @DisplayName("로그인에 성공하면 JWT accessToken을 응답 받는다.") - void getJwtAccessTokenWhenlogin() { - // given - String email = "test@email.com"; - String password = "12341234"; - memberRepository.save(new Member(null, "이름", email, password, Role.MEMBER)); + Then("토큰을 쿠키에 담아 응답한다") { + runPostTest(endpoint, body = MemberFixture.userLoginRequest()) { + statusCode(200) + cookie("accessToken", expectedToken) + header("Set-Cookie", containsString("Max-Age=1800000")) + header("Set-Cookie", containsString("HttpOnly")) + header("Set-Cookie", containsString("Secure")) + } + } + } - Map loginParams = Map.of( - "email", email, - "password", password - ); + When("회원을 찾지 못하면") { + every { + memberRepository.findByEmailAndPassword(userRequest.email, userRequest.password) + } returns null - // when - Map cookies = RestAssured.given().log().all() - .contentType(ContentType.JSON) - .port(port) - .body(loginParams) - .when().post("/login") - .then().log().all().extract().cookies(); + Then("400 에러를 응답한다") { + runPostTest(endpoint, body = userRequest) { + log().all() + statusCode(400) + body("errorType", `is`(ErrorType.MEMBER_NOT_FOUND.name)) + } + } + } - // then - assertThat(cookies.get("accessToken")).isNotNull(); - } + When("잘못된 요청을 보내면 400 에러를 응답한다.") { - @Test - @DisplayName("로그인 검증 시, 회원의 name을 응답 받는다.") - void checkLogin() { - // given - String email = "test@test.com"; - String password = "12341234"; - String accessTokenCookie = getAccessTokenCookieByLogin(email, password); + Then("이메일 형식이 잘못된 경우") { + val invalidRequest: LoginRequest = userRequest.copy(email = "invalid") - // when & then - RestAssured.given().log().all() - .contentType(ContentType.JSON) - .port(port) - .header("cookie", accessTokenCookie) - .when().get("/login/check") - .then() - .body("data.name", is("이름")); - } + runPostTest(endpoint, body = invalidRequest) { + log().all() + statusCode(400) + body("message", `is`("이메일 형식이 일치하지 않습니다. 예시: abc123@gmail.com")) + } + } - @Test - @DisplayName("로그인 없이 검증요청을 보내면 401 Unauthorized 를 응답한다.") - void checkLoginFailByNotAuthorized() { - RestAssured.given().log().all() - .contentType(ContentType.JSON) - .port(port) - .when().get("/login/check") - .then() - .statusCode(401); - } + Then("비밀번호가 공백인 경우") { + val invalidRequest = userRequest.copy(password = " ") - @Test - @DisplayName("로그아웃 요청 시, accessToken 쿠키가 삭제된다.") - void checkLogout() { - // given - String accessToken = getAccessTokenCookieByLogin("email@email.com", "password"); + runPostTest(endpoint, body = invalidRequest) { + log().all() + statusCode(400) + body("message", `is`("비밀번호는 공백일 수 없습니다.")) + } + } + } + } - // when & then - RestAssured.given().log().all() - .port(port) - .header("cookie", accessToken) - .when().post("/logout") - .then() - .statusCode(200) - .cookie("accessToken", ""); - } + Given("로그인 상태를 확인할 때") { + val endpoint: String = "/login/check" - private String getAccessTokenCookieByLogin(final String email, final String password) { - memberRepository.save(new Member(null, "이름", email, password, Role.ADMIN)); + When("로그인된 회원의 ID로 요청하면") { + every { jwtHandler.getMemberIdFromToken(any()) } returns user.id!! + every { memberRepository.findByIdOrNull(user.id!!) } returns user - Map loginParams = Map.of( - "email", email, - "password", password - ); + Then("회원의 이름을 응답한다") { + runGetTest(endpoint) { + statusCode(200) + body("data.name", `is`(user.name)) + } + } + } - String accessToken = RestAssured.given().log().all() - .contentType(ContentType.JSON) - .port(port) - .body(loginParams) - .when().post("/login") - .then().log().all().extract().cookie("accessToken"); + When("토큰은 있지만 회원을 찾을 수 없으면") { + val invalidMemberId: Long = -1L - return "accessToken=" + accessToken; - } + every { jwtHandler.getMemberIdFromToken(any()) } returns invalidMemberId + every { memberRepository.findByIdOrNull(invalidMemberId) } returns null + + Then("400 에러를 응답한다.") { + runGetTest(endpoint) { + statusCode(400) + body("errorType", `is`(ErrorType.MEMBER_NOT_FOUND.name)) + } + } + } + } + + Given("로그아웃 요청을 보낼 때") { + val endpoint: String = "/logout" + + When("로그인 상태가 아니라면") { + setUpNotLoggedIn() + + Then("로그인 페이지로 이동한다.") { + runPostTest(endpoint) { + log().all() + statusCode(302) + header("Location", containsString("/login")) + } + } + } + + When("로그인 상태라면") { + setUpUser() + every { memberRepository.findByIdOrNull(user.id!!) } returns user + + Then("토큰의 존재 여부와 무관하게 토큰을 만료시킨다.") { + runPostTest(endpoint) { + log().all() + statusCode(200) + cookie("accessToken", "") + header("Set-Cookie", containsString("Max-Age=0")) + } + } + } + } + } } -- 2.47.2 From 03411fe423d412cc0e48f5075184c5b27e176e4c Mon Sep 17 00:00:00 2001 From: pricelees Date: Sun, 13 Jul 2025 21:10:01 +0900 Subject: [PATCH 37/37] =?UTF-8?q?refactor:=20=EC=96=B4=EB=85=B8=ED=85=8C?= =?UTF-8?q?=EC=9D=B4=EC=85=98=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=ED=86=B5?= =?UTF-8?q?=ED=95=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../roomescape/system/auth/web/support/Admin.kt | 5 ----- .../system/auth/web/support/AuthAnnotations.kt | 13 +++++++++++++ .../system/auth/web/support/LoginRequired.kt | 5 ----- .../roomescape/system/auth/web/support/MemberId.kt | 5 ----- 4 files changed, 13 insertions(+), 15 deletions(-) delete mode 100644 src/main/java/roomescape/system/auth/web/support/Admin.kt create mode 100644 src/main/java/roomescape/system/auth/web/support/AuthAnnotations.kt delete mode 100644 src/main/java/roomescape/system/auth/web/support/LoginRequired.kt delete mode 100644 src/main/java/roomescape/system/auth/web/support/MemberId.kt diff --git a/src/main/java/roomescape/system/auth/web/support/Admin.kt b/src/main/java/roomescape/system/auth/web/support/Admin.kt deleted file mode 100644 index 5e5285e7..00000000 --- a/src/main/java/roomescape/system/auth/web/support/Admin.kt +++ /dev/null @@ -1,5 +0,0 @@ -package roomescape.system.auth.web.support - -@Target(AnnotationTarget.FUNCTION) -@Retention(AnnotationRetention.RUNTIME) -annotation class Admin diff --git a/src/main/java/roomescape/system/auth/web/support/AuthAnnotations.kt b/src/main/java/roomescape/system/auth/web/support/AuthAnnotations.kt new file mode 100644 index 00000000..77bb3090 --- /dev/null +++ b/src/main/java/roomescape/system/auth/web/support/AuthAnnotations.kt @@ -0,0 +1,13 @@ +package roomescape.system.auth.web.support + +@Target(AnnotationTarget.FUNCTION) +@Retention(AnnotationRetention.RUNTIME) +annotation class Admin + +@Target(AnnotationTarget.FUNCTION) +@Retention(AnnotationRetention.RUNTIME) +annotation class LoginRequired + +@Target(AnnotationTarget.VALUE_PARAMETER) +@Retention(AnnotationRetention.RUNTIME) +annotation class MemberId \ No newline at end of file diff --git a/src/main/java/roomescape/system/auth/web/support/LoginRequired.kt b/src/main/java/roomescape/system/auth/web/support/LoginRequired.kt deleted file mode 100644 index 0e751ded..00000000 --- a/src/main/java/roomescape/system/auth/web/support/LoginRequired.kt +++ /dev/null @@ -1,5 +0,0 @@ -package roomescape.system.auth.web.support - -@Target(AnnotationTarget.FUNCTION) -@Retention(AnnotationRetention.RUNTIME) -annotation class LoginRequired diff --git a/src/main/java/roomescape/system/auth/web/support/MemberId.kt b/src/main/java/roomescape/system/auth/web/support/MemberId.kt deleted file mode 100644 index 45711d4f..00000000 --- a/src/main/java/roomescape/system/auth/web/support/MemberId.kt +++ /dev/null @@ -1,5 +0,0 @@ -package roomescape.system.auth.web.support - -@Target(AnnotationTarget.VALUE_PARAMETER) -@Retention(AnnotationRetention.RUNTIME) -annotation class MemberId -- 2.47.2