[JPA] JPA가 DDL을 자동 생성해주는데, 굳이 내가 DDL을 작성해야할까?

이동엽·2023년 3월 5일
2

jpa

목록 보기
8/8
post-thumbnail

바야흐로 개강을 앞둔 2월 중순, 우리 팀 아보카도는 요구사항 설계 및 데이터베이스 설계를 마쳤다.
이제 할 일은? → JPA를 이용한 엔티티 설계 및 관계 매핑!


마침 자바 ORM 표준 JPA 프로그래밍을 공부하던 중이였고, 하고 싶었던 공부였기에 술술 진도가 나가던 찰나!
갑자기 스친 생각이 있었다.


JPA를 사용하면 개발자가 직접 SQL을 작성하지 않아도 된다는 건 이해했다!
이전에 데이터베이스 설계를 마쳤기에, 물리적 설계과정에서 직접 DDL을 작성하기도 했다.


근데 스프링 부트와 JPA를 이용하면 애플리케이션을 시작할 경우 자동으로 CREATE 쿼리가 날라가는데,
‘굳이 DDL을 내가 작성해야 할까?’ 라는 생각이 스쳤다.


  • 애플리케이션 실행 시 JPA가 작성해주는 DDL

  • 그리고 직접 작성한 DDL


현재 프로젝트 환경

  • 나는 아직 설계 초기 단계이고, 로컬 h2 DB를 사용 중인데
  • 현재 내 application.ymlspring.jpa.hibernate.ddl-auto: create 옵션으로 되어있다.
    • 참고로 이 옵션은 해당하는 테이블이 있으면 drop하고, 테이블을 새로 만드는 명령이다.
    • 반드시 로컬 환경에서만 써야 한다! 운영 환경에서는 기존 데이터가 있는 테이블을 다 날려버리기 때문!


현재까지의 생각은 이렇다.

  • 지금은 로컬이라 create 옵션을 붙여놔도 상관없기에 이 옵션 덕에 DDL이 자동으로 생성되지만,
    운영 DB에선 이 옵션을 사용하지 않으니 직접 작성해야 하지 않을까?


이에 대한 주변에서 얻은 의견들

  • DDL로 제한할 요소가 많다!
    • 아무리 코드에서 검증을 한다해도, 외부에서 DB 정보를 얻어 접속할 경우 직접 DDL로 제한해야 한다.

  • 또한 나처럼 프로그램을 운영할 경우, DB가 코드에 종속적일 수 있다!
    • 갑자기 JPA를 안 쓴다고 한다면?? → 라이브러리를 바꾸기 위해 코드를 보고 DDL을 작성해야 함!

추가!

짤막하게 배우고 가는 ddl-auto 옵션 종류

  • create : 기존 테이블을 삭제 후 생성 (drop + create)
  • create-drop : create와 같으나 종료시점에 테이블을 drop
  • update : 변경된 내용만 반영 → 운영 DB에서는 사용하면 안된다고 한다.
  • validate : 엔티티와 테이블이 정상 매핑되었는지만 확인
  • none : 사용하지 않음 → 사실상 없는 값이지만 관례상 none이라고 한다.

주의할 점

  • 운영 장비에서는 절대 create, create-drop, update를 사용하면 안된다.
  • 개발 초기 단계는 create 또는 update
  • 테스트 서버는 update 또는 validate
  • 스테이징과 운영 서버는 validate 또는 none
  • 로컬 환경을 제외한 나머지 서버에서는 최대한 직접 쿼리를 날려서 적용하는 것이 가장 좋다고 한다.


참고자료
ddl-auto 옵션 관련 주의할 점!!!!!!!!!

profile
백엔드 개발자로 등 따숩고 배 부르게 되는 그 날까지

2개의 댓글

comment-user-thumbnail
2023년 3월 5일

그래서 답이 뭐냐고요

1개의 답글