개발일지/2023_한이음

[개발]🤦🏻‍♀️고민하기 - review controller 리팩토링

기억지기 개발자 2023. 6. 4. 14:03

⬇️리팩토링 전 코드

@RestController
@CrossOrigin(origins = "http://localhost:3000", methods = {RequestMethod.OPTIONS, RequestMethod.DELETE, RequestMethod.GET, RequestMethod.POST, RequestMethod.PUT})
@RequestMapping("/review")
public class ReviewController {
    private final ReviewService reviewService;

    public ReviewController(ReviewService reviewService) {
        this.reviewService = reviewService;
    }

    // 리뷰 등록
    @PostMapping("/save")
    public ResponseEntity save(@RequestBody Review review) {
        return ResponseEntity.ok().body(reviewService.save(review));
    }

    //해당 학교애 대한 전체 리뷰 보여주기
    @GetMapping("/list")
    public ResponseEntity list(Long schoolId) {
        return ResponseEntity.ok().body(reviewService.findAll(schoolId));
    }

    //update
    @PutMapping(value = "/update/{id}")
    public ResponseEntity<Review> update(@RequestBody ReviewDTO dto, @PathVariable Long id) {
        Optional<Review> reviewdto = this.reviewService.update(id, dto);
        return new ResponseEntity(reviewdto, HttpStatus.OK);
    }

    //delete
    @DeleteMapping(value = "/delete/{id}")
    public void delete(@PathVariable Long id) {
        reviewService.delete(id);
    }
}

❤️@CrossOrigin을 삭제해도 된다.

(이 어노테이션을 대체하는 코드(방법)가 있을 텐데 그 방법이 정확히 모르겠다)

 

❤️매핑 어노테이션에 value값이 꼭 들어있어야 하는 것은 아니다.

 

 

 

package hanium.highwayspring.review;
import hanium.highwayspring.school.School;
import hanium.highwayspring.school.SchoolService;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Optional;

@RestController
@RequestMapping("/review")
public class ReviewController {
    private final ReviewService reviewService;
    private final SchoolService schoolService;

    public ReviewController(ReviewService reviewService, SchoolService schoolService) {
        this.reviewService = reviewService;
        this.schoolService = schoolService;
    }

    // 리뷰 등록
    @PostMapping()
    public ResponseEntity<Review> save(@RequestBody ReviewDTO reviewdto) {
        School school = schoolService.findBySchoolId(1L)
                .orElseThrow(() -> new IllegalArgumentException("학교가 존재하지 않습니다."));
        Review review =  ReviewDTO.toEntity(reviewdto, school);
        return ResponseEntity.ok().body(reviewService.save(review));
    }

    //해당 학교애 대한 전체 리뷰 보여주기
    @GetMapping()
    public ResponseEntity<List<Review>> getReviewsBySchoolId(@RequestParam(name = "schoolId") Long schoolId) {
        School school = schoolService.findBySchoolId(schoolId)
                .orElseThrow(() -> new IllegalArgumentException("학교가 존재하지 않습니다."));
        List<Review> reviews = reviewService.findAll(school);
        return ResponseEntity.ok(reviews);
    }
    //update
    @PutMapping(value = "/{id}")
    public ResponseEntity<Review> update(@RequestBody ReviewDTO dto, @PathVariable Long id) {
        Optional<Review> reviewdto = this.reviewService.update(id, dto);
        return new ResponseEntity(reviewdto, HttpStatus.OK);
    }

    //delete
    @DeleteMapping(value = "/{id}")
    public void delete(@PathVariable Long id) {
        reviewService.delete(id);
    }
}

⬆️ 리팩토링 후 코드.

  • 팀원이 알려주기로는 매개변수에 @RequestBody 없이 객체만을 매개변수에 적어서 사용이 가능하다고 하는데 내가 post men에 테스트를 했을 때는 값들이 다 null로 나와서 없애지는 못했다.
  • 그리고 put과 delete에서도 value값을 사용하지 않고 사용할 수 있다고 팀원이 이야기해 줬는데 update와 delete는 id값이 있어야 하기 때문에 아직까지 내 수준(?)에서는 없애는 데에 실패했다.