에러문구Encountered two children with the same key, `0` 게시글 조회, 카테고리 반복시 위와 같은 오류가 발생했다. 에러문구에서 파악 가능한 사항은 중복된 키 값이 존재해 일어나는 오류인 것으로 보인다. 카테고리를 변경하거나, 페이징을 변경할경우 간혹 발생했다. 리스트에서 게시글을 불러올 경우 postgresql 내 데이터를 불러오는데, 그 데이터의 id 값이 중복값이 되어있어 문제를 일으키는 것으로 확인된다. DB상에서 ID값이 0인 데이터를 모두 제거후 확인해보니 정상작동한다. postgresql의 데이터는 크롤링을 이용해서 데이터를 정제한 후 집어넣기 때문에 문제가 있다면 크롤링 쪽 로직의 수정이 필요하다. id값이 0으로 지정되는 부분을 체크하여 확인할 예정..
왼쪽 / 오른쪽을 1페이지씩 이동시키는 페이징의 기본 버튼은 반드시 -1 , +1로 이동한다. 이전에 만들어놓은 handlePageChange 메서드를 동일하게 사용할 생각이다. 현재 페이지 이동번호가 필요하고, == 1 일때는 작동하지 않게 하기 위해서 currentPage 값이 1 이라면 비활성화 해야한다. {/* 이전 페이지 버튼 */} handlePageChange(currentPage - 1)} disabled={currentPage === 1} className="!px-3 !py-1 text-gray-700 rounded-md disabled:opacity-50" ..
AI Chat하면 대표적으로 chatgpt를 생각하고, 모델 자체도 GPT-n 모델을 제일 많이 사용한다. 이 외 클로드도, Sonar, Gemini 등 많은 모델이 존재하지만 이중 퍼플렉시티가 사용하는 Sonar 모델은 검색 후 추론에 특화되어있다. 즉, 명확하게 어떠한 페이지의 검색결과나 조사결과의 데이터를 뽑고싶다면 퍼플렉시티를 이용하는 편이다. 퍼플렉시티 또한 api를 제공하는데, 이번에 프로젝트에서 해당 모델을 사용할 이유가 생겨 사용 전 postman을 이용해 테스트해보려고 한다. 퍼플렉시티에서 기본적으로 하단에 API 메뉴가 존재한다. API 키를 누르면 아래와 같은 페이지가 등장한다. Start Building, Develooper Docs 버튼 아무거나 눌러도 같은 페이지의 카테고리..
@Injectable()export class BoardRepository extends Repository { constructor(private readonly dataSource: DataSource) { super(BoardDeals, dataSource.createEntityManager()); // ❌ BoardDeals 테이블도 사용하려고 함 }} Nest.js에서 Repositroy를 만들어서 DB를 컨트롤할 경우, 위처럼 class에 Repository를 상속받는다. import { DataSource, Repository } from "typeorm"; Repsotiory 로 메서드를 상속받는데, 이는 기본 Repository와 테이블 모델을 결합한것이기 때문에,..
페이징페이징은 어떤 리스트에서도 가장 기본에 속하는 구조다. 여러 개시글의 리스트가 일정 갯수 이상 존재한다면 그 게시글들을 모두 보여주는 방법을 정해야 하는데, 가장 보편적으로 많은 시스템에서 채택한 구조가 페이징이다. 요즘은 페이징기능이 아니라, 내리면 다음 요소들을 불러오는 시스템도 있지만 UX적으로 불편하다고 생각했던게 많아 페이징 구조를 선택했다. 게시글로 작성하지는 않았지만, 현재 API를 통해 게시글을 불러와 리스트를 그리는 부분까지만 구현된 상태다. useEffect(() => { const fetchData = async () => { try { const sourceParam = selectedSource === '통합' ? '' : `&site=${sel..
nest.js 프로젝트 만들기npx @nestjs/cli new backend 설치중 npm 혹은 yarn을 설정 할 수 있습니다. Puppeteer 설치npm install puppeteer # 동적 크롤링 nest js 프로젝트 내 서비스 / 컨트롤러 생성하기nest generate service crawlnest generate controller crawl nest.js는 위의 명령어를 입력하여 controller와 service를 생성시킵니다. 아래와 같이 자동으로 폴더가 나뉘어지고, 자동으로 생성되느 문구가 와래와 같다면 " @Injectable " 이 명시되어있는지 확인해주세요. 크롤링 service단 async scrapeWithPuppeteer(url: string) { con..
TypeORM save() or insert() / update().save() 의 동작은 아래와 같다.아직 존재하지 않는 엔티티를 삽입→ INSERT, UPDATE엔티티가 존재하지 않는 경우, 기존 엔티티를 업데이트 시도→ SELECT 를 통해 객체에 정의된 PK를 사용하여 엔티티 존재여부 확인반면에 **.insert()**와 **.update()**는 주어진 엔티티(객체) 자체를 데이터베이스에 INSERT 한다. 즉 존재여부는 파악하지 않는다. 그렇기 때문에 .save()와 비교하면 연산 자체가 짧아진다. 또한 .save()와 .inset(), .update()는 반환값의 차이가 존재한다. save()의 경우await Auser = this.ARepository.save(user);return use..
크롤링 오류3 개의 사이트 (퀘이사존/뽐뿌/아카라이브)에 크롤링을 진행하여 사용자들이 올려주는 특가정보들을 한 페이지에 모아서 보여주는 것이 목표이기 때문에, node.js를 이용해 해당 크롤링을 진행했다. 개 중 아카라이브 사이트를 크롤링하던 도중 데이터를 가져오지 못하는 상황이 발생했다. 로직상 오류가 아닌것이, 테스트를 할 때마다 결과값이 달랐었다. async scrapArcaDeal(url: string) : Promise { // 브라우저 실행 const StealthPlugin = require('puppeteer-extra-plugin-stealth'); puppeteer.use(StealthPlugin()); ..