김영명 | 김희빈 | 박세연(PO) | 신재윤 | 홍혁준(SM) | 조셉 | 김훈기 |
---|---|---|---|---|---|---|
DEVELOPER | DEVELOPER | DEVELOPER | DEVELOPER | DEVELOPER | 멘토 | 서브멘토 |
ymkim97 | kmebin | parksey | DevUni | HongDosan | joseph-100 | HunkiKim |
웹툰 서비스
네이버 웹툰을 클론 코딩한 프로젝트 입니다.
저희 조셉팀에서는 멀티모듈을 기반으로 프로젝트를 설계해봤습니다.
도메인은 크게 회원, 결제, 웹툰으로 구성됩니다.
다양한 기능 구현에 초점을 두었다기 보다는
다양한 기술에 도전해보는 것과, 지속적인 리팩토링을 통한 코드 개선에 집중했습니다.
├── 회원
│ ├── 일반(JToon) 로그인
│ ├── 일반(JToon) 회원가입
│ ├── SMTP 기반 이메일 인증
│ └── OAuth 2.0 로그인 및 회원가입
│
├── 결제
│ ├── Portone-Iamport 기반 결제 승인 검증 및 생성
│ ├── Portone-Iamport 기반 결제 취소
│ └── 결제 내역 조회
│
├── 웹툰
│ ├── 웹툰 생성 (작가 권한 필요)
│ ├── 회차 생성
│ ├── s3 이미지 업로드
│ ├── s3 이미지 삭제
│ ├── 웹툰 리스트 조회
│ ├── 웹툰 정보 조회
│ ├── 회차 리스트 조회
│ ├── 회차 정보 조회
│ └── 회차 구매
![image](https://private-user-images.githubusercontent.com/87688023/270543163-c395838c-bee5-4d51-9b64-256b53c2da3d.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjIyNDE5MzksIm5iZiI6MTcyMjI0MTYzOSwicGF0aCI6Ii84NzY4ODAyMy8yNzA1NDMxNjMtYzM5NTgzOGMtYmVlNS00ZDUxLTliNjQtMjU2YjUzYzJkYTNkLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA3MjklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNzI5VDA4MjcxOVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTczOGU5ODFlZDExMzc4M2VjZjU5NzliYjFhYzE4YjRkMDljODcwZjI0NTU4YjM5Y2ZkZjRmMzIzNTBmZGI5MDgmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.3uKtb-KXbUTm7B-RjTzmNtW5otWmIawsdsMaPafeTc8)
![image](https://private-user-images.githubusercontent.com/87688023/270543232-e0804bec-2802-437d-ad32-0fcc1e439143.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjIyNDE5MzksIm5iZiI6MTcyMjI0MTYzOSwicGF0aCI6Ii84NzY4ODAyMy8yNzA1NDMyMzItZTA4MDRiZWMtMjgwMi00MzdkLWFkMzItMGZjYzFlNDM5MTQzLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA3MjklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNzI5VDA4MjcxOVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWZlM2MxYTk0ZDYwZWM2ZjAxNDY3NDFlNTU1NTdhZTQ3YTJiMTc0MGJhNjliMzVjZjVkMzQ5NDhiZDEzMjk3MjEmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.SEa7gBoY1QY9eOsRcbK4aOJ0tI2CyNKUNahT9AgNU3g)
![image](https://private-user-images.githubusercontent.com/87688023/270570948-ab3963af-5a7b-40bb-9956-417be44d070b.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjIyNDE5MzksIm5iZiI6MTcyMjI0MTYzOSwicGF0aCI6Ii84NzY4ODAyMy8yNzA1NzA5NDgtYWIzOTYzYWYtNWE3Yi00MGJiLTk5NTYtNDE3YmU0NGQwNzBiLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA3MjklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNzI5VDA4MjcxOVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWFkYzI5ZTk0ZjQzMDcwNzA0MmQwNGNjY2IzZTg0YzFkY2YzNWI5OGJmZDU1MDgxZmQ5YjJjMDNkNzI5ODc3OGImWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.zYfEpKtEuBPfTZM33pNrxR1bX66c27JFVQS1TN8jesU)
![image](https://private-user-images.githubusercontent.com/87688023/270563864-4a138a68-e18d-43f5-bbd8-bdf95ffadc16.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjIyNDE5MzksIm5iZiI6MTcyMjI0MTYzOSwicGF0aCI6Ii84NzY4ODAyMy8yNzA1NjM4NjQtNGExMzhhNjgtZTE4ZC00M2Y1LWJiZDgtYmRmOTVmZmFkYzE2LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA3MjklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNzI5VDA4MjcxOVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWM1NDRiMDg4YTRkN2U4MjQ0NTQwNTY4YWI0NjQwNGU3YTlhYzU5NzQ0YjRmZWE0YWIxNWQyNTA1MGFkMTE2OTcmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.8fuhikjJaLxcAAJQxnymkrktnXoDCQBA9UnauyULdJE)
![image](https://private-user-images.githubusercontent.com/87688023/270548561-03d55a3e-9cdd-471a-b0e4-f6c1c915f97c.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjIyNDE5MzksIm5iZiI6MTcyMjI0MTYzOSwicGF0aCI6Ii84NzY4ODAyMy8yNzA1NDg1NjEtMDNkNTVhM2UtOWNkZC00NzFhLWIwZTQtZjZjMWM5MTVmOTdjLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA3MjklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNzI5VDA4MjcxOVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWI2ZDY5YTFiNjYzN2UzNzg3YTRiNmJiZDczMjBkZmRhZDE4NDNjOTIxZTg5ZDYzMDFmMTBlOTcwNmVmZjE1NGEmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.t2OKsHtOR7j2j8dJGIbKa_SUQTUDSHwJOHyqdtvhgak)
해당 구조는 우아한 기술 블로그에서 권용근님의 멀티 모듈 설계 이야기를 참고 하였습니다.
├─ ...
├─ module-application
│ └── app-api
│ └── src.main.java.shop.jtoon
│ ├── global
│ ├── member
│ ├── payment
│ ├── security
│ └── webtoon
│
├── module-core
│ └── src.main.java.shop.jtoon
│ ├── util
│ ├── type
│ └── exception
│
├── module-domain
│ ├── domain-member
│ ├── domain-payment
│ ├── domain-webtoon
│ ├── domain-jpa
│ └── domain-redis
│
├── module-internal
│ └── core-web
│ ├── security
│ ├── annotation
│ ├── config
│ └── error
│ ├── iamport-client
│ ├── s3-client
│ └── smtp-client
│
└── settings.gradle
![image](https://private-user-images.githubusercontent.com/87688023/270553816-8ae19f50-9484-49bb-84a8-7097c065fe87.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjIyNDE5MzksIm5iZiI6MTcyMjI0MTYzOSwicGF0aCI6Ii84NzY4ODAyMy8yNzA1NTM4MTYtOGFlMTlmNTAtOTQ4NC00OWJiLTg0YTgtNzA5N2MwNjVmZTg3LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA3MjklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNzI5VDA4MjcxOVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTZjNzJjMjQzMThkY2NiY2Y1MjMzZTQxNGYxYWY3YjdkMDBiNDY5YzMwOGRmMzY1MjVmYjM2ZTc5MDk0ZWJiODUmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.koinsiGUBKLuslqR-lxIutycEvxGlnWt3n6KGctX6TI)
![image](https://private-user-images.githubusercontent.com/87688023/270572055-db950edb-df7a-455f-9980-d95ded1d5b4e.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjIyNDE5MzksIm5iZiI6MTcyMjI0MTYzOSwicGF0aCI6Ii84NzY4ODAyMy8yNzA1NzIwNTUtZGI5NTBlZGItZGY3YS00NTVmLTk5ODAtZDk1ZGVkMWQ1YjRlLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA3MjklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNzI5VDA4MjcxOVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTY3N2Y5ZTFkYzlmMTFmNDZhNmU4NDFmMDYyMzZhNDUzNWRkZmNjNzI3ZDkzYmExZDJlNTUyNTdkZGI3MzliYTkmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.jVGUEwSsHuTWJysWHAnPLLbrFGQbWc0q-OR5k7Hr_XI)