ν΄λΉ μ리μ¦λ 3κ°μ κΈλ‘ ꡬμ±λμ΄μμ΅λλ€. κ° λ¨κ³μ μμΈν μ¬νμ μλ λ§ν¬λ₯Ό μ°Έμ‘°ν΄μ£ΌμΈμ
- 1νΈ Spring Boot μλ² μμ±νκΈ°
- 2νΈ Elastic Beanstalk μμ±νκΈ°
- 3νΈ Github Actions μ μνκΈ°
- ν΄λΉ κΈμ μ€μ΅ μ½λ λ° github repository
λκΈ°
μ΅κ·Ό μ¬λ΄μμ μλ‘κ² κ°λ°νλ μλ²λ₯Ό 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 λ₯Ό μ΄μ©ν΄μ λ°°ν¬ μλνλ₯Ό ꡬμ±ν΄λ³΄μ!
λκΈ