본문 바로가기
개발/Armeria

[Java] Armeria - Restful API 서버 구축하기 - (2) 도메인서비스 연동

by Mingvel 2022. 6. 29.

이번 글에선 이전 글에 이어, Armeria Framework에 Restful HTTP API 서비스 연동을 진행해보겠습니다.

 

 

이전 글 보러 가기 - [Java] Armeria - Restful API 서버 구축하기 - (1) Application 생성

 

[Java] Armeria - Restful API 서버 구축하기 - (1) Application 생성

이번 글에서는 LINE에서 탄생 한 Open Source Framework인 Armeria를 이용하여, Restful API 서버를 간단하게 구축해보려고 합니다. Armeria는 LINE 내에서 사용 중이던 어떤 기술의 한계점을 극복하기 위해 자체

far-ming.tistory.com

 

 

이번 예시에선 책(Book)이라는 도메인을 사용할 것입니다.

 

 

Book 도메인은, 별도 Data Storage 연동 없이

Application Level에서 구현 가능한 데이터를 제공할 것이고 CRUD 또한 제공합니다.

 

 

Book.class

public class Book {
    private final long id;
    private final String name;
    private final long page;

    public Book(long id, String name, long page) {
        this.id = id;
        this.name = name;
        this.page = page;
    }

    public long getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public long getPage() {
        return page;
    }
}

 

linecorp.armeria 의존성 패키지에는 

Jackson Library가 기본적으로 포함됩니다 --> (Jackson Library Version을 최신으로 유지하고 있는 부분을 확인할 수 있네요)

 

 

Armeria에서는 Json 데이터 통신을 위해 Jackson Library를 이용한 기본적인 메서드를 제공하는데,

Jackson의 도움을 받기 위해 Json 데이터에 포함될 각 Field의 Getter는 생성하도록 합니다

 

 

BookRepository.class

public class BookRepository {

    static final Map<Long, Book> books;

    static {
        books = new HashMap<>();

        books.put(1L, new Book(1, "first Book", 100));
        books.put(2L, new Book(2, "second Book", 200));
        books.put(3L, new Book(3, "third Book", 300));
    }

    public static Book findById(long id) {
        return books.get(id);
    }

    public static List<Book> findAll() {
        return new ArrayList<>(books.values());
    }

    public static Book createUpdateBook(Book book) {
        return books.put(book.getId(), book);
    }

    public static Book deleteById(long id) {
        return books.remove(id);
    }
}

 

Armeria Framework의 핵심에 집중하기 위해, 별도 Data Source 연동 없이 데이터 흐름을 처리하기 위한 Repository도 만들어줍니다

또한, CRUD 기능을 담당하는 메서드도 함께 생성합니다

 

 

서비스를 생성하기 전에, 

각 Java Compiler가 각 Parameter 정보를 알 수 있게, build.gradle설정을 추가합니다

 

//build.gradle
// ...
tasks.withType(JavaCompile) {
    options.compilerArgs += '-parameters'
}

 

 

드디어 대망의 서비스입니다

 

 

BookService.class

import java.util.NoSuchElementException;

import com.book.handler.NoSuchElementExceptionHandler;

import com.linecorp.armeria.common.HttpResponse;
import com.linecorp.armeria.server.annotation.Delete;
import com.linecorp.armeria.server.annotation.ExceptionHandler;
import com.linecorp.armeria.server.annotation.Get;
import com.linecorp.armeria.server.annotation.Param;
import com.linecorp.armeria.server.annotation.Post;
import com.linecorp.armeria.server.annotation.RequestObject;

public class BookService {

    @Get("/books")
    public HttpResponse findAll() {
        return HttpResponse.ofJson(BookRepository.findAll());
    }

    @ExceptionHandler(NoSuchElementExceptionHandler.class)
    @Get("/book/:id")
    public HttpResponse findById(@Param long id) {
        Book book = BookRepository.findById(id);
        if (book == null) {
            throw new NoSuchElementException(id + " book is not found.");
        }
        return HttpResponse.ofJson(book);
    }

    @Post("/book")
    public HttpResponse createBook(@RequestObject Book book) {
        return HttpResponse.ofJson(BookRepository.createUpdateBook(book));
    }

    @ExceptionHandler(NoSuchElementExceptionHandler.class)
    @Delete("/book/:id")
    public HttpResponse deleteById(@Param long id) {
        Book book = BookRepository.deleteById(id);
        if (book == null) {
            throw new NoSuchElementException(id + " book delete failed");
        }
        return HttpResponse.ofJson(book);
    }
}

 

Http Method는 어노테이션으로 간결하게 표현이 가능하고

요청 값 (Parameter 등) 에 해당하는 부분도 굉장히 간결하게 표현이 가능합니다

 

서비스 부분에서 사용되는 어노테이션들은 특히 흥미로운 부분이 많은데

양이 적지 않아서 별도의 글로 다루도록 하겠습니다

Armeria Service에서 사용되는 유용한 어노테이션들 

 

 

마지막으로 

서버에 Http Service를 등록해줍니다.

static Server newServer() {
        ServerBuilder sb = Server.builder();
        return sb.http(Main.PORT)
        	//.service("/", (ctx, req) -> HttpResponse.of("This is Book Server"))
                 .annotatedService(new BookService())
                 .build();
    }

 

Armeria에서는 각 Http Service를 Doc으로 만들어주는 기능 또한 제공합니다

해당 내용도 별도의 글로 다루도록 하겠습니다

Armeria API Document 만들기 - 준비 중..

 

 

위와 같은 과정을 마치면 Web에서 해당 서비스 접근이 가능합니다.

 

(GET) /books

 

Github Source

 

GitHub - meeingjae/armeria-book-service: Armeria Restful Http Server

Armeria Restful Http Server. Contribute to meeingjae/armeria-book-service development by creating an account on GitHub.

github.com

 

반응형

댓글