[프로젝트]중고 경매 사이트 - 제시요(메인화면 카테고리 리스트)

기능구현
송송승현's avatar
Dec 24, 2024
[프로젝트]중고 경매 사이트 - 제시요(메인화면 카테고리 리스트)

화면

notion image

JavaScript

all(); async function all(){ let carouselInner = document.querySelector(".t1-hotCategory"); let data = await categorySelectAll(); let s =Math.ceil(data.length/4); let str = ``; for(let i= 0; i<s; i++){ str += `<div class="t1-carousel-item carousel-item"><div class="t1-category-box d-flex justify-content-center" style="gap: 20px;"></div></div>` } carouselInner.innerHTML=str; let carouselItem = document.querySelectorAll(".t1-carousel-item"); if (carouselItem.length > 0) { carouselItem[0].classList.add ('active'); } let categoryBox = document.querySelectorAll(".t1-category-box"); let num = 0; let str2 =``; for(let i=0; i<data.length; i++){ str2+=` <div class="t1-category"> <input type="hidden" value="${data[i].id}"> <a href="/goods-list/${data[i].id}"><img src="${data[i].imgUrl}" class="rounded" alt="디지털기기"></a> <div class="t1-category-name">${data[i].name}</div> </div> ` if((i+1)%4==0){ if (num < categoryBox.length) { categoryBox[num].innerHTML = str2; num++; str2 = ``; } } } if (str2 !== '' ) { categoryBox[num].innerHTML = str2; } } async function categorySelectAll(){ let url = "/api/v1/category" let response = await fetch(url); let responseData = await response.json(); if(!responseData.success){ throw new Error("네트워크 응답에 문제가 있습니다."); } let data = responseData.data; return data; }

Controller

@ResponseBody @GetMapping("/api/v1/category") public ResponseEntity<?> category() { List<CategoryResponse.CategoryDTO> dto = categoryService.findAllCategory(); CommonResp<List<CategoryResponse.CategoryDTO>> resp = CommonResp.success(dto); return new ResponseEntity<>(resp, HttpStatus.OK); }

Service

public List<CategoryResponse.CategoryDTO> findAllCategory() { List<Category> categoryList = categoryRepository.findAllCategory(); List <CategoryResponse.CategoryDTO> categoryDTOList = new ArrayList<>(); for (Category category : categoryList) { categoryDTOList.add(new CategoryResponse.CategoryDTO(category, false)); } return categoryDTOList; }

Repository

public List<Category> findAllCategory() { Query q = em.createQuery("SELECT c FROM Category c", Category.class); return q.getResultList(); }

Entity

@NoArgsConstructor @Table(name = "category_tb") @Getter @Entity public class Category { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; @Column(unique = true, nullable = false) private String name; @Column(nullable = false) private String imgUrl; @Builder public Category(Integer id, String name, String imgUrl) { this.id = id; this.name = name; this.imgUrl = imgUrl; } }

해설

💡
JPQL을 활용하여 Repository에서 모든 카테고리 리스트를 가져와 비동기 통신을 수행
JavaScript에서 비동기 통신을 수행한 결과를 4개씩 하나로 묶어 캐러샐 형태로 변형
4개씩 묶은 후 남은 나머지를 하나로 묶어 캐러샐 형태로 변형
좌우 버튼을 클릭하면 캐러샐이 메인화면의 카테고리 캐러샐이 변화(부트 스트랩 사용)
 
Share article

송승현의 블로그