λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
  • μž₯원읡 κΈ°μˆ λΈ”λ‘œκ·Έ
🀷🏼‍♀️ Etc.../- linux, aws, docker, k8s

Github Action κ³Ό Elastic Beanstalk 둜 μ„œλ²„ λ°°ν¬ν•˜κΈ° - Spring Boot μ„œλ²„ μƒμ„±ν•˜κΈ°

by Wonit 2022. 1. 23.

 

 

ν•΄λ‹Ή μ‹œλ¦¬μ¦ˆλŠ” 3개의 κΈ€λ‘œ κ΅¬μ„±λ˜μ–΄μžˆμŠ΅λ‹ˆλ‹€. 각 λ‹¨κ³„μ˜ μžμ„Έν•œ 사항은 μ•„λž˜ 링크λ₯Ό μ°Έμ‘°ν•΄μ£Όμ„Έμš”

동기

 

졜근 μ‚¬λ‚΄μ—μ„œ μƒˆλ‘­κ²Œ κ°œλ°œν•˜λŠ” μ„œλ²„λ₯Ό EB 와 Github Action 을 μ΄μš©ν•˜μ—¬ 배포 μžλ™ν™” ꡬ성을 ν•˜λŠ” κΈ°νšŒκ°€ μƒκ²Όμ—ˆλ‹€.

 

μ§€κΈˆκΉŒμ§€ ν•΄λ΄€λ˜ CI/CD, 배포 μžλ™ν™”λŠ” λ‹€μŒ 2κ°œμ΄λ‹€.

 

  • Travis CI + CodeDeploy
  • EC2 + Jenkins

 

처음 μžλ™ν™”μ— λŒ€ν•΄μ„œ ν•™μŠ΅ν•  λ•Œ Elastic Beanstalk 에 λŒ€ν•œ ν›„κΈ°λŠ” 거의 λͺ»λ³΄λ‹€ 싢이 ν–ˆμ§€λ§Œ ν˜„μž¬λŠ” EB 와 Github Action 에 λŒ€ν•œ 성곡 μΌ€μ΄μŠ€κ°€ λ§Žμ•„μ§€κ³  κ°„λ‹¨ν•œ 토이 ν”„λ‘œμ νŠΈ 및 μŠ€νƒ€νŠΈμ—…μ—μ„œλŠ” 이듀을 많이 μ΄μš©ν•œλ‹€κ³  ν•œλ‹€.

 

이번 μ‹œλ¦¬μ¦ˆμ—μ„œ λ‚˜λŠ” EB 와 Github Action 을 μ΄μš©ν•˜μ—¬ Spring Boot Application Server 의 배포 μžλ™ν™”λ₯Ό ꡬ성해보고 κ·Έ 과정듀을 κ³΅μœ ν•΄λ³΄λ € ν•œλ‹€.

 

사전 지식 1. Elastic Beanstalk λž€?

 

 

μ•„λ§ˆμ‘΄μ—λŠ” μˆ˜λ°±κ°€μ§€μ˜ μ„œλΉ„μŠ€κ°€ μ‘΄μž¬ν•˜κ³  또 κ·Έ ꡬ쑰에 λ§žλŠ” 이해와 Trouble Shooting 이 ν•„μˆ˜μ μ΄λ‹€.


λ‹¨μˆœνžˆ μš°λ¦¬κ°€ κ°œλ°œν•œ Application Server λ₯Ό EC2 에 μ˜¬λ¦¬λŠ” μž‘μ—… λ§ˆμ €λ„ μ•Œμ•„μ•Ό ν•  기본적 지식듀이 λ„ˆλ¬΄λ‚˜λ„ λ§Žλ‹€.

 

VPCλΆ€ν„° μ‹œμž‘ν•΄μ„œ Security Group, EBS λ“±λ“±..

 

λ§Œμ•½ 여기에 배포 μžλ™ν™”λ₯Ό λΆ™νžŒλ‹€λ©΄ IAM κΆŒν•œ μ„€μ •κ³Ό VPC μ„€μ •, Load Balancing μ„€μ •λ“± λ‹€μ–‘ν•œ 섀정을 μš°λ¦¬κ°€ ν•™μŠ΅ν•˜κ³  μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.

 

이λ₯Ό μœ„ν•΄μ„œ AWS μ—μ„œλŠ” 이런 ν΄λΌμš°λ“œ λ¦¬μ†ŒμŠ€λ“€μ„ λ”μš± μ‰½κ²Œ μ‘°μž‘ν•  수 μžˆλ„λ‘ ν•˜λŠ” μ„œλΉ„μŠ€κ°€ λ°”λ‘œ Elastic Beanstalk 이닀.

 

μžμ„Έν•œ μ„€λͺ…은 μ‹€μ œλ‘œ EB λ₯Ό μ‚¬μš©ν•˜λŠ” μ‹œμ μ— λ‹€μ‹œ μ΄μ•ΌκΈ°ν•˜λ„λ‘ ν•˜κ² λ‹€.

 

사전 지식 2. Github Actions λž€?

 

 

Github Actions λŠ” Github μ—μ„œ μš΄μ˜ν•˜λŠ” CD λ„κ΅¬λ‘œ 많이 μ•Œλ €μ Έ μžˆλ‹€.

 

 

κ³΅μ‹μ μœΌλ‘œλŠ” Github Actions λŠ” Github μ—μ„œ μ œκ³΅ν•˜λŠ” Workflow μžλ™ν™” 도ꡬ이닀.

 

주둜 ν…ŒμŠ€νŠΈ, λΉŒλ“œ, 배포 λ“±μ˜ λ‹€μ–‘ν•œ μž‘μ—…μ„ μˆ˜ν–‰ν•  수 μžˆλŠ”λ°, Github μ—μ„œ CI/CD νŒŒμ΄ν”„λΌμΈμ„ λ„μž…ν•  λ•Œ Travis CI 처럼 λ‹€λ₯Έ μ†”λ£¨μ…˜μœΌλ‘œ λ“€μ–΄κ°€μ„œ μ„€μ •ν•˜λŠ”κ²Œ μ•„λ‹ˆλΌ μ§μ ‘μ μœΌλ‘œ λ°”λ‘œ Github κ³Ό 연결이 λ˜μ–΄μžˆκΈ° λ•Œλ¬Έμ— λ§Žμ€ νšŒμ‚¬λ“€μ΄ Github Actions λ₯Ό μ‚¬μš©ν•œλ‹€κ³  ν•œλ‹€.

 

μ—­μ‹œ μžμ„Έν•œ μ„€λͺ…은 μ‹€μ œλ‘œ Github Actions λ₯Ό μ‚¬μš©ν•˜λŠ” μ‹œμ μ— λ‹€μ‹œ μ΄μ•ΌκΈ°ν•˜λ„λ‘ ν•˜κ² λ‹€.

 

이제 μ‹€μŠ΅μ„ μœ„ν•΄μ„œ Github Repository ν•˜λ‚˜λ₯Ό μƒμ„±ν•˜κ³  Spring Boot μ„œλ²„λ₯Ό μΆ”κ°€μ‹œμΌœλ³΄μž.

 

1. Github Repository 생성 및 μ„œλ²„ 개발

 

μš°μ„  μ‹€μŠ΅μ„ μœ„ν•œ Github Repository λ₯Ό μƒμ„±ν•΄μ£Όμž.

 

 

그리고 Spring Boot Application Server λ₯Ό λ§Œλ“€μ–΄ ν•΄λ‹Ή Repository 둜 push 해주도둝 ν•˜μž.

 

 

μ•„μ£Ό κ°„λ‹¨ν•œ Application Server λ₯Ό κ°œλ°œν•˜λ € ν•˜λ‹ˆ Lombok κ³Ό Spring Boot Web 만 μ˜μ‘΄μ„±μœΌλ‘œ μΆ”κ°€μ‹œμΌœμ£Όμž.

 

Github Actions 와 Elastic Beanstalk 에 λŒ€ν•œ μ‚¬μš© λ§Œμ„ λͺ©ν‘œλ‘œ ν•˜μ‹ λ‹€λ©΄ μ‹€μŠ΅ μ½”λ“œ 및 github repository μ—μ„œ μ†ŒμŠ€μ½”λ“œλ₯Ό λ‹€μš΄λ°›κ³  μƒˆλ‘­κ²Œ μƒμ„±λœ 본인의 Repository 에 μœ„μΉ˜μ‹œμΌœμ£Όμ„Έμš”.

 

ν”„λ‘œμ νŠΈ 디렉토리 ꡬ쑰

 

μ•„μ£Ό 기본적인 Spring Boot 의 Layered Architecture 만 가져가도둝 ν•˜κ³  μœ„μ˜ 디렉토리 ꡬ쑰에 맞게 μ†ŒμŠ€μ½”λ“œλ₯Ό μΆ”κ°€ν•΄μ£Όμž.

 

Application server 의 μ½”λ“œ

 

ServerAppApplication.java

@SpringBootApplication
public class ServerAppApplication {

    public static void main(String[] args) {
        SpringApplication.run(ServerAppApplication.class, args);
    }

}

 

Todo.java

@Getter @Setter @Builder
@NoArgsConstructor
@AllArgsConstructor
public class Todo {
    private String todoId;
    private String todoName;
    private LocalDateTime createdAt;
}

Todo λŠ” Persist ν•  Entity λŒ€μƒ 객체이닀.

 

λ‹¨μˆœν•˜κ²Œ μ‹λ³„μžμ™€ todo 이름 그리고 μƒμ„±μΌλ§Œ κ°–λŠ”λ‹€.

 

TodoRepository.java

@Repository
public class TodoRepository {

    private List<Todo> dataStorage = new ArrayList<>();

    public void save(Todo todo) {
        dataStorage.add(todo);
    }

    public List<Todo> findAll() {
        return dataStorage;
    }
}

 

DBλ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šμ„ 것이기 λ•Œλ¬Έμ— dataStorage κ°€ Persist ν•  μ €μž₯μ†ŒλΌ μƒκ°ν•˜λ©΄ λœλ‹€.

 

save() λ©”μ„œλ“œκ°€ 호좜되면 dataStorage 에 Todo λ₯Ό μΆ”κ°€ν•˜κ³  findAll() λ©”μ„œλ“œκ°€ 호좜되면 dataStorage 에 μ €μž₯된 λͺ¨λ“  todo λ₯Ό λ°˜ν™˜ν•œλ‹€.

 

TodoService.java

@RequiredArgsConstructor
@Service
public class TodoService {
    private final TodoRepository todoRepository;

    public void createTodo(String todoName) {
        String todoId = UUID.randomUUID().toString();

        Todo todo = Todo.builder()
                .todoId(todoId)
                .todoName(todoName)
                .createdAt(LocalDateTime.now())
                .build();

        todoRepository.save(todo);
    }

    public List<Todo> getAllTodo() {
        return todoRepository.findAll();
    }
}

 

λΉ„μ¦ˆλ‹ˆμŠ€ 둜직이 μ‘΄μž¬ν•˜λŠ” Service μ½”λ“œμ΄λ‹€.

 

μ˜ˆμƒν•˜λŠ” 바와 같이 Todo 생성과 쑰회의 역할을 μˆ˜ν–‰ν•œλ‹€.

 

CreateTodoRequest.java

@Getter @Setter
@NoArgsConstructor
@AllArgsConstructor
public class CreateTodoRequest {
    private String todoName;
}

 

Todo λ₯Ό 생성할 λ•Œ μ‚¬μš©λ˜λŠ” DTO 객체이닀.

 

TodoController.java

@RestController
@RequiredArgsConstructor
@RequestMapping(value = "/api/todos", produces = "application/json")
public class TodoController {
    private final TodoService todoService;

    @PostMapping
    public ResponseEntity<Todo> createTodo(@RequestBody CreateTodoRequest requestData) {
        String todoName = requestData.getTodoName();
        todoService.createTodo(todoName);
        return ResponseEntity.status(HttpStatus.CREATED).build();
    }

    @GetMapping
    public ResponseEntity<List<Todo>> getAllTodo() {
        return ResponseEntity.ok(todoService.getAllTodo());
    }
}

 

μœ„μ˜ μ½”λ“œλŠ” API Endpoints이닀.

 

μœ„ 디렉토리 ꡬ쑰에 λ³΄μ΄λŠ” DefaultController λŠ” ν˜„μž¬ λ‹¨κ³„μ—μ„œ μƒλž΅ν•΄λ„ μ’‹λ‹€.

 

μš°λ¦¬λŠ” DefaultController 의 API Endpoint ν•˜λ‚˜λ₯Ό μΆ”κ°€ν•˜κ³  μ‹€μ œ EB와 Github Actions κ°€ 잘 λ™μž‘ν•˜λŠ”μ§€λ₯Ό μ•Œμ•„λ³Ό 것이닀.

 

Code Push

 

μž‘μ„±ν•œ μ½”λ“œλ“€μ„ μ μ ˆν•œ Commit Message 둜 λ¬Άμ–΄μ„œ github 에 μ˜¬λ €λ‘μž.

 

 

이제 μš°λ¦¬λŠ” Elastic Beanstalk 와 Github Actions λ₯Ό μ‚¬μš©ν•  μ€€λΉ„κ°€ 된 것이닀.

 

이제 λ°”λ‘œ λ‹€μŒμ‹œκ°„ λΆ€ν„° Github Actions λ₯Ό μ΄μš©ν•΄μ„œ 배포 μžλ™ν™”λ₯Ό κ΅¬μ„±ν•΄λ³΄μž!

 

λŒ“κΈ€