Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

부산대 BE 진서현 5주차 3단계 #370

Open
wants to merge 56 commits into
base: jinseohyun1228
Choose a base branch
from
Open
Changes from all commits
Commits
Show all changes
56 commits
Select commit Hold shift + click to select a range
0fb14c2
git: 이전 코드 가져오기
jinseohyun1228 Jul 22, 2024
6d78068
feat: 카카오 Oauth로그인에 사용되는 변수 프로퍼티 설정
jinseohyun1228 Jul 22, 2024
f528cb7
feat: 카카오 Oauth로그인에 사용되는 변수 프로퍼티 설정
jinseohyun1228 Jul 22, 2024
870515f
Merge branch 'step0' of https://github.com/jinseohyun1228/spring-gift…
jinseohyun1228 Jul 22, 2024
598a2ac
feat: 카카오 Oauth로그인에 사용되는 변수 프로퍼티 설정
jinseohyun1228 Jul 22, 2024
0b76705
feat(KakaoTokenResponse) : 카카오 엑세스 토큰 응답 객체 생성
jinseohyun1228 Jul 22, 2024
bb706b2
feat: 카카오 유저정보 응답 객체 생성
jinseohyun1228 Jul 22, 2024
aeed0d3
feat(KakaoController): 카카오 로그인 로직 컨트롤러 생성
jinseohyun1228 Jul 22, 2024
4f36dec
feat: 카카오 로그인 로직 서비스단 구현
jinseohyun1228 Jul 22, 2024
faf470a
feat(UserJoinRequest) : 카카오 유저 정보를 입력받아 생성하는 생성자 추가
jinseohyun1228 Jul 22, 2024
67847ec
style: 코드 컨벤션
jinseohyun1228 Jul 22, 2024
2b57e7c
style: 코드 컨벤션
jinseohyun1228 Jul 22, 2024
f255790
Merge branch 'jinseohyun1228' into step0
jinseohyun1228 Jul 22, 2024
0efab09
fix: 카카오 로그인시에도 헤더에 jwt 담아서 요청
jinseohyun1228 Jul 22, 2024
a4b5fb7
git: 충돌 해결
jinseohyun1228 Jul 22, 2024
91cba30
refactor(KakaoProperties): 레코드로 변경, grantType 설정값에서 가져오기, @@JsonNamin…
jinseohyun1228 Jul 23, 2024
0ae8817
test(KakaoPropertiesTest) : 카카오 프로퍼티 정상 빈 등록되었는지 검사
jinseohyun1228 Jul 23, 2024
2b6ac31
--point : 혹시라도 컨트롤러 메서드 분리 안되면 여기로 와야함--
jinseohyun1228 Jul 23, 2024
d04a38c
refactor: KakaoProfile를 UserRequest처럼 다룰 수 있도록 변경
jinseohyun1228 Jul 23, 2024
f2817a6
refactor(KakaoController) : 코드-토큰-정보조회-가입-jwt이 한 메서드에 있던 것을 일단 가입과 jw…
jinseohyun1228 Jul 23, 2024
9c5b171
refactor(UserService) : 카카오 로그인 과정 변경
jinseohyun1228 Jul 23, 2024
68d2672
error : 카카오 컨트롤러 메서드 분리 문제
jinseohyun1228 Jul 23, 2024
f98e3ba
study : 왜여기서 한지 모르겠지만 영속성 컨텍스트에 대한 테스트
jinseohyun1228 Jul 24, 2024
2665daf
refactor: 카카오 인증 컨트롤러와 서비스단 구현
jinseohyun1228 Jul 24, 2024
f1796a9
fix : 카카오프로필에는 패스워드 값을 넣기 힘들어 중간 dto KakaoUser 추가
jinseohyun1228 Jul 24, 2024
5021243
fix : 설정값에 (")제거
jinseohyun1228 Jul 24, 2024
1f092bb
chore : 생성자 순서변경
jinseohyun1228 Jul 24, 2024
7eb8c71
study : 여기서 왜 한건지 모르겠는 영속성 컨텍스트 테스트
jinseohyun1228 Jul 24, 2024
c2d378d
step0을 제외한 다른 브랜치에서는 이전 커밋들이 자꾸 살아나서 다시 step0으로 돌아옴
jinseohyun1228 Jul 24, 2024
5dd57c4
git : PR과 충돌 해결
jinseohyun1228 Jul 24, 2024
276aabe
fix : 주문시 옵션 수량 차감
jinseohyun1228 Jul 24, 2024
1d1828a
refactor : 카카오유저dto를 삭제하고 핸들러를 사용함
jinseohyun1228 Jul 25, 2024
8e5c2f8
refactor : 카카오유저dto를 삭제하고 핸들러를 사용함
jinseohyun1228 Jul 25, 2024
ee11f4f
refactor : 요청으로 받는 프로퍼티, 카카오 프로필 내부 레코드로 둬 리팩토링 진행
jinseohyun1228 Jul 25, 2024
aa2e3ee
refactor : 응답에 쓰이는 탬플릿 레코드의 링크를 내부 레코드로 변경해 리팩토링
jinseohyun1228 Jul 25, 2024
363edd1
refactor : 카카오톡 메시지 보내기 부분에 필요한 탬플릿을 팩토리 패턴 이용
jinseohyun1228 Jul 25, 2024
cecffb8
refactor : 팩토리 패턴도 싫다!! 도메인에 로직을 담자! KakaoProfile에 user를 변경하는 로직 추가
jinseohyun1228 Jul 25, 2024
531926f
fix(CategoryService) : 카테고리 저장에 save 호출이 안되는 부분 해결
jinseohyun1228 Jul 25, 2024
6ccfcc6
refactor : 직접 문자열 선언해서 사용하지 않고, 상수문자열이나 프로퍼티로 이용할 수 있게 변경
jinseohyun1228 Jul 25, 2024
34a4a5d
style : 코드컨벤션 안맞는 부분 수정
jinseohyun1228 Jul 25, 2024
9db24f8
remove : 안쓰는 객체들 제거
jinseohyun1228 Jul 25, 2024
df26f71
remove : 안쓰는 객체들 제거로 인한 import문 삭제
jinseohyun1228 Jul 25, 2024
f320a39
refactor(UserService): 유저 로그인 서비스 메서드 내에서 직접 카카로 프로필을 유저로 변환
jinseohyun1228 Jul 25, 2024
1c336ec
refactor: Token -> ApiToken 으로 정확한 클래스명 부여
jinseohyun1228 Jul 25, 2024
e00e054
refactor: 카카오 로그인 중 ApiToken 저장 로직 유저서비스의 로그인로직 내로 이동
jinseohyun1228 Jul 25, 2024
2128717
refactor: 카카오토큰 갱신 호출 주체를 동일 클래스 내 메서드에서 카카오 컨트롤러 메서드로 변경
jinseohyun1228 Jul 25, 2024
9401d5e
refactor: 유저 정보 url 변경
jinseohyun1228 Jul 25, 2024
16a17b9
feat : productRequest, optionListRequest를 이용한 ProductAllRequest 생성자 추가
jinseohyun1228 Jul 25, 2024
e8f724d
remove : Token -> ApiToken 이름 변경으로 인해 기존 레파지토리 삭제
jinseohyun1228 Jul 25, 2024
1e0335f
style : 코드 컨벤션
jinseohyun1228 Jul 25, 2024
a372432
refactor : 엑세스 토큰 요청 시점의 시간을 활용해 토큰 엔티티에 만료시간추가 후, 만료가 되었을때만 요청
jinseohyun1228 Jul 26, 2024
c0d7dd9
refactor : 로그인 화면에 로그인 성공시 전송 문자열 추가
jinseohyun1228 Jul 26, 2024
8e3752f
refactor : 토큰 갱신 로직을 카카오 서비스에서 토큰 서비스로 이동
jinseohyun1228 Jul 26, 2024
b9633b7
fif : 만료시각이 현재시각보다 이전일때 갱신이되는 로직 수정
jinseohyun1228 Jul 26, 2024
4ef921d
docs: 기능 문서 추가
jinseohyun1228 Jul 28, 2024
2ad1f87
Merge branch 'jinseohyun1228' into step0
jinseohyun1228 Jul 28, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
118 changes: 79 additions & 39 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,41 +1,81 @@
# spring-gift-order

# 기능 요구 사항
카카오톡 메시지 API를 사용하여 주문하기 기능을 구현한다.

- 주문할 때 수령인에게 보낼 메시지를 작성할 수 있다.
- 상품 옵션과 해당 수량을 선택하여 주문하면 해당 상품 옵션의 수량이 차감된다.
- 해당 상품이 위시 리스트에 있는 경우 위시 리스트에서 삭제한다.
- 나에게 보내기를 읽고 주문 내역을 카카오톡 메시지로 전송한다.
- 메시지는 메시지 템플릿의 기본 템플릿이나 사용자 정의 템플릿을 사용하여 자유롭게 작성한다.


아래 예시와 같이 HTTP 메시지를 주고받도록 구현한다.

### Request
```
POST /api/orders HTTP/1.1
Authorization: Bearer {token}
Content-Type: application/json

{
"optionId": 1,
"quantity": 2,
"message": "Please handle this order with care."
}

```
### Response
```
HTTP/1.1 201 Created
Content-Type: application/json

{
"id": 1,
"optionId": 1,
"quantity": 2,
"orderDateTime": "2024-07-21T10:00:00",
"message": "Please handle this order with care."
}

```

쓰고 나니 부족한 부분이 보여 기능추가를 해야겠다.

## API 문서

* 모든 URL 형식은 `http://localhost:8080/spring-gift` 로시작합니다.
* spring-gift 가 제공하는 기능은 회원가입, 제품, 카테코리, 옵션 CRUD와 위시리스트만들기, 주문기능이 있습니다.

### 유저 관련 API
| 제목 | 메서드/URL 엔드포인트 | 요청 컨텐트 타입 / 요청 객체 | 응답객체 | 설명 |
|--------------|-----------------------|-----------------------------------------------------------|---------------------------------------------------------------------------------------------------|----------------------------------------|
| 회원가입 API | POST /members/join | Content-Type: application/json<br>Body: UserJoinRequest | header: {"Authorization": "Bearer {token}" } Body: { "redirectUrl": "/spring-gift"} | |
| 로그인 API | POST /members/login | Content-Type: application/json<br>Body: UserLoginRequest | header: {"Authorization": "Bearer {token}" } Body: { "redirectUrl": "/spring-gift"} | |

### 카카오 로그인 API
| 제목 | 메서드/URL 엔드포인트 | 요청 컨텐트 타입 / 요청 객체 | 응답객체 | 설명 |
|--------------------------|-------------------------------|------------------------------|------------------------------------------------|------|
| 카카오 로그인 화면 요청 | GET /kakao/login | - | Redirect to Kakao Login URL | 클라이언트가 이 URL로 요청하면 카카오 로그인 화면으로 리다이렉트됩니다. 응답이 다른 URL (`/kakao/login/callback`)로 전달됩니다. |
| 카카오 로그인 및 토큰 처리 | GET /kakao/login/callback | Query Parameters: code | Status: 201 Created<br>Body: "successfully LoggedIn" | 카카오 서버에서 리다이렉트된 코드를 사용하여 사용자를 로그인 처리하고 JWT 토큰을 반환합니다. |

* 프론트에서 토큰 처리 메서드로 요청하실 필요는 없습니다. 다만 응답을 callback에서 받습니다.


### 제품 등록,수정,삭제 API
| 제목 | 메서드/URL 엔드포인트 | 요청 컨텐트 타입 / 요청 객체 | 응답객체 | 설명 |
|------------------|-------------------------|---------------------------------------------------------------------------|-----------------------------------|------|
| 제품 등록 | POST /admin/product | Content-Type: application/json<br>Body: ProductAllRequest | Status: 200<br>Body: "Product added successfully" | |
| 제품 정보 업데이트 | PUT /admin/product/{id} | Content-Type: application/json<br>Body: ProductRequest | Status: 200<br>Body: "Product updated successfully" | |
| 제품 삭제 | DELETE /admin/product/{id} | Content-Type: application/json<br>Path Variable: id (Long) | Status: 200<br>Body: "Product deleted successfully" | |
* 현재 권한 검사가 일어나지는 않지만, 이후 권한을 두어 추가할 예정입니다.
* 제품을 조회하거나 볼 수 있는 기능은 아래 따로 두었습니다.

### 제품,옵션 조회 API
| 제목 | 메서드/URL 엔드포인트 | 요청 컨텐트 타입 / 요청 객체 | 응답객체 | 설명 |
|----------------------|------------------------------|------------------------------|----------------------------------------------|------|
| 제품 목록 페이지 조회 | GET /products | - | Status: 200 OK<br>Body: Page of ProductResponce | 페이지네이션을 이용한 제품 목록을 반환합니다. |
| 특정 제품 조회 | GET /product/{id} | - | Status: 200 OK<br>Body: ProductResponce | 제품 ID에 해당하는 상세 제품 정보를 반환합니다. |
| 제품 옵션 조회 | GET /product/{id}/options | - | Status: 200 OK<br>Body: ProductAllResponse | 제품 ID에 해당하는 제품과 그 옵션들의 상세 정보를 반환합니다. |


### 카테고리 관련 API
| 제목 | 메서드/URL 엔드포인트 | 요청 컨텐트 타입 / 요청 객체 | 응답객체 | 설명 |
|-----------------|-------------------------|----------------------------------------------------------------|--------------------------------------|------|
| 카테고리 생성 | POST /admin/category | Content-Type: application/json<br>Body: CategoryRequest | Status: 201 Created<br>Body: "Category created successfully" | |
| 카테고리 업데이트 | PUT /admin/category/{id}| Content-Type: application/json<br>Body: CategoryRequest | Status: 200 OK<br>Body: "Category updated successfully" | |
| 카테고리 삭제 | DELETE /admin/category/{id} | Content-Type: application/json<br>Path Variable: id (Long) | Status: 200 OK<br>Body: "Category deleted successfully" | |


### 옵션 관련 API
| 제목 | 메서드/URL 엔드포인트 | 요청 컨텐트 타입 / 요청 객체 | 응답객체 | 설명 |
|--------------------|-----------------------------------------------|-----------------------------------------------------------|------------------------------------------------|------|
| 옵션 조회 | GET /admin/product/{id}/options | Content-Type: application/json | Status: 200 OK<br>Body: List of OptionResponse | |
| 옵션 추가 | POST /admin/product/{productId}/option | Content-Type: application/json<br>Body: OptionRequest | Status: 200 OK<br>Body: "Option added successfully" | |
| 옵션 수정 | PUT /admin/product/{productId}/option/{optionId} | Content-Type: application/json<br>Body: OptionRequest | Status: 200 OK<br>Body: "Option updated successfully" | |
| 옵션 삭제 | DELETE /admin/product/{productId}/option/{optionId} | Content-Type: application/json | Status: 200 OK<br>Body: "Option deleted successfully" | |
| 옵션 수량 변경 | PUT /admin/product/{productId}/option/{optionId}/quantity | Content-Type: application/json<br>Body: OptionChangeQuantityRequest | Status: 200 OK<br>Body: "Option Quantity changed successfully" | |


### 위시리스트 관련 API
| 제목 | 메서드/URL 엔드포인트 | 요청 컨텐트 타입 / 요청 객체 | 응답객체 | 설명 |
|--------------------|-----------------------------|------------------------------|----------------------------------------------------|------|
| 위시리스트 제품 삭제 | DELETE /wishlist/{productId}| - | Status: 200 OK<br>Body: "successfully deleted the item to your wishlist" | 위시리스트에서 특정 제품을 삭제합니다. |
| 위시리스트 조회 | GET /wishlists | - | Status: 200 OK<br>Body: Page of WishProductResponse | 사용자의 위시리스트 페이지를 반환합니다. |
| 위시리스트 제품 추가 | POST /wishlist/{productId} | - | Status: 200 OK<br>Body: "successfully added the item to your wishlist" | 위시리스트에 특정 제품을 추가합니다. |


### 주문 관련 API
| 제목 | 메서드/URL 엔드포인트 | 요청 컨텐트 타입 / 요청 객체 | 응답객체 | 설명 |
|------------|-----------------------|--------------------------------------------------|-------------------------------------|------|
| 제품 주문 | POST /order/{id} | Content-Type: application/json<br>Body: OrderRequest | Status: 200 OK<br>Body: OrderResponce | 제품을 주문하고, 해당 제품의 옵션 수량을 감소시킨 후, 카카오 메시지로 주문 내용을 전송합니다. |

### 페이지 관련 API
| 제목 | 메서드/URL 엔드포인트 | 요청 컨텐트 타입 / 요청 객체 | 응답객체 | 설명 |
|--------------------|------------------------------|------------------------------|-----------------------------------|------|
| 관리자 제품 페이지 | GET /admin/product | - | HTML: "adminProduct" | 관리자 제품 관리 페이지를 반환합니다. |
| 회원 로그인/등록 페이지 | GET /members/login, /members/register | - | HTML: "user" | 회원 로그인 및 등록 페이지를 반환합니다. |
| 제품 페이지 | GET /product | - | HTML: "memberProduct" | 제품 페이지를 반환합니다. |
| 위시리스트 페이지 | GET /wishlist | - | HTML: "memberWishList" | 회원의 위시리스트 페이지를 반환합니다. |
=======