환경 변수 설정
기본 원칙
민감 정보는 절대 코드에 하드코딩하지 않는다.
모든 환경별 설정은 환경변수 또는 프로파일 파일로 분리한다.
application.yml 구조
spring:
application:
name: agent
datasource:
url: jdbc:mysql://${DB_HOST}:3306/scraping?useSSL=false&serverTimezone=Asia/Seoul&characterEncoding=UTF-8
driver-class-name: com.mysql.cj.jdbc.Driver
username: ${DB_USERNAME}
password: ${DB_PASSWORD}
jpa:
hibernate:
ddl-auto: ${DDL_AUTO:validate} # 운영: validate, 개발: update
show-sql: ${SHOW_SQL:false}
mail:
host: smtp.naver.com
port: 587
username: ${NAVER_USERNAME}
password: ${NAVER_PASSWORD}
ai:
anthropic:
api-key: ${ANTHROPIC_API_KEY}
chat:
options:
model: claude-sonnet-4-6
max-tokens: 4096
slack:
webhook-url: ${SLACK_WEBHOOK_URL}
app:
api:
url: ${API_URL:http://localhost:8080}
version: ${APP_VERSION:1.0.0}
환경변수 접두사 규칙
| 접두사 | 용도 | 예시 |
|---|---|---|
DB_ | 데이터베이스 접속 정보 | DB_HOST, DB_USERNAME, DB_PASSWORD |
ANTHROPIC_ | Claude AI API | ANTHROPIC_API_KEY |
SLACK_ | Slack 알림 연동 | SLACK_WEBHOOK_URL |
NAVER_ | 네이버 메일 SMTP | NAVER_USERNAME, NAVER_PASSWORD |
APP_ | 애플리케이션 공통 | APP_VERSION, APP_API_URL |
기본값 설정 규칙
# ${ENV_VAR:기본값} 형식 사용
server.port: ${PORT:8080}
app.api.url: ${API_URL:http://localhost:8080}
- 운영 환경에서 반드시 주입되어야 하는 값은 기본값 없이 선언 (
${DB_PASSWORD}) - 개발 편의를 위해 기본값이 허용되는 값만 기본값 지정
환경별 프로파일 분리
src/main/resources/
├── application.yml # 공통 (기본값, 환경변수 참조)
├── application-local.yml # 로컬 개발 전용 (git 커밋 허용)
└── application-prod.yml # 운영 전용 (git 커밋 금지)
application-local.yml 예시
로컬 개발 시 실제 RDS 없이 H2 인메모리 DB 사용:
spring:
datasource:
url: jdbc:h2:mem:testdb;MODE=MySQL
driver-class-name: org.h2.Driver
username: sa
password:
jpa:
hibernate:
ddl-auto: create-drop
show-sql: true
h2:
console:
enabled: true
application-prod.yml 예시
spring:
jpa:
hibernate:
ddl-auto: validate
show-sql: false
datasource:
url: jdbc:mysql://scrapinng-db.cb4ccem8gbzh.ap-northeast-2.rds.amazonaws.com:3306/scraping?useSSL=false&serverTimezone=Asia/Seoul&characterEncoding=UTF-8&allowPublicKeyRetrieval=true
프로파일 활성화
# 로컬 실행 시
./gradlew bootRun --args='--spring.profiles.active=local'
# EC2 실행 시
java -jar agent.jar --spring.profiles.active=prod
# systemd service 파일
ExecStart=/usr/bin/java -jar /opt/agent/agent.jar --spring.profiles.active=prod
EC2 환경변수 관리
agent.env 파일 (EC2 서버)
# /opt/agent/agent.env
DB_HOST=scrapinng-db.cb4ccem8gbzh.ap-northeast-2.rds.amazonaws.com
DB_USERNAME=admin
DB_PASSWORD=...
NAVER_USERNAME=...
NAVER_PASSWORD=...
ANTHROPIC_API_KEY=sk-ant-...
SLACK_WEBHOOK_URL=https://hooks.slack.com/services/...
DIGEST_MAIL_TO=...
DIGEST_MAIL_FROM=...
API_URL=http://3.37.75.226:8080
APP_VERSION=1.0.0
systemd service에 env 파일 연결
[Service]
EnvironmentFile=/opt/agent/agent.env
ExecStart=/usr/bin/java -jar /opt/agent/scraping/build/libs/agent-0.0.1-SNAPSHOT.jar \
--spring.profiles.active=prod
.env.example 파일
팀원 온보딩을 위해 항상 최신 상태로 유지한다:
# .env.example (git 커밋 대상)
DB_HOST=localhost
DB_USERNAME=root
DB_PASSWORD=your_password_here
NAVER_USERNAME=your_naver_id@naver.com
NAVER_PASSWORD=your_naver_app_password
ANTHROPIC_API_KEY=sk-ant-your-key-here
SLACK_WEBHOOK_URL=https://hooks.slack.com/services/your/webhook/url
DIGEST_MAIL_TO=recipient@example.com
DIGEST_MAIL_FROM=sender@naver.com
API_URL=http://localhost:8080
APP_VERSION=1.0.0
.gitignore 필수 항목
# 민감 정보 파일
.env
.env.*
application-prod.yml
agent.env
# IDE
.idea/
*.iml
신규 환경변수 추가 체크리스트
- [ ]
application.yml에${ENV_VAR}형식으로 참조 추가 - [ ] EC2 서버의
/opt/agent/agent.env에 실제 값 추가 - [ ]
sudo systemctl restart agent로 서비스 재시작 (환경변수 반영) - [ ]
.env.example파일에 빈 값으로 항목 추가 - [ ] 팀원에게
.env.example업데이트 공지