Boot Spring 3.2.0으로 시작하기: NoSQL 통합을 포함한 Hello World REST API 구축

스프링 부트 3.2.0의 최신 발전으로 여행을 떠나 기본 “Hello World” 애플리케이션을 만드는 과정을 안내해 드리겠습니다. 이 튜토리얼에서는 일반적인 스프링 소개를 넘어, REST API를 구축하는 복잡성과 NoSQL 데이터베이스와 원활하게 통합하는 방법에 대해 자세히 살펴보겠습니다. 스프링 부트 3.2.0은 새로운 기능과 최적화의 범위를 통해 현대적인 개발 관행의 매력적인 탐색을 위한 무대를 제공합니다. 이 가이드는 초보자와 숙련된 개발자 모두를 위해 맞춤화되어 있으며, 스프링의 잠재력을 활용한 견고하고 현대적인 애플리케이션을 위한 실습 경험을 약속합니다. 간단함과 혁신이 만나는 스프링 3.2.0의 여행을 시작하겠습니다.

스프링 부트 3.2.0의 새로운 기능

스프링 부트 3.2.0은 Java 개발에서 상당한 발전을 이루며, 최소 Java 17 환경을 요구하고 최신 Java 21에 대한 지원을 확장합니다. 이 버전은 스프링 프레임워크 사용의 환경을 재정의하는 많은 기능을 도입합니다.

자바의 인상적인 특징 중 하나는 가상 스레드를 지원한다는 것으로, 이를 통해 경량 스레드를 활용하여 확장성과 응답성을 향상시킵니다. 또한, Spring Boot 3.2.0은 JVM 체크포인트 복원(CRaC) 프로젝트의 초기 지원을 도입하여 애플리케이션이 JVM 재시작 후 상태를 복구할 수 있게 함으로써 신뢰성과 강인성을 강화합니다.

보안은 SSL 번들 재로딩으로 중앙에 놓이며, 동적으로 SSL 번들을 다시 로드할 수 있게 합니다. 이 기능을 통해 개발자는 SSL 인증서를 보다 동적으로 관리할 수 있어 애플리케이션의 민첩성과 보안을 보장합니다.

관찰 가능성 개선 사항은 릴리스 전반에 걸쳐 제공되어 개발자에게 개발 경험을 보다 투명하고 관리하기 쉽게 하는 강화된 모니터링 및 추적 기능을 제공합니다.

현대적인 개발 관행에 맞춰 Spring Boot 3.2.0은 RESTful(RestClient) 및 JDBC(JdbcClient) 작업을 위한 전용 클라이언트를 도입합니다. 이러한 추가 사항은 외부 서비스와의 통신을 간소화하고 통합 기능을 향상시킵니다.

또한 Jetty 12와의 호환성도 주목할 만한 포함으로, 개발자가 Jetty 웹 서버의 최신 기능을 활용할 수 있게 합니다. Spring Boot 3.2.0은 Apache Pulsar를 지원함으로써 생태계 호환성을 확장하며, Spring의 메시징 기능을 확장하여 견고한 이벤트 기반 애플리케이션을 구축할 수 있게 합니다.

Kafka와 RabbitMQ의 대중성을 인정하며, Spring Boot 3.2.0은 이러한 인기 있는 메시지 시스템에 대한 SSL 번들 지원을 도입하여, 이러한 메시지 브로커에 의존하는 애플리케이션의 보안 포스처를 강화합니다.

이 릴리스는 또한 중첩된 JAR 파일을 처리하는 방식을 재구성하여 의존성 관리의 복잡성을 해결하며, 더 안정적이고 예측 가능한 애플리케이션 배포를 보장합니다. 마지막으로, Docker 이미지 빌드에서 개선이 이루어져 컨테이너화 프로세스를 간소화하고 Spring 애플리케이션의 이식성과 배포 효율성을 향상시킵니다.

결론적으로, Spring Boot 3.2.0은 최신 Java 버전과 일치하면서 혁신적인 기능을 도입하고 기존 기능을 개선합니다. 이번 릴리스는 개발자들이 Java 개발의 끊임없는 변화하는 환경에서 현대적이고 견고하며 고성능의 애플리케이션을 자신 있게 구축할 수 있도록 지원합니다.

코드 보기

이번 세션에서는 Spring의 힘을 활용하여 HarperDB와 원활하게 통합하는 포켓몬 API를 개발하는 흥미로운 여정을 시작합니다. 우리의 초점은 기본 CRUD(생성, 읽기, 업데이트, 삭제) 작업을 구현하는 것에 있으며, 각 포켓몬에 대한 고유 식별자(ID)를 활용하는 것에 특히 주목합니다. 이 세션이 끝날 때까지 당신은 완전히 기능하는 Spring 애플리케이션뿐만 아니라 확장 및 더 큰 프로젝트에 통합할 준비가 된 포켓몬 API를 갖게 될 것입니다. 단순함과 혁신이 만나는 포켓몬과 Spring 개발의 세계로 뛰어들어보세요.

Docker를 사용하여 HarperDB NoSQL 데이터베이스가 실행 중인지 확인하세요. 터미널을 열고 다음 명령어를 실행하세요:

Shell

 

docker run -d -e HDB_ADMIN_USERNAME=root -e HDB_ADMIN_PASSWORD=password -e HTTP_THREADS=4 -p 9925:9925 -p 9926:9926 harperdb/harperdb

이 명령어는 HarperDB Docker 이미지를 가져와 지정된 구성으로 컨테이너를 시작합니다. -p 옵션은 컨테이너의 포트를 로컬 머신에 매핑하여 HarperDB 인터페이스를 http://localhost:9925에서 접근할 수 있게 합니다.

다음으로 Spring Initializer로 이동하여 Spring 애플리케이션을 설정합니다. 다음 단계를 따르세요:

  1. 원하는 프로젝트 설정을 선택하세요 (예: Maven 또는 Gradle, Java 버전).
  2. 의존성 추가: 의존성 목록에서 “Spring Web“을 선택하세요.
  3. Generate”를 클릭하여 프로젝트를 ZIP 파일로 다운로드 하세요.

다운로드한 ZIP 파일을 추출하고 프로젝트를 IntelliJ IDEA나 Eclipse와 같은 선호하는 통합 개발 환경(IDE)에 가져오세요.

이제 Spring 애플리케이션이 설정되었으므로 다음 중요한 단계는 HarperDB와의 통합입니다. 이를 달성하려면 프로젝트에 HarperDB 의존성을 포함시켜야 합니다. pom.xml 파일에 다음 Maven 의존성을 추가하세요:

XML

 

<dependency>
    <groupId>io.harperdb</groupId>
    <artifactId>harpderdb-core</artifactId>
    <version>0.0.1</version>
</dependency>

의존성을 배치한 후, 코드로 넘어가 보겠습니다. Spring에서 연결을 관리하고 Spring Inversion of Control(IoC) 컨테이너의 핵심 부분으로 만들기 위해 HarperDB라는 구성 클래스를 생성할 것입니다.

Java

 

@Configuration
public class HarperDB {

    @Bean
    public Template template() {
        Server server = ServerBuilder.of("http://localhost:9925")
                .withCredentials("root", "password");
        server.createDatabase("pokemons");
        server.createTable("pokemon").id("id").database("pokemons");
        return server.template("pokemons");
    }
}

이 구성 클래스는 @Configuration 어노테이션으로 표시되어 있으며, ‘template’이라는 이름의 Spring bean을 생성합니다. Template 객체는 HarperDB와 상호 작용하는 데 핵심적인 구성 요소입니다. 서버 연결 세부 정보, 포함하여 서버 URL과 로그인 자격 증명을 사용하여 초기화합니다. 또한 “pokemons”라는 데이터베이스와 “pokemon”이라는 테이블을 생성하고, “id” 컬럼을 포함합니다. 이는 포켓몬 엔티티를 HarperDB에 저장하기 위한 기반을 설정합니다.

데모를 강화하기 위해 먼저 Java의 record 기능을 사용하여 불변 엔티티를 생성합니다:

Java

 

public record Pokemon(String id, String name, String location) {
}

이 간단한 포켓몬 레코드 클래스는 포켓몬의 기본 속성인 ID, 이름 및 위치를 불변 방식으로 캡슐화합니다.

다음으로, 데이터베이스와의 통신을 설정하기 위해 PokemonService를 생성하여 HarperDB에 브릿지 역할을 합니다:

Java

 

@Service
public class PokemonService {

    private final Template template;

    public PokemonService(Template template) {
        this.template = template;
    }

    public Optional<Pokemon> findById(String id) {
        return template.findById(Pokemon.class, id);
    }

    public void save(Pokemon pokemon) {
        template.upsert(pokemon);
    }

    public void delete(String id) {
        template.delete(Pokemon.class, id);
    }
}

PokemonService 클래스는 포켓몬 엔티티와 관련된 기본 작업을 처리하는 Spring 서비스입니다. 앞서 구성한 Template 객체를 사용하여 HarperDB와 상호 작용합니다. findById 메소드는 ID로 포켓몬을 검색하고, 포켓몬을 추가하거나 업데이트하며, 데이터베이스에서 삭제하고 제거합니다.

마지막으로, 이러한 작업을 REST 엔드포인트로 노출하기 위해 PokemonController를 생성합니다:

Java

@RestController
public class PokemonController {

    private final PokemonService service;

    public PokemonController(PokemonService service) {
        this.service = service;
    }

    @GetMapping("/pokemons/{id}")
    Pokemon findById(@PathVariable String id) {
        return service.findById(id).orElseThrow(() -> new PokemonNotFoundException(id));
    }

    @PutMapping("/pokemons")
    Pokemon newPokemon(@RequestBody Pokemon pokemon) {
        service.save(pokemon);
        return pokemon;
    }

    @DeleteMapping("/pokemons/{id}")
    void deleteEmployee(@PathVariable String id) {
        service.delete(id);
    }
}

이 PokemonController 클래스는 @RestController 어노테이션이 달리고, 세 가지 엔드포인트를 정의합니다:

  • GET /pokemons/{id}는 ID로 포켓몬을 검색합니다.
  • PUT /pokemons는 새 포켓몬을 생성하거나 기존 포켓몬을 업데이트합니다.
  • DELETE /pokemons/{id}는 ID로 포켓몬을 삭제합니다.

컨트롤러는 PokemonService에 의존하여 이러한 작업을 처리하며, 스프링 애플리케이션에서 관심사의 명확한 분리를 제공합니다.

이러한 구성 요소가 준비되면 포켓몬 API는 HarperDB를 사용하여 기본 CRUD 작업을 수행할 수 있습니다. 엔드포인트를 테스트하여 스프링과 NoSQL 데이터베이스의 매끄러운 통합을 직접 확인해보세요!

HarperDB와 포켓몬 API가 통합된 스프링 애플리케이션이 이제 테스트 및 실행을 위해 준비되었습니다. curl 명령을 사용하여 몇 가지 일반적인 시나리오를 살펴보겠습니다. 진행하기 전에 스프링 애플리케이션이 실행 중인지 확인하세요.

포켓몬 생성

Shell

 

   curl -X PUT -H "Content-Type: application/json" -d '{"id": "1", "name": "Pikachu", "location": "Forest"}' http://localhost:8080/pokemons

이 명령은 ID가 1이고, 이름이 피카츄이며, 위치가 숲인 새로운 포켓몬을 생성합니다.

ID로 포켓몬 조회

Shell

 

curl http://localhost:8080/pokemons/{id}

{id}를 방금 생성한 포켓몬의 실제 ID로 교체하세요.

포켓몬 업데이트

Shell

 

   curl -X PUT -H "Content-Type: application/json" -d '{"id": "1", "name": "Raichu", "location": "Thunderstorm"}' http://localhost:8080/pokemons

이 명령은 ID가 1인 기존 포켓몬의 이름을 라이츄로, 위치를 뇌우로 업데이트합니다.

ID로 포켓몬 삭제

Shell

 

curl -X DELETE http://localhost:8080/pokemons/{id}

{id}를 삭제하려는 포켓몬의 실제 ID로 교체하세요.

이러한 시나리오는 포켓몬 API에서 기본 CRUD 작업을 포괄적으로 테스트합니다. 포켓몬을 생성하는 것부터 시작합니다. 특정 사용 사례와 데이터에 따라 명령을 필요에 따라 조정하고 테스트를 즐겨주세요!

결론

이 튜토리얼에서는 Spring Boot 3.2.0의 기능을 활용하여 HarperDB와 원활하게 통합된 간결한 포켓몬 API를 만들어보았습니다. 최신 Spring 버전은 중요한 기능을 소개하여 우리가 견고하고 확장 가능한 애플리케이션을 만들 수 있는 능력을 향상시켰습니다.

불변 엔티티, Spring IoC 및 HarperDB를 활용하여 현대 Java 개발의 간단함을 보여주었습니다. 데모 코드는 여기에서 사용할 수 있으며 사용자 정의를 위한 프로젝트의 기초가 됩니다.

업데이트 및 심층 인사이트에 대해서는 공식 Spring 블로그를 참조하세요. Spring Boot와 HarperDB 여정이 혁신과 코딩의 기쁨으로 가득 차길 바랍니다! 행복한 코딩!

Source:
https://dzone.com/articles/getting-started-with-boot-spring-320-building-a-he