지우너
[CRUD 프로젝트] Todo(2) DB교체 본문
안녕하세요!
Todo(1)을 작성한지도 벌써 한달이 되었습니다. 1에서는 주로 Todo 리스트의 기본 기능 및 화면 구현을 했습니다.
본격적으로 기능을 추가하기에 앞서 해야할 일이 있습니다.
- DB파일 교체
- 편의상 전에 강의에서 만든었던 db 파일을 임시로 사용하고 있었습니다.
- 사실 이 부분은 설정만 만져주면 되기에 간단한 작업이었는데, 그래서 그런지 우선순위가 밀리게 되었습니다.
- 깃허브 연동
- 기능이 점점 늘어나게 되면 branch를 이용하여 관리해주는 게 편할 거 같다고 생각했습니다.
- 화면 구조 개선
- 화면의 경우 부트스트랩의 코드를 그대로 가져오거나 잘 작동되지 않는 부분은 gpt를 이용해 구현했습니다.
- 그래서 tag 같은 구조가 깔끔하게 구성되어 있지 않다는 문제가 있습니다.
원래는 그렇게 오래 걸릴 일들이 아니라고 생각해 (2)에 모두 쓸 생각이었으나, DB 파일을 교체하는데에 문제가 있었습니다.
이 글은 아래의 문제들을 해결하는 과정들을 순차적으로 정리했습니다.
- 사용 중이던 db는 h2 데이터 베이스의 슈퍼 관리자 sa를 비밀번호 없이 사용하고 있었음 → sa 계정에 비밀 번호를 설정하고, 새로운 db 계정을 생성
- 깃허브에 올릴 생각으로 git init을 하고 .gitignore 설정을 만지고 .yml 파일을 보니 db 정보가 그대로 드러나 있음 → db 관련 정보를 환경 설정 파일인 .env 파일로 분리하고 intellij 환경변수 설정
편의상 "-다" 체를 사용합니다!
db파일 교체
데이터베이스 파일 생성
영한쌤이 jpa1 프로젝트 환경설정에서 가르쳐 주셨던 방법을 이용하여 todo 데이터베이스 파일을 생성해준다.
- jdbc:h2:~/db명 (최소 한번)
- ~/db명.mv.db 파일 생성 확인
- 이후 부터는 jdbc:h2:tcp://localhost/~/db명 이렇게 접속

yml 파일 설정
spring:
datasource:
url: db-url
username: your-db-username
password: your-db-password
driver-class-name: org.h2.Driver
jpa:
hibernate:
ddl-auto: update
properties:
hibernate:
# show_sql: true
default_batch_fetch_size: 100
format_sql: true
logging:
level:
org.hibernate.SQL: debug
org.hibernate.orm.jdbc.bind: trace #??? ?? 3.x, hibernate6
ddl-auto: create로 설정한 이유
김영한님은 JPA 기본편에서 ddl-auto 설정에 대해 아래와 같이 언급했다.

.gitignore, DB username, password, .env
git에 올리려고 했는데 yml파일에는 db name이랑 password가 있어서 보안에 안 좋을 거 같은 느낌이 들었다.
gpt는 이에 대해 로컬 db라고 해도 포트가 열려 있는 경우
.yml파일에 적혀있는 username과 password를 이용해 해킹을 당할 수 있다고 말하며, "보안분리"를 해야한다고 했다.


application.yml이 로컬에서 .env나 다른 설정 파일을 자동으로 읽게 해두면, 실행할 때마다 별도로 입력할 필요가 없다.
Spring Boot는 기본적으로 OS 환경 변수나 .properties 파일, application.yml에서 ${변수명}으로 읽을 수 있다.
즉, IntelliJ에서 실행할 때도 .env 파일 내용을 미리 읽게 설정해두면, DB 연결은 평소처럼 자동으로 된다.
DB username password 설정
우선 db에 username과 password가 설정되어 있지 않았으므로 설정해준다. 아래 글을 참고하여 이름과 비밀번호를 변경해주었다.
-- sa 계정에 강력한 비밀번호 설정 (보안 확보)
ALTER USER sa SET PASSWORD '비밀번호';
-- 기존에 있을 수 있는 유저네임 계정 제거 (선택적)
DROP USER IF EXISTS 유저네임;
-- 새 사용자 생성
CREATE USER 유저네임 PASSWORD '비밀번호';
-- 관리자 권한 부여 (필요한 경우만)
ALTER USER 유저네임 ADMIN TRUE;
관리자 계정 sa를 rename하지 않고, 새로운 계정을 만드는 이유
1. 하드코딩된 참조 가능성: 일부 프레임워크 또는 내부 로직이 sa 계정(h2 데이터베이스의 기본 슈퍼 관리자 계정)을 참조할 수 있다.
-> 이름을 바꾸면 접근 실패, 권한 오류 등의 문제가 발생할 가능성이 있음
2. 역할 분리 및 책임 분산
sa는 초기 세팅용, 비상시 사용하는 계정. 실제 서비스 운영이나 테스트에는 역할 기반 계정을 사용하는 것이 좋음
.yml 파일 수정
spring:
datasource:
url: ${DB_URL}
username: ${DB_USERNAME}
password: ${DB_PASSWORD}
driver-class-name: org.h2.Driver
jpa:
hibernate:
ddl-auto: update
properties:
hibernate:
# show_sql: true
default_batch_fetch_size: 100
format_sql: true
logging:
level:
org.hibernate.SQL: debug
org.hibernate.orm.jdbc.bind: trace #??? ?? 3.x, hibernate6
.env 파일 분리
프로젝트 루트 디렉토리에 .env 파일을 생성한다.
DB_URL=db_url
DB_USERNAME= db_username
DB_PASSWORD= db_password
db_url, db_username, db_password에 본인이 설정한 db의 url, username, password를 입력해준다.
IntelliJ 환경변수 설정

우측 상단에 디버그 버튼 오른쪽에 세로점3개를 클릭 - Edit

Environment variables에 아래와 같이 입력한다.
DB_URL=db_url;DB_USERNAME= db_username;DB_PASSWORD= db_password
이제 드디어 DB 교체가 끝났습니다. 내일은 (3) git 연동을 합니다! 읽어주셔서 감사합니다.
'Project' 카테고리의 다른 글
[CRUD 프로젝트] Todo(3) Git 연동 (0) | 2025.04.15 |
---|---|
[CRUD 프로젝트] Todo(1) (0) | 2025.03.13 |
[Unity 3D Run] (아직 못함) 캐릭터를 가리는 오브젝트의 투명도 처리 (0) | 2023.05.27 |
[Unity 3D Run] 해상도 설정 (1) | 2023.04.08 |
[Unity 3D Run] 게임오버/클리어 UI (3) (1) | 2023.03.25 |