"스프링 부트 TDD - 입문부터 실전까지 정확하게" 인프런 강의의 실습 코드 저장소입니다.
./gradlew build
./gradlew bootRun
요청
- 메서드: POST
- 경로: /seller/signUp
- 헤더
Content-Type: application/json
- 본문
CreateSellerCommand { email: string, username: string, password: string }
- curl 명령 예시
curl -i -X POST 'http://localhost:8080/seller/signUp' \ -H 'Content-Type: application/json' \ -d '{ "email": "seller1@example.com", "username": "seller1", "password": "seller1-password", "contactEmail": "contact1@example.com" }'
성공 응답
- 상태코드: 204 No Content
정책
- 이메일 주소는 유일해야 한다
- 사용자이름은 유일해야 한다
- 사용자이름은 3자 이상의 영문자, 숫자, 하이픈, 밑줄 문자로 구성되어야 한다
- 비밀번호는 8자 이상의 문자로 구성되어야 한다
테스트
- 올바르게 요청하면 204 No Content 상태코드를 반환한다
- email 속성이 지정되지 않으면 400 Bad Request 상태코드를 반환한다
- email 속성이 올바른 형식을 따르지 않으면 400 Bad Request 상태코드를 반환한다
- username 속성이 지정되지 않으면 400 Bad Request 상태코드를 반환한다
- username 속성이 올바른 형식을 따르지 않으면 400 Bad Request 상태코드를 반환한다
- username 속성이 올바른 형식을 따르면 204 No Content 상태코드를 반환한다
- password 속성이 지정되지 않으면 400 Bad Request 상태코드를 반환한다
- password 속성이 올바른 형식을 따르지 않으면 400 Bad Request 상태코드를 반환한다
- email 속성에 이미 존재하는 이메일 주소가 지정되면 400 Bad Request 상태코드를 반환한다
- username 속성에 이미 존재하는 사용자이름이 지정되면 400 Bad Request 상태코드를 반환한다
- 비밀번호를 올바르게 암호화한다
요청
- 메서드: POST
- 경로: /seller/issueToken
- 본문
IssueSellerToken {
email: string,
password: string
}
- curl 명령 예시
curl -i -X POST 'http://localhost:8080/seller/issueToken' \ -H 'Content-Type: application/json' \ -d '{ "email": "seller1@example.com", "password": "seller1-password" }'
응답
- 상태코드: 200 OK
본문
AccessTokenCarrier { accessToken: string }
테스트
- 올바르게 요청하면 200 OK 상태코드를 반환한다
- 올바르게 요청하면 접근 토큰을 반환한다
- 접근 토큰은 JWT 형식을 따른다
- 존재하지 않는 이메일 주소가 사용되면 400 Bad Request 상태코드를 반환한다
- 잘못된 비밀번호가 사용되면 400 Bad Request 상태코드를 반환한다
요청
- 메서드: POST
- 경로: /shopper/signUp
- 본문
CreateShopperCommand { email: string, username: string, password: string }
- curl 명령 예시
curl -i -X POST 'http://localhost:8080/shopper/signUp' \ -H 'Content-Type: application/json' \ -d '{ "email": "shopper1@example.com", "username": "shopper1", "password": "shopper1-password" }'
성공 응답
- 상태코드: 204 No Content
정책
- 이메일 주소는 유일해야 한다
- 사용자이름은 유일해야 한다
- 사용자이름은 3자 이상의 영문자, 숫자, 하이픈, 밑줄 문자로 구성되어야 한다
- 비밀번호는 8자 이상의 문자로 구성되어야 한다
- 비밀번호는 연속된 4개 이상의 문자를 포함해서는 안 된다
테스트
- 올바르게 요청하면 204 No Content 상태코드를 반환한다
- email 속성이 지정되지 않으면 400 Bad Request 상태코드를 반환한다
- email 속성이 올바른 형식을 따르지 않으면 400 Bad Request 상태코드를 반환한다
- username 속성이 지정되지 않으면 400 Bad Request 상태코드를 반환한다
- username 속성이 올바른 형식을 따르지 않으면 400 Bad Request 상태코드를 반환한다
- username 속성이 올바른 형식을 따르면 204 No Content 상태코드를 반환한다
- password 속성이 지정되지 않으면 400 Bad Request 상태코드를 반환한다
- password 속성이 올바른 형식을 따르지 않으면 400 Bad Request 상태코드를 반환한다
- email 속성에 이미 존재하는 이메일 주소가 지정되면 400 Bad Request 상태코드를 반환한다
- username 속성이 이미 존재하는 사용자이름이 지정되면 400 Bad Request 상태코드를 반환한다
- 비밀번호를 올바르게 암호화한다
요청
- 메서드: POST
- 경로: /shopper/issueToken
- 본문
IssueShopperToken { email: string, password: string }
- curl 명령 예시
curl -i -X POST 'http://localhost:8080/shopper/issueToken' \ -H 'Content-Type: application/json' \ -d '{ "email": "shopper1@example.com", "password": "shopper1-password" }'
성공 응답
- 상태코드: 200 OK
- 본문
AccessTokenCarrier { accessToken: string }
테스트
- 올바르게 요청하면 200 OK 상태코드와 접근 토큰을 반환한다
- 접근 토큰은 JWT 형식을 따른다
- 존재하지 않는 이메일 주소가 사용되면 400 Bad Request 상태코드를 반환한다
- 잘못된 비밀번호가 사용되면 400 Bad Request 상태코드를 반환한다
요청
- 메서드: GET
- 경로: /seller/me
- 헤더
Authorization: Bearer {accessToken}
- curl 명령 예시
curl -i -X GET 'http://localhost:8080/seller/me' \ -H 'Authorization: Bearer {accessToken}'
성공 응답
- 상태코드: 200 OK
- 본문
SellerMeView { id: string(UUID), email: string, username: string, contactEmail: string }
테스트
- 올바르게 요청하면 200 OK 상태코드를 반환한다
- 접근 토큰을 사용하지 않으면 401 Unauthorized 상태코드를 반환한다
- 서로 다른 판매자의 식별자는 서로 다르다
- 같은 판매자의 식별자는 항상 같다
- 판매자의 기본 정보가 올바르게 설정된다
- 문의 이메일 주소를 올바르게 설정한다
요청
- 메서드: GET
- 경로: /shopper/me
- 헤더
Authorization: Bearer {accessToken}
- curl 명령 예시
curl -i -X GET 'http://localhost:8080/shopper/me' \ -H 'Authorization: Bearer {accessToken}'
성공 응답
- 상태코드: 200 OK
- 본문
ShopperMeView { id: string(UUID), email: string, username: string }
테스트
- 올바르게 요청하면 200 OK 상태코드를 반환한다
- 접근 토큰을 사용하지 않으면 401 Unauthorized 상태코드를 반환한다
- 서로 다른 구매자의 식별자는 서로 다르다
- 같은 구매자의 식별자는 항상 같다
- 구매자의 기본 정보가 올바르게 설정된다
요청
- 메서드: POST
- 경로: /seller/products
- 헤더
Authorization: Bearer {accessToken}
- 본문
RegisterProductCommand { name: string, imageUri: string, description: string, priceAmount: number, stockQuantity: number }
- curl 명령 예시
curl -i -X POST 'http://localhost:8080/seller/products' \ -H 'Authorization: Bearer {accessToken}' \ -H 'Content-Type: application/json' \ -d '{ "name": "Product 1", "imageUri": "http://example.com/product1.jpg", "description": "Product 1 description", "priceAmount": 1000, "stockQuantity": 10 }'
성공 응답
- 상태코드: 201 Created
- 헤더
Location: /seller/products/{id}
테스트
- 올바르게 요청하면 201 Created 상태코드를 반환한다
- 판매자가 아닌 사용자의 접근 토큰을 사용하면 403 Forbidden 상태코드를 반환한다
- imageUri 속성이 URI 형식을 따르지 않으면 400 Bad Request 상태코드를 반환한다
- 올바르게 요청하면 등록된 상품 정보에 접근하는 Location 헤더를 반환한다
요청
- 메서드: GET
- 경로: /seller/products/{id}
- 헤더
Authorization: Bearer {accessToken}
- curl 명령 예시
curl -i -X GET 'http://localhost:8080/seller/products/{id}' \ -H 'Authorization: Bearer {accessToken}'
성공 응답
- 상태코드: 200 OK
- 본문
SellerProductView { id: string(UUID), name: string, imageUri: string, description: string, priceAmount: number, stockQuantity: number, registeredTimeUtc: string(YYYY-MM-DDThh:mm:ss.sss) }
테스트
- 올바르게 요청하면 200 OK 상태코드를 반환한다
- 판매자가 아닌 사용자의 접근 토큰을 사용하면 403 Forbidden 상태코드를 반환한다
- 존재하지 않는 상품 식별자를 사용하면 404 Not Found 상태코드를 반환한다
- 다른 판매자가 등록한 상품 식별자를 사용하면 404 Not Found 상태코드를 반환한다
- 상품 식별자를 올바르게 반환한다
- 상품 정보를 올바르게 반환한다
- 상품 등록 시각을 올바르게 반환한다
요청
- 메서드: GET
- 경로: /seller/products
- 헤더
Authorization: Bearer {accessToken}
- curl 명령 예시
curl -i -X GET 'http://localhost:8080/seller/products' \ -H 'Authorization: Bearer {accessToken}'
성공 응답
- 상태코드: 200 OK
- 본문
ArrayCarrier<SellerProductView> { items: [ SellerProductView { id: string(UUID), name: string, imageUri: string, description: string, priceAmount: number, stockQuantity: number, registeredTimeUtc: string(YYYY-MM-DDThh:mm:ss.sss) } ] }
정책
- 상품 목록은 등록 시점 역순으로 정렬되어야 한다
테스트
- 올바르게 요청하면 200 OK 상태코드를 반환한다
- 판매자가 등록한 모든 상품을 반환한다
- 다른 판매자가 등록한 상품이 포함되지 않는다
- 상품 정보를 올바르게 반환한다
- 상품 등록 시각을 올바르게 반환한다
- 상품 목록을 등록 시점 역순으로 정렬한다
요청
- 메서드: GET
- 경로: /shopper/products
- 쿼리 매개변수
continuationToken: string?
- 헤더
Authorization: Bearer {accessToken}
- curl 명령 예시
curl -i -X GET 'http://localhost:8080/shopper/products?continuationToken={continuationToken}' \ -H 'Authorization: Bearer {accessToken}'
성공 응답
- 상태코드: 200 OK
- 본문
PageCarrier<ProductView> { items: [ ProductView { id: string(UUID), seller: SellerView { id: string(UUID), username: string, contactEmail: string }, name: string, imageUri: string, description: string, priceAmount: number, stockQuantity: number } ], continuationToken: string }
정책
- 상품 목록은 등록 시점 역순으로 정렬되어야 한다
- 한 페이지는 최대 10개의 상품을 포함한다
테스트
- 올바르게 요청하면 200 OK 상태코드를 반환한다
- 판매자 접근 토큰을 사용하면 403 Forbidden 상태코드를 반환한다
- 첫 번째 페이지의 상품을 반환한다
- 상품 목록을 등록 시점 역순으로 정렬한다
- 상품 정보를 올바르게 반환한다
- 판매자 정보를 올바르게 반환한다
- 두 번째 페이지를 올바르게 반환한다
- 마지막 페이지를 올바르게 반환한다
- continuationToken 매개변수에 빈 문자열이 지정되면 첫 번째 페이지를 반환한다
- 문의 이메일 주소를 올바르게 설정한다
요청
- 메서드: POST
- 경로: /seller/changeContactEmail
- 헤더
Authorization: Bearer {accessToken}
- 본문
ChangeContactEmailCommand { contactEmail: string }
- curl 명령 예시
curl -i -X POST 'http://localhost:8080/seller/changeContactEmail' \ -H 'Authorization: Bearer {accessToken}' \ -H 'Content-Type: application/json' \ -d '{ "contactEmail": "contact2@example.com" }'
성공 응답
- 상태코드: 204 No Content
테스트
- 올바르게 요청하면 204 No Content 상태코드를 반환한다
- contactEmail 속성이 올바르게 지정되지 않으면 400 Bad Request 상태코드를 반환한다
- 문의 이메일 주소를 올바르게 변경한다