웅진씽크빅 [Next.js 프로젝트 캠프 2기]에서 진행한 기업 연계 프로젝트 입니다. IT 서비스의 발전에 따라 발생하는 보안 사고 문제에 대응하기 위해 고안 된 프로젝트 입니다. AI를 사용해 소프트웨어 코드의 보안 취약점을 분석하여 해결책을 제시 할 수 있으며, 해외 취약점 관련 기사를 번역하여 제공해 사용자에게 보안 트렌드에 관련된 정보를 제공 할 수 있습니다.
기여도 40% / 5명 (FE 5)전체 페이지의 퍼블리싱 및 기능의 40% 정도 구현
사이트 상단과 하단의 Header, Footer 컴포넌트 퍼블리싱 및 기능 개발
보안 사고 문제 기사들을 확인 할 수 있는 "취약점 DB" 페이지 퍼블리싱 및 기능 구현 100% 기여
구현 상세 내용
- cnnvd 사이트 https://www.cnnvd.org.cn/home/warn 의 취약점 게시글을
puppeteer라이브러리를 사용해 크롤링한 뒤에Llama3 AI를 사용해 번역한 후Firebase에 저장- 저장된 게시글 데이터를 한 페이지에 5개씩 보이도록 구현
- 페이지네이션 직접 구현
- 상단의 3개의 배너는 현재 게시물 중 가장 최신의 게시물 3개를 게시, 또한 마우스 포인터 위치에 따른 애니매이션 구현
HOT,NEW버튼을 누르면 게시글을 최신순, 조회수 순으로 내림 차순 정렬 되도록 구현- 게시글에 붙은 라벨은 조회수 상위 10개 게시물일 경우
HOT라벨, 48시간 내에 업데이트 된 게시물인 경우NEW라벨이 붙도록 구현- 게시글의 핀 아이콘을 누르면 마이 페이지의 스크랩 된 게시물에서 확인 가능
- 게시글의 공유 아이콘을 누르면 게시글 상세 페이지 링크를 공유 할 수 있음
- 검색창을 통해 게시글 제목을 필터링 하여 나열 할 수 있음
- 우측의 실시간 토픽은 가장 많이 검색된 검색어를 내림 차순으로 나열
- 비 로그인 상태일시 접근 할 수 없도록 예외 처리 구현
- 페이지 로딩시에 skeleton ui 직접 구현하여 로딩 상태 구현
구현 상세 내용
- 취약점 DB 페이지에서 게시글을 클릭하면 게시글의 제목, 게시 날짜, 라벨, 내용 등을 확인 할 수 있도록 구현
- 게시글 내용에 테이블이 존재 할 경우, 사용자가 데이터를 테이블 형식으로 볼 수 있도록 구현
- 핀 아이콘과 공유 아이콘을 통해 "취약점 DB" 페이지와 같이 스크랩, 공유 기능을 구현
- 하단의 비슷한 정보글은 같은 회사에 관련된 정보글을 가져오도록 구현
- 우측 하단의 버튼을 통해 게시들에 관련된 질의 응답이 가능 하도록 AI를 훈련하여 QnA 구현
- 페이지 로딩시에 skeleton ui 직접 구현하여 로딩 상태 구현
1️⃣ puppeteer 라이브러리의 click 메소드와 setTimeout 함수를 통해 크롤링 타겟 페이지 내의 원하는 정보 얻어오기 구현
원인:
해결
2️⃣ 크롤링 데이터 번역 과정을 통해 발생하는 막대한 로딩 시간 확인. 사용자 로딩 시간 단축을 목적으로 크롤링 데이터 업데이트 방식을 변경
원인:
해결:
3️⃣ 아티클 테이블 데이터를 firebase 형식에 어긋나지 않기 위해 객체 형식으로 저장
원인
string[][] type 으로 저장하려했음해결
string[][] type이 아닌 object[] type으로 저장 하는 것으로 결정object[] type으로 저장 가능const keyArray = ['column1','column2','column3','column4' ....]1️⃣ 팀에서 컨밴션을 확실하게 정하고 코드 리뷰를 통해 서로의 코드를 보완하며 진행 하니 좋은 결과물이 나온 것 같다
2️⃣ 짧은 기간 내에 완성해야 하므로 성능을 고려 하지 않고 기능 구현을 한 점이 아쉽다.
3️⃣ Next.js를 사용해 풀스택 개발을 진행해본 것이 새로운 경험이었다.
헬스장 내의 회원 및 트레이너들이 원만하게 PT와 맴버쉽을 사용할 수 있도록 해주는 프로젝트 입니다. 사용자는 회원, 트레이너, 관리자 3개의 권한 중에 하나를 부여 받아서 이용할 수 있습니다.
기여도 50% / 5명 (BE 3, FE 2)Zustand를 선택한 이유
redux 와 zustand 중에서 고민redux 보다 zustand를 사용하는 것이 프로젝트에 더 효율적이라고 판단zustand와 조합하기 위해서 react-query를 추가적으로 선택1️⃣ 계정 권한에 따라 Header에 다른 menuList가 표시 될 수 있도록 component 및 hook 재 설계
원인:
해결:
2️⃣ API 호출 횟수를 최소화 하여 성능 개선
원인:
해결:
인하대학교의 중앙 밴드 동아리인 ‘꼬망스’의 24학번 대상 홍보 및 지원 페이지 입니다. 이 웹 서비스를 통해 신입생분들이 꼬망스에 대한 자세한 정보를 쉽게 접할 수 있으며, 꼬망스에 지원까지 할 수 있는 페이지 입니다.
기여도 70% / 3명 (디자이너 1, FE 2)Tailwind CSS를 사용한 이유
CSS-in-js 형식의 라이브러리를 사용할 경우 위의 목적에서 조금 아쉬울 수 있을 것이라고 생각Tailwind CSS를 협업 프로젝트에서 사용해본 적이 없어 이번 기회에 Tailwind CSS의 까다로운 문법을 좀 더 익히고 단점과 장점을 파악해 보려함1️⃣ robots.txt 추가 및 index.html 수정을 통해 라이트 하우스 SEO 점수를 100점으로 개선
원인:
해결:
robots.txt 추가11px로 맞춤index.html에 <meta> 태그 및 <title> 추가를 통해 페이지 소개 문구를 작성2️⃣ 이미지 확장자 변환, 자바 스크립트 압축을 통한 성능 개선
원인:
해결:
gif → webp로 변환. 또한 이미지의 크기를 렌더링 되는 크기에 맞게 축소webpack.config.js의 설정을 통해 자바스크립트를 gzip 로 압축강아지 입양 희망자와 분양자(브리더)를 연결하는 서비스입니다. 이 서비스를 통해 신뢰성있는 분양과정을 진행할 수 있습니다.
기여도 50% / 5명 (디자이너 1, BE 1, FE 3)styled-component를 사용하기로 결정TailWind CSS 사용 의견도 있었으나, 사용해보지 않은 분이 계셨으며 최초에 프로젝트가 결성 될 때 빨리 완성을 하는 것을 목표로 하였기 때문에, 익숙해지는 데에 어려운 TailWindCSS를 사용하지 않도록 하였음redux과 zustand 중에서 어떤 것을 사용할지 고민하였음zustand에 비해 복잡하지만 좀 더 구조적이고 표준화된 redux를 사용하기로 함redux-toolkit을 사용하기로 함1️⃣ 분양희망자 주거환경 (등록/수정/삭제) 기능 구현을 set type 과 blob type을 사용하여 설계 및 구현
원인:
해결:
2️⃣ 이미지 업로드 시에 Resizer를 사용하여서 에러 방지 및 용량 축소
원인:
해결:
react-image-file-resizer 라이브러리를 사용하여 업로드될 이미지의 용량을 축소한 다음 백엔드로 전송하여 에러 해결. 이후에 업로드 된 이미지를 다시 클라이언트로 표시 할 때 성능 향상도 기대해 볼 수 있음3️⃣ 견종 자동 검색 컴포넌트 제작 및 공통 컴포넌트로 리팩토링
원인:
해결:
setTimeout 과 Array.filter , react-hook-form 라이브러리를 사용해서 검색어가 변경 되면 0.2초 후에 검색어와 일치하는 견종 목록을 반환 하는 방식으로 자동 검색 기능을 구현4️⃣ 사용자 프로필 이미지가 Header 에 제대로 반영 되도록 redux와 localstorage를 사용해 재 설계 및 구현
원인:
-해결:
1️⃣ 폴더 구조에 대한 논의 없이 프로젝트를 시작했기 때문에 폴더 구조가 뒤죽박죽인 상태로 완성이 된 점이 매우 아쉽다.
2️⃣ 폴더 구조 뿐만 아니라 코드 컨밴션 이나 공통 컴포넌트 사용 등에 관해서도 깊게 이야기 하지 않은 것이 아쉽다.
3️⃣ 나 혼자서 해결 하는 것보다 때로는 팀원들과 소통 하는 게 더 빠른 문제 해결이 될 수도 있는다는 것을 깨달았다.
4️⃣ styled-component가 아닌 TailWindCSS를 사용해서 프로젝트를 만들어보고 싶어졌다.