Wooin-dev / dailyone_server

dailyOne (D'One) - 서버
0 stars 0 forks source link

DONE이 갑자기 연속적으로 2개가 세이브되는 현상 발생 #49

Closed Wooin-dev closed 1 month ago

Wooin-dev commented 1 month ago
2024-07-19T05:27:00.348Z TRACE 1 --- [nio-8080-exec-5] o.s.t.i.TransactionInterceptor           : Getting transaction for [com.wooin.dailyone.service.UserService.loadUserByEmail]
2024-07-19T05:27:00.352Z  INFO 1 --- [nio-8080-exec-5] c.w.d.repository.UserCacheRepository     : Get User from Redis USER:wooin@done.com - null
2024-07-19T05:27:00.353Z TRACE 1 --- [nio-8080-exec-5] o.s.t.i.TransactionInterceptor           : No need to create transaction for [org.springframework.data.jpa.repository.support.SimpleJpaRepository.findByEmail]: This method is not transactional.
Hibernate: 
    select
        u1_0.id,
        u1_0.created_at,
        u1_0.created_by,
        u1_0.deleted_at,
        u1_0.email,
        u1_0.kakao_id,
        u1_0.modified_at,
        u1_0.modified_by,
        u1_0.nickname,
        u1_0.password,
        u1_0.role 
    from
        users u1_0 
    where
        (
            u1_0.deleted_at is NULL
        ) 
        and u1_0.email=?
2024-07-19T05:27:00.367Z TRACE 1 --- [nio-8080-exec-5] o.s.t.i.TransactionInterceptor           : Completing transaction for [com.wooin.dailyone.service.UserService.loadUserByEmail]
2024-07-19T05:27:00.371Z DEBUG 1 --- [nio-8080-exec-5] o.s.web.servlet.DispatcherServlet        : POST "/api/v1/done/6", parameters={}
2024-07-19T05:27:00.372Z DEBUG 1 --- [nio-8080-exec-5] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped to com.wooin.dailyone.controller.DoneController#createDone(Long, Authentication)
2024-07-19T05:27:00.495Z TRACE 1 --- [nio-8080-exec-5] o.s.t.i.TransactionInterceptor           : Getting transaction for [com.wooin.dailyone.service.DoneService.createDone]
2024-07-19T05:27:00.498Z TRACE 1 --- [nio-8080-exec-5] o.s.t.i.TransactionInterceptor           : Getting transaction for [org.springframework.data.jpa.repository.support.SimpleJpaRepository.getReferenceById]
2024-07-19T05:27:00.511Z TRACE 1 --- [nio-8080-exec-5] o.s.t.i.TransactionInterceptor           : Completing transaction for [org.springframework.data.jpa.repository.support.SimpleJpaRepository.getReferenceById]
2024-07-19T05:27:00.511Z TRACE 1 --- [nio-8080-exec-5] o.s.t.i.TransactionInterceptor           : No need to create transaction for [org.springframework.data.jpa.repository.support.SimpleJpaRepository.findByPromiseGoalAndCreatedAtBetween]: This method is not transactional.
Hibernate: 
    select
        d1_0.id,
        d1_0.created_at,
        d1_0.deleted_at,
        d1_0.modified_at,
        d1_0.promise_goal_id 
    from
        done d1_0 
    where
        (
            d1_0.deleted_at is NULL
        ) 
        and d1_0.promise_goal_id=? 
        and d1_0.created_at between ? and ?
2024-07-19T05:27:00.522Z TRACE 1 --- [nio-8080-exec-5] o.s.t.i.TransactionInterceptor           : Getting transaction for [org.springframework.data.jpa.repository.support.SimpleJpaRepository.save]
2024-07-19T05:27:01.059Z TRACE 1 --- [nio-8080-exec-3] o.s.t.i.TransactionInterceptor           : Getting transaction for [com.wooin.dailyone.service.UserService.loadUserByEmail]
2024-07-19T05:27:01.061Z  INFO 1 --- [nio-8080-exec-3] c.w.d.repository.UserCacheRepository     : Get User from Redis USER:wooin@done.com - null
2024-07-19T05:27:01.061Z TRACE 1 --- [nio-8080-exec-3] o.s.t.i.TransactionInterceptor           : No need to create transaction for [org.springframework.data.jpa.repository.support.SimpleJpaRepository.findByEmail]: This method is not transactional.
Hibernate: 
    select
        u1_0.id,
        u1_0.created_at,
        u1_0.created_by,
        u1_0.deleted_at,
        u1_0.email,
        u1_0.kakao_id,
        u1_0.modified_at,
        u1_0.modified_by,
        u1_0.nickname,
        u1_0.password,
        u1_0.role 
    from
        users u1_0 
    where
        (
            u1_0.deleted_at is NULL
        ) 
        and u1_0.email=?
2024-07-19T05:27:01.072Z TRACE 1 --- [nio-8080-exec-3] o.s.t.i.TransactionInterceptor           : Completing transaction for [com.wooin.dailyone.service.UserService.loadUserByEmail]
2024-07-19T05:27:01.076Z DEBUG 1 --- [nio-8080-exec-3] o.s.web.servlet.DispatcherServlet        : POST "/api/v1/done/6", parameters={}
2024-07-19T05:27:01.077Z DEBUG 1 --- [nio-8080-exec-3] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped to com.wooin.dailyone.controller.DoneController#createDone(Long, Authentication)
2024-07-19T05:27:01.079Z TRACE 1 --- [nio-8080-exec-3] o.s.t.i.TransactionInterceptor           : Getting transaction for [com.wooin.dailyone.service.DoneService.createDone]
2024-07-19T05:27:01.080Z TRACE 1 --- [nio-8080-exec-3] o.s.t.i.TransactionInterceptor           : Getting transaction for [org.springframework.data.jpa.repository.support.SimpleJpaRepository.getReferenceById]
2024-07-19T05:27:01.081Z TRACE 1 --- [nio-8080-exec-3] o.s.t.i.TransactionInterceptor           : Completing transaction for [org.springframework.data.jpa.repository.support.SimpleJpaRepository.getReferenceById]
2024-07-19T05:27:01.081Z TRACE 1 --- [nio-8080-exec-3] o.s.t.i.TransactionInterceptor           : No need to create transaction for [org.springframework.data.jpa.repository.support.SimpleJpaRepository.findByPromiseGoalAndCreatedAtBetween]: This method is not transactional.
Hibernate: 
    select
        d1_0.id,
        d1_0.created_at,
        d1_0.deleted_at,
        d1_0.modified_at,
        d1_0.promise_goal_id 
    from
        done d1_0 
    where
        (
            d1_0.deleted_at is NULL
        ) 
        and d1_0.promise_goal_id=? 
        and d1_0.created_at between ? and ?
2024-07-19T05:27:01.086Z TRACE 1 --- [nio-8080-exec-3] o.s.t.i.TransactionInterceptor           : Getting transaction for [org.springframework.data.jpa.repository.support.SimpleJpaRepository.save]
Hibernate: 
    insert 
    into
        done
        (created_at, deleted_at, modified_at, promise_goal_id) 
    values
        (?, ?, ?, ?)
Hibernate: 
    insert 
    into
        done
        (created_at, deleted_at, modified_at, promise_goal_id) 
    values
        (?, ?, ?, ?)
2024-07-19T05:27:01.220Z TRACE 1 --- [nio-8080-exec-5] o.s.t.i.TransactionInterceptor           : Completing transaction for [org.springframework.data.jpa.repository.support.SimpleJpaRepository.save]
2024-07-19T05:27:01.221Z TRACE 1 --- [nio-8080-exec-5] o.s.t.i.TransactionInterceptor           : Completing transaction for [com.wooin.dailyone.service.DoneService.createDone]
2024-07-19T05:27:01.221Z TRACE 1 --- [nio-8080-exec-3] o.s.t.i.TransactionInterceptor           : Completing transaction for [org.springframework.data.jpa.repository.support.SimpleJpaRepository.save]
2024-07-19T05:27:01.222Z TRACE 1 --- [nio-8080-exec-3] o.s.t.i.TransactionInterceptor           : Completing transaction for [com.wooin.dailyone.service.DoneService.createDone]
2024-07-19T05:27:01.273Z DEBUG 1 --- [nio-8080-exec-3] m.m.a.RequestResponseBodyMethodProcessor : Using 'application/json', given [application/json, text/plain, */*] and supported [application/json, application/*+json]
2024-07-19T05:27:01.273Z DEBUG 1 --- [nio-8080-exec-3] m.m.a.RequestResponseBodyMethodProcessor : Writing [com.wooin.dailyone.controller.response.Response@9914cc6]
2024-07-19T05:27:01.274Z DEBUG 1 --- [nio-8080-exec-5] m.m.a.RequestResponseBodyMethodProcessor : Using 'application/json', given [application/json, text/plain, */*] and supported [application/json, application/*+json]
2024-07-19T05:27:01.274Z DEBUG 1 --- [nio-8080-exec-5] m.m.a.RequestResponseBodyMethodProcessor : Writing [com.wooin.dailyone.controller.response.Response@4cc96813]
2024-07-19T05:27:01.275Z DEBUG 1 --- [nio-8080-exec-5] o.s.web.servlet.DispatcherServlet        : Completed 200 OK
2024-07-19T05:27:01.276Z DEBUG 1 --- [nio-8080-exec-3] o.s.web.servlet.DispatcherServlet        : Completed 200 OK
Wooin-dev commented 1 month ago

두개가 리턴되서 오류가 남.

2024-07-19T05:31:32.162Z TRACE 1 --- [nio-8080-exec-1] o.s.t.i.TransactionInterceptor           : Completing transaction for [com.wooin.dailyone.service.PromiseGoalService.selectMyPromiseGoalList] after exception: org.springframework.dao.IncorrectResultSizeDataAccessException: Query did not return a unique result: 2 results were returned
2024-07-19T05:31:32.165Z DEBUG 1 --- [nio-8080-exec-1] .m.m.a.ExceptionHandlerExceptionResolver : Using @ExceptionHandler com.wooin.dailyone.exception.GlobalControllerAdvice#applicationHandler(RuntimeException)
2024-07-19T05:31:32.166Z ERROR 1 --- [nio-8080-exec-1] c.w.d.exception.GlobalControllerAdvice   : Error occurs org.springframework.dao.IncorrectResultSizeDataAccessException: Query did not return a unique result: 2 results were returned
2024-07-19T05:31:32.166Z DEBUG 1 --- [nio-8080-exec-1] o.s.w.s.m.m.a.HttpEntityMethodProcessor  : Using 'application/json', given [application/json, text/plain, */*] and supported [application/json, application/*+json]
2024-07-19T05:31:32.167Z DEBUG 1 --- [nio-8080-exec-1] o.s.w.s.m.m.a.HttpEntityMethodProcessor  : Writing [com.wooin.dailyone.controller.response.Response@162a60ed]
2024-07-19T05:31:32.168Z DEBUG 1 --- [nio-8080-exec-1] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [org.springframework.dao.IncorrectResultSizeDataAccessException: Query did not return a unique result: 2 results were returned]
Wooin-dev commented 1 month ago

일명 '따닥' 현상

중복적으로 들어온 요청에 대해 중복요청을 처리한 내용의 블로그를 몇몇 찾을 수 있었다.

선택한 방향

Wooin-dev commented 1 month ago

AOP를 활용하여 중복요청 제거

해당방식의 한계점 발견하여 철회

Wooin-dev commented 1 month ago

Redis분산락을 AOP를 통해 적용, 컬리 블로그

위 링크의 방식을 통해 해결.

고민할 점

해당 과정을 정리한 블로그