이번 글에선 이전 글에 이어, Armeria Framework에 Restful HTTP API 서비스 연동을 진행해보겠습니다.
이전 글 보러 가기 - [Java] Armeria - Restful API 서버 구축하기 - (1) Application 생성
이번 예시에선 책(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에서 해당 서비스 접근이 가능합니다.
'개발 > Armeria' 카테고리의 다른 글
[Java] Armeria Documentation Service 생성하기 (0) | 2022.07.04 |
---|---|
[Java] Armeria Service에서 사용되는 유용한 Annotation (0) | 2022.07.03 |
[Java] Armeria - Restful API 서버 구축하기 - (1) Application 생성 (0) | 2022.06.29 |
댓글