본문 바로가기
스프링 관련/스프링

controller

by 문자메일 2023. 1. 15.

패키지 구성 기본 뼈대

- controller

-> AbstractController.java / 서버에서 응답하는 Response 값 Generic으로 Mapping하는 메서드 가진 추상클래스

-- <entity 명칭>

--> 각 entity 별 controller

 

 

Controller에서 서버 Response 공통 포맷으로 응답하는 로직은, 강의중에서 조금 더 복잡하게 구현된 예제 내용으로 커밋함. Response는 아래 2번째 이미지 참조.

 

 

 

 

controller 공통 응답 좀 더 심플하게 구현하려면 아래 Generic Response, Controller 소스코드 참고하여 구현하면 될 것으로 생각됨. 

 

@Getter
@AllArgsConstructor
public class Response<T> {
    private String resultCode;
    private T result;

    public static Response<Void> error(String errorCode){
        return new Response<>(errorCode, null);
    }

    public static Response<Void> success(){
        return new Response<Void>("SUCCESS", null);
    }

    public static <T> Response<T> success(T result){
        return new Response<>("SUCCESS", result);
    }

    public String toStream() {
        if(result == null){
            return "{" +
                    "\"resultCode\":" + "\"" + resultCode + "\"," +
                    "\"result\":" + null + "}";
        }

        return "{" +
                "\"resultCode\":" + "\"" + resultCode + "\"," +
                "\"result\":" + "\"" + null + "\"" + "}";
    }
}

 

@RestController
@RequestMapping("/api/v1/posts")
@RequiredArgsConstructor
public class PostController {

    private final PostService postService;

    @PostMapping
    public Response<Void> create(@RequestBody PostCreateRequest request, Authentication authentication){
        postService.create(request.getTitle(), request.getBody(), authentication.getName());

        return Response.success();
    }

    @PutMapping("/{postId}")
    public Response<PostResponse> modify(@PathVariable Integer postId, @RequestBody PostModifyRequest request, Authentication authentication){
        Post post = postService.modify(request.getTitle(), request.getBody(), authentication.getName(), postId);

        return Response.success(PostResponse.fromPost(post));
    }

    @DeleteMapping("/{postId}")
    public Response<Void> delete(@PathVariable Integer postId, Authentication authentication){
        postService.delete(authentication.getName(), postId);
        return Response.success();
    }

    @GetMapping
    public Response<Page<PostResponse>> list(Pageable pageable, Authentication authentication){
        return Response.success(postService.list(pageable).map(PostResponse::fromPost));
    }

    @GetMapping("/my")
    public Response<Page<PostResponse>> my(Pageable pageable, Authentication authentication){
        return Response.success(postService.my(authentication.getName(), pageable).map(PostResponse::fromPost));
    }

    @PostMapping("/{postId}/likes")
    public Response<Void> like(@PathVariable Integer postId, Authentication authentication){
        postService.like(postId, authentication.getName());
        return Response.success();
    }

    @GetMapping("/{postId}/likes")
    public Response<Long> likeCount(@PathVariable Integer postId, Authentication authentication){
        return Response.success(postService.likeCount(postId));
    }

    @PostMapping("/{postId}/comments")
    public Response<Void> comment(@PathVariable Integer postId, @RequestBody PostCommentRequest request,
                                  Authentication authentication){
        postService.comment(postId, authentication.getName(), request.getComment());

        return Response.success();
    }

    @GetMapping("/{postId}/comments")
    public Response<Page<CommentResponse>> comment(@PathVariable Integer postId, Pageable pageable,
                                                   Authentication authentication){
        return Response.success(postService.getComments(postId, pageable).map(CommentResponse::fromComment));
    }

}

 

 

 

아래는 프로젝트 소스코드보며 정리하다가 정리 아직 못한 것 로깅

 

postController
Response


둘 다 AbstractController, ResponseDTO == Response에 구현된게 비슷함

위 방법에선 일반 컨트롤러 메서드 마다 return 하는 부분에서 Generic 클래스의 static 메서드로 Response 인스턴스 생성하여 응답하는 방식

아래 방법도 마찬가지로 컨트롤러 메서드마다 return 하는 부분에서 Generic Response 생성하는 부분 호출은 한다.
그런데 위와 다른점은 AbstractController.java 에 Generic Response 생성하는 추상클래스를 정의하고, 이 메서드를 호출하여 응답 생성함
결국 다시 뜯어보니 차이점은 추상컨트롤러의 메서드에서 Response 빈 인스턴스 생성만 하고, set으로 값 넣어주는 역할만 하던데, 굳이 저렇게 안하고 Generic Response
객체에서 static 메서드로 바로 만들어서 사용하는게 더 간단하지 않나? 변경사항 발생 시 유지보수 더 편하게 하려고 만들어진 구조인가? 그런가 싶기도 하고..

4개로 구성

CounselController -> AbstractController
CounselDTO
ResponseDTO

'스프링 관련 > 스프링' 카테고리의 다른 글

dto  (0) 2023.01.15
exception  (0) 2023.01.15
repository  (0) 2023.01.15
domain  (0) 2023.01.14
service  (0) 2023.01.14

댓글