Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

#13 API 고급 - 실무 필수 최적화 #15

Merged
merged 3 commits into from
Aug 3, 2023
Merged

#13 API 고급 - 실무 필수 최적화 #15

merged 3 commits into from
Aug 3, 2023

Conversation

jimin-kiim
Copy link
Member

@jimin-kiim jimin-kiim commented Aug 3, 2023

Overview

  • 트래픽이 많은 서비스의 경우 발생할 수 있는 성능 장애 문제와 관련된 개념인 OSIV 및 이를 켜고 끌 경우의 장단점을 이해하고 서비스의 특성에 따른 OSIV 관련 옵션 선택 로직 정리한다.

Contents

  • 배경 이해
    • 서비스에서 트랜잭션 시작. (@Transactional -> set auto commit false )
    • 트랜잭션 시작 -> 데이터 베이스 커넥션 가져온다. (디비에 트랜잭션 시작한다고 알린다.)
  • OSIV의 개념
    • Open Session In View (Open EntityManager In View)
    • JPA : EntityManager = Hibernate : Session
    • 하지만 관례상 JPA에서도 Hibernate 경우와 동일하게 OSIV라 칭한다. 또는 open-in-view
  • open-in-view: true
    • default. -> 애플리케이션 실행 시 터미널에 위 사실을 알려주며 경고를 띄운다. 즉 잘못 사용하면 위험함을 암시하는 것.
    • 왜 위험한가?
      • open-in-view가 true라는 것은 트랙잭션의 범위를 벗어나더라도 영속성 컨텍스트를 끝까지 유지하는 것을 말한다. (@Transactional 해당되는 부분이 끝나도 반환을 안 한다. ) API의 경우 API가 유저에게 반환될 때까지, 화면인 경우 뷰템플릿을 갖고 렌더링이 완성되고 데이터 리스폰스가 나갈 때까지. 이의 위험성은 너무 오랫동안 데이터베이스 커넥션 리소스를 사용해 장애로 이어질 수 있기 때문이다. 이는 실시간 트래픽이 중요한 애플리케이션에서 장애로 많이 나타난다. 컨트롤러에서 외부 API를 호출하는 경우 외부 API 대기 시간 동안에도 커넥션 리소스를 반환하지 못하고 유지 해야 하는 경우에서도 마찬가지로 문제가 된다.
    • 그럼 아예 끄면 되는 거 아닌가? 켜둔 이유가 무엇인가
      • 지연로딩을 위해서이다. 지연로딩을 하기 위해서는 영속성 컨텍스트가 살아있어야 한다. 이를 위해 true로 설정한 채 코드를 작성해 왔던 것. 즉 이를 켠다면 엔티티를 적극 활용해 레이지 로딩같은 기술을 컨트롤러, 뷰에서 활용하는 것이 가능해진다는 장점이 있다.
  • open-in-view: false
    • 실시간 트래픽이 많은 api 작성 시엔 장애를 막기 위해 이를 꺼야 한다. 근데 이때 지연로딩을 해야 할 경우는 어떻게 해야 할까
      • 여러 방법이 있지만 대표적으로 query service를 따로 작성하여 관리하는 방법이 있다. 즉 커맨드와 쿼리를 분리하는 것. 단 이럴 경우 코드와 계층 분리, 패키지 관리가 복잡해지는 단점이 발생한다.
  • 간단하게 정리하면 유지보수 측면에선 OSIV를 켜는 것이, 성능 측면에선 끄는 것이 적절하다고 말할 수 있다. api의 라이프사이클에 따라, 서비스의 규모 및 성격에 따라, admin api 여부 등에 따라 적절히 판단하여 OSIV on/off, query 서비스 분리 등을 통해 성능을 개선/ 장애 해결을 할 수 있다.

Related Issue

@jimin-kiim jimin-kiim merged commit 3152cdc into main Aug 3, 2023
1 check passed
@jimin-kiim jimin-kiim deleted the #13 branch August 3, 2023 08:20
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[FEAT] API 고급 - 실무 필수 최적화
1 participant