인프런 커뮤니티 질문&답변
jpa ddl-auto none을 하는 이유와 join 방법
해결된 질문
작성
·
34
0
Q. SQL 로 미리 테이블 작성하거나 인덱스 설정을 SQL 로 직접하는데 이유가 궁금합니다
인덱스 같은경우 jpa 에서 쓸수있는 옵션이 제한적이라 따로 SQL 로 관리한다고 듣긴했는데 테이블도 실제로 SQL 에서 하는지 궁금하고, SQL 로만 테이블 생성 인덱스 관리를 할경우 현업에서는 어떤 db 마이그레이션 라이브러리를 주로 사용하는지도 궁금합니다.
Q. 참조관계를 DB 에서 걸지않고 논리적으로만 걸었을때 참조테이블에대한 조인은 어떤식으로 하는지 궁금합니다.
MSA 기준으론 데이터베이스가 아예 분리될텐데 어떤식으로 조인하나요?
추가적으로 논리적으로 참조설계가 된 상황에서 @ManyToOne 사용이 가능한지궁급합니다. 예를들면 Comment 엔티티에서 parentCommentId 같은 같은 데이터베이스에 있는 테이블에 @ManyToOne 적용이 가능한지궁급합니다.
답변 2
0
쵸잉님, 안녕하세요!
일단 먼저 말씀드리고 싶은 점은, 사고가 jpa에 종속되지 않는게 좋을 것 같습니다!
실무에서는 jpa를 사용하지 않는 경우도 많고, 개인적으로도 선호하진 않습니다.
제 주변에서도 딱히 선호하는 경향은 드물기도 하고, 사용하더라도 단순 crud만 쓰는 사례도 많습니다.
그리고 결국 jpa가 만들어주는 것도 sql 스크립트일 뿐입니다.
Q. SQL 로 미리 테이블 작성하거나 인덱스 설정을 SQL 로 직접하는데 이유가 궁금합니다
인덱스 같은경우 jpa 에서 쓸수있는 옵션이 제한적이라 따로 SQL 로 관리한다고 듣긴했는데 테이블도 실제로 SQL 에서 하는지 궁금하고, SQL 로만 테이블 생성 인덱스 관리를 할경우 현업에서는 어떤 db 마이그레이션 라이브러리를 주로 사용하는지도 궁금합니다.
테이블이나 인덱스 스크립트는 별도 문서 또는 툴이나 스크립트로 관리되는 것이 일반적일 것 같습니다.
한번 생성 이후 자바 코드로 남겨둘 이유도 없고, 히스토리 관리도 어렵고, 오히려 불필요한 코드로 가독성만 나빠지게 될 것 같네요.
ddl-auto none으로 설정하는 이유는, 운영 중 새롭게 배포된 자바 코드로 인해 갑작스레 스키마 또는 인덱스가 변경되면 시스템에 장애를 유발할 수 있습니다.
db 마이그레이션은 어떤 질문을 주신건지 잘 이해를 못하였는데, jpa 코드로 인덱스를 생성한다고 해서 자바 라이브러리가 인덱스에 대한 마이그레이션을 수행해주는건 아닙니다. 인덱스 스크립트를 자바에서 만들어서 db로 전달해줄 뿐, 실제로는 모두 sql 기반으로 스크립트가 실행되어서 db 자체에서 인덱스가 생성됩니다.
Q. 참조관계를 DB 에서 걸지않고 논리적으로만 걸었을때 참조테이블에대한 조인은 어떤식으로 하는지 궁금합니다.
MSA 기준으론 데이터베이스가 아예 분리될텐데 어떤식으로 조인하나요?
추가적으로 논리적으로 참조설계가 된 상황에서 @ManyToOne 사용이 가능한지궁급합니다. 예를들면 Comment 엔티티에서 parentCommentId 같은 같은 데이터베이스에 있는 테이블에 @ManyToOne 적용이 가능한지궁급합니다.
MSA 기준으로 데이터베이스가 분리되면, 애플리케이션 레벨에서 각 마이크로서비스마다 필요한 데이터를 질의하여 조인하게 됩니다.
이 경우에 조인을 위한 네트워크 통신 비용, 질의 비용, 응답 지연 등의 문제가 생기게 되는데, 이를 해결하는 방법은 마지막 챕터 최적화 전략에서 일부 살펴보게 되네요!
@ManyToOne은 물리적 외래키를 강제하진 않고, 논리적 참조라고 하더라도 사용할 수 있습니다.
논리적 참조되는 컬럼에 대해 인덱스만 잘 고려되면 될 것 같네요.
하지만 위에서 JPA에 대해 회의적인 입장을 말씀 드렸듯이, @ManyToOne과 같은 연관 관계 애노테이션도 잘 사용하진 않습니다.
객체 간 참조 강결합과 코드와 내부적인 쿼리 실행 방식 이해에 복잡함을 수반하기 때문에 개인적으로 지양하는 방향이고, 애초에 엔티티가 코드 또는 DB 레벨에서 물리적으로 격리되어 있다면 참조할 수도 없습니다.
충분한 답변이 되었을지 모르겠네요. 혹시 더 궁금한 점 있으시면 편히 남겨주세요!
0
안녕하세요, 인프런 AI 인턴입니다. 쵸잉님.
질문 주신 내용은 JPA와 데이터베이스 작업에 대한 실제적인 사용 방법과 MSA 환경에서의 데이터베이스 접근에 대한 질문입니다. 이와 관련하여 몇 가지 정보를 제공하겠습니다.
1. JPA와 SQL을 통한 테이블 및 인덱스 관리
- DDL Auto-Setting None: JPA의 DDL-auto 옵션을
none으로 설정하는 이유는 프로덕션 환경에서 데이터베이스 스키마 변경을 JPA가 자동으로 관리하지 않도록 하기 위함입니다. 이는 데이터 무결성을 높이고, 개발자에게 더 많은 제어권을 부여합니다. 프로덕션 환경에서는 보통 수동으로 SQL 스크립트를 통해 테이블과 인덱스를 관리합니다.
- SQL을 사용하는 이유: JPA에서는 인덱스 설정 등 세밀한 조정을 위한 옵션이 제한적이며, 이러한 경우 데이터베이스에 맞는 최적화된 인덱스를 직접 설정하기 위해 SQL을 사용합니다.
2. 실무에서 사용하는 마이그레이션 도구
- DB 마이그레이션 도구: 일반적으로 Liquibase, Flyway 같은 데이터베이스 마이그레이션 도구를 사용하여 테이블 스키마와 인덱스를 관리합니다. 이 도구들은 DDL 스크립트를 통해 데이터베이스 변경 사항을 추적하고, 다른 환경에서도 일관되게 적용할 수 있도록 지원합니다.
3. MSA 환경에서의 조인 및 참조 관계
- MSA에서의 조인: MSA에서는 데이터베이스가 서로 분리되어 있어 물리적인 조인을 사용하지 못합니다. 대신, 각 서비스의 API를 통해 필요한 데이터를 가져와서 응용 프로그램 레벨에서 조인합니다.
- 논리적 참조와 JPA 사용: 논리적인 참조를 사용한다 해도, 같은 데이터베이스 내의 다른 테이블과의 관계를 설정할 때 @ManyToOne 등 JPA의 어노테이션은 사용할 수 있습니다. 하지만, 물리적 종속성을 피하고자 한다면 객체 레벨의 참조만을 사용하는 것이 바람직할 수 있습니다.
이와 관련하여 유사한 질문 및 실무 경험을 참고할 수 있는 답변 URL을 아래에 제공드립니다:
- JPA의 DDL 설정과 마이그레이션 전략에 대한 고려 사항 (게시글 제목)
- Microservices 환경의 데이터 통합 및 설계 고려사항 (게시글 제목)
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.





