상황
현장실습을 진행하면서 데이터베이스에 의도하지 않게 테이블이 여러개 생기는 상황을 만나고 나서 외부용 DB를 external로 분리를 하고 테스트를 하기 위해서 H2데이터베이스를 연결해서 작업을 진행하고 있었다. 처음에는 문제가 발생하지 않았고 실시간으로 데이터를 가지고 오는것도 가능했다. 그런데 과거 데이터를 가지고 올려고 하는데 갑자기 조회가 안되는 일이 발생했다!!!
확인을 해보니까 테이블이 없다고 나오고 있었고, 저장된 데이터들이 사라져 버렸다.... 백업을 해놓은 상태가 아니기 때문에 복구 할 수 없었고 나는 내가 어떤부분을 잘못 작성했는지 이해가 안되고 있었다.
일단 DB를 local에 생성해서 Test용 데이터만 추출해서 기능을 하기로 했고 죄송하다는 말씀을 드린 이후에 local DB로 작업을 시작했다.
문제 발생
계속 고민한 끝에 이유를 찾아버렸다..
먼저 내가 작업하는 파일의 application.properties에는
spring.jpa.hibernate.ddl-auto=create
이게 설정되어 있었다. 근데 JPA에 연결한 데이터베이스는 H2를 연결해놨는데 왜 문제가 발생했는지 이해가 안되고 있었다. 그리고 외부 DB로는 SELECT쿼리만 보내고 있었기 때문에 테이블이 없어진다는게 도무지 이해가 안된 거 같다.
계속해서 고민하던 끝에 문제점을 발견했다!!
먼저 다중 데이터소스를 설정하기 위해서 application.properties에서 외부DB + H2 database 관련 설정을 명시해주고 따로 Config파일을 만들어서 Bean에 등록할 수 있도록 관리를 하고 있었다. 그래서 DataSource를 만드는 과정에서 @Primary를 H2 Database bean쪽에 붙여놓고 있었는데 외부 DB를 못찾는 거 같아서 @Primary를 External DB를 DataSource에 등록하는 쪽에 설정을 해놨다. 이게 진짜 문제였다.... 정말 고민을 한끝에 내가 큰 실수를 했다는 걸 깨달았다.
왜 문제였을까??
먼저 @Primary는 Spring 컨테이너에 같은 타입의 Bean이 여러 개 있을 때 기본으로 주입될 Bean을 지정하는 어노테이션이다.
그럼 External DB에 해당 어노테이션을 명시해 둔다면 JPA는 External DB를 기본으로 주입하게 된다. 그러면 어떻게 되는걸까??
내가 create로 설정을 해놨기 때문에 기존의 중복된 이름으로 되어있는 테이블을 DROP시키고 다른 엔티티를 새로 만드는 현상이 발생한다. 이 과정에서 DB에 기존에 존재하는 테이블이 삭제가 된것이다.
해결
@Primary
@Bean
public (H2 Database)
@Bean
public (External Database)
이런 형식으로 설정을 해줘서 H2 Database가 JPA에 연결되게 만들어서 엔티티를 정상적으로 생성하게 변경하였고 create로 해놓은 부분은 update로 변경해줘서 문제를 해결했다.
이후 개선 방안
- Spring boot에 대한 이해도가 더 많이 필요할거 같다. 이번 기회에 JDBC, JPA의 관계를 이해했다.
- 충분한 테스트를 진행한 이후에 항상 중요한 DB에 접근하는 습관을 가져야 할 거 같다. 테스트는 항상 로컬환경에서 먼저 수행하자!! -> 계속 명심하자...
- 가능한 spring.jpa.hibernate.ddl-auto 설정은 none, update로 설정을 하고 실험을 하자 또는 validate를 사용하자.
어제도 문제를 겪었는데 이번에는 제대로 실수한 거 같다... 앞으로는 이번 경험을 기반으로 실수하지 않고 개발을 할 수 있도록 해야겠다!!
관계도
[Spring 애플리케이션]
│
▼
┌─────────────────────────────┐
│ 데이터 접근 기술 (Data Access Layer) │
└─────────────────────────────┘
│
├────────────┬─────────────┬──────────────┬──────────────┐
▼ ▼ ▼ ▼
┌────────────┐ ┌────────────┐ ┌─────────────┐ ┌───────────────┐
│ JDBC API │ │ JdbcTemplate │ │ MyBatis │ │ JPA (Hibernate) │
└────────────┘ └────────────┘ └─────────────┘ └───────────────┘
│ │ │ │
└───┬─────────────┴──────┬───────┴────────────────┘
▼ ▼
┌────────────────────────┐
│ JDBC Driver (MySQL, ...) │
└────────────────────────┘
│
▼
[Relational Database (RDBMS)]
'에러(Error)' 카테고리의 다른 글
spring.jpa.hibernate.ddl-auto를 조심히 사용하자!! (0) | 2025.07.01 |
---|