이 가이드에는 Gateway를 연동하여 개발할 수 있도록 합니다. 이 가이드에서는 다음 방법을 설명합니다.
해당 예제는 책 목록을 조회하는 API 입니다.
파라미터로 Request<RequestHeader, BookParameter>
형태의 request 변수를 선언하였고
요청한 클라이언트에 ResponseEntity<Response<ResponseHeader, List<BookList>>>
형태로 리턴합니다.
@PostMapping(value = "/api/book/list")
public ResponseEntity<Response<ResponseHeader, List<BookList>>> getBooKList(
Request<RequestHeader, BookParameter> request) {
List<BookList> bookList = bookService.getBookList();
ResponseHeader responseHeader = new ResponseHeader();
responseHeader.setResultCode(ResponseCode.OK);
responseHeader.setResultMessage(Const.SUCCESS);
return ResponseEntity.ok(new Response<>(responseHeader, bookList));
}
파라미터: Request<RequestHeader, BookParameter>
형태
RequestHeader
에는 클라이언트의 요청 정보 → Request 클래스의 head
에 담습니다
BookParameter
는 책 정보 조회 시 조건을 담은 DTO 객체 → Request 클래스의 body
에 담습니다
{
"head": {
},
"body": {
"title": "life" //책 제목에 life가 포함된 책을 검색
}
}
리턴: ResponseEntity<Response<ResponseHeader, List<BookList>>>
형태
ResponseHeader(결과코드(result_code), 결과 메시지(result_msg)를 포함한 객체) → Response의 head에 담습니다
BookList는 데이터베이스에서 조회한 책 정보를 담는 DTO 객체 → Response의 body에 담습니다
{
"head": {
"result_code": "200",
"result_msg": "조회 성공"
},
"body": [
{
"bookId": "4",
"title": "What Life Was Like in the Jewel in the Crown: British India AD 1600-1905",
"isbn13": "34406054602",
"languageName": "English",
"numPages": "168",
"publicationDate": "1999-09-01",
"publisherName": "Time Life Medical",
"authorName": "Time-Life Books"
},
{
"bookId": "6",
"title": "Life Is a Dream and Other Spanish Classics (Eric Bentley's Dramatic Repertoire) - Volume II",
"isbn13": "73999140774",
"languageName": "English",
"numPages": "298",
"publicationDate": "2000-04-01",
"publisherName": "Applause Theatre and Cinema Book Publishers",
"authorName": "Eric Bentley"
}
]
}
인터페이스 객체인 BookMapper는 데이터 접근을 위한 객체이며 생성자를 통해 주입합니다.
호출부분은 Controller의 List<BookList> bookList = bookService.getBookList();
이며 getBookList() 메서드는 bookMapper객체의 getBookList()
메서드를 호출하여 조회한 결과를 반환하게 됩니다. 반환 타입은 List<BookList>
형태입니다.
방법 1) msp.gateway.datasource 섹션을 통해 DB연결을 정의한 경우 반드시 아래와 같이 작성합니다.
@Service
public class BookService {
private final SqlSessionTemplate sqlSessionTemplate;
public BookService(SqlSessionTemplate sqlSessionTemplate){
this.sqlSessionTemplate = sqlSessionTemplate;
}
public List<BookList> getBookList() {
BookMapper bookMapper = sqlSessionTemplate.getMapper(BookMapper.class);
return bookMapper.getBookList();
}
}
방법 2) spring.datasource를 섹션을 통해 DB연결을 정의한 경우, 방법1 또는 아래와 같이 작성이 가능합니다.
@Service
public class BookService {
private final BookMapper bookMapper;
public BookService(BookMapper bookMapper) {
this.bookMapper = bookMapper;
}
public List<BookList> getBookList() {
return bookMapper.getBookList();
}
}
BookMapper 인터페이스는 데이터베이스에서 책 목록을 조회하는 기능을 정의합니다. BookService 클래스가 이 인터페이스를 구현하여, 실제 데이터 접근 로직을 구현합니다.
@Mapper
public interface BookMapper {
List<BookList> getBookList();
}
book.xml은 Mybatis를 사용하여 데이터베이스에서 책 목록을 조회하는 Mapper파일 입니다. 이 쿼리문은 책과 관련된 여러 테이블을 조인하여 책 정보, 언어 정보, 출판사 정보, 저자 정보를 가져오며, title의 속성값이 null또는 빈 문자열이 아닐경우 title 필드에 대한 LIKE 조건을 추가하며, 최대 10건의 결과만 반환하도록 작성되어있습니다.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="kr.msp.example.mapper.BookMapper">
<select id="getBookList" parameterType="kr.msp.example.dto.BookParameter" resultType="kr.msp.example.dto.BookList">
select book.book_id
, book.title
, book.isbn13
, language.language_name
, book.num_pages
, book.publication_date
, publisher.publisher_name
, author.author_name
from
book book, book_language language, publisher publisher, book_author book_author, author author
where book.language_id = language.language_id
and book.publisher_id = publisher.publisher_id
and book.book_id = book_author.book_id
and book_author.author_id = author.author_id
<if test="title != null and title != ''">
and book.TITLE LIKE '%' || #{title} || '%'
</if>
order by book_id
limit 10
</select>
</mapper>