## 0. [Config 리포지터리 생성](https://github.com/new) ![[Pasted image 20231221113005.png]] - 깃허브 리포지터리를 Private로 생성한다. Public으로 설정하면 설정 파일 속 중요 정보들을 다른 사람들이 볼 수 있기 때문에 반드시 Private로 설정해야 한다. ## 1. 설정 파일 생성 ![[Pasted image 20231221123154.png]] ```yml server:   port: 8001 spring:   application:     name: configservertest ``` - Config 서버가 읽을 설정 파일을 생성한다. - 이때 명명하는 **규칙**은 `[이름]-[환경].[properties|yml]`이다. 관례가 아니라 **규칙**이기 때문에 지켜줘야 한다. - Config 서버는 이름과 환경을 기준으로 필요한 설정 파일을 읽어온다. ## 2. SSH key 생성 ```bash ssh-keygen -m PEM -t rsa -b 4096 -C "spring-cloud-config-test" ``` - Git bash를 실행한 다음 위의 코드를 입력한다. 이때 팁은 위의 코드를 복사한 다음 `shift + insert`로 붙여 넣기 하는 것이다. - Git bash 터미널은 리눅스기 때문에 붙여 넣기 단축키를 `shift + insert`로 한다. - 위 코드의 의미는 다음과 같다. - `ssh-keygen`: SSH 키를 생성하는 명령어 - `-m`: 생성된 키의 인코딩 방식, 위 코드에서는 [PEM](https://en.wikipedia.org/wiki/Privacy-Enhanced_Mail)을 사용했다. - `-t`: 키를 생성하는 알고리즘, 위 코드에서는 RSA 알고리즘을 사용했다. - `-b`: 키의 강도를 결정하는 비트 수, 위 코드에서는 4096을 사용했다. - `-C"`: 키의 주석이다. ![[Pasted image 20231221114551.png]] - 코드를 입력하면 위와 같은 화면이 나오면서 기타 설정을 하게 된다. 나는 따로 설정할 내용이 없기 때문에 엔터를 연타했다. ```bash cd ~/.ssh cat id_rsa.pub ``` - 키를 생성했다면 위의 코드를 복사해서 실행한다. 그러면 아래와 같은 키 값이 출력된다. - `id_rsa.pub`는 생성된 키 쌍 중 **Public 키**에 해당한다. ![[Pasted image 20231221115044.png]] - 이 출력된 키 값을 사용해야 하므로 복사를 해둔다. ## 3. Public 키 등록 ![[Pasted image 20231221115152.png]] - 깃허브로 다시 돌아가 Settings > Deploy keys 탭을 클릭한다. ![[Pasted image 20231221115327.png]] - Add deploy key 버튼을 클릭한다. ![[Pasted image 20231221115435.png]] - 복사한 키를 key 텍스트 박스 안에 붙여넣고 Add key 버튼을 클릭한다. ![[Pasted image 20231221115605.png]] - 위와 같은 화면이 나온다면 정상적으로 처리 된 것이다. ## 4. Config 서버 구현 ![[Pasted image 20231221120401.png]] - [스프링 부트 프로젝트 생성 페이지](https://start.spring.io/)에서 프로젝트를 생성한다. - 의존성은 **Config Server**와 **Spring Security** 두 가지를 추가하는데, 나중에 직접 Gradle에 추가해도 상관없다. ```java @EnableConfigServer @SpringBootApplication public class ConfigtestApplication { public static void main(String[] args) { SpringApplication.run(ConfigtestApplication.class, args); } } ``` - `@EnableConfigServer` 어노테이션을 추가한다. ![[Pasted image 20231221121128.png]] - 다시 깃허브로 돌아가 SSH URI을 복사한다. 복사한 URI는 따로 저장해둬야 한다. ```bash cat id_rsa ``` - 이번에는 깃 배시로 돌아와서 위의 명령어를 입력한다. 그럼 아래와 같은 화면이 출력된다. - `id_rsa`는 생성된 키 쌍 중 **Private 키**에 해당한다. ![[Pasted image 20231221120136.png]] - 이 키도 SSH URI와 같이 복사한 뒤 따로 저장해둔다. ``` server: port: 9000 spring: application: name: config-test cloud: config: server: git: uri: [SSH URI] ignoreLocalSshSettings: true private-key: | [Private 키] ``` - `application.properties`를 `application.yml`로 확장자를 변경한 다음 위의 코드를 입력한다. 이때 위에서 미리 복사해둔 SSH URI와 Private 키를 입력한다. ![[Pasted image 20231221121814.png]] - `.yml`의 문법에 맞게 들여쓰기에 유의하여 값을 입력해야 한다. 특히 Private 키를 입력할 때 반드시 이를 유의해야 한다. ```java @Configuration @EnableWebSecurity public class SecurityConfig { @Bean public BCryptPasswordEncoder bCryptPasswordEncoder(){ return new BCryptPasswordEncoder(); } @Bean public SecurityFilterChain filterChain(HttpSecurity httpSecurity) throws Exception { httpSecurity.csrf(auth->auth.disable()); httpSecurity.authorizeHttpRequests(auth -> auth.anyRequest().authenticated()); httpSecurity.httpBasic(Customizer.withDefaults()); return httpSecurity.build(); } @Bean public UserDetailsService userDetailsService(){ UserDetails userDetails = User.builder() .username("config-manager") .password(bCryptPasswordEncoder().encode("qwerty123")) .roles("ADMIN") .build(); return new InMemoryUserDetailsManager(userDetails); } } ``` - Security Config를 작성한다. 설정 파일에는 DB 접속에 필요한 정보나 기타 중요한 정보가 있을 수 있기 때문에 Security를 설정해야 한다. ![[Pasted image 20231221142103.png]] - Config 서버를 기동한다. ## 5. Config 서버 테스트 ![[Pasted image 20231221123506.png]] - [스프링 부트 프로젝트 생성 페이지](https://start.spring.io/)에서 Config 서버를 테스트할 프로젝트를 생성한다. 이 프로젝트의 이름이 [[7. Spring Cloud Config를 통한 Config 관리#1. 설정 파일 생성|설정 파일 생성]]에 있는 `configservertest`이다. ```yaml spring: application: name: configservertest profiles: active: dev config: import: optional:configserver:http://config-manager:qwerty123@localhost:9000 ``` - `application.properties`를 `application.yml`로 확장자를 변경한 다음 위의 코드를 입력한다. - 위 코드의 의미는 다음과 같다. - `spring.application.name`: 애플리케이션의 이름을 설정한다. 여기서는 "configservertest"로 설정되어 있다. - `spring.profiles.active`: 현재 활성화된 프로파일을 설정한다. 여기서는 "dev"로 설정되어 있다. - `spring.config.import`: 외부 구성 소스에서 구성 속성을 가져온다. 여기서는 Config Server를 사용하여 가져온다. - `optional`: 구성 서버가 사용 가능하지 않더라도 애플리케이션을 시작할 수 있도록 설정한다. - `http://config-manager:qwerty123@localhost:9000`: Config Server의 URL과 인증 정보를 지정한다. - `config-manager:qwerty123`는 `[username]:[password]`로 위 SecurityConfig에서 적용한 값이다. ![[Pasted image 20231221140711.png]] - 애플리케이션을 시작하면 Config 서버로부터 Config를 받아온 다음 애플리케이션을 설정한다. 위의 빨간 상자 안에 있는 텍스트가 출력되면 정상적으로 적용된 것이다.