[Spring Boot].env파일 사용하기

한상욱·2024년 10월 29일
0

Spring Boot

목록 보기
18/19
post-thumbnail

들어가며

application.yml 파일에는 생각보다 여러가지 정보가 들어갑니다. 그 중에는 깃허브 레포지토리에 올리기엔 민감한 정보들이 있을 수 있죠. 예를 들어, JWT를 위한 키라던지, 데이터베이스 유저와 비밀번호 등 이러한 정보는 레포지토리로 공유하는 것은 보안적인 측면에서 적절하지 않습니다.

이러한 것을 해결하기 위해서 .env 파일과 .gitignore 파일을 생성하여 민감한 정보는 변수로 삽입하여 레포지토리에는 올리지 않는 방법이 있습니다.

여기서, .gitignore 파일은 깃허브로 푸시하는 경우 명시된 파일경로는 변경사항이 전달되지 않도록 해주는 설정파일입니다.

.env는 왜 쓸까?

.env 파일은 Spring Boot 프로젝트에서 환경변수를 등록할 수 있도록 하는 설정파일입니다. 만약, Spring Boot에서 MySQL같은 데이터베이스를 사용하는 경우에는 application.yml 파일에 아래와 같은 정보가 필요합니다.

spring:
  ...
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: "jdbc:mysql://localhost:3306/test_db?autoReconnect=true&useUnicode=true&serverTimezone=Asia/Seoul"
    username: test_admin
    password: 1234
  jpa:
    database: mysql
    database-platform: org.hibernate.dialect.MySQL8Dialect
    properties:
      hibernate:
        storage_engine: innodb
        format_sql: true
        use_sql_comments: true
    hibernate:
      ddl-auto: create
    open-in-view: false
    show_sql: true

위에서는 로컬에서 MySQL에 생성된 test_db를 3306번 포트로 test_admin계정의 정보를 통해서 연동할 수 있도록 명시했습니다. 위와 같은 경우 DB서버의 URL과 포트번호, 계정 등 여러 민감한 정보가 명시되어 있고, 깃허브같은 레포지토리에 푸시하는 경우에는 공개되기에 악용될 수도 있습니다.

이를 위해서 .env파일을 정의하여 해당 정보를 환경변수로 등록하여 파일에서 감출 수 있습니다.

.env 사용하기

일단, .env 파일을 생성하여 아래와 같이 입력합니다.

//.env

DB_PORT=3306
DB_USER=test_admin
DB_PASSWORD=1234
DB_URL=localhost
DB=test_db

위 정보는 이제 application.yml파일에서 환경변수로 등록된 값들을 변수명으로 접근할 수 있도록 해줍니다. ${}로 표시한 후 해당하는 변수명을 기입하면 됩니다.

spring:
  ...
  application:
    name: test_web_server
  config:
    import: optional:file:.env[.properties]
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: "jdbc:mysql://${DB_URL}:${DB_PORT}/${DB}?autoReconnect=true&useUnicode=true&serverTimezone=Asia/Seoul"
    username: ${DB_USER}
    password: ${DB_PASSWORD}
  jpa:
    database: mysql
    database-platform: org.hibernate.dialect.MySQL8Dialect
    properties:
      hibernate:
        storage_engine: innodb
        format_sql: true
        use_sql_comments: true
    hibernate:
      ddl-auto: create
    open-in-view: false
    show_sql: true

이렇게, 변수명을 통해 민감한 정보를 감출 수 있습니다.

  config:
    import: optional:file:.env[.properties]

이 부분이 중요한대요. 이는 .env파일을 .env.properties파일로 해석하여 가져올 수 있도록 하는 부분입니다. 빼먹지 않게 주의해줍니다.

.gitignore 설정

이제, .env파일에 민감한 정보가 있으므로 해당 파일은 깃허브 레포지토리가 아닌 메일 혹은 팀 드라이브같은 경로로 팀원과 주고받아야할 것입니다. 따라서, 레포지토리에 푸시되지 않도록 정보를 추가해줍니다.

...
### .env ###
.env*
...

이제, 해당 파일은 깃허브에 푸시되지 않습니다. 만약, 해당 파일이 지속적으로 푸시된다면 캐시를 지우고 다시 푸시해야 합니다.

$ git rm -r --cached . // 캐시 삭제
$ git add .
$ git commit -m "커밋메세지"

이렇게 하면 깃허브에는 .env파일이 더이상 푸시되지 않습니다.

profile
자기주도적, 지속 성장하는 모바일앱 개발자가 되기 위해

0개의 댓글