API/실습

47. [ JAVA ] API 문서 문제 : JWT(Json Web Token)(보안) / User (2)

천재단미 2025. 1. 5. 23:22
728x90
반응형

 

 

 

 

문제

 

3. 리뷰 API

3.1. 리뷰 작성

새로운 리뷰를 작성하는 API입니다.

  • URL: /api/v1/reviews
  • Method: POST
  • 설명:
    • 인증된 사용자만 리뷰를 작성할 수 있습니다.
    • 동일한 메뉴에 대해 한 사용자는 하나의 리뷰만 작성 가능합니다.
    • 리뷰 작성 시 해당 음식점의 평균 평점이 자동으로 갱신됩니다.
    • 음식점과 메뉴의 리뷰 카운트가 자동으로 증가합니다.
  • Request Header:
Authorization: Bearer {accessToken}

  • Request Body:
{
    "restaurantId": 1,
    "menuId": 1,
    "rating": 5,
    "content": "정말 맛있었습니다!"
}

  • Validation:
    • rating: 1-5 사이의 정수만 가능
    • content: 최소 10자 이상 작성
    • restaurantId: 유효한 음식점 ID
    • menuId: 해당 음식점의 유효한 메뉴 ID
  • Response:
  • 성공 201 문제있을경우 400

3.2. 리뷰 수정

기존 리뷰를 수정하는 API입니다.

  • URL: /api/v1/reviews/{id}
  • Method: PUT
  • 설명:
    • 리뷰 작성자만 수정이 가능합니다.
    • 리뷰 수정 시 음식점의 평균 평점이 자동으로 갱신됩니다.
    • 리뷰 내용과 평점만 수정 가능합니다.
    • 존재하지 않는 리뷰 ID인 경우 404 에러를 반환합니다.
  • Request Header:
Authorization: Bearer {accessToken}

  • Request Body:
{
    "rating": 4,
    "content": "맛있었지만 조금 짰어요"
}

  • Response:
  • 성공 200 문제있을경우 400

 

풀이

 

3.1. 리뷰 작성

새로운 리뷰를 작성하는 API입니다.

 

Postman

 

 

  • URL: /api/v1/reviews
  • Method: POST
  • 설명:
    • 인증된 사용자만 리뷰를 작성할 수 있습니다.
    • 동일한 메뉴에 대해 한 사용자는 하나의 리뷰만 작성 가능합니다.
    • 리뷰 작성 시 해당 음식점의 평균 평점이 자동으로 갱신됩니다.
    • 음식점과 메뉴의 리뷰 카운트가 자동으로 증가합니다.

 

intelliJ

 

 

@RestController
public class ReviewController {

    @Autowired
    ReviewService reviewService;

    @PostMapping("/api/v1/reviews")
    ResponseEntity<Object> createReview(@RequestHeader("Authorization") String token,
                                        @RequestBody ReviewRequest reviewRequest) {
        int result = reviewService.createReview(token, reviewRequest);
        //   성공 201   문제있을경우 400
        if (result != 1) {
            // result 가 1이 라는 경우는, 테이블에 행이 추가되었다는 의미입니다.
            // result 가 1이 아닌 경우는, 테이블에 행이 추가되지 않았다는 의미입니다.
            return ResponseEntity.status(400).build();
        }
        return ResponseEntity.status(201).build();

    }
  • Request Header:
Authorization: Bearer {accessToken}

 

 

intelliJ

 

@Service
public class ReviewService {

    @Autowired
    JwtConfig jwtConfig;

    @Autowired
   private ReviewDAO reviewDAO;

    public int createReview(String token, ReviewRequest reviewRequest){
      // 토큰은 Bearer 를 제외한 나머지지 부분이기 때문에 
      // substring(7)을 사용하여 Bearer 를 제외한 나머지를 가져옵니다.
      long userId =  
      Long.parseLong( jwtConfig.getTokenClaims(token.substring(7)).getSubject());
     // Long.parseLong 는 문자열을 long 타입으로 변환하는 메소드입니다.
       return reviewDAO.createReview(userId, reviewRequest);


    }

 

  • Validation:
    • rating: 1-5 사이의 정수만 가능
    • content: 최소 10자 이상 작성
    • restaurantId: 유효한 음식점 ID
    • menuId: 해당 음식점의 유효한 메뉴 ID

 

intelliJ

 

 

@Repository
public class ReviewDAO {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    public int createReview(long userId, ReviewRequest reviewRequest){
     String sql = "INSERT INTO review(user_id, " +
             "restaurant_id,menu_id,rating,content)\n" +
             "values(?,?,?,?,?);";
        return jdbcTemplate.update(sql, userId, reviewRequest.restaurantId,
                reviewRequest.menuId, reviewRequest.rating, reviewRequest.content);
    }

 

 

package com.example.jwt3.dto;

public class ReviewRequest {
    public long restaurantId;
    public long menuId;
    public double rating;
    public String content;


    public ReviewRequest() {
    }

    public ReviewRequest(long restaurantId, 
                          long menuId, double rating, String content) {
        this.restaurantId = restaurantId;
        this.menuId = menuId;
        this.rating = rating;
        this.content = content;
    }
}

 

Postman

 

 

3.2. 리뷰 수정

기존 리뷰를 수정하는 API입니다.

 

Postman

 

  • URL: /api/v1/reviews/{id}
  • Method: PUT
  • 설명:
    • 리뷰 작성자만 수정이 가능합니다.
    • 리뷰 수정 시 음식점의 평균 평점이 자동으로 갱신됩니다.
    • 리뷰 내용과 평점만 수정 가능합니다.
    • 존재하지 않는 리뷰 ID인 경우 404 에러를 반환합니다.
  • Response:
  • 성공 200 문제있을경우 400

 

intelliJ

 

  • Request Header:
Authorization: Bearer {accessToken}

 

Postman

 

 

intelliJ

 

 

  • Request Body:
{
    "rating": 4,
    "content": "맛있었지만 조금 짰어요"
}

 

Postman

 

728x90
반응형
home top bottom
}