인프런 커뮤니티 질문&답변

asdkfur님의 프로필 이미지

작성한 질문수

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

변경 감지와 병합(merge)

jpa 사용 가능성에 대해 문의 드립니다.

해결된 질문

20.03.18 17:16 작성

·

254

6

안녕하세요 매번 친절한 답변 감사합니다. 정말 정말 도움이 되고 있습니다. 

이번에는 이런경우에도 jpa 사용이 효율적인지 또는 가능한지를 묻고 싶어서 질문 드립니다. 프로젝트 구조상 마스터와 서브디비 여러개로 구성되어있을때 디비정보가 딱 정해진게 아니라 특정 리퀘스트마다 마스터 디비 를 조회를 통해 서브디비 정보를 얻어와 (ip는 각각 다르지만 테이블 구조,데이터베이스 이름등은 서브디비 모두 동일하다는 가정하에) 동적으로 서브디비와 커넥션을 맺어 사용해야  하는데

이 상황에서도 jpa를 활용가능 할까요 또는 효율적일 까요? 이런경우에서도 jdbc 커넥션풀이 성능에 도움을 줄 수 있을까요?

답변 4

7

김영한님의 프로필 이미지
김영한
지식공유자

2020. 03. 20. 01:30

음... 말씀하신 내용을 들어보니, 현재 서브 DB는 데이터베이스 커넥션 풀을 사용하지 않는군요.

그리고 서브DB마다, 데이터가 샤딩이 되어 있는 구조인가 보네요.

(만약에 리플리카 모델이라면 이런식으로 마스터 테이블을 통해서 IP를 얻어오는 것은 좋지 않습니다.)

말씀하신 내용으로 제가 생각하는 방향을 말씀드릴께요. 제가 상황을 더 디테일하게 몰라서 그냥 참고만 부탁드립니다.

RoutingDataSource를 적용하고, 서브 DB는 모두 데이터소스에 등록하고, 커넥션 풀 관리를 하는 것을 권장드립니다.

기본적으로 데이터베이스 커넥션 풀을 사용하는게 여러가지 면에서 더 효과적입니다.

서브 DB들도 각각 마스터 슬레이브 구조로 되어 있을 것이어서 장애시에 자동으로 failover가 일어나는 구조일 것이라 생각합니다.

마스터DB에서 관리하는 서브DB IP도 어차피 실시간으로 막 바꿀 수 있는게 아니어서, DB 관련 작업이 있을 때는 DBA와 애플리케이션 쪽에서 서로 플랜을 잡고 진행할 것이라 크게 문제가 없을 것이라 생각합니다.

마지막으로 성능 문제를 말씀드리면, 제가 과거에 한 서버에서 데이터베이스 커넥션풀을 1000개 이상 사용한 적이 있었는데(지금은 이렇게 크게는 잘 안잡습니다.), 특별히 성능 문제는 없었습니다. 물론 이 부분은 서버마다 상황이 다르기 때문에 꼭 성능 테스트를 하고 사용하는게 중요합니다.

오히려 커넥션 풀을 사용하면 계속 객체를 생성하고 지우는 것이 아니라 재사용하고, 외부에 소켓을 열고 닫는 행위 자체가 줄어들기 때문에 성능이 향상됩니다.

감사합니다^^

5

김영한님의 프로필 이미지
김영한
지식공유자

2020. 03. 18. 23:41

반갑습니다 asdkfur님^^ 좋은 질문입니다.

저도 처음에 이런 복잡한 상황에도 JPA를 사용할 수 있을까 고민했던 적이 있습니다.

실무에서는 스프링과 JPA를 함께 사용하고, 데이터베이스 커넥션(데이터소스)과 관련된 부분은 JPA가 아니라 스프링 프레임워크가 대신 관리해줍니다. 따라서 마스터 슬레이브 구조나, 샤딩 구조에서도 아무런 문제없이 사용할 수 있습니다.

추가로 질문주신 jdbc 커넥션풀은 이런 경우에도 기본으로 사용해야 합니다^^!

감사합니다.

1

asdkfur님의 프로필 이미지
asdkfur
질문자

2020. 03. 22. 14:45

항상 친절한 답변 감사합니다. 

1

asdkfur님의 프로필 이미지
asdkfur
질문자

2020. 03. 19. 16:40

안녕하세요 답변 정말 감사드려요. 선생님 말듣고 좀더 알아본결과 두가지정도의 방법이 있더라구요

1.jdbc template  사용

2. RoutingDataSoruce사용 

1번 방법은 커넥션 풀로 관리되는 지는 모르겠지만 그냥 매 리퀘스트마다 마스터 디비 질의 후 datasource 생성후에 jpa 사용없이 쿼리로 날리는 방법인데.. 

이방법은 매번 커넥션 새로 생성을 감수해야 하고 jpa 없이 한다면 간단한 프로젝트면 모르겟는데 복잡해지고 커지면 불가능 할거 같아요 ..

  2번 방법은 초기에 모든 서브 디비를 등록해놓고 리퀘스트마다 마스터 디비 질의 후 적절한datsource를 선택하는 방법인데.... 지금상황으로는 서브디비가 10개정도인데 각각의 connection pool을 기본값 10으로 안전하게 지정해놓으면 전체 100개정도가 되는데  스프링 서버쪽 부하에 문제는 없을까요?  그리고 이런종류에 서비스가 많다면 결국엔 서브 디비쪽 부하나 커넥션 사이즈도 문제가 생길수있을거 같아요(이런상황은 결국엔 디비 구조 변경이 시간만 있다면 가장 나은 선택인건가요?)그리고 현재 마스터디비에 서브디비의 아이피를 관리하는데 자주 바뀔리는없지만 바뀐다면 현재 실시간 마스터 디비를 조회해서 서브디비 datasource 10개를 관리하는게 아니기떄문에 수정이 필요할수도 있을것같아요 .. 그럼에도 이게 최선의 방법인지 의견을 여쭙고 싶습니다. 

감사합니다.

 

asdkfur님의 프로필 이미지

작성한 질문수

질문하기