JPA 관련 여러 질문

2019-08-20 15:11

안녕하세요 현재 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 가 완전히 동일한 형태가 됩니다.

  1. 위와 같은 구조에서 대상 데이터베이스를 로직에 따라 다르게 바라보게 할 수 있나요?
  • 최초 저장시에는 main database 와 log database 에 동일하게 저장
  • 결재, 반려, 미결재문서 조회 등은 main database 에서 처리
  • 완료된 문서에 대해서는 log database 에 update 하고 main database 에서는 제거
  • 이렇게 동작해야 하는데... 가능할지 모르겠네요..
  • mybatis 에서는 param.setDbName(dbName); param.setTableName(tableName);
  • SELECT .... FROM ${dbName}.${tableName} WHERE ... 와 같은 형태로 사용하고 있습니다. (테이블도 _{dd} 형태)
  1. @OneToOne, @OneToMany 관련
  • 문서정보.java
  • 문서결재선정보.java
  • 위와 같이 있을 때 entity 설계는 문서정보.java 에 문서결재선정보를 @OneToMany 로 선언했습니다.
  • 문서결재선정보.java 에도 @ManyToOne 을 설정해 줘야 하나요? (항상 쌍으로 선언하는 건가요?)
  1. save 시 개별 저장? cascade.all ??
  • 문서정보를 저장할 때 문서결재선 정보에 cascade.all 를 지정해 두면 한번에 저장이 되네요.
  • 편하고 좋습니다.
  • 다만, 문서결재선정보 외 다른 항목의 경우 문서별로 무조건 추가되는 것이 아니라 다른 테이블에 이미 저장되어 있는 정보와 매치만 되면 됩니다.
  • jpaRepository 의 save 를 이용할 경우 duplicate key (무조건 insert 하기 때문에) 예외가 발생하게 됩니다.
  • 이런 경우 jpaRepository 를 이용하지 않고 service 단에서 EntityManager를 DI 하여 별도 처리를 해야 하는 건가요?

마음이 급하여 두서 없이 질문 드린점 죄송합니다.

4개의 의견 from SLiPP

2019-08-24 13:10
  1. 서로 다른 데이터 베이스 사용 이런 경우는 겪어보지는 못하였는데요. jpa 및 spring 환경에서는 database 가 달라진다면, connection 도 달라져야 하지 않을까 하네요. 처음 든 생각은 datasource 를 여러개 둔 후 상황에 따라 다른 datasource 를 사용하면서 insert 를 하면 좋지 않을까 생각이 듭니다. https://supawer0728.github.io/2018/05/06/spring-boot-multiple-datasource/

  2. 한 쪽에서 OneToMany 를 한 경우 다른 쪽에서 만드시 manyToOne 은 하지 않아도 될 것 같습니다. 나중에 로직에서 필요할때 넣으면 될 것 같습니다

  3. 개인적으로는 casecade.all 로 바로 저장하기 보다는 직접 save 를 하나씩 호출하면서 저장하는 것이 좋은 것 같습니다. 가끔 의도치 않게 jpa/hibernate 의 동작으로 delete 가 날아가 문제가 발생할 것 같아요

2019-08-26 09:38

@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 와 혼용해서 사용해야 하는지... 잘 모르겠네요. ㅜㅜ

2019-08-26 10:57

@보리차이리터 안녕하세요. jpa 만으로 해결하기 어려울때 mybatis 나 JdbcTemplate 를 사용하는 것도 좋은 방법일듯 합니다.

실제로 말씀해주신 상황 이외에도 통계 sql 이나 복잡한 sql 을 돌릴 때, jdbc template 를 사용하기도 하였어요. 김영한님의 JPA 책에서도 고려해 볼 수 있는 상황이라는 말이 있네요.

https://spring.io/projects/spring-data-jdbc 요새 spring data jdbc 도 잘 되어있어, 고려하기 좋을 것이라 생각합니다.

의견 추가하기

연관태그

← 목록으로