Skip to content

Commit

Permalink
Merge pull request #27 from ghojeong/feature/be/mock-api
Browse files Browse the repository at this point in the history
[BE] 모킹한 데이터로 API 완성
  • Loading branch information
kjk402 committed Apr 22, 2021
2 parents 08e026c + 214a26a commit 99bb9c3
Show file tree
Hide file tree
Showing 21 changed files with 627 additions and 228 deletions.
4 changes: 4 additions & 0 deletions backend/README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
# Backend

백엔드를 위한 디렉토리

## API 배포 링크

http://3.37.26.82:8080/swagger-ui.html
24 changes: 14 additions & 10 deletions backend/build.gradle
Original file line number Diff line number Diff line change
@@ -1,25 +1,29 @@
plugins {
id 'org.springframework.boot' version '2.4.5'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
id 'java'
id 'org.springframework.boot' version '2.4.5'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
id 'java'
}

group = 'com.codesquad.sidedish'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

repositories {
mavenCentral()
mavenCentral()
}

dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'
implementation 'org.springframework.boot:spring-boot-starter-web'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
runtimeOnly 'mysql:mysql-connector-java'
implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'
implementation 'org.springframework.boot:spring-boot-starter-web'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
runtimeOnly 'mysql:mysql-connector-java'

// swagger
implementation 'io.springfox:springfox-swagger2:2.9.2'
implementation 'io.springfox:springfox-swagger-ui:2.9.2'
}

test {
useJUnitPlatform()
useJUnitPlatform()
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,19 @@

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration;
import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;

@SpringBootApplication
// FIXME: DB 연동을 무효화하기 위해서 임시로 exclude 함, 나중에 수정할 예정
@SpringBootApplication(exclude = {
DataSourceAutoConfiguration.class,
DataSourceTransactionManagerAutoConfiguration.class,
HibernateJpaAutoConfiguration.class})
public class SideDishApplication {

public static void main(String[] args) {
SpringApplication.run(SideDishApplication.class, args);
}
public static void main(String[] args) {
SpringApplication.run(SideDishApplication.class, args);
}

}
Original file line number Diff line number Diff line change
@@ -1,9 +1,21 @@
package com.codesquad.sidedish.SideDish.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

import java.util.HashSet;
import java.util.Set;

@EnableSwagger2
@Configuration
public class WebConfig implements WebMvcConfigurer {

Expand All @@ -13,4 +25,27 @@ public void addCorsMappings(final CorsRegistry registry) {
.allowedOrigins("*")
.allowedMethods("*");
}

@Bean
public Docket api() {
ApiInfo apiInfo = new ApiInfoBuilder()
.title("Side Dish API")
.description("Spring API made by Bat and Pyro")
.license("Apache License Version 2.0")
.version("0.1")
.build();

Set<String> responseContentType = new HashSet<>();
responseContentType.add("application/json;charset=UTF-8");

// http://localhost:8080/swagger-ui.html
return new Docket(DocumentationType.SWAGGER_2)
.groupName("side-dish")
.produces(responseContentType)
.apiInfo(apiInfo)
.select()
.apis(RequestHandlerSelectors.basePackage("com.codesquad.sidedish.SideDish")) // NOTE: basic-error-controller 는 문서화 하지 않음
.paths(PathSelectors.ant("/**"))
.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,18 @@
import com.codesquad.sidedish.SideDish.dto.*;
import com.codesquad.sidedish.SideDish.service.CategoryService;
import com.codesquad.sidedish.SideDish.service.DishService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@Api(tags = {"Side Dish API"}, description = "Bat 와 Pyro 가 야근하며 만든 API")
@RestController
public class DishController {
private final CategoryService categoryService;
Expand All @@ -18,44 +25,50 @@ public class DishController {
this.dishService = dishService;
}

@GetMapping
@RequestMapping("/categories")
@GetMapping("/categories")
@ApiOperation(value = "카테고리", notes = "요리 카테고리 목록을 반환합니다.")
public ResponseEntity<List<CategoryDto>> getCategories() {
List<CategoryDto> categories = categoryService.getList();
return ResponseEntity.ok().body(categories);
}

@GetMapping("/detail/{hash}")
public ResponseEntity<DishDetailDto> getDetail(@PathVariable("hash") String hash) {
DishDetailDto dishDetailDto = dishService.getDetail(hash);
@GetMapping("/detail/{detailHash}")
@ApiOperation(value = "요리 상세", notes = "요리의 상세 정보를 반환합니다.")
public ResponseEntity<DishDetailDto> getDetail(@ApiParam("요리의 식별자") @PathVariable("detailHash") String detailHash) {
DishDetailDto dishDetailDto = dishService.getDetail(detailHash);
return ResponseEntity.ok().body(dishDetailDto);
}

@GetMapping("/detail/{hash}/refreshable")
public ResponseEntity<RefreshDto> getDetailRefreshable(@PathVariable("hash") String hash, @RequestParam("lastUpdated") int lastUpdated) {
RefreshDto refreshDto = dishService.getDetailRefreshable(hash, lastUpdated);
@GetMapping("/detail/{detailHash}/refreshable")
@ApiOperation(value = "요리 상세 갱신", notes = "요리의 상세 정보를 갱신할 필요가 있는지 여부를 반환합니다.")
public ResponseEntity<RefreshDto> getDetailRefreshable(@ApiParam("요리의 식별자") @PathVariable("detailHash") String detailHash, @ApiParam("프론트에서 마지막으로 업데이트 한 날짜. 데이터 형식: yyMMddhhmm") @RequestParam("lastUpdated") int lastUpdated) {
RefreshDto refreshDto = dishService.getDetailRefreshable(detailHash, lastUpdated);
return ResponseEntity.ok().body(refreshDto);
}

@GetMapping("/detail/{hash}/quantity")
public ResponseEntity<QuantityDto> getDetailQuantity(@PathVariable("hash") String hash) {
QuantityDto quantityDto = dishService.getDetailQuantity(hash);
@GetMapping("/detail/{detailHash}/quantity")
@ApiOperation(value = "요리 수량", notes = "요리의 주문 가능한 수량을 반환합니다.")
public ResponseEntity<QuantityDto> getDetailQuantity(@ApiParam("요리의 식별자") @PathVariable("detailHash") String detailHash) {
QuantityDto quantityDto = dishService.getDetailQuantity(detailHash);
return ResponseEntity.ok().body(quantityDto);
}

@GetMapping("/main")
@ApiOperation(value = "메인 요리", notes = "메인 요리의 목록을 반환합니다.")
public ResponseEntity<List<DishDto>> getMainList() {
List<DishDto> dishes = dishService.getList(1);
return ResponseEntity.ok().body(dishes);
}

@GetMapping("/side")
@ApiOperation(value = "반찬 요리", notes = "반찬 요리의 목록을 반환합니다.")
public ResponseEntity<List<DishDto>> getSideList() {
List<DishDto> dishes = dishService.getList(1);
return ResponseEntity.ok().body(dishes);
}

@GetMapping("/soup")
@ApiOperation(value = "국물 요리", notes = "국물 요리의 목록을 반환합니다.")
public ResponseEntity<List<DishDto>> getSoupList() {
List<DishDto> dishes = dishService.getList(1);
return ResponseEntity.ok().body(dishes);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.codesquad.sidedish.SideDish.controller;

import com.codesquad.sidedish.SideDish.exception.DishNotFoundException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;

@ControllerAdvice
public class DishExceptionHandler {
private final Logger logger = LoggerFactory.getLogger(DishExceptionHandler.class);

@ExceptionHandler(DishNotFoundException.class)
public ResponseEntity handleDishNotFound(DishNotFoundException e) {
logger.error(e.getMessage());
return ResponseEntity.status(HttpStatus.NOT_FOUND).body("존재하지 않는 Dish 입니다.");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.codesquad.sidedish.SideDish.domain;

public class Category {
private final long id;
private final String categoryName;
private final String endPoint;

public Category(long id, String categoryName, String endPoint) {
this.id = id;
this.categoryName = categoryName;
this.endPoint = endPoint;
}

public long getId() {
return id;
}

public String getCategoryName() {
return categoryName;
}

public String getEndPoint() {
return endPoint;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.codesquad.sidedish.SideDish.domain;

import java.util.Arrays;
import java.util.List;

public class CategoryMockRepository implements CategoryRepository {
private final List<Category> categories = Arrays.asList(
new Category(1, "모두가 좋아하는 든든한 메인요리", "/main"),
new Category(2, "뜨끈하고 시원한 국물요리", "/soup"),
new Category(3, "밥도둑이 여기있다! 반찬요리", "/side")
);

@Override
public List<Category> findAll() {
return categories;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.codesquad.sidedish.SideDish.domain;

import java.util.List;

public interface CategoryRepository {
List<Category> findAll();
}
Loading

0 comments on commit 99bb9c3

Please sign in to comment.