Day_43 ( 스프링 - 10 )

HD.Y·2023년 12월 28일
0

한화시스템 BEYOND SW

목록 보기
38/58
post-thumbnail

🐶 application.yml 파일 활용하는법

  • plication.yml일을 개발 환경별로 여러개 만들어서 사용할 수 있다.
    보통 (loval) / 개발(dev) / 운영(prod)으로 만들어서 사용한다고 한다.

  • yml 파일을 여러개 만드는 법은 plication-local.yml / application-dev.yml / application-prod.yml렇게 생성 후 안에 환경 설정들을 각각 적어준다.

  • 그런다음 Run/Debug Configurations 에서 어플리케이션 추가를 한뒤 아래처럼 만들어주면 된다.
    ➡ 이때 --spring.profiles.active=해당 어플리케이션 이름 을 적어주면 된다.

  • 그런다음 기존에 있던 그냥 aplication.yml일에는 어떤 설정 파일을 실행시킬것인지 아래처럼 적어주면 된다.

    spring:
      profiles:
        active: local

🐼 application.yml 파일 환경변수 설정하기

  • 어제 개인적으로 진행중인 쇼핑몰 프로젝트를 하다가 의문점이 들었었는데, 오늘 해결된 부분이 있었다. 그것이 바로 application.yml 파일에 대한 내용이었다.

  • 보통 application.yml 파일에는 알려지면 안되는 민감한 정보들도 포함되어 있기 때문에 깃에 올릴때 .gitignore 에 포함시켜서 깃에 업로드 되지 않도록 설정한다고 배웠었다.

  • 하지만 어제 교육장소에서 작업 후 집에서 git pull 을 하니깐 application.yml 파일이 깃에 업로드가 안되어 있어서 다시 만들어서 생성해줘야 됬었다.

  • 이처럼 팀으로 프로젝트를 진행할 때 이러한 설정 파일도 서로 공유가 되야되기 때문에 깃에 업로드를 해야되는데 이럴때 민감한 정보를 가리고 보낼 수 있도록 하는 것이 환경변수 설정이다.

  • 환경변수를 설정하는 방법은 내가 공개하고 싶지 않은 것을 내가 원하는 이름으로 설정할 수 있다. 설정은 ${설정할이름} 이렇게 하면 된다. 그다음
    Run/Debug Configurations 에서 Environment variables 에 내가 설정한 이름에 대한 값을 적어주면 된다.

  • 예를 들어 ${TEST} 라고 설정 했으면, TEST=1234 로 적어주면 된다. 값을 적어줄때는 아래 그림의 동그라미 친 부분을 누르면 쉽게 입력할 수 있다.

  • 아래는 내가 진행중인 개인 프로젝트의 DB 연결 부분을 환경변수로 바꿔준 내용이다. 이렇게 하면 gitapplication.yml 파일을 업로드해도 전혀 문제될게 없을 것이다.


🦁 스프링 부트 웹서버 리눅스 서버 이용 실행하기

  • 사전에 VMware Workstation 으로 리눅스 서버 1대를 준비해줬다.
    ➡ IP 설정 및 방화벽을 다 꺼준 상태이다.

  • 리눅스 서버에서 웹 어플리케이션을 실행해주기 위해서는 인텔리제이에서 pom.xml 파일에 내용을 2줄 추가해줘야된다.

    ➡ 첫번째 화살표의 내용은 내 프로젝트 명을 적어주면 된다.
    ➡ 두번째 화살표의 내용은 jar 파일을 만들어주기 위해 package를 눌러주는데,
      그때 자동으로 테스트를 해서 환경변수 설정한 것 때문에 에러가 나서 package 할때
      테스트를 하지 말라는 내용이다.

  • 다음으로 나는 메이븐을 사용하고 있는데, 오른쪽 메뉴바의 m 표시를 눌러서 Lifecycle 을 보면 package가 있다. 이것을 더블 클릭해주면 된다.

    ➡ 정상적으로 됬다면 프로젝트에 target 폴더가 생겼을 것이고 그것을 열어보면
      프로젝트이름-0.0.1-SNAPSHOT.jar 이 생성되 있을 것이다.

  • 이제 이 생성된 jar 파일을 리눅스 서버로 옮기면 되는데 옮기는 방법은 아래와 같다.
    1) 윈도우에서 cmd 창을 열고( 관리자 권한 X ) jar 파일이 생성된 폴더로 이동한다.
      ➡ cd C:\springbootproject\yml\target\ 파일 경로는 jar 파일 우클릭 해보면
          copy/path 가 있는데 그것을 클릭해보면 알 수 있다.
    2) 다음으로 아래의 명령어를 입력하면 리눅스 서버로 파일이 전송된다.
      ➡ scp yml-0.0.1-SNAPSHOT.jar [리눅스 서버 계정명]@[리눅스 서버 IP주소]:[리눅스
          서버에서 파일을 저장할 경로]

      ➡ 그럼 정말로 연결을 진행할 것인지 물어보는 내용이 출력되고, yes를 입력해주면,
          계정의 패스워드를 입력하라고 나온다. 패스워드를 정상적으로 입력하면 아래처럼
          출력되고, 리눅스 서버에서 저장한 경로로 이동하면 정상적으로 jar 파일이
          생성된 것을 확인할 수 있을 것이다.

  • 다음으로 리눅스 서버(CentOs)에 내가 사용하는 자바 jdk를 설치해주면 된다.
    나는 jdk 11 을 사용중이고 설치하는 방법은 아래와 같다.

    1) open jdk 11 설치 : yum install java-11-openjdk-devel.x86_64
      ➡ 정상 설치여부 확인 : java --version

    2) 환경 변수 설정
      ➡ javac 설치경로 확인 : which javac
      ➡ 설치 경로에 연결된 원본파일 위치 확인 : readlink -f [설치경로]
        ➡ 나는 아래와 같이 떴는데 여기서 제일 뒤의 /bin/javac 전까지가 JAVA_HOME
          으로 설정할 경로이다.
          /usr/lib/jvm/java-11-openjdk-11.0.18.0.9-0.3.ea.el8.x86_64/bin/javac

      ➡ 환경 변수 설정 : vi /etc/profile

      ➡ 열린 파일 제일 밑에 JAVA_HOME 설정 내용 추가
    export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.18.0.9-0.3.ea.el8.x86_64

      ➡ 설정 후 변경사항 적용 : source /etc/profile

      ➡ 적용 결과 확인 : echo $JAVA_HOME

  • 여기까지 끝났다면, 웹 어플리케이션에서 설정했던 환경변수에 대한 값을 설정해준다. 나는 아까 ${TEST} 라는 환경변수를 만들었고 여기에 값을 설정해주기 위해서는
    export TEST=1111 이렇게 입력해주면 된다.
     ➡ 환경 변수에 값이 설정됬는지 확인 : env | grep TEST

  • 마지막으로 jar 파일을 실행시켜준다 : java -jar yml-0.0.1-SNAPSHOT.jar
    그러면 아래와 같이 스프링 부트가 실행 될 것이다.

  • 정상적으로 동작하는지 간단하게 컨트롤러를 아래와 같이 만들어봤다.

    // application-local.yml 파일
     my:
      var: ${TEST}
     
    // ApiController 클래스
    @RestController
    @RequestMapping("/api")
    public class ApiController {
    
      private final Logger log = LoggerFactory.getLogger(ApiController.class);
    
      @Value("${my.var}")
      private String var;
    
      @RequestMapping(method = RequestMethod.GET, value = "/app")
      public ResponseEntity app() {
          log.info("my var is {}", var);
          return ResponseEntity.ok().body("ok");
      }
    }

  • 포스트맨을 이용하여 GET 방식으로 [리눅스 서버 IP]:8080/api/app 로 요청을 보내면 아래와 같이 정상적으로 응답이 오는것을 확인할 수 있고, 로그를 보면 TEST 환경변수에 설정해준 값이 정상적으로 들어간 것을 볼 수 있다.


🐷 Vault 서버 실습하기

  • Vault 서버란 ?
    Vault는 HashiCorp에 의해서 개발된 크로스플랫폼 패스워드 및 인증 관리 시스템이다. 공개되면 안되는 비밀번호, API 키, 토큰 등을 저장하고 관리한다

  • 먼저 Vault 서버를 리눅스 컴퓨터에서 설치해준다. 설치하는 방법은 Vault 홈페이지에 나와있다. ( https://developer.hashicorp.com/vault/install#Linux )
    1) yum install –y yum-utils
    2) yum-config-manager —add-repo
      https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo
    3) yum -y install vault

  • Vault 서버를 실행시킨다 : systemctl start vault

  • 크롬에서 vault 서버 주소를 입력한다 : https://[리눅스 컴퓨터 IP]:8200
      ➡ 연결이 비공개로 설정되어 있지 않습니다로 뜨는데 고급을 누르고 (안전하지 않음)
        으로 이동을 클릭해준다. 그러면 아래와 같이 뜰것이다.

  • 다음으로 아래의 순서대로 진행해보겠다.
    1) "Key shares""Key threshold" 는 아무것이나 원하는 숫자로 입력해준뒤
       Initialize를 클릭한다. ( 너무 길면 안된다. )
    2) 나에게 발급된 Key가 나오는데 이것은 꼭 기억해줘야되기 때문에 맨 아래에
       Download keys를 눌러서 저장해 놓는다. 다음으로 Continue to Unseal
       클릭한다.
    3) 발급받은 Unseal 키들을 한개씩 모두 입력해줘야된다. 이때 키는 keys_base64
       되있는 것을 입력해준다.
    4) 발급받은 Token을 입력해준다. 정상적으로 인증이 끝나면 아래처럼 웹페이지가
       나타날 것이다.

    5) 왼쪽 메뉴바에서 Secrets Engines 클릭 후 Enable new engine을 클릭해준다.
    6) Generic 에서 KV(key-vaule) 를 클릭한뒤 Next를 누른다.
    7) Path (나중에 URI 주소) 에 원하는 대로 적고 Enable Engine 을 클릭한다.
      ➡ 나는 "test" 라고 적어줬다.
    8) Create secret 클릭 후 Path for this secret에 원하는 내용을 적는다. 이 부분을
      적으면 나중에 경로가 /test/[추가내용] 로 된다.
      ➡ 나는 "vault" 라고 적어줬다.

    9) Secret data에 원하는 Key-Value 를 적어준다. Key는 환경변수로 설정할 이름,
      Value는 환경변수에 설정할 값을 적어주면 된다.

    10) 나는 아래와 같이 설정해 준뒤 Save를 클릭했다.

    11) 그런 다음 아래 그림처럼 Paths 를 클릭해서 나오는 API path 주소로 포스트맨을 이용하여 HTTP 요청을 보내서 테스트를 해보면 된다.

      ➡ 요청 주소 : https://[리눅스 서버 ip]:8200/[Api path 주소]
      ➡ Headers에 부여받은 토큰 추가
      ➡ 정상적으로 요청이 가면 아래와 같이 내가 설정한 key-value 값이
        출력되는 것을 볼 수 있다.


🐸 스프링 부트에서 Vault 실습하기

  • 스프링 부트에서 실습하기 위해선 위에서 설정한 Vault 로는 동작을 안한다. 주소가 Vault 서버의 프로토콜이 https 다 보니 인증받지 못해서 실행이 안되는 오류가 뜬다.

  • 리눅스 컴퓨터의 방화벽을 꺼준다.

  • 따라서 리눅스 서버에서 Valut 서버를 수동으로 실행시켜줘야된다.
    1) 서버 설정 파일을 만들어서 아래의 내용을 입력한다 : vi vault.config

     ```java
     backend "inmem" {
     }
    
     listener "tcp" {
       address = "0.0.0.0:8200"
       tls_disable = 1
     }
     ```

    2) 서버를 실행 시켜준다 : vault server -config=/root/vault.config

    3) 서버는 실행시키면 작업이 안되므로 putty로 쉘창을 한개 더 띄워준다.

    4) 서버 초기화 : vault operator init
      ➡ 이때 Get "https://127.0.0.1:8200/v1/sys/seal-status": http: server gave
        HTTP response to HTTPS client 오류가 뜬다면 Vault 서버 주소를 바꿔줘야된다.
      ➡ export VAULT_ADDR=http://127.0.0.1:8200 해준 뒤 다시 초기화 해준다.

    5) 그러면 아래와 같이 Key 들과 Token이 출력될 것이다. 이것을 따로 적어놓는다.

    6) Vault 서버 잠금을 해제한다 : vault operator unseal
      ➡ 서버 초기화 시 출력된 Unseal Key를 1번부터 입력한다.
      ➡ 위 과정을 3번 반복한다.

    7) 토큰을 환경변수로 등록한다 : export VAULT_TOKEN=[초기화 시 받은 토큰]

    8) 관리자를 생성한다 : vault token create -id="00000000-0000-0000-
                       0000-000000000000" -policy="root"

    9) KV(key-value) 를 등록한다.
      ➡ vault secrets enable -path=엔진이름/ kv
      ➡ vault kv put 엔진이름/경로 환경변수1=값1 환경변수2=값2
      ➡ 설정한 key-value 리스트를 확인해본다 : vault kv get 엔진이름/경로

  • 스프링 부트 pom.xml 파일에 vault 라이브러리를 추가해준다.

    		    <dependency>
    				<groupId>org.springframework.cloud</groupId>
    				<artifactId>spring-cloud-starter-vault-config</artifactId>
    				<version>3.1.3</version>
    			</dependency>
  • application.yml 파일에 vault 관련 설정 추가

    my:
      var: ${aaa}
      
    spring.config.import: vault://
     spring.cloud.vault:
       host: 77.77.77.120  // 리눅스 컴퓨터 IP
       port: 8200
       scheme: https
       uri: https://77.77.77.120:8200
       token: hvs.hMCdq6WitF3KTOuEU96ZN7R3  // 부여 받았던 토큰
       kv:
         enabled: true
         backend: test  // 생성했던 경로 Path
         application-name: my  // 경로 Path 다음에 생성했던 경로

    // ApiController 클래스
    @RestController
    @RequestMapping("/api")
    public class ApiController {
    
     private final Logger log = LoggerFactory.getLogger(ApiController.class);
    
     @Value("${my.var}")
     private String var;
     @Value("${bbb}")
     private String password;
    
     @RequestMapping(method = RequestMethod.GET, value = "/app")
     public ResponseEntity app() {
         log.info("my var is {}", var);
         log.info("password is {}", password);
         return ResponseEntity.ok().body("ok");
     }
    }

  • 스프링을 실행시키고 포스트맨으로 테스트해보면 아래와 같이 설정한 환경변수에 Vault 서버에서 지정한 key-value 값들이 불러와져서 출력되는 것을 볼 수 있다.


🐵 Spring Config Server 실습하기

  • 서버와 클라이언트로 사용할 스프링 부트 프로젝트를 새로 생성한다.

  • 서버로 사용할 스프링 부트 프로젝트의 pom.xml 파일에 라이브러리를 추가해준다.

    		    <dependency>
    				<groupId>org.springframework.boot</groupId>
    				<artifactId>spring-boot-starter-web</artifactId>
    			</dependency>
          
    		    <dependency>
    				<groupId>org.springframework.cloud</groupId>
    				<artifactId>spring-cloud-config-server</artifactId>
    				<version>3.1.3</version>
    			</dependency>
  • [프로젝트 이름]Application 클래스에 @EnableConfigServer 을 달아준다.

  • 내 깃허브에 레포지터리를 하나 생성한다.

  • *.yml 파일들을 모아놓는 폴더를 생성 후 테스트로 application-dev.yml 을 만들어본다. 내용은 아래와 같이 적어줬다.

    my:
     var1: 11111
     var2: 22222
  • 폴더에서 git bash 를 실행시켜서 깃 저장소를 설치한다 : git init

  • 생성한 깃허브 레포지터리로 원격 저장소를 설정한다
    git remote add origin [깃허브 레포지터리 주소]

  • 폴더 내에 있는 *.yml 파일들을 커밋하고 푸쉬한다.
    git add .
    git commit -m "커밋 메시지"
    git push origin master

  • 깃허브에서 제대로 업로드 되었는지 확인해본다.

  • 서버의 application.yml 파일에 아래와 같이 적어준다.

    server:
       port: 8888
     spring:
       application:
         name: config
       cloud:
         config:
           server:
             git:
               uri: [깃허브 레포지터리 주소]
               search-paths: /**
               default-label: master
  • 서버를 실행시킨다.


클라이언트 서버 설정

  • 클라이언트 서버의 pom.xml 파일에 라이브러리를 추가해준다.

    		<dependency>
    		   <groupId>org.springframework.boot</groupId>
    		   <artifactId>spring-boot-starter-web</artifactId>
    	    </dependency>
    
    	    <dependency>
    		   <groupId>org.springframework.cloud</groupId>
    		   <artifactId>spring-cloud-config-client</artifactId>
    		   <version>3.1.3</version>
    	    </dependency>

  • 클라이언트 서버의 application.yml 파일에 아래와 같이 입력해준다.

    spring:
       config:
         import: "optional:configserver:http://localhost:8888/"
       cloud:
         config:
           name: application  // application-dev.yml 의 앞 부분
           profile: dev       // application-dev.yml 의 뒤 부분

  • ApiController 클래스를 아래와 같이 만들어서 포스트맨으로 테스트해본다.

    @RestController
    @RequestMapping("/api")
    public class ApiController {
    
      private final Logger log = LoggerFactory.getLogger(ApiController.class);
      @Value("${my.var1}")
      private String var1;
    
      @Value("${my.var2}")
      private String var2;
    
      @RequestMapping(method = RequestMethod.GET, value = "/app")
      public ResponseEntity app() {
          log.info("my var1 is {}", var1);
          log.info("mt var2 is {}", var2);
          return ResponseEntity.ok().body("ok");
      }
    }
  • 포스트맨으로 HTTP 요청을 보내면 정상적으로 응답이 오고, 로그를 보면 깃허브에 올려놨던 application-dev.xml 파일에서 my.var1 과 my.var2 의 값을 불러와서 출력하는 것을 볼 수 있다.


🦍 깃허브 레포지터리 비공개 설정 후 실습하기

  • 하지만 *.yml 파일을 모아놓은 레포지터리를 공개로 설정해놓으면 민감한 자료들을 다른 사람들이 다 보게 되는 문제가 생긴다. 따라서 이것을 private으로 바꾼뒤 값을 불러오려면 Vault 서버를 사용해야 한다.

  • 방식은 Vault 서버에 깃허브 username 과 password 를 key-value 로 저장해놓고 거기서 값을 불러와서 실행시키는 방법이다.

  • 먼저, 깃허브를 private으로 바꾼뒤 비공개 레포지터리를 접근하려면 password가 깃허브에서 발급해주는 token 값이 된다.
    토큰 발급받는 법
    깃허브 프로필 클릭 - 왼쪽 메뉴바 제일 밑의 Developer settings 클릭
    ➡ Personal access tokens에서 Tokens(classic) 클릭
    ➡ Generate new Token 클릭
    ➡ Note는 사용 목적으로 목적에 맞게 적어준 뒤 권한은 일단 다 부여했다.
    ➡ Token이 발급되고 이것을 따로 저장해놓는다.

  • 다음으로 서버의 application.yml 파일을 수정한다.

    server:
      port: 8888
    
    spring:
      cloud:
        vault:
          host: 77.77.77.120
          port: 8200
          scheme: http
          uri: http://77.77.77.120:8200
          token: hvs.HRZB8FDbigR9Y0RF3RBrulgn
          kv:
            enabled: true
            backend: test
            application-name: my
        config:
          import: "vault://"
          server:
            git:
              uri: [깃허브 config 레포지터리 주소]
              username: [깃허브 계정먕]
              password: [깃허브에서 발급받은 토큰]
              default-label: master
  • 그런다음 크롬에서 localhost:8888/application/dev를 해보면 아래와 같이 application-dev.yml 파일의 내용이 불러와 지는것을 볼 수 있다.

  • 하지만 username과 password를 환경변수로 설정하고 vault 서버에서 설정한 값을 불러오니 username은 불러와지는데, password가 안불러와지는 문제가 발생했는데 이부분은 추후 확인해볼 필요가 있을 것 같다.

profile
Backend Developer

0개의 댓글