## 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를 받아온 다음 애플리케이션을 설정한다. 위의 빨간 상자 안에 있는 텍스트가 출력되면 정상적으로 적용된 것이다.