스프링 부트 백엔드 개발 강좌, 일래스틱 빈스토크로 서버 구축하기

일래스틱 빈스토크로 서버 구축하기

안녕하세요! 이번 강좌에서는 스프링 부트를 사용하여 백엔드 애플리케이션을 개발하고, 일래스틱 빈스톡(AWS Elastic Beanstalk)을 이용해 서버를 구축하는 방법에 대해 자세히 알아보겠습니다. 이 과정에서는 백엔드 개발의 기본 개념, 스프링 부트의 특징, 그리고 일래스틱 빈스톡의 설정 및 배포 방법에 대해 다룰 것입니다.

1. 스프링 부트란?

스프링 부트는 스프링 프레임워크를 기반으로 한 프로젝트로, 개발자가 더 쉽고 빠르게 스프링 애플리케이션을 구축할 수 있게 도와줍니다. 다음은 스프링 부트의 주요 특징입니다:

  • 자동 구성: 스프링 부트는 개발자가 필요한 설정을 자동으로 구성해 줍니다.
  • 스타터 의존성: 특정 기능을 쉽게 추가할 수 있도록 미리 구성된 의존성을 제공합니다.
  • 내장 서버: Tomcat, Jetty 등의 내장 웹 서버를 통해 독립적인 실행이 가능합니다.
  • 프로덕션 준비: 운영 환경에서 유용한 기능(모니터링, 로깅 등)을 제공합니다.

1.1 스프링 부트를 사용하는 이유

스프링 부트를 사용하면 애플리케이션 개발 속도가 빨라지고, 설정과 테스트가 간편해집니다. 특히 마이크로서비스 아키텍처를 지향하는 팀에서는 독립적인 서비스 개발이 가능해지는 장점이 있습니다.

2. 스프링 부트 프로젝트 생성하기

스프링 부트 프로젝트를 생성하는 가장 쉬운 방법은 Spring Initializr를 사용하는 것입니다. 이 도구를 통해 필요한 종속성과 초기 설정을 자동으로 구성할 수 있습니다.

2.1 Spring Initializr를 통한 프로젝트 생성

  1. Spring Initializr에 접속합니다.
  2. 프로젝트 메타데이터를 입력합니다:
    • Project: Maven Project
    • Language: Java
    • Spring Boot: 2.x.x (최신 안정 버전 선택)
    • Group: com.example
    • Artifact: my-spring-boot-app
    • Description: Demo project for Spring Boot
    • Package Name: com.example.myspringbootapp
    • Packaging: Jar
    • Java: 11 (또는 본인이 사용하는 버전)
  3. Dependencies(종속성)을 추가합니다:
    • Spring Web
    • Spring Data JPA
    • H2 Database
    • Spring Boot DevTools
  4. Generate 버튼을 클릭하여 zip 파일을 다운로드합니다.

2.2 프로젝트 구조 이해하기

다운로드한 zip 파일의 압축을 풀면 다음과 같은 기본 구조가 생성됩니다:

my-spring-boot-app/
├── src/
│   ├── main/
│   │   ├── java/
│   │   │   └── com/example/myspringbootapp/
│   │   │       └── MySpringBootApp.java
│   │   ├── resources/
│   │   │   ├── application.properties
│   └── test/
├── pom.xml
└── ...

3. 애플리케이션 로직 구현하기

3.1 간단한 REST API 만들기

이제 간단한 REST API를 만들어 보겠습니다. 먼저, GreetingController.java라는 컨트롤러 클래스를 생성합니다.

package com.example.myspringbootapp;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class GreetingController {

    @GetMapping("/greet")
    public String greet(@RequestParam(value = "name", defaultValue = "World") String name) {
        return "Hello, " + name + "!";
    }
}

이제 프로젝트를 실행하고 브라우저에서 http://localhost:8080/greet?name=John로 접속하면 “Hello, John!”이라는 메시지를 볼 수 있습니다.

4. 데이터베이스 설정하기

이번에는 H2 Database를 사용하여 간단한 CRUD API를 구현해 보겠습니다.

4.1 엔티티 클래스 생성

package com.example.myspringbootapp;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;

    // Getters and Setters
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

4.2 JPA 리포지토리 생성

package com.example.myspringbootapp;

import org.springframework.data.jpa.repository.JpaRepository;

public interface UserRepository extends JpaRepository {
}

4.3 서비스와 컨트롤러 구현

이제 UserService와 UserController를 생성하여 CRUD 기능을 구현하겠습니다.

package com.example.myspringbootapp;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Optional;

@Service
public class UserService {

    @Autowired
    private UserRepository userRepository;

    public List findAll() {
        return userRepository.findAll();
    }

    public Optional findById(Long id) {
        return userRepository.findById(id);
    }

    public User save(User user) {
        return userRepository.save(user);
    }

    public void delete(Long id) {
        userRepository.deleteById(id);
    }
}
package com.example.myspringbootapp;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/users")
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping
    public List getAllUsers() {
        return userService.findAll();
    }

    @GetMapping("/{id}")
    public ResponseEntity getUserById(@PathVariable Long id) {
        return userService.findById(id)
                .map(ResponseEntity::ok)
                .orElse(ResponseEntity.notFound().build());
    }

    @PostMapping
    public User createUser(@RequestBody User user) {
        return userService.save(user);
    }

    @DeleteMapping("/{id}")
    public ResponseEntity deleteUser(@PathVariable Long id) {
        userService.delete(id);
        return ResponseEntity.noContent().build();
    }
}

5. 애플리케이션 실행하기

이제 애플리케이션을 실행해 봅시다. IDE에서 MySpringBootApp.java 클래스를 실행하면 내장 서버가 시작되고, API에 접근할 수 있습니다.

5.1 Postman으로 API 테스트하기

Postman을 사용하여 API를 테스트할 수 있습니다. 다음과 같이 기본적인 요청을 만들어 실행해 보세요:

  • GET 요청: http://localhost:8080/users
  • POST 요청: http://localhost:8080/users (Body: JSON 형식)
  • DELETE 요청: http://localhost:8080/users/{id}

6. AWS Elastic Beanstalk 소개

AWS Elastic Beanstalk는 애플리케이션을 배포하고, 관리하는 작업을 자동화해주는 서비스입니다. 스프링 부트 애플리케이션을 이 서비스에 배포할 수 있습니다.

6.1 Elastic Beanstalk의 특징

  • 자동 스케일링: 트래픽에 따라 인스턴스를 자동으로 늘리거나 줄일 수 있습니다.
  • 운영 환경 관리: 서버의 운영 체제, 플랫폼, 리소스를 관리할 수 있습니다.
  • 쉬운 배포: 코드 몇 줄로 애플리케이션을 배포할 수 있습니다.

7. 일래스틱 빈스톡에 애플리케이션 배포하기

애플리케이션을 Elastic Beanstalk에 배포하기 위해서는 다음 단계를 따릅니다:

7.1 AWS 계정 생성 및 IAM 사용자 설정

  1. AWS 공식 홈페이지에 접속하여 계정을 생성합니다.
  2. IAM 서비스를 통해 새로운 사용자를 추가하고, 적절한 권한을 부여합니다.

7.2 Elastic Beanstalk 환경 생성

  1. AWS Management Console에 접속하여 Elastic Beanstalk를 선택합니다.
  2. 환경 생성(Create environment)를 클릭합니다.
  3. Web server environment을 선택합니다.
  4. Platform에서 Java를 선택하고 버전을 확인합니다.
  5. Application code에서 Upload your code를 체크하고, zip 파일을 업로드합니다.
  6. 환경 이름, 리소스 설정 등을 완료합니다.

7.3 애플리케이션 배포

모든 설정이 완료되면 환경을 생성하면 자동으로 애플리케이션이 배포됩니다. 배포가 완료되면 제공된 URL로 접속하여 애플리케이션을 확인할 수 있습니다.

8. 결론

이번 강좌에서는 스프링 부트를 사용하여 간단한 백엔드 애플리케이션을 개발하고, AWS Elastic Beanstalk에 배포하는 과정을 살펴보았습니다. 이 과정을 통해 스프링 부트의 특징과 AWS의 유용성을 직접 체험할 수 있었습니다. 더 깊은 이해를 위해 공식 문서와 관련 자료를 참고하시길 권장합니다.

질문이나 더 알고 싶은 내용이 있다면 댓글로 남겨주세요. 감사합니다!