안녕하세요 현재 Spring 레거시 + Mybatis 로 구현된 프로젝트를 버전업(차세대) 하면서 Spring Boot + JPA 로 변경할 계획 입니다.
JPA 에 대하여 공부하면서 Entity 설계 중인데 많은 부분 어려움을 겪고 있습니다.
[환경] mariadb - main database : yhkim (가칭) - log database : yhkim_log_{yyyy}_{mm} 월별 데이터베이스 이며 main database 에 있는 테이블들과 99% 같은 테이블 정보를 가지고 있게 됩니다. - 처리되지 않는 최근 문서는 main database 에 저장되며 - 처리 완료된 문서 정보는 log database 에 저장하고 main database 에서는 삭제되는 구조 입니다.
[질문] 1. entity 중복 설계? - 위와 같은 구조에서 entity 설계를 할 때 main database 와 log database 에 대한 entity 를 모두 설계 해야 하나요? 대부분 같은 구조를 갖게 되기 때문에 class 가 완전히 동일한 형태가 됩니다.
- 위와 같은 구조에서 대상 데이터베이스를 로직에 따라 다르게 바라보게 할 수 있나요?
- 최초 저장시에는 main database 와 log database 에 동일하게 저장
- 결재, 반려, 미결재문서 조회 등은 main database 에서 처리
- 완료된 문서에 대해서는 log database 에 update 하고 main database 에서는 제거
- 이렇게 동작해야 하는데... 가능할지 모르겠네요..
- mybatis 에서는 param.setDbName(dbName); param.setTableName(tableName);
- SELECT .... FROM ${dbName}.${tableName} WHERE ... 와 같은 형태로 사용하고 있습니다. (테이블도 _{dd} 형태)
- @OneToOne, @OneToMany 관련
- 문서정보.java
- 문서결재선정보.java
- 위와 같이 있을 때 entity 설계는 문서정보.java 에 문서결재선정보를 @OneToMany 로 선언했습니다.
- 문서결재선정보.java 에도 @ManyToOne 을 설정해 줘야 하나요? (항상 쌍으로 선언하는 건가요?)
- save 시 개별 저장? cascade.all ??
- 문서정보를 저장할 때 문서결재선 정보에 cascade.all 를 지정해 두면 한번에 저장이 되네요.
- 편하고 좋습니다.
- 다만, 문서결재선정보 외 다른 항목의 경우 문서별로 무조건 추가되는 것이 아니라 다른 테이블에 이미 저장되어 있는 정보와 매치만 되면 됩니다.
- jpaRepository 의 save 를 이용할 경우 duplicate key (무조건 insert 하기 때문에) 예외가 발생하게 됩니다.
- 이런 경우 jpaRepository 를 이용하지 않고 service 단에서 EntityManager를 DI 하여 별도 처리를 해야 하는 건가요?
마음이 급하여 두서 없이 질문 드린점 죄송합니다.
4개의 의견 from SLiPP
서로 다른 데이터 베이스 사용 이런 경우는 겪어보지는 못하였는데요. jpa 및 spring 환경에서는 database 가 달라진다면, connection 도 달라져야 하지 않을까 하네요. 처음 든 생각은 datasource 를 여러개 둔 후 상황에 따라 다른 datasource 를 사용하면서 insert 를 하면 좋지 않을까 생각이 듭니다. https://supawer0728.github.io/2018/05/06/spring-boot-multiple-datasource/
한 쪽에서 OneToMany 를 한 경우 다른 쪽에서 만드시 manyToOne 은 하지 않아도 될 것 같습니다. 나중에 로직에서 필요할때 넣으면 될 것 같습니다
개인적으로는 casecade.all 로 바로 저장하기 보다는 직접 save 를 하나씩 호출하면서 저장하는 것이 좋은 것 같습니다. 가끔 의도치 않게 jpa/hibernate 의 동작으로 delete 가 날아가 문제가 발생할 것 같아요
@jinwon
답변 감사합니다.
1번 내용이 현재 가장 문제네요...
사실 mybatis 에서는 ${dbName}.${tableName} 과 같이 사용했기 때문에 전혀 문제가 되지 않았습니다. 로그성 데이터베이스이기 때문에 datasource를 여러개 만들어서 사용하기에도 무리가 있습니다.. ex) 검색조건: 2019.01.01~2019.06.31 로 할 경우 yhkim_log_2019_01.doc, ..... yhkim_log_2019_06.doc 에 대해서 select 해야 하기 때문에....
mybatis 와 혼용해서 사용해야 하는지... 잘 모르겠네요. ㅜㅜ
@보리차이리터 안녕하세요. jpa 만으로 해결하기 어려울때 mybatis 나 JdbcTemplate 를 사용하는 것도 좋은 방법일듯 합니다.
실제로 말씀해주신 상황 이외에도 통계 sql 이나 복잡한 sql 을 돌릴 때, jdbc template 를 사용하기도 하였어요. 김영한님의 JPA 책에서도 고려해 볼 수 있는 상황이라는 말이 있네요.
https://spring.io/projects/spring-data-jdbc 요새 spring data jdbc 도 잘 되어있어, 고려하기 좋을 것이라 생각합니다.
@jinwon
고맙습니다. 책 보면서 공부하면서 진행 중 입니다. 말씀해 주신 것 처럼 필요한 상황에 혼용해서 사용해 봐야 하겠네요. ^^
의견을 남기기 위해서는 SLiPP 계정이 필요합니다.
안심하세요! 회원가입/로그인 후에도 작성하시던 내용은 안전하게 보존됩니다.
SLiPP 계정으로 로그인하세요.
또는, SNS 계정으로 로그인하세요.