Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -5,22 +5,29 @@

@RequiredArgsConstructor
public enum BookGenre {
FICTION("소설/시/희곡"),
ESSAY("에세이"),
SELF_IMPROVEMENT("자기계발"),
SCIENCE("과학"),
HISTORY("역사"),
ECONOMY("경제경영"),
ART("예술/대중문화"),
HUMANITIES("인문학"),
HOME("가정/요리/뷰티"),
TRAVEL("여행"),
HEALTH("건강/취미/레저");
FICTION("소설/시/희곡", "1"),
ESSAY("에세이", "55889"),
SELF_IMPROVEMENT("자기계발", "336"),
SCIENCE("과학", "987"),
HISTORY("역사", "74"),
ECONOMY("경제경영", "170"),
ART("예술/대중문화", "517"),
HUMANITIES("인문학", "656"),
HOME("가정/요리/뷰티", "1230"),
TRAVEL("여행", "1196"),
HEALTH("건강/취미/레저", "55890"),

private final String value;
ALL("전체", null);

private final String value; // 한글 노출 이름
private final String categoryId; // Aladin CategoryId

@JsonValue
public String getValue() {
return value;
}

public String getCategoryId() {
return categoryId;
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.hansung.leafly.domain.book.service;

import com.hansung.leafly.domain.book.entity.enums.BookGenre;
import com.hansung.leafly.domain.book.web.dto.BookFilterReq;
import com.hansung.leafly.domain.book.web.dto.BookInfoRes;
import com.hansung.leafly.domain.book.web.dto.SearchRes;
Expand All @@ -14,4 +15,6 @@ public interface BookService {
BookInfoRes details(Long isbn, Member member);

BookInfoRes ocr(MultipartFile file, Member member);

List<SearchRes> category(BookGenre genre, Member member);
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;

import java.util.HashSet;
Expand All @@ -25,6 +26,7 @@

@Service
@RequiredArgsConstructor
@Transactional(readOnly = true)
@Slf4j
public class BookServiceImpl implements BookService {
private final AladinClient aladinClient;
Expand Down Expand Up @@ -101,6 +103,35 @@ public BookInfoRes ocr(MultipartFile file, Member member) {
return details(isbn, member);
}

@Override
public List<SearchRes> category(BookGenre genre, Member member) {
AladinSearchRes response;

if (genre == BookGenre.ALL) {
// 전체 → 인기 도서 탐색
response = aladinClient.bestSeller();
} else {
// 장르 검색
response = aladinClient.searchByCategory(genre.getCategoryId());
}

if (response == null || response.item() == null) {
return List.of();
}

Set<Long> bookmarkedSet = new HashSet<>(
bookmarkRepository.findIsbnsByMemberId(member.getId())
);

return response.item().stream()
.filter(item -> item.isbn13() != null && !item.isbn13().isBlank())
.map(item -> SearchRes.from(
item,
bookmarkedSet.contains(Long.parseLong(item.isbn13()))
))
.toList();
}

//카테고리 필터링
private boolean matchesGenre(AladinBookItem item, List<BookGenre> targetGenres) {
String middle = extractMiddleCategory(item.categoryName());
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.hansung.leafly.domain.book.web.controller;

import com.hansung.leafly.domain.book.entity.enums.BookGenre;
import com.hansung.leafly.domain.book.service.BookService;
import com.hansung.leafly.domain.book.web.dto.BookFilterReq;
import com.hansung.leafly.domain.book.web.dto.BookInfoRes;
Expand Down Expand Up @@ -54,4 +55,12 @@ public ResponseEntity<SuccessResponse<BookInfoRes>> ocr(
return ResponseEntity.status(HttpStatus.OK).body(SuccessResponse.from(res));
}

@GetMapping("/category")
public ResponseEntity<SuccessResponse<List<SearchRes>>> category(
@RequestParam BookGenre genre,
@AuthenticationPrincipal CustomMemberDetails memberDetails
){
List<SearchRes> res = bookService.category(genre, memberDetails.getMember());
return ResponseEntity.status(HttpStatus.OK).body(SuccessResponse.from(res));
}
}
14 changes: 14 additions & 0 deletions src/main/java/com/hansung/leafly/infra/aladin/AladinClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -66,5 +66,19 @@ public AladinSearchRes searchByCategory(String categoryId) {

return restTemplate.getForObject(uri, AladinSearchRes.class);
}

public AladinSearchRes bestSeller() {
String uri = UriComponentsBuilder.fromHttpUrl(SEARCH_URL)
.queryParam("ttbkey", TTB_KEY)
.queryParam("QueryType", "Bestseller")
.queryParam("SearchTarget", "Book")
.queryParam("MaxResults", 20)
.queryParam("output", "js")
.queryParam("Version", "20131101")
.build()
.toUriString();

return restTemplate.getForObject(uri, AladinSearchRes.class);
}
}