From c5e21156115d76b9d939a57fb245d472808aad38 Mon Sep 17 00:00:00 2001 From: Hanbin Lee Date: Mon, 21 Nov 2022 00:55:12 +0900 Subject: [PATCH 1/3] =?UTF-8?q?[#24]=20feat:=20JWT=20=ED=99=9C=EC=9A=A9?= =?UTF-8?q?=ED=95=9C=20=EC=9D=B8=EA=B0=80=20=ED=94=84=EB=A1=9C=EC=84=B8?= =?UTF-8?q?=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 - 인가 프로세스용 Security Filter 적용 - jwt token 유효성 체크 및 claim 조회를 통한 authentication 반환 메소드 추가 --- .../common/config/SecurityConfig.kt | 1 - .../dongnecafe/controller/TestController.kt | 13 ----- .../src/main/resources/application-local.yml | 2 +- .../dongnecafe/security/JwtTokenUtils.kt | 49 +++++++++++++--- .../common/config/SecurityConfig.kt | 16 +++++- .../security/JwtAuthenticationConfigurer.kt | 25 +++++++++ .../filter/JwtAuthenticationFilter.kt | 56 +++++++++++++++++++ .../src/main/resources/application-local.yml | 2 +- .../src/test/resources/application.yml | 2 +- 9 files changed, 140 insertions(+), 26 deletions(-) delete mode 100644 dongne-account-api/src/main/kotlin/io/beaniejoy/dongnecafe/controller/TestController.kt create mode 100644 dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/security/JwtAuthenticationConfigurer.kt create mode 100644 dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/security/filter/JwtAuthenticationFilter.kt diff --git a/dongne-account-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/config/SecurityConfig.kt b/dongne-account-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/config/SecurityConfig.kt index 8ecd601..ca04bc2 100644 --- a/dongne-account-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/config/SecurityConfig.kt +++ b/dongne-account-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/config/SecurityConfig.kt @@ -22,7 +22,6 @@ class SecurityConfig { .authorizeRequests() .antMatchers("/auth/members/sign-up").permitAll() .antMatchers("/auth/authenticate").permitAll() - .antMatchers("/test").hasRole("USER") // 임시 인가 테스트용 .anyRequest().authenticated() .and() diff --git a/dongne-account-api/src/main/kotlin/io/beaniejoy/dongnecafe/controller/TestController.kt b/dongne-account-api/src/main/kotlin/io/beaniejoy/dongnecafe/controller/TestController.kt deleted file mode 100644 index b171393..0000000 --- a/dongne-account-api/src/main/kotlin/io/beaniejoy/dongnecafe/controller/TestController.kt +++ /dev/null @@ -1,13 +0,0 @@ -package io.beaniejoy.dongnecafe.controller - -import org.springframework.web.bind.annotation.GetMapping -import org.springframework.web.bind.annotation.RestController - -@RestController -class TestController { - - @GetMapping("/test") - fun test(): String { - return "authorize OK!" - } -} \ No newline at end of file diff --git a/dongne-account-api/src/main/resources/application-local.yml b/dongne-account-api/src/main/resources/application-local.yml index 58a0493..eafd9db 100644 --- a/dongne-account-api/src/main/resources/application-local.yml +++ b/dongne-account-api/src/main/resources/application-local.yml @@ -5,4 +5,4 @@ spring: password: beaniejoy # TODO 추후 보안에 대해 생각해보기 jwt: secret_key: aG9wZS15b3UtYWx3YXlzLWJlLWhhcHB5LXRoaXMteWVhcgo= - expiration_time: 86400 \ No newline at end of file + validity_time_in_sec: 86400 \ No newline at end of file diff --git a/dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/security/JwtTokenUtils.kt b/dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/security/JwtTokenUtils.kt index 69cf1e6..08bb800 100644 --- a/dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/security/JwtTokenUtils.kt +++ b/dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/security/JwtTokenUtils.kt @@ -1,11 +1,15 @@ package io.beaniejoy.dongnecafe.security +import io.jsonwebtoken.Claims +import io.jsonwebtoken.ExpiredJwtException import io.jsonwebtoken.Jwts import io.jsonwebtoken.SignatureAlgorithm import io.jsonwebtoken.security.Keys import mu.KLogging import org.springframework.beans.factory.annotation.Value +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken import org.springframework.security.core.Authentication +import org.springframework.security.core.authority.SimpleGrantedAuthority import org.springframework.stereotype.Component import java.security.Key import java.util.* @@ -14,25 +18,56 @@ import java.util.* class JwtTokenUtils( @Value("\${jwt.secret_key}") private val secretKey: String, - @Value("\${jwt.expiration_time}") - private val expirationTime: Long + @Value("\${jwt.validity_time_in_sec}") + private val validityTimeSec: Long ) { private val key: Key = Keys.hmacShaKeyFor(secretKey.toByteArray()) + private val validityTimeMilliSec: Long = validityTimeSec * 1000 - companion object: KLogging() + companion object : KLogging() { + const val AUTHORITIES_KEY = "authorities" + } fun createToken(authentication: Authentication): String { + logger.info { "test = ${authentication.name}" } val authenticatedMember = (authentication.principal as SecurityUser).member + val authorities = authentication.authorities.joinToString(",") { it.authority } + val nowTime = Date().time - val expirationDate = Date(nowTime + this.expirationTime) + val expirationDate = Date(nowTime + this.validityTimeMilliSec) return Jwts.builder() .setSubject(authenticatedMember.email) - .claim("memberId", authenticatedMember.id) - .claim("email", authenticatedMember.email) - .claim("roles", authentication.authorities.joinToString(",") { it.authority }) + .claim(AUTHORITIES_KEY, authorities) .signWith(key, SignatureAlgorithm.HS256) .setExpiration(expirationDate) .compact() } + + fun getAuthentication(accessToken: String): Authentication? { + val claims = getValidTokenBody(accessToken) + ?: return null + + val authorities = claims[AUTHORITIES_KEY].toString().split(",") + .map { SimpleGrantedAuthority(it) } + + return UsernamePasswordAuthenticationToken(claims.subject, accessToken, authorities) + } + + // jwt access token 유효성 검증 및 claims 획득 + private fun getValidTokenBody(accessToken: String): Claims? { + return try { + Jwts.parserBuilder() + .setSigningKey(key) + .build() + .parseClaimsJws(accessToken) + .body + } catch (e: ExpiredJwtException) { + logger.error { "JWT access token expired. > Error: ${e.message}" } + null + } catch (e: Exception) { + logger.error { "JWT access token invalid. > Error: ${e.message}" } + null + } + } } \ No newline at end of file diff --git a/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/config/SecurityConfig.kt b/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/config/SecurityConfig.kt index 9dcf6be..1019ad6 100644 --- a/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/config/SecurityConfig.kt +++ b/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/config/SecurityConfig.kt @@ -1,5 +1,8 @@ package io.beaniejoy.dongnecafe.common.config +import io.beaniejoy.dongnecafe.security.JwtAuthenticationConfigurer +import io.beaniejoy.dongnecafe.security.JwtTokenUtils +import org.springframework.beans.factory.annotation.Autowired import org.springframework.boot.autoconfigure.security.servlet.PathRequest import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration @@ -11,19 +14,28 @@ import org.springframework.security.web.SecurityFilterChain @Configuration @EnableWebSecurity class SecurityConfig { + @Autowired + lateinit var jwtTokenUtils: JwtTokenUtils + @Bean fun filterChain(http: HttpSecurity): SecurityFilterChain { return http .csrf().disable() - .formLogin().disable() .authorizeRequests() - .anyRequest().authenticated() // 임시 허용 + .anyRequest().authenticated() .and() + .also { jwtAuthenticationConfigurer(it) } .build() } + private fun jwtAuthenticationConfigurer(http: HttpSecurity) { + http + .apply(JwtAuthenticationConfigurer()) + .jwtTokenUtils(jwtTokenUtils) + } + @Bean fun webSecurityCustomizer(): WebSecurityCustomizer { return WebSecurityCustomizer { web -> diff --git a/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/security/JwtAuthenticationConfigurer.kt b/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/security/JwtAuthenticationConfigurer.kt new file mode 100644 index 0000000..cbaa79a --- /dev/null +++ b/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/security/JwtAuthenticationConfigurer.kt @@ -0,0 +1,25 @@ +package io.beaniejoy.dongnecafe.security + +import io.beaniejoy.dongnecafe.security.filter.JwtAuthenticationFilter +import org.springframework.security.config.annotation.SecurityConfigurerAdapter +import org.springframework.security.config.annotation.web.builders.HttpSecurity +import org.springframework.security.web.DefaultSecurityFilterChain +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter + +class JwtAuthenticationConfigurer : + SecurityConfigurerAdapter() { + private var jwtTokenUtils: JwtTokenUtils? = null + + override fun configure(http: HttpSecurity) { + http + .addFilterBefore( + JwtAuthenticationFilter(this.jwtTokenUtils!!), + UsernamePasswordAuthenticationFilter::class.java + ) + } + + fun jwtTokenUtils(jwtTokenUtils: JwtTokenUtils): JwtAuthenticationConfigurer { + this.jwtTokenUtils = jwtTokenUtils + return this + } +} \ No newline at end of file diff --git a/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/security/filter/JwtAuthenticationFilter.kt b/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/security/filter/JwtAuthenticationFilter.kt new file mode 100644 index 0000000..11463d4 --- /dev/null +++ b/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/security/filter/JwtAuthenticationFilter.kt @@ -0,0 +1,56 @@ +package io.beaniejoy.dongnecafe.security.filter + +import io.beaniejoy.dongnecafe.security.JwtTokenUtils +import mu.KLogging +import mu.KotlinLogging +import org.springframework.security.core.context.SecurityContextHolder +import org.springframework.web.filter.GenericFilterBean +import javax.servlet.FilterChain +import javax.servlet.ServletRequest +import javax.servlet.ServletResponse +import javax.servlet.http.HttpServletRequest + +class JwtAuthenticationFilter( + private val jwtTokenUtils: JwtTokenUtils +) : GenericFilterBean() { + private val log = KotlinLogging.logger {} + + companion object { + private const val AUTHORIZATION = "Authorization" + private const val BEARER = "Bearer" + private const val WHITESPACE = " " + } + + /** + * JWT access token 인가 처리 + */ + override fun doFilter(request: ServletRequest, response: ServletResponse, chain: FilterChain) { + val httpRequest = request as HttpServletRequest + log.info { "[JwtAuthenticationFilter][${request.dispatcherType}][${request.requestURI}]" } + + getAccessToken(httpRequest)?.let { + jwtTokenUtils.getAuthentication(it) + }?.also { + SecurityContextHolder.getContext().authentication = it + log.info { "Valid Access Token [${it.name}]" } + } + + chain.doFilter(request, response) + } + + private fun getAccessToken(request: HttpServletRequest): String? { + val bearer = request.getHeader(AUTHORIZATION) + ?: return null + + val splitBearer = bearer.split(WHITESPACE) + if (splitBearer.first() != BEARER) { + return null + } + + if (splitBearer.size != 2 || splitBearer.last().isBlank()) { + return null + } + + return splitBearer.last() + } +} \ No newline at end of file diff --git a/dongne-service-api/src/main/resources/application-local.yml b/dongne-service-api/src/main/resources/application-local.yml index 58a0493..eafd9db 100644 --- a/dongne-service-api/src/main/resources/application-local.yml +++ b/dongne-service-api/src/main/resources/application-local.yml @@ -5,4 +5,4 @@ spring: password: beaniejoy # TODO 추후 보안에 대해 생각해보기 jwt: secret_key: aG9wZS15b3UtYWx3YXlzLWJlLWhhcHB5LXRoaXMteWVhcgo= - expiration_time: 86400 \ No newline at end of file + validity_time_in_sec: 86400 \ No newline at end of file diff --git a/dongne-service-api/src/test/resources/application.yml b/dongne-service-api/src/test/resources/application.yml index 71426a6..9619c20 100644 --- a/dongne-service-api/src/test/resources/application.yml +++ b/dongne-service-api/src/test/resources/application.yml @@ -14,4 +14,4 @@ logging: jwt: secret_key: ZG9uZ25lLWNhZmUtcHJvamVjdC1rZXktZm9yLXRlc3QtY29kZQo - expiration_time: 60 \ No newline at end of file + validity_time_in_sec: 60 \ No newline at end of file From 74896f286d52b2c7bf0ae74bd344083adc54a329 Mon Sep 17 00:00:00 2001 From: beaniejoy Date: Fri, 25 Nov 2022 16:56:32 +0900 Subject: [PATCH 2/3] =?UTF-8?q?[#24]=20feat:=20JWT=20=EC=9D=B4=EC=9A=A9?= =?UTF-8?q?=ED=95=9C=20=EC=9D=B8=EA=B0=80=20=ED=94=84=EB=A1=9C=EC=84=B8?= =?UTF-8?q?=EC=8A=A4=20=EA=B0=9C=EB=B0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - exception 디렉토리 변경 - config 내용 일부 수정 --- .../io/beaniejoy/dongnecafe/common/config/SecurityConfig.kt | 1 + .../{domain/cafe => common}/error/CafeExceptionHandler.kt | 3 ++- .../error => common/error/exception}/CafeExistedException.kt | 2 +- .../error/exception}/CafeMenuNotFoundException.kt | 2 +- .../error => common/error/exception}/CafeNotFoundException.kt | 2 +- .../error/exception}/MenuOptionNotFoundException.kt | 2 +- .../error/exception}/OptionDetailNotFoundException.kt | 2 +- .../dongnecafe/domain/cafe/service/CafeMenuService.kt | 2 +- .../beaniejoy/dongnecafe/domain/cafe/service/CafeService.kt | 4 ++-- .../dongnecafe/domain/cafe/service/MenuOptionService.kt | 2 +- .../dongnecafe/domain/cafe/service/OptionDetailService.kt | 2 +- .../dongnecafe/security/filter/JwtAuthenticationFilter.kt | 3 +-- .../dongnecafe/domain/cafe/service/CafeMenuServiceTest.kt | 2 +- .../dongnecafe/domain/cafe/service/CafeServiceTest.kt | 4 ++-- 14 files changed, 17 insertions(+), 16 deletions(-) rename dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/{domain/cafe => common}/error/CafeExceptionHandler.kt (79%) rename dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/{domain/cafe/error => common/error/exception}/CafeExistedException.kt (63%) rename dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/{domain/cafe/error => common/error/exception}/CafeMenuNotFoundException.kt (74%) rename dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/{domain/cafe/error => common/error/exception}/CafeNotFoundException.kt (62%) rename dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/{domain/cafe/error => common/error/exception}/MenuOptionNotFoundException.kt (67%) rename dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/{domain/cafe/error => common/error/exception}/OptionDetailNotFoundException.kt (69%) diff --git a/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/config/SecurityConfig.kt b/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/config/SecurityConfig.kt index 1019ad6..7bf46f1 100644 --- a/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/config/SecurityConfig.kt +++ b/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/config/SecurityConfig.kt @@ -6,6 +6,7 @@ import org.springframework.beans.factory.annotation.Autowired import org.springframework.boot.autoconfigure.security.servlet.PathRequest import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration +import org.springframework.http.HttpMethod import org.springframework.security.config.annotation.web.builders.HttpSecurity import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity import org.springframework.security.config.annotation.web.configuration.WebSecurityCustomizer diff --git a/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/error/CafeExceptionHandler.kt b/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/error/CafeExceptionHandler.kt similarity index 79% rename from dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/error/CafeExceptionHandler.kt rename to dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/error/CafeExceptionHandler.kt index 7b1f1fd..c2e534c 100644 --- a/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/error/CafeExceptionHandler.kt +++ b/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/error/CafeExceptionHandler.kt @@ -1,5 +1,6 @@ -package io.beaniejoy.dongnecafe.domain.cafe.error +package io.beaniejoy.dongnecafe.common.error +import io.beaniejoy.dongnecafe.common.error.exception.CafeNotFoundException import org.springframework.http.ResponseEntity import org.springframework.web.bind.annotation.ExceptionHandler import org.springframework.web.bind.annotation.RestControllerAdvice diff --git a/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/error/CafeExistedException.kt b/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/error/exception/CafeExistedException.kt similarity index 63% rename from dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/error/CafeExistedException.kt rename to dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/error/exception/CafeExistedException.kt index ac08e0d..cbf77c8 100644 --- a/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/error/CafeExistedException.kt +++ b/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/error/exception/CafeExistedException.kt @@ -1,3 +1,3 @@ -package io.beaniejoy.dongnecafe.domain.cafe.error +package io.beaniejoy.dongnecafe.common.error.exception class CafeExistedException(name: String) : RuntimeException("Cafe[$name] is already existed") \ No newline at end of file diff --git a/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/error/CafeMenuNotFoundException.kt b/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/error/exception/CafeMenuNotFoundException.kt similarity index 74% rename from dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/error/CafeMenuNotFoundException.kt rename to dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/error/exception/CafeMenuNotFoundException.kt index d569449..1a963a8 100644 --- a/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/error/CafeMenuNotFoundException.kt +++ b/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/error/exception/CafeMenuNotFoundException.kt @@ -1,4 +1,4 @@ -package io.beaniejoy.dongnecafe.domain.cafe.error +package io.beaniejoy.dongnecafe.common.error.exception class CafeMenuNotFoundException(menuId: Long, cafeId: Long) : RuntimeException("Cafe[${cafeId}]의 Menu[${menuId}]는 존재하지 않는 메뉴입니다.") \ No newline at end of file diff --git a/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/error/CafeNotFoundException.kt b/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/error/exception/CafeNotFoundException.kt similarity index 62% rename from dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/error/CafeNotFoundException.kt rename to dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/error/exception/CafeNotFoundException.kt index 63a183c..053daec 100644 --- a/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/error/CafeNotFoundException.kt +++ b/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/error/exception/CafeNotFoundException.kt @@ -1,3 +1,3 @@ -package io.beaniejoy.dongnecafe.domain.cafe.error +package io.beaniejoy.dongnecafe.common.error.exception class CafeNotFoundException(cafeId: Long) : RuntimeException("Cafe[$cafeId] is not found") \ No newline at end of file diff --git a/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/error/MenuOptionNotFoundException.kt b/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/error/exception/MenuOptionNotFoundException.kt similarity index 67% rename from dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/error/MenuOptionNotFoundException.kt rename to dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/error/exception/MenuOptionNotFoundException.kt index 228fd9d..44742f6 100644 --- a/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/error/MenuOptionNotFoundException.kt +++ b/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/error/exception/MenuOptionNotFoundException.kt @@ -1,3 +1,3 @@ -package io.beaniejoy.dongnecafe.domain.cafe.error +package io.beaniejoy.dongnecafe.common.error.exception class MenuOptionNotFoundException(menuOptionId: Long) : RuntimeException("MenuOption[$menuOptionId] is not found") \ No newline at end of file diff --git a/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/error/OptionDetailNotFoundException.kt b/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/error/exception/OptionDetailNotFoundException.kt similarity index 69% rename from dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/error/OptionDetailNotFoundException.kt rename to dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/error/exception/OptionDetailNotFoundException.kt index 59b5a88..3bb8d45 100644 --- a/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/error/OptionDetailNotFoundException.kt +++ b/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/error/exception/OptionDetailNotFoundException.kt @@ -1,3 +1,3 @@ -package io.beaniejoy.dongnecafe.domain.cafe.error +package io.beaniejoy.dongnecafe.common.error.exception class OptionDetailNotFoundException(optionDetailId: Long) : RuntimeException("OptionDetail[$optionDetailId] is not found") \ No newline at end of file diff --git a/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/service/CafeMenuService.kt b/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/service/CafeMenuService.kt index bf40940..23c0857 100644 --- a/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/service/CafeMenuService.kt +++ b/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/service/CafeMenuService.kt @@ -1,7 +1,7 @@ package io.beaniejoy.dongnecafe.domain.cafe.service import io.beaniejoy.dongnecafe.domain.cafe.model.response.CafeMenuDetailedInfo -import io.beaniejoy.dongnecafe.domain.cafe.error.CafeMenuNotFoundException +import io.beaniejoy.dongnecafe.common.error.exception.CafeMenuNotFoundException import io.beaniejoy.dongnecafe.domain.cafe.model.request.CafeMenuUpdateRequest import io.beaniejoy.dongnecafe.domain.cafe.repository.CafeMenuRepository import org.springframework.data.repository.findByIdOrNull diff --git a/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/service/CafeService.kt b/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/service/CafeService.kt index 9452130..8d0504c 100644 --- a/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/service/CafeService.kt +++ b/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/service/CafeService.kt @@ -4,8 +4,8 @@ import io.beaniejoy.dongnecafe.domain.cafe.model.response.CafeDetailedInfo import io.beaniejoy.dongnecafe.domain.cafe.model.response.CafeSearchInfo import io.beaniejoy.dongnecafe.domain.cafe.model.request.CafeMenuRegisterRequest import io.beaniejoy.dongnecafe.domain.cafe.entity.Cafe -import io.beaniejoy.dongnecafe.domain.cafe.error.CafeExistedException -import io.beaniejoy.dongnecafe.domain.cafe.error.CafeNotFoundException +import io.beaniejoy.dongnecafe.common.error.exception.CafeExistedException +import io.beaniejoy.dongnecafe.common.error.exception.CafeNotFoundException import io.beaniejoy.dongnecafe.domain.cafe.repository.CafeRepository import mu.KLogging import org.springframework.data.domain.Page diff --git a/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/service/MenuOptionService.kt b/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/service/MenuOptionService.kt index 06236d8..dde1d00 100644 --- a/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/service/MenuOptionService.kt +++ b/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/service/MenuOptionService.kt @@ -1,6 +1,6 @@ package io.beaniejoy.dongnecafe.domain.cafe.service -import io.beaniejoy.dongnecafe.domain.cafe.error.MenuOptionNotFoundException +import io.beaniejoy.dongnecafe.common.error.exception.MenuOptionNotFoundException import io.beaniejoy.dongnecafe.domain.cafe.model.request.MenuOptionUpdateRequest import io.beaniejoy.dongnecafe.domain.cafe.repository.MenuOptionRepository import org.springframework.data.repository.findByIdOrNull diff --git a/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/service/OptionDetailService.kt b/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/service/OptionDetailService.kt index 4cbe0b7..269589b 100644 --- a/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/service/OptionDetailService.kt +++ b/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/service/OptionDetailService.kt @@ -1,6 +1,6 @@ package io.beaniejoy.dongnecafe.domain.cafe.service -import io.beaniejoy.dongnecafe.domain.cafe.error.OptionDetailNotFoundException +import io.beaniejoy.dongnecafe.common.error.exception.OptionDetailNotFoundException import io.beaniejoy.dongnecafe.domain.cafe.model.request.OptionDetailUpdateRequest import io.beaniejoy.dongnecafe.domain.cafe.repository.OptionDetailRepository import org.springframework.data.repository.findByIdOrNull diff --git a/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/security/filter/JwtAuthenticationFilter.kt b/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/security/filter/JwtAuthenticationFilter.kt index 11463d4..8719aec 100644 --- a/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/security/filter/JwtAuthenticationFilter.kt +++ b/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/security/filter/JwtAuthenticationFilter.kt @@ -1,7 +1,6 @@ package io.beaniejoy.dongnecafe.security.filter import io.beaniejoy.dongnecafe.security.JwtTokenUtils -import mu.KLogging import mu.KotlinLogging import org.springframework.security.core.context.SecurityContextHolder import org.springframework.web.filter.GenericFilterBean @@ -26,7 +25,7 @@ class JwtAuthenticationFilter( */ override fun doFilter(request: ServletRequest, response: ServletResponse, chain: FilterChain) { val httpRequest = request as HttpServletRequest - log.info { "[JwtAuthenticationFilter][${request.dispatcherType}][${request.requestURI}]" } + log.info { "[JwtAuthenticationFilter][${request.dispatcherType}] uri: ${request.requestURI}" } getAccessToken(httpRequest)?.let { jwtTokenUtils.getAuthentication(it) diff --git a/dongne-service-api/src/test/kotlin/io/beaniejoy/dongnecafe/domain/cafe/service/CafeMenuServiceTest.kt b/dongne-service-api/src/test/kotlin/io/beaniejoy/dongnecafe/domain/cafe/service/CafeMenuServiceTest.kt index 361267a..4654bf1 100644 --- a/dongne-service-api/src/test/kotlin/io/beaniejoy/dongnecafe/domain/cafe/service/CafeMenuServiceTest.kt +++ b/dongne-service-api/src/test/kotlin/io/beaniejoy/dongnecafe/domain/cafe/service/CafeMenuServiceTest.kt @@ -1,7 +1,7 @@ package io.beaniejoy.dongnecafe.domain.cafe.service import io.beaniejoy.dongnecafe.domain.cafe.entity.CafeMenu -import io.beaniejoy.dongnecafe.domain.cafe.error.CafeMenuNotFoundException +import io.beaniejoy.dongnecafe.common.error.exception.CafeMenuNotFoundException import io.beaniejoy.dongnecafe.domain.cafe.repository.CafeMenuRepository import io.beaniejoy.dongnecafe.domain.cafe.repository.MenuOptionRepository import io.beaniejoy.dongnecafe.domain.cafe.repository.OptionDetailRepository diff --git a/dongne-service-api/src/test/kotlin/io/beaniejoy/dongnecafe/domain/cafe/service/CafeServiceTest.kt b/dongne-service-api/src/test/kotlin/io/beaniejoy/dongnecafe/domain/cafe/service/CafeServiceTest.kt index 5e5247d..c66c95a 100644 --- a/dongne-service-api/src/test/kotlin/io/beaniejoy/dongnecafe/domain/cafe/service/CafeServiceTest.kt +++ b/dongne-service-api/src/test/kotlin/io/beaniejoy/dongnecafe/domain/cafe/service/CafeServiceTest.kt @@ -1,8 +1,8 @@ package io.beaniejoy.dongnecafe.domain.cafe.service import io.beaniejoy.dongnecafe.domain.cafe.entity.Cafe -import io.beaniejoy.dongnecafe.domain.cafe.error.CafeExistedException -import io.beaniejoy.dongnecafe.domain.cafe.error.CafeNotFoundException +import io.beaniejoy.dongnecafe.common.error.exception.CafeExistedException +import io.beaniejoy.dongnecafe.common.error.exception.CafeNotFoundException import io.beaniejoy.dongnecafe.domain.cafe.repository.CafeRepository import io.beaniejoy.dongnecafe.domain.cafe.utils.CafeTestUtils import org.junit.jupiter.api.* From 579e1070844d4645be77beecfbe6b9133afdbdcc Mon Sep 17 00:00:00 2001 From: beaniejoy Date: Tue, 29 Nov 2022 01:15:21 +0900 Subject: [PATCH 3/3] =?UTF-8?q?[#24]=20feat:=20front=EC=9A=A9=20=EC=97=90?= =?UTF-8?q?=EB=9F=AC=20=EC=9D=91=EB=8B=B5=20=ED=8F=AC=EB=A9=A7=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9(=EB=AF=B8=EC=99=84=EC=84=B1)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - error response 규격화 때 개발 계획 - front용 임시 에러응답 적용 --- .../common/security/UserDetailsServiceImpl.kt | 2 +- .../error/handler/CommonControllerAdvice.kt | 27 +++++++++++++++++++ .../dongnecafe/error/ErrorResponse.kt | 6 +++++ .../domain/cafe/service/CafeMenuService.kt | 2 +- .../domain/cafe/service/CafeService.kt | 4 +-- .../domain/cafe/service/MenuOptionService.kt | 2 +- .../cafe/service/OptionDetailService.kt | 2 +- .../error/CafeExceptionHandler.kt | 4 +-- .../error/exception/CafeExistedException.kt | 2 +- .../exception/CafeMenuNotFoundException.kt | 2 +- .../error/exception/CafeNotFoundException.kt | 2 +- .../exception/MenuOptionNotFoundException.kt | 2 +- .../OptionDetailNotFoundException.kt | 2 +- .../cafe/service/CafeMenuServiceTest.kt | 2 +- .../domain/cafe/service/CafeServiceTest.kt | 4 +-- 15 files changed, 49 insertions(+), 16 deletions(-) create mode 100644 dongne-account-api/src/main/kotlin/io/beaniejoy/dongnecafe/error/handler/CommonControllerAdvice.kt create mode 100644 dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/error/ErrorResponse.kt rename dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/{common => }/error/CafeExceptionHandler.kt (79%) rename dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/{common => }/error/exception/CafeExistedException.kt (63%) rename dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/{common => }/error/exception/CafeMenuNotFoundException.kt (74%) rename dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/{common => }/error/exception/CafeNotFoundException.kt (62%) rename dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/{common => }/error/exception/MenuOptionNotFoundException.kt (67%) rename dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/{common => }/error/exception/OptionDetailNotFoundException.kt (69%) diff --git a/dongne-account-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/security/UserDetailsServiceImpl.kt b/dongne-account-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/security/UserDetailsServiceImpl.kt index 970cc3f..b0259bb 100644 --- a/dongne-account-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/security/UserDetailsServiceImpl.kt +++ b/dongne-account-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/security/UserDetailsServiceImpl.kt @@ -22,7 +22,7 @@ class UserDetailsServiceImpl( return memberRepository.findByEmail(email)?.let { logger.info { "[LOAD MEMBER] email: ${it.email}, role: ${it.roleType}, activated: ${it.activated}" } createSecurityUser(it) - } ?: throw UsernameNotFoundException(email) + } ?: throw UsernameNotFoundException("${email} is not found") } private fun createSecurityUser(member: Member): SecurityUser { diff --git a/dongne-account-api/src/main/kotlin/io/beaniejoy/dongnecafe/error/handler/CommonControllerAdvice.kt b/dongne-account-api/src/main/kotlin/io/beaniejoy/dongnecafe/error/handler/CommonControllerAdvice.kt new file mode 100644 index 0000000..83d901c --- /dev/null +++ b/dongne-account-api/src/main/kotlin/io/beaniejoy/dongnecafe/error/handler/CommonControllerAdvice.kt @@ -0,0 +1,27 @@ +package io.beaniejoy.dongnecafe.error.handler + +import io.beaniejoy.dongnecafe.error.ErrorResponse +import mu.KLogging +import org.springframework.http.HttpStatus +import org.springframework.http.ResponseEntity +import org.springframework.security.core.AuthenticationException +import org.springframework.web.bind.annotation.ExceptionHandler +import org.springframework.web.bind.annotation.RestControllerAdvice + +// TODO 통합된 에러 핸들링 필요(ErrorResponse 규격화) +@RestControllerAdvice +class CommonControllerAdvice { + + companion object : KLogging() + + @ExceptionHandler(AuthenticationException::class) + fun handleAuthenticationException(e: AuthenticationException): ResponseEntity { + logger.error { "AuthenticationException: ${e.message}" } + return ResponseEntity.ok().body( + ErrorResponse( + code = HttpStatus.BAD_REQUEST.value(), + message = "계정 혹은 비밀번호가 일치하지 않습니다." + ) + ) + } +} \ No newline at end of file diff --git a/dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/error/ErrorResponse.kt b/dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/error/ErrorResponse.kt new file mode 100644 index 0000000..a6e8abd --- /dev/null +++ b/dongne-common/src/main/kotlin/io/beaniejoy/dongnecafe/error/ErrorResponse.kt @@ -0,0 +1,6 @@ +package io.beaniejoy.dongnecafe.error + +data class ErrorResponse( + val code: Int, + val message: String? +) \ No newline at end of file diff --git a/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/service/CafeMenuService.kt b/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/service/CafeMenuService.kt index 23c0857..72733c6 100644 --- a/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/service/CafeMenuService.kt +++ b/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/service/CafeMenuService.kt @@ -1,7 +1,7 @@ package io.beaniejoy.dongnecafe.domain.cafe.service import io.beaniejoy.dongnecafe.domain.cafe.model.response.CafeMenuDetailedInfo -import io.beaniejoy.dongnecafe.common.error.exception.CafeMenuNotFoundException +import io.beaniejoy.dongnecafe.error.exception.CafeMenuNotFoundException import io.beaniejoy.dongnecafe.domain.cafe.model.request.CafeMenuUpdateRequest import io.beaniejoy.dongnecafe.domain.cafe.repository.CafeMenuRepository import org.springframework.data.repository.findByIdOrNull diff --git a/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/service/CafeService.kt b/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/service/CafeService.kt index 8d0504c..e311c5d 100644 --- a/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/service/CafeService.kt +++ b/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/service/CafeService.kt @@ -4,8 +4,8 @@ import io.beaniejoy.dongnecafe.domain.cafe.model.response.CafeDetailedInfo import io.beaniejoy.dongnecafe.domain.cafe.model.response.CafeSearchInfo import io.beaniejoy.dongnecafe.domain.cafe.model.request.CafeMenuRegisterRequest import io.beaniejoy.dongnecafe.domain.cafe.entity.Cafe -import io.beaniejoy.dongnecafe.common.error.exception.CafeExistedException -import io.beaniejoy.dongnecafe.common.error.exception.CafeNotFoundException +import io.beaniejoy.dongnecafe.error.exception.CafeExistedException +import io.beaniejoy.dongnecafe.error.exception.CafeNotFoundException import io.beaniejoy.dongnecafe.domain.cafe.repository.CafeRepository import mu.KLogging import org.springframework.data.domain.Page diff --git a/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/service/MenuOptionService.kt b/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/service/MenuOptionService.kt index dde1d00..a34440e 100644 --- a/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/service/MenuOptionService.kt +++ b/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/service/MenuOptionService.kt @@ -1,6 +1,6 @@ package io.beaniejoy.dongnecafe.domain.cafe.service -import io.beaniejoy.dongnecafe.common.error.exception.MenuOptionNotFoundException +import io.beaniejoy.dongnecafe.error.exception.MenuOptionNotFoundException import io.beaniejoy.dongnecafe.domain.cafe.model.request.MenuOptionUpdateRequest import io.beaniejoy.dongnecafe.domain.cafe.repository.MenuOptionRepository import org.springframework.data.repository.findByIdOrNull diff --git a/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/service/OptionDetailService.kt b/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/service/OptionDetailService.kt index 269589b..94e5753 100644 --- a/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/service/OptionDetailService.kt +++ b/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/domain/cafe/service/OptionDetailService.kt @@ -1,6 +1,6 @@ package io.beaniejoy.dongnecafe.domain.cafe.service -import io.beaniejoy.dongnecafe.common.error.exception.OptionDetailNotFoundException +import io.beaniejoy.dongnecafe.error.exception.OptionDetailNotFoundException import io.beaniejoy.dongnecafe.domain.cafe.model.request.OptionDetailUpdateRequest import io.beaniejoy.dongnecafe.domain.cafe.repository.OptionDetailRepository import org.springframework.data.repository.findByIdOrNull diff --git a/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/error/CafeExceptionHandler.kt b/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/error/CafeExceptionHandler.kt similarity index 79% rename from dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/error/CafeExceptionHandler.kt rename to dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/error/CafeExceptionHandler.kt index c2e534c..1d869ea 100644 --- a/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/error/CafeExceptionHandler.kt +++ b/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/error/CafeExceptionHandler.kt @@ -1,6 +1,6 @@ -package io.beaniejoy.dongnecafe.common.error +package io.beaniejoy.dongnecafe.error -import io.beaniejoy.dongnecafe.common.error.exception.CafeNotFoundException +import io.beaniejoy.dongnecafe.error.exception.CafeNotFoundException import org.springframework.http.ResponseEntity import org.springframework.web.bind.annotation.ExceptionHandler import org.springframework.web.bind.annotation.RestControllerAdvice diff --git a/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/error/exception/CafeExistedException.kt b/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/error/exception/CafeExistedException.kt similarity index 63% rename from dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/error/exception/CafeExistedException.kt rename to dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/error/exception/CafeExistedException.kt index cbf77c8..e88e84c 100644 --- a/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/error/exception/CafeExistedException.kt +++ b/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/error/exception/CafeExistedException.kt @@ -1,3 +1,3 @@ -package io.beaniejoy.dongnecafe.common.error.exception +package io.beaniejoy.dongnecafe.error.exception class CafeExistedException(name: String) : RuntimeException("Cafe[$name] is already existed") \ No newline at end of file diff --git a/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/error/exception/CafeMenuNotFoundException.kt b/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/error/exception/CafeMenuNotFoundException.kt similarity index 74% rename from dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/error/exception/CafeMenuNotFoundException.kt rename to dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/error/exception/CafeMenuNotFoundException.kt index 1a963a8..bb60691 100644 --- a/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/error/exception/CafeMenuNotFoundException.kt +++ b/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/error/exception/CafeMenuNotFoundException.kt @@ -1,4 +1,4 @@ -package io.beaniejoy.dongnecafe.common.error.exception +package io.beaniejoy.dongnecafe.error.exception class CafeMenuNotFoundException(menuId: Long, cafeId: Long) : RuntimeException("Cafe[${cafeId}]의 Menu[${menuId}]는 존재하지 않는 메뉴입니다.") \ No newline at end of file diff --git a/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/error/exception/CafeNotFoundException.kt b/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/error/exception/CafeNotFoundException.kt similarity index 62% rename from dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/error/exception/CafeNotFoundException.kt rename to dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/error/exception/CafeNotFoundException.kt index 053daec..e8a0c09 100644 --- a/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/error/exception/CafeNotFoundException.kt +++ b/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/error/exception/CafeNotFoundException.kt @@ -1,3 +1,3 @@ -package io.beaniejoy.dongnecafe.common.error.exception +package io.beaniejoy.dongnecafe.error.exception class CafeNotFoundException(cafeId: Long) : RuntimeException("Cafe[$cafeId] is not found") \ No newline at end of file diff --git a/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/error/exception/MenuOptionNotFoundException.kt b/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/error/exception/MenuOptionNotFoundException.kt similarity index 67% rename from dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/error/exception/MenuOptionNotFoundException.kt rename to dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/error/exception/MenuOptionNotFoundException.kt index 44742f6..cb42fe7 100644 --- a/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/error/exception/MenuOptionNotFoundException.kt +++ b/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/error/exception/MenuOptionNotFoundException.kt @@ -1,3 +1,3 @@ -package io.beaniejoy.dongnecafe.common.error.exception +package io.beaniejoy.dongnecafe.error.exception class MenuOptionNotFoundException(menuOptionId: Long) : RuntimeException("MenuOption[$menuOptionId] is not found") \ No newline at end of file diff --git a/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/error/exception/OptionDetailNotFoundException.kt b/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/error/exception/OptionDetailNotFoundException.kt similarity index 69% rename from dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/error/exception/OptionDetailNotFoundException.kt rename to dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/error/exception/OptionDetailNotFoundException.kt index 3bb8d45..69df3ac 100644 --- a/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/common/error/exception/OptionDetailNotFoundException.kt +++ b/dongne-service-api/src/main/kotlin/io/beaniejoy/dongnecafe/error/exception/OptionDetailNotFoundException.kt @@ -1,3 +1,3 @@ -package io.beaniejoy.dongnecafe.common.error.exception +package io.beaniejoy.dongnecafe.error.exception class OptionDetailNotFoundException(optionDetailId: Long) : RuntimeException("OptionDetail[$optionDetailId] is not found") \ No newline at end of file diff --git a/dongne-service-api/src/test/kotlin/io/beaniejoy/dongnecafe/domain/cafe/service/CafeMenuServiceTest.kt b/dongne-service-api/src/test/kotlin/io/beaniejoy/dongnecafe/domain/cafe/service/CafeMenuServiceTest.kt index 4654bf1..f9789a2 100644 --- a/dongne-service-api/src/test/kotlin/io/beaniejoy/dongnecafe/domain/cafe/service/CafeMenuServiceTest.kt +++ b/dongne-service-api/src/test/kotlin/io/beaniejoy/dongnecafe/domain/cafe/service/CafeMenuServiceTest.kt @@ -1,7 +1,7 @@ package io.beaniejoy.dongnecafe.domain.cafe.service import io.beaniejoy.dongnecafe.domain.cafe.entity.CafeMenu -import io.beaniejoy.dongnecafe.common.error.exception.CafeMenuNotFoundException +import io.beaniejoy.dongnecafe.error.exception.CafeMenuNotFoundException import io.beaniejoy.dongnecafe.domain.cafe.repository.CafeMenuRepository import io.beaniejoy.dongnecafe.domain.cafe.repository.MenuOptionRepository import io.beaniejoy.dongnecafe.domain.cafe.repository.OptionDetailRepository diff --git a/dongne-service-api/src/test/kotlin/io/beaniejoy/dongnecafe/domain/cafe/service/CafeServiceTest.kt b/dongne-service-api/src/test/kotlin/io/beaniejoy/dongnecafe/domain/cafe/service/CafeServiceTest.kt index c66c95a..7914fe0 100644 --- a/dongne-service-api/src/test/kotlin/io/beaniejoy/dongnecafe/domain/cafe/service/CafeServiceTest.kt +++ b/dongne-service-api/src/test/kotlin/io/beaniejoy/dongnecafe/domain/cafe/service/CafeServiceTest.kt @@ -1,8 +1,8 @@ package io.beaniejoy.dongnecafe.domain.cafe.service import io.beaniejoy.dongnecafe.domain.cafe.entity.Cafe -import io.beaniejoy.dongnecafe.common.error.exception.CafeExistedException -import io.beaniejoy.dongnecafe.common.error.exception.CafeNotFoundException +import io.beaniejoy.dongnecafe.error.exception.CafeExistedException +import io.beaniejoy.dongnecafe.error.exception.CafeNotFoundException import io.beaniejoy.dongnecafe.domain.cafe.repository.CafeRepository import io.beaniejoy.dongnecafe.domain.cafe.utils.CafeTestUtils import org.junit.jupiter.api.*