{"id":20449376,"url":"https://github.com/codestates-seb/seb43_main_008","last_synced_at":"2025-07-29T06:32:46.622Z","repository":{"id":158738079,"uuid":"633650325","full_name":"codestates-seb/seb43_main_008","owner":"codestates-seb","description":null,"archived":false,"fork":false,"pushed_at":"2023-08-06T09:18:02.000Z","size":6517,"stargazers_count":7,"open_issues_count":1,"forks_count":4,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-04-13T01:47:12.466Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://ssdss.vercel.app/","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/codestates-seb.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2023-04-28T01:27:40.000Z","updated_at":"2023-08-24T14:05:14.000Z","dependencies_parsed_at":null,"dependency_job_id":"f158c0a0-e8e0-4355-8478-5e78f8d506f8","html_url":"https://github.com/codestates-seb/seb43_main_008","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/codestates-seb/seb43_main_008","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/codestates-seb%2Fseb43_main_008","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/codestates-seb%2Fseb43_main_008/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/codestates-seb%2Fseb43_main_008/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/codestates-seb%2Fseb43_main_008/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/codestates-seb","download_url":"https://codeload.github.com/codestates-seb/seb43_main_008/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/codestates-seb%2Fseb43_main_008/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":267639569,"owners_count":24119780,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-07-29T02:00:12.549Z","response_time":2574,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-15T10:40:35.906Z","updated_at":"2025-07-29T06:32:46.602Z","avatar_url":"https://github.com/codestates-seb.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n  \u003ch1\u003e🌿쓰고 쓰고 또 쓰자 (쓰쓰또쓰)\u003c/h1\u003e\n\u003c/div\u003e\n\n\u003cdiv align=\"center\"\u003e\n  \u003ch3\u003e쓰쓰또쓰와 함께 플라스틱을 재활용하고 기록해봐요.\u003c/h3\u003e\n  \u003cimg src=\"https://raw.githubusercontent.com/codestates-seb/seb43_main_008/main/client/public/images/qrCode.png\" width=\"200px\" height=\"200px\"\u003e\n\u003c/div\u003e\n\n\u003cbr/\u003e\n\n사용자가 물건이 “쉽게 버릴 수 있는 물건”이 아닌 “끝까지 제 쓸모를 다한 물건”이 될 수 있도록 도와줍니다.\n함께 하며 서로가 서로의 원동력이 되도록 환경을 조성합니다.\n저희 팀은 개인의 작은 실천과 동참으로 조금 더 깨끗한 세상을 만들 수 있다고 믿습니다.\n\n-   쓰쓰또쓰는 사용자가 플라스틱 재사용 회차별 사진과 함께 글을 지속적으로 기록하는 일지 제공 서비스입니다.\n-   재사용한 플라스틱의 졸업을 위해, 투표 기능을 제공합니다.\n-   투표 결과에 따라 배지와 메달 보상으로 성취감을 느낄 수 있도록 만들었습니다.\n\n\u003cbr/\u003e\n\n## 팀 소개\n\n### Front-end\n\n|                                  \u003cimg src=\"https://cdn.discordapp.com/attachments/1101112392659767369/1113236228351991869/421b971f5aaff0b5.png\" width=\"200px\" height=\"200px\"\u003e                                   |                           \u003cimg src=\"https://cdn.discordapp.com/attachments/1101112392659767369/1113236380366159994/a2125abea89bbbe1.png\" width=\"200px\" height=\"200px\"\u003e                            |                 \u003cimg src=\"https://cdn.discordapp.com/attachments/1101112392659767369/1113237188902125608/32b8a4bccba3ad5f.png\" width=\"200px\" height=\"200px\"\u003e                  |\n| :-----------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------: |\n|                                         [천지인(LEAD)\u003cbr/\u003e(@jiin9999)](https://github.com/jiin9999)                                         |                                     [오아름\u003cbr/\u003e(@Aroma-oh)](https://github.com/Aroma-oh)                                     |                         [정순현\u003cbr/\u003e(@jungsoonhyun)](https://github.com/jungsoonhyun)                         |\n| \u003cp align=\"left\"\u003e- 로그인 페이지\u003cbr/\u003e - 회원가입 페이지\u003cbr/\u003e - 회원 정보 수정 페이지\u003cbr/\u003e - 회원가입 축하 페이지\u003cbr/\u003e - 투표 완료 페이지\u003c/p\u003e | \u003cp align=\"left\"\u003e- 북마크 페이지\u003cbr/\u003e - 시리즈 상세 페이지\u003c/br\u003e - 팔로우 페이지\u003c/br\u003e - 메인 페이지\u003c/br\u003e - 마이 페이지\u003c/br\u003e\u003c/p\u003e | \u003cp align=\"left\"\u003e- 뱃지 페이지\u003cbr/\u003e - 시리즈 작성페이지\u003cbr/\u003e - 일지 작성 페이지\u003c/br\u003e- 일지 상세페이지\u003c/br\u003e\u003c/p\u003e |\n\n### Back-end\n\n| \u003cimg src=\"https://cdn.discordapp.com/attachments/1101112392659767369/1113236311986405406/0bf74084411d2309.png\" width=\"200px\" height=\"200px\"\u003e | \u003cimg src=\"https://cdn.discordapp.com/attachments/1101112392659767369/1113236110362034196/f9ec1fb7f9a35b2f.png\" width=\"200px\" height=\"200px\"\u003e | \u003cimg src=\"https://cdn.discordapp.com/attachments/1101112392659767369/1113236995800576120/aee0cf8f08b07ff1.png\" width=\"200px\" height=\"200px\"\u003e |\n| :---------------------------------------------------------------------: | :--------------------------------------------------------------------------: | :-----------------------------------------------------------------------------: |\n|        [진하늘(LEAD)\u003cbr/\u003e(@mewluee)](https://github.com/mewluee)        |        [김대현\u003cbr/\u003e(@NewfileDOTpy)](https://github.com/NewfileDOTpy)         |       [안윤아\u003cbr/\u003e(@digital-hamster)](https://github.com/digital-hamster)       |\n|               \u003cp align=\"left\"\u003e- 회원 도메인 CRUD\u003c/br\u003e - 팔로우 도메인 CRUD\u003c/br\u003e - OAuth2 로그인\u003c/br\u003e - Spring Security + JWT\u003c/br\u003e - 보안 \u003c/p\u003e               |                 \u003cp align=\"left\"\u003e- 시리즈 도메인 CRUD\u003c/br\u003e - 코멘트 도메인 CRUD\u003c/br\u003e - 데이로그 도메인 CRUD\u003c/br\u003e - CD/CI\u003c/br\u003e - 이미지 파일 처리\u003c/br\u003e - 이미지 파일 처리\u003c/p\u003e       |                   \u003cp align=\"left\"\u003e- 뱃지 도메인 CRUD\u003c/br\u003e - 북마크 도메인 CRUD\u003c/br\u003e - 투표 도메인 CRUD\u003c/br\u003e - Database Administrator\u003c/br\u003e - NginX \u003c/p\u003e                   |\n\n## 시스템 아키텍처\n![시스템아키텍쳐](https://github.com/codestates-seb/seb43_main_008/assets/119935602/ef5d1ff8-6c06-44ee-a0f5-947361afff48)\n\n\n## ERD\n\u003cimg width=\"1085\" alt=\"ERD\" src=\"https://github.com/codestates-seb/seb43_main_008/assets/119935602/149d42f7-fa6b-475f-bacf-8adbc707e77d\"\u003e\n\n\n## FE 기술 스택\n\n-   Next.js\n    -   SSR을 이용해 SEO(검색엔진 최적화)를 향상시켰습니다.\n-   React\n    -   컴포넌트 재사용과 상태에 따른 불필요한 리렌더링을 고려하며 구현하였습니다.\n-   TypeScript\n    -   동적 언어인 JS의 안정성을 보장하고, 원활한 협업을 위해 사용했습니다.\n-   PWA\n    -   PWA를 이용해 데스크탑, 안드로이드, IOS에서 다운로드하여 앱으로 사용할 수 있도록 구현하였고, 반응형 UI로 크로스 플랫폼을 지원할 수 있도록 했습니다.\n    -   웹 푸시를 활용해 사용자가 네이티브 앱을 사용하는 것처럼 느낄 수 있도록 구현하였습니다.\n-   ESLint \u0026 Prettier\n    -   협업을 위해 코드 포매팅 기능에 ESLint를, 코드 스타일링에 Prettier를 적용했습니다.\n-   Deploy\n    -   Vercel을 이용해 https 배포했습니다.\n    -   Github Action으로 CI/CD를 도입했습니다.\n\n\u003cbr/\u003e\n\n## BE 기술 스택\n\n-   Spring boot\n    -   Java 기반의 웹 애플리케이션을 개발하기 위해 spring 프레임워크를 사용했습니다.\n-   Spring Security\n    -   사용자 인증과 권한 부여 그리고 보안 구성을 위해 사용했습니다.\n-   MySQL\n    -   사용자의 데이터를 담을 수 있는 데이터베이스 서버를 만들어 MySQL로 구현했습니다.\n-   Postman\n    -   REST API의 테스트를 위해 이용했습니다.\n-   Linux\n    -   원격 서버 가동을 위해 사용했습니다.\n-   Gradle\n    -   외부 라이브러리 및 프레임워크를 쉽게 적용하여 프로젝트를 빌드하기 위해 사용했습니다.\n-   JPA\n    -   DB를 로직 안에서 구현하기 위해 RDS를 이용하여 JPA로 구현했습니다.\n-   Oauth2\n    -   oauth2를 사용하여 사용자가 편리하게 회원가입과 로그인을 하도록 지원했습니다.\n-   AWS Web Service\n    -   EC2, CodeDeploy, S3 Bucket, RDS 를 통해 어플의 배포 및 관리를 하였습니다. 또한 IAM을 통해 협업 할 수 있었습니다.\n-   JWT\n    -   보안을 위해 사용자의 권한 정보를 담은 JWT를 발급해 리소스 접근에 제한을 두었습니다.\n-   Github Action\n    -   깃허브 의존성이 높고, 비용적 한계가 있는 프로젝트의 상황을 고려하여 CD/CI를 선정하였으며 Gighub push / merger 를 통해 간편하게 배포된 어플리케이션을 유지/ 보수 할 수 있도록 했습니다.\n-   S3 imageBucket\n    -   DB에 이미지 저장 시 가해지는 용량 및 부하를 줄이기 위하여 큰 스토리지용량을 지원하는 S3 imageBucket 사용했습니다.\n\n\n\u003cbr/\u003e\n\n## 개발시 주안점\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003e천지인\u003c/b\u003e\u003c/summary\u003e\u003cbr/\u003e\n  \n- 프로젝트 초기 세팅: Next13의 실험적 기능인 app 디렉토리 폴더 구조를 이용해 프로젝트를 구축하였습니다.\n- PWA: PC보다는 모바일에 집중한 사이트의 특성을 고려해 홈 화면에 추가하여 사용자가 네이티브 앱처럼 사용할 수 있도록 했습니다.\n- 회원가입: React-hook-form을 사용해 컴포넌트 리렌더링 최적화를 진행했습니다.\n- 회원정보 수정: 사용자가 프로필 이미지를 등록하면 미리보기가 렌더되고, 서버에 바로 저장될 수 있도록 구현하였습니다.\n  \n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003e오아름\u003c/b\u003e\u003c/summary\u003e\u003cbr/\u003e\n\n  \n- 메인 페이지\n  \n ![](https://velog.velcdn.com/images/on002way/post/9b0073bf-e650-48de-8b53-4b709e4a542d/image.gif) \n  \n ✅ 비회원도 조회가 가능한 유일한 페이지! 메인 페이지는 모두가 조회가 가능한 유일한 페이지입니다. \n  따라서 개별 시리즈는 새로운 사용자의 궁금증을 유도하여 회원가입으로 연결하는 역할을 해야합니다.\n  이를 위해 시리즈의 사진 영역을 넓게 잡아 시각적인 이목을 끌고자 했으며, “n번 사용”정보를 노출하였습니다. \n  (비닐봉지를 30번 사용한 시리즈라면 궁금하지 않을까요? 👀) \n  \n✅ 사용자의 빠른 탐색을 위해 무한 스크롤을 적용했습니다.\n많은 이미지 로딩이 필요한 메인페이지는 최초 렌더가 느리다는 단점이 있습니다. \n  이를 해결하기 위해 api 요청 1회당 12개의 데이터만 불러오는 무한 스크롤을 적용하였습니다.\n\n- 시리즈 상세 페이지\n  \n![](https://velog.velcdn.com/images/on002way/post/3047f626-a0f2-4efa-bef2-cc6a7c47ae12/image.gif)\n  \n✅ 기능별로 컴포넌트를 분할했습니다. \n시리즈 상세페이지는 다양한 기능(데이로그 조회, 북마크, 투표, 댓글)이 들어가는 페이지입니다. 각 기능은 개별 api가 존재하기 때문에 불필요한 리렌더링 방지를 위해 컴포넌트를 분할 했습니다. \n  \n✅ 사용자의 빠른 탐색을 위해 무한 스크롤을 적용했습니다.\n데이로그도 많은 이미지 로딩이 필요한 페이지입니다. 따라서 무한 스크롤을 통해 단위 별로 데이터를 호출하여 빠른 로딩을 주고자 했습니다. \n\n- 마이 페이지\n  \n![](https://velog.velcdn.com/images/on002way/post/ecfbc362-e5f0-44f8-b079-8b0f92a8d97d/image.gif)\n  \n✅ 조건으로 UI를 구분하여 컴포넌트를 재사용했습니다. \n마이페이지는 \"자신\"의 페이지 접속의 경우와 \"타인\"의 페이지 접속의 경우 UI가 구분됩니다. UI의 글씨 혹은 연결 링크만 변경되기 때문에, 페이지를 나눠 중복 코드를 작성하기 보다는 조건문을 주어 다른 UI가 렌더되도록 하였습니다. \n  \n✅ 다양한 시리즈 상태의 구분이 필요했습니다.\n시리즈는 투표 결과에 따라 메달을 부여받을 수도, 재사용을 해야할 수도 있습니다. 이러한 상태가 피드의 UI상으로 구분되어 사용자가 즉각적으로 확인할 수 있도록 구현했습니다. \n\n  \n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003e정순현\u003c/b\u003e\u003c/summary\u003e\u003cbr/\u003e\n  \n- 로그인 페이지\n  - 이런 이유로 이런 이런 기술을 적용해서 이렇게 만들어 보았습니다.\n- 회원가입 페이지\n  - 이런 이유로 이런 이런 기술을 적용해서 이렇게 만들어 보았습니다.\n- 회원 정보 수정 페이지\n  - 이런 이유로 이런 이런 기술을 적용해서 이렇게 만들어 보았습니다.\n  \n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003e진하늘\u003c/b\u003e\u003c/summary\u003e\u003cbr/\u003e\n  \n- 로그인 페이지\n  - 이런 이유로 이런 이런 기술을 적용해서 이렇게 만들어 보았습니다.\n- 회원가입 페이지\n  - 이런 이유로 이런 이런 기술을 적용해서 이렇게 만들어 보았습니다.\n- 회원 정보 수정 페이지\n  - 이런 이유로 이런 이런 기술을 적용해서 이렇게 만들어 보았습니다.\n  \n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003e김대현\u003c/b\u003e\u003c/summary\u003e\u003cbr/\u003e\n  \n- 로그인 페이지\n  - 이런 이유로 이런 이런 기술을 적용해서 이렇게 만들어 보았습니다.\n- 회원가입 페이지\n  - 이런 이유로 이런 이런 기술을 적용해서 이렇게 만들어 보았습니다.\n- 회원 정보 수정 페이지\n  - 이런 이유로 이런 이런 기술을 적용해서 이렇게 만들어 보았습니다.\n  \n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003e안윤아\u003c/b\u003e\u003c/summary\u003e\u003cbr/\u003e\n  \n- 로그인 페이지\n  - 이런 이유로 이런 이런 기술을 적용해서 이렇게 만들어 보았습니다.\n- 회원가입 페이지\n  - 이런 이유로 이런 이런 기술을 적용해서 이렇게 만들어 보았습니다.\n- 회원 정보 수정 페이지\n  - 이런 이유로 이런 이런 기술을 적용해서 이렇게 만들어 보았습니다.\n  \n\u003c/details\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcodestates-seb%2Fseb43_main_008","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcodestates-seb%2Fseb43_main_008","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcodestates-seb%2Fseb43_main_008/lists"}