티스토리 뷰

개발/WIL

10.23 WIL

욱스다 2022. 10. 24. 02:20

지난 한주동안에는 스프링 배우시는분들과 함께 기본 crud api를 작성해서 

각자 맡은 파트를 수행해서 깃허브로 협업해보는 한주였다. 

나는 게시물 작성하는 부분을 맡았다.

 

컨트롤러 부분.

@RestController
@RequiredArgsConstructor
@RequestMapping({"/article"})
public class ArticleController {
    private final ArticleService articleService;

    @GetMapping
    public ResponseDto<?> selectAll() {
        return articleService.findAllArticle();
    }

    @PostMapping
    public ResponseDto<?> article(@RequestBody ArticleRequestDto requestDto, @AuthenticationPrincipal MemberDetailsImpl memberDetails) {
        return articleService.article(requestDto, memberDetails);
    }

    @GetMapping({"/{articleId}"})
    public ResponseDto<?> findArticle(@PathVariable("articleId") Long id) {
        return articleService.findArticle(id);
    }

    @PutMapping({"/{articleId}"})
    public ResponseDto<?> update(@PathVariable("articleId") Long id, @RequestBody ArticleRequestDto requestDto, @AuthenticationPrincipal MemberDetailsImpl memberDetails) {
        return articleService.update(id, requestDto, memberDetails);
    }

    @DeleteMapping({"/{articleId}"})
    public ResponseDto<?> delete(@PathVariable("articleId") Long id, @AuthenticationPrincipal MemberDetailsImpl memberDetails) {
        return articleService.delete(id, memberDetails);
    }
}

서비스 부분

@Service
@RequiredArgsConstructor
public class ArticleService {

    private final ArticleRepository articleRepository;
    /*
     * 게시글 단일 조회
     */
    public ResponseDto<?> findArticle(Long id) {
        Article article = articleRepository.findById(id).orElse(null);

        if(article == null ) {
            return ResponseDto.fail("Invalied id", "Article id를 찾을 수 없음");
        }

        ArticleResponseDto articleResponseDto = new ArticleResponseDto(article);

        return ResponseDto.success(articleResponseDto);
    }

    /*
     * 게시글 전체조회
     */
    public ResponseDto<?> findAllArticle() {
        List<Article> findArticleList = articleRepository.findAll();

        List<ArticleResponseDto> articleResponseDtoList = new ArrayList<>();

        for (Article article : findArticleList) {
            articleResponseDtoList.add(new ArticleResponseDto(article));
        }

        return ResponseDto.success(articleResponseDtoList);
    }

    /*
     * 게시글 등록
     */
    @Transactional
    public ResponseDto<?> article(ArticleRequestDto requestArticle, MemberDetailsImpl memberDetails) {
        Article article = new Article(requestArticle, memberDetails.getMember());
        articleRepository.save(article);
        return ResponseDto.success("성공적으로 저장했습니다.");
    }

    /*
     * 게시글 수정
     */
    @Transactional
    public ResponseDto<?> update(Long id, ArticleRequestDto requestDto, MemberDetailsImpl memberDetails) {

        Article article = articleRepository.findById(id).orElse(null);

        if(article == null) {
            return ResponseDto.fail("Invalied id", "수정할 게시글이 없음");
        }

        if(article.getMember().getId().equals(memberDetails.getMember().getId())) {
            String title = requestDto.getTitle();
            String content = requestDto.getContent();

            article.update(title,content);

            articleRepository.save(article);
            return ResponseDto.success("성공");
        } else {
            return ResponseDto.fail("수정권한이 없어","수정권한이 없어요");
        }
    }

    /*
     * 게시글 삭제
     */
    @Transactional
    public ResponseDto<?> delete(Long id, MemberDetailsImpl memberDetails) {
        Article article = articleRepository.findById(id).orElse(null);

        if(article == null) {
            return ResponseDto.fail("해당 게시글이 없어요","게시글 없음!");
        }

        if(article.getMember().getId().equals(memberDetails.getMember().getId())) {
            articleRepository.deleteById(id);
            return ResponseDto.success("삭제성공");
        } else {
            return ResponseDto.fail("권한이 없어요","권한없음");
        }
    }

}

오류 처리에 미흡함이 있는데 그 부분에 있어서는 어떻게 처리를 해줄지 더 생각을 해봐야할거같다.

그리고 react랑 토이프로젝트를 진행함에 있어서 포트가 달라서 생기는 설정에 대한 부분을 해결하기위해

(해당 에러는 CORS 에러라고도 했다.)

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("*")
                //.allowedMethods("*")
                ///exposedHeaders("Authorization","Refresh-Token")
                //.allowCredentials(true)//make client read header("jwt-token")
        ;
    }
}

위와 같이 아스타로 다 풀어주긴 했는데 나중에는 localhost:3000 포트로 바꿔서 테스트해볼 예정. 

그리고 Rest Api를  restful하게(?) api를 작성함에 있어 기술 매니저님이 말씀해주셨는데 단수 복수 개념으로 생각해보면 좋을거라고 이야기하셨다. Article같은 경우에 Articles로 해당 게시판은 하나만 있을 수 없기때문에 s를 붙여주는게 관례라고 이야기하셨다. Posts, Products 등등..

https://meetup.toast.com/posts/92

 

REST API 제대로 알고 사용하기 : NHN Cloud Meetup

REST API 제대로 알고 사용하기

meetup.toast.com

 

 

지난 한주간의 시간!

'개발 > WIL' 카테고리의 다른 글

11.6 WIL  (0) 2022.11.06
10.30 WIL  (0) 2022.10.30
10.16 WIL  (0) 2022.10.17
10.9 한주의 회고  (0) 2022.10.09
10.2 한주의 회고  (0) 2022.10.02
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/06   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함