최지훈
51
2020-04-04 23:00:24 작성 2020-04-04 23:00:49 수정됨
3
207

Spring 에서 syncronized 사용에 관한 질문...


안녕하세요. 


자바 코드에 대해서는 잘알지 못 하지만, 실제 서비스상에서 문제가 없는지 몰라서 문의드려봅니다.


자바 특성상 쓰레드를 기반으로 동작하기 때문에. 스프링 기반으로 MVC로 웹개발을 한 상태에서... 

포인트 적립/차감 같은 기능을 구현했을 때, 매크로나 기타 프로그램을 이용해서 단시간이 수천, 수만건의 요청이 접수되는 경우, 포인트 처리 순서가 꼬이게 되는 현상이 있습니다.(차감이 연달아 된다거나 적립이 늦게되거나 먼저 되거나 등등) 


그런데 이때 스프링 컨트롤러나 DB 처리하는 함수 부분에서 syncronized 를 사용하는게 괜찮은 건지 궁금합니다. (아니면 다른 대안이 있는지도 궁금합니다)


다만, syncronized 를 함수에 명시해서 포인트 적립/차감 처리를 사용하면 해당 함수의 경우 동시 처리가 방지되기는 하는데, 이런식으로 구현을 했을 때 다른 컨트롤러로 들어온 처리에 문제가 되거나 하지 않는지 궁금합니다. 아니면 특정 부분만 호출을 큐에 담았다가 처리하는 미들웨어 같은걸 써야 하는지.. )

 

우선 구글 캡챠로 방지를 해볼까 하는데, 캡챠 이외에 일시적으로 밀려들어오는 요청에서 syncronized 처리가 실서비스 상황에서 문제를 일으킬 여지가 없는지 궁금합니다. 


잘 모르는 부분이 많아서.. 문의 드리오니,조언이나 다른 방안이 있다면 댓글 부탁드립니다.


감사합니다. 

0
0
  • 답변 3

  • 정원
    160
    2020-04-05 02:35:13

    트랜젝션 로직을 안짜고 syncronized로 하시면 단일 인스턴스 WAS일 때는 문제 없을지 몰라도 추후에 여러개 인스턴스로 변경되면 결국 포인트 처리 순서가 꼬이는 문제가 다시 발생합니다

    이 문제의 답은 사수께 여쭤봐서 설계하고 배우는 것이 맞을 것 같습니다

    0
  • LichKing
    16k
    2020-04-05 10:18:44

    글로만 봤을땐 절대 사용하면 안됩니다. 단시간에 수천수만건이 들어올때 그 수천수만건이 전부 순차적으로 처리된다는걸 의미합니다. 스루풋에서 급격한 저하가 있을거고, 그럼 또다른 이슈가 등장할겁니다.

    제가 봤을땐 원천적인 문제가 어딘가에 있을거같은데요.(의도치않은 공유데이터 사용 등)

    이걸 찾아서 해결해야지 그냥 락을 걸어버리는건 문제를 덮어버리는것뿐만 아니라 또다른 혹은 더큰문제를 불러일으키게 될겁니다.

    0
  • 최지훈
    51
    2020-04-06 09:20:41

    답변 주신 두분 모두 감사드립니다.

    정원님 /// 트랜잭션 처리 부분을 확인해봐야 겠군요. 관련해서 한번 살펴보겠습니다.
    사수가 없다보니 이래저래 조언을 구하고 있습니다. 어쨌든 답변 감사합니다.. 

    LichKing님 // 기계적인 방식으로 요청건수를 임의로 처리했을 때 발생되는 현상이라... 사전에 막는 차원에서 살펴보는 중인데요. 정원님의 말씀대로 트랜잭션 부분을 한번 확인해봐야 겠습니다. 답변 감사합니다. 


    0
  • 로그인을 하시면 답변을 등록할 수 있습니다.