일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- unityui
- 이분탐색
- 프로그래머스
- 스택
- 내일배움캠프
- BFS
- 구현
- Photon
- 순열
- 문자열
- UE4
- 워크플로
- 포톤
- Unity3d
- FSM
- Unity2D
- C++
- Firebase
- Inventory
- 유클리드호제법
- 유니티
- 언리얼엔진
- 스파르타내일배움캠프
- UnrealEngine
- c#
- 스파르타내일배움캠프TIL
- Unity
- 알고리즘
- 해시
- QueryDSL
- Today
- Total
개발 낙서장
[JSP] API 연동 및 데이터 출력 본문
책을 검색하고 조회할 수 있는 간단한 기능을 만들어 봤다.
JSP를 활용했으며 네이버 오픈 API를 통해 도서 정보를 가져왔다.
구조는 다음과 같다.
- 클라이언트에서 키워드로 검색
- 서버에서 키워드를 가지고 오픈 API 호출
- 받은 데이터를 JSON으로 반환
- JSP에서 데이터 출력
검색
<div class="input-div">
<form action="<c:url value="/books/search"/>" method="get">
<label>
<input type="text" name="query" style="width: 80%;">
</label>
<button type="submit">검색</button>
</form>
</div>
JSTL의 태그 중 하나인 c:url을 사용해 해당 페이지 주소를 호출하도록 했으며 form과 input을 통해 입력값을 쿼리스트링으로 넘겨줄 수 있게 하였다.
a href가 아니라 c:url 태그를 사용하는 이유는 Context Path 때문이라고 한다. 유동적인 서버 상황에 따라 경로를 찾아주기 때문에 유지보수 측면에서 매우 좋은 것 같다.
Controller
@GetMapping("/search")
public ModelAndView searchBook(@ModelAttribute SearchBookRequestDto requestDto) {
ModelAndView mv = new ModelAndView("test");
mv.addObject("search", bookService.searchBook(requestDto));
return mv;
}
ModelAndView를 통해 JSP 창과 데이터를 담아 반환할 수 있도록 했다.
Service
public String searchBook(SearchBookRequestDto requestDto) {
URI uri = UriComponentsBuilder
.fromHttpUrl(baseUrl)
.path(path)
.queryParam("query", requestDto.getQuery())
.queryParam("display", requestDto.getDisplay() == null ? 20 : requestDto.getDisplay())
.queryParam("start", requestDto.getStart() == null ? 1 : requestDto.getStart())
.queryParam("sort", requestDto.getSort() == null ? "date" : requestDto.getSort())
.encode(StandardCharsets.UTF_8)
.build().toUri();
RequestEntity<Void> req = RequestEntity
.get(uri)
.header(headerClientId, clientId)
.header(headerClientSecret, clientSecret)
.build();
ResponseEntity<SearchBookResponseDto> exchange = restTemplate.exchange(req, SearchBookResponseDto.class);
// JSON으로 변환
ObjectMapper objectMapper = new ObjectMapper();
String jsonResponse = "";
try {
jsonResponse = objectMapper.writeValueAsString(exchange.getBody());
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return jsonResponse;
}
RestTemplate를 활용해 외부 API를 호출하였고 받은 값을 ObjectMapper를 통해 Json으로 변환해주었다.
그냥 String으로 반환하면 JSP에서 깔끔하게 사용할 수 없고 JSON으로 변환하지 않으면 아예 사용할 수 없다.
JSP
<body>
<h1>S E A R C H</h1>
<div class="book-info-area">
<script>
let books = ${search}.items;
let html = "";
$.each(books, function (i, v) {
html += `
<div class="book-card">
<img src="\${v.image}" alt="Book Image">
<p class="book-title">\${v.title}</p>
<p class="book-author">\${v.author}</p>
<p class="book-description">\${v.description}</p>
<a href="\${v.link}" class="book-link" target="_blank">View Details</a>
</div>`;
})
$(".book-info-area").append(html);
</script>
</div>
</body>
ModelAndView에서 보내준 Key 값으로 사용하면 된다.
주의해야 할 점은 JavaScript의 백틱과 JSP의 백틱 표현식이 같은데 JSP가 먼저 실행되기에 js의 백틱은 인식되지 않는다.
따라서 js의 백틱을 JSP와 함께 사용하는 경우라면 js에서는 ${}
이 아니라 앞에 백슬래쉬와 함께 \${}
이런 식으로 사용해야 js 백틱도 원활히 동작한다.
ChatGPT와 구글링의 힘을 빌려 css도 간단히 작성해보았다.
토이 프로젝트를 제작하는 셈 치고 조금씩 확장해갈 생각이다.
Redis를 사용해 인기 검색어 혹은 인기 검색 도서를 메인에 보여준다던지
회원과 관리자, 게시판을 추가해 사용자와 관리자 관점으로 도메인을 확장한다던지 등..
'Java' 카테고리의 다른 글
[Spring] Redis로 인기 검색어 구현 (0) | 2024.12.18 |
---|---|
[JSP] SpringBoot + JSP 설정 (0) | 2024.12.12 |
[JAVA] compareTo (0) | 2024.11.26 |
[Spring] @RequestPart 테스트 HttpMediaTypeNotSupportedException (0) | 2024.05.17 |
Spring + Redis Cache (0) | 2024.05.13 |