Skip to content

Commit

Permalink
Merge pull request #54 from ClothingStoreService/develop
Browse files Browse the repository at this point in the history
develop 브랜치 main 브랜치에 merge
  • Loading branch information
hjj4060 authored May 20, 2024
2 parents e0e5efc + d38a9d5 commit 473593f
Show file tree
Hide file tree
Showing 138 changed files with 6,481 additions and 40 deletions.
85 changes: 50 additions & 35 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,96 +1,111 @@
# ClothStar 프로젝트

## 프로젝트 소개
- 개요 : 의류 온라인 쇼핑몰에서의 까다로운 도메인 규칙을 설계하고 구현하여 의류 쇼핑몰에 대한 도메인에 대한 이해를 높임과 동시에 개발과 협업의 역량을 향상 시키기 위해 시작하였습니다.

- 개요 : 의류 온라인 쇼핑몰에서의 까다로운 도메인 규칙을 설계하고 구현하여 의류 쇼핑몰에 대한 도메인에 대한 이해를 높임과 동시에 개발과 협업의 역량을 향상 시키기 위해 시작하였습니다.
- Scrum 방법론 사용 : 1주, 2주 단위로 Sprint를 나누고, 주간 미팅과 데일리 스탠딩 미팅을 통해 각 팀원의 진행사항 및 계획에 대해 공유하며 진행하였습니다.
- 컨벤션 사용과 깃 브랜치 전략 사용 : 커밋 커벤션과, 네이버 코드 컨벤션을 따랐습니다.
- [커밋 컨벤션 규칙 참고 URL](https://velog.io/@shin6403/Git-git-%EC%BB%A4%EB%B0%8B-%EC%BB%A8%EB%B2%A4%EC%85%98-%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0)
- [네이버 Java 코드 컨벤션 참고 URL](https://bestinu.tistory.com/64)
- [깃 브랜치 전략 참고 URL](https://hudi.blog/git-branch-strategy/)
- [커밋 컨벤션 규칙 참고 URL](https://velog.io/@shin6403/Git-git-%EC%BB%A4%EB%B0%8B-%EC%BB%A8%EB%B2%A4%EC%85%98-%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0)
- [네이버 Java 코드 컨벤션 참고 URL](https://bestinu.tistory.com/64)
- [깃 브랜치 전략 참고 URL](https://hudi.blog/git-branch-strategy/)

## 팀 멤버

- 유수빈
- 김민아
- 강현수

## 프로젝트 스프린트 계획

이 프로젝트는 스크럼 방법론을 따라 진행됩니다. 1주~2주일 단위로 Sprint를 나누고, 주간 미팅을 통해 각 팀원의 진행사항 및 계획에 대해 공유하였습니다. 아래는 프로젝트의 스프린트 계획입니다.

### 스프린트 1

- **멤버**: 강현수
- **목표**: 회원가입, 로그인 API 구현 (스프링 시큐리티 적용)
- **목표**: 회원가입, 로그인, 판매자, 배송지 기본 API 구현
- **기간**: 2024년 3월 13일부터 2024년 3월 31일까지
- **주요 작업**:
- 스프링 시큐리티 적용하여 회원가입, 로그인 API 구현
- 회원가입, 회원조회, 로그인 API
- 배송지 입력, 조회 API 구현
- 판매자 신청, 조회 API 구현
- 테스트 작성 및 실행

- **멤버**: 유수빈
- **목표**: 주문 API 구현(반품, 교환 제외)
- **기간**: 2024년 3월 14일부터 2024년 3월 31일까지
- **주요 작업**:
- (사용자)주문 생성 구현
- (사용자)주문 내역 구현
- (사용자)주문 취소 구현
- (판매자)주문 관리 구현
- 테스트 작성 및 실행
- 사용자 피드백 수집
- (사용자)주문 생성 구현
- (사용자)주문 내역 구현
- (사용자)주문 취소 구현
- (판매자)주문 관리 구현
- 테스트 작성 및 실행
- 사용자 피드백 수집

- **멤버**: 김민아
- **목표**: [스프린트 목표 및 완료 기준]
- **기간**: 2024년 3월 14일부터 2024년 3월 31일까지
- **주요 작업**:
- 기능 1 구현
- 기능 2 구현
- 테스트 작성 및 실행
- 사용자 피드백 수집
- 주문 상품 반품 구현
- 주문 상품 교환
- (판매자)상품 관리 구현
- (사용자)상품 조회 및 검색 구현
- 테스트 작성 및 실행
- 사용자 피드백 수집

### 스프린트 2

- **멤버**: 강현수
- **목표**: JWT 토큰 검증 사용한 비밀번호 수정, 회원정보 수정
- **목표**: 스프링 시큐리티 적용과, Jwt 적용후 인증및 권한 구현
- **기간**: 2024년 4월 01일부터 2024년 4월 10일까지
- **주요 작업**:
- JWT 토큰으로 이메일로 전송한 비밀번호 수정 링크 타고 왔는지 확인
- 회원 정보 수정
- 테스트 작성 및 실행
- 스프링 시큐리티 적용
- 스프링 시큐리티 Jwt 이용한 인증 및 권한구현
- 회원정보 수정, 회원 도메인 validation 체크및 수정
- 테스트 작성 및 실행

- **멤버**: 유수빈
- **목표**: 주문 상태 알림 API 구현
- **기간**: 2024년 4월 01일부터 2024년 4월 10일까지
- **주요 작업**:
- 주문 상태 알림 구현
- 테스트 작성 및 실행
- 사용자 피드백 수집
- 주문 상태 알림 구현
- 입점 신청/관리 구현
- 테스트 작성 및 실행
- 사용자 피드백 수집

- **멤버**: 김민아
- **목표**: 재입고 알림 API 구현
- **기간**: 2024년 4월 01일부터 2024년 4월 10일까지
- **주요 작업**:
- 재입고 알림 구현
- 테스트 작성 및 실행
- 사용자 피드백 수집
- 재입고 알림 구현
- 상품 리뷰 구현
- 장바구니, 위시리스트 구현
- 테스트 작성 및 실행
- 사용자 피드백 수집

### 스프린트 3

- **멤버**: 강현수
- **목표**: 배송지 입력 API 개발
- **목표**: refresh 토큰 구현및 코드 리팩토링
- **기간**: 2024년 4월 11일부터 2024년 4월 21일까지
- **주요 작업**:
- 배송지 입력, 추가, 삭제 API 개발
- 테스트 작성 및 실행
- access 토큰으로 refresh 토큰 재발급
- 테스트 작성 및 실행

- **멤버**: 유수빈
- **목표**: 최종 사용자 피드백 수집 및 수정
- **기간**: 2024년 4월 11일부터 2024년 4월 21일까지
- **주요 작업**:
- 최종 사용자 피드백 수집 및 수정
- 최종 사용자 피드백 수집 및 수정

- **멤버**: 김민아
- **목표**: [스프린트 목표 및 완료 기준]
- **기간**: 2024년 4월 11일부터 2024년 4월 21일까지
- **주요 작업**:
- 기능 5 구현
- 기능 6 구현
- 테스트 작성 및 실행
- 최종 사용자 피드백 수집 및 수정
- 검색 엔진 구현
- 기능 6 구현
- 테스트 작성 및 실행
- 최종 사용자 피드백 수집 및 수정

## 프로젝트 기간
이 프로젝트의 예상 기간은 2024년 3월 13일부터 2024년 4월 21일까지입니다.

이 프로젝트의 예상 기간은 2024년 3월 13일부터 2024년 4월 21일까지입니다.
17 changes: 17 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,27 @@ dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-jdbc'
implementation 'org.springdoc:springdoc-openapi-ui:1.8.0'
implementation 'org.springframework.boot:spring-boot-starter-validation'
implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity5'
implementation 'io.jsonwebtoken:jjwt-api:0.12.3'

implementation "javax.validation:validation-api:2.0.1.Final"
runtimeOnly 'com.h2database:h2'
runtimeOnly 'com.mysql:mysql-connector-j'
testImplementation "org.hamcrest:hamcrest:2.2"
testImplementation "org.junit.jupiter:junit-jupiter:5.10.2"
testImplementation "org.mockito:mockito-junit-jupiter:4.11.0"
runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.12.3'
runtimeOnly 'io.jsonwebtoken:jjwt-jackson:0.12.3'

compileOnly 'org.projectlombok:lombok'

annotationProcessor 'org.projectlombok:lombok'

testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.springframework.security:spring-security-test'
}

tasks.named('test') {
Expand Down
1 change: 0 additions & 1 deletion src/main/java/org/store/clothstar/Application.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,4 @@ public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
package org.store.clothstar.category.controller;

import io.swagger.v3.oas.annotations.Operation;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.store.clothstar.category.dto.request.CreateCategoryRequest;
import org.store.clothstar.category.dto.request.UpdateCategoryRequest;
import org.store.clothstar.category.dto.response.CategoryDetailResponse;
import org.store.clothstar.category.dto.response.CategoryResponse;
import org.store.clothstar.category.service.CategoryService;
import org.store.clothstar.common.dto.MessageDTO;
import org.store.clothstar.common.util.URIBuilder;

import java.net.URI;
import java.util.List;

@RestController
@RequiredArgsConstructor
@RequestMapping("/v1/categories")
public class CategoryController {

private final CategoryService categoryService;

@Operation(summary = "전체 카테고리 조회", description = "모든 카테고리를 조회한다.")
@GetMapping
public ResponseEntity<List<CategoryResponse>> getAllCategories() {
List<CategoryResponse> categoryResponses = categoryService.getAllCategories();
return ResponseEntity.ok().body(categoryResponses);
}

@Operation(summary = "카테고리 상세 조회", description = "id로 카테고리 한개를 상세 조회한다.")
@GetMapping("/{categoryId}")
public ResponseEntity<CategoryDetailResponse> getCategory(@PathVariable Long categoryId) {
CategoryDetailResponse categoryDetailResponse = categoryService.getCategory(categoryId);
return ResponseEntity.ok().body(categoryDetailResponse);
}

@Operation(summary = "카테고리 등록", description = "카테고리 타입(이름)을 입력하여 신규 카테고리를 등록한다.")
@PostMapping
public ResponseEntity<Long> createCategory(@Validated @RequestBody CreateCategoryRequest createCategoryRequest) {
Long categoryId = categoryService.createCategory(createCategoryRequest);

URI location = URIBuilder.buildURI(categoryId);

return ResponseEntity.created(location).build();
}

@Operation(summary = "카테고리 수정", description = "카테고리 이름을 수정한다.")
@PutMapping("/{categoryId}")
public ResponseEntity<MessageDTO> updateCategories(
@PathVariable Long categoryId,
@Validated @RequestBody UpdateCategoryRequest updateCategoryRequest) {

categoryService.updateCategory(categoryId, updateCategoryRequest);

return ResponseEntity.ok().body(new MessageDTO(HttpStatus.OK.value(), "Category updated successfully", null));
}
}
16 changes: 16 additions & 0 deletions src/main/java/org/store/clothstar/category/domain/Category.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package org.store.clothstar.category.domain;

import lombok.Builder;
import lombok.Getter;
import org.store.clothstar.category.dto.request.UpdateCategoryRequest;

@Getter
@Builder
public class Category {
private Long categoryId;
private String categoryType;

public void updateCategory(UpdateCategoryRequest updateCategoryRequest) {
this.categoryType = updateCategoryRequest.getCategoryType();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package org.store.clothstar.category.dto.request;

import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.store.clothstar.category.domain.Category;

import javax.validation.constraints.NotBlank;

@Getter
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class CreateCategoryRequest {

@Schema(description = "카테고리 타입(이름)", nullable = false)
@NotBlank(message = "카테고리 타입을 입력해주세요.")
private String categoryType;

public Category toCategory() {
return Category.builder()
.categoryType(categoryType)
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package org.store.clothstar.category.dto.request;

import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

import javax.validation.constraints.NotBlank;

@Getter
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class UpdateCategoryRequest {

@Schema(description = "카테고리 타입(이름)", nullable = false)
@NotBlank(message = "카테고리 타입을 입력해주세요.")
private String categoryType;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package org.store.clothstar.category.dto.response;

import lombok.Builder;
import lombok.Getter;
import org.store.clothstar.category.domain.Category;

@Getter
@Builder
public class CategoryDetailResponse {
private Long categoryId;
private String categoryType;

public static CategoryDetailResponse from(Category category) {
return CategoryDetailResponse.builder()
.categoryId(category.getCategoryId())
.categoryType(category.getCategoryType())
.build();
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package org.store.clothstar.category.dto.response;

import lombok.Builder;
import lombok.Getter;
import org.store.clothstar.category.domain.Category;

@Getter
@Builder
public class CategoryResponse {
private Long categoryId;
private String categoryType;

public static CategoryResponse from(Category category) {
return CategoryResponse.builder()
.categoryId(category.getCategoryId())
.categoryType(category.getCategoryType())
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package org.store.clothstar.category.repository;

import org.apache.ibatis.annotations.Mapper;
import org.store.clothstar.category.domain.Category;

import java.util.List;

@Mapper
public interface CategoryRepository {
List<Category> selectAllCategory();

Category selectCategoryById(Long categoryId);

int save(Category category);

int updateCategory(Category category);
}
Loading

0 comments on commit 473593f

Please sign in to comment.