[오픈소스] Swagger/OpenAPI 실시간 프리뷰 IntelliJ 플러그인을 제작했습니다! 안녕하세요! 이번에 처음으로 오픈소스 IntelliJ 플러그인 Swagger Viewer 를 제작하여 공유해 봅니다. 🤔 개발하게 된 계기 백엔드 개발 시 API 문서화를 위해 Swagger(OpenAPI)를 자주 활용하곤 합니다. 하지만 Spring Boot 환경에서 @Operation 같은 어노테이션의 다양한 속성을 작성하거나 YAML 파일로 스펙을 정의할 때, "실제 최종 사용자나 프론트엔드 개발자에게 이 문서가 어떻게 보일지" IDE 내에서 즉시 확인하기 어렵다는 불편함이 있었습니다. 혹여나 속성을 오기재하여 엉뚱한 문서가 전달되는 상황을 예방하고, 문서 작성 생산성을 높이고자 Swagger 작성과 동시에 실시간 렌더링 화면을 보여주는 플러그인 을 만들게 되었습니다. ✨ 주요 기능 및 특징 실시간 렌더링 프리뷰: 코드나 문서의 내용을 변경하면 Viewer 화면이 실시간으로 동기화되어 어떻게 바뀌는지 즉시 확인할 수 있습니다. 현재 지원 환경: Spring 프레임워크(어노테이션 기반) 및 .yaml / .yml 확장자의 Swagger 문서 🚀 향후 계획 현재는 Java/Kotlin(Spring) 및 YAML 중심이지만, 추후 FastAPI나 Flask 등 다양한 프레임워크 스펙도 지원할 수 있도록 확장해 나갈 예정입니다. 버그 제보나 기능 제안(Issue)은 언제든 환영합니다! 필요하신 분들께 작게나마 도움이 되었으면 좋겠습니다. 많은 관심과 피드백 부탁드립니다. 감사합니다! 🔗 JetBrains Marketplace 다운로드 https://plugins.jetbrains.com/plugin/33010-swagger-viewer
안녕하세요 프로젝트 swagger에 대한 질문입니다 ㅠㅠ아시는분있으면 꼭 답해주시기 바랍니다 코드 게시물 관련 프로젝트입니다. 나의 페이지에서 코드 게시물을 검색할수 있는 필터링 조건과 다른 유저 페이지에서 코드 게시물을 검색할수 있는 필터링 조건이 다른 상황입니다. api 설계시 위 두 api를 모두 "/codebox/{nickname}"으로 동일한 상황이고 @RequestBody로 받는 JSON 데이터들은 다르기 때문에 Controller에서 @GetMapping("/codebox/{nickname}")으로 동일하나 나의 페이지 접속시 토큰을 추가로 hearder에 받게 하여 아래와 같이 분리하여 구현된 상황입니다. 여기서 Swagger를 통해 api명세서를 자동으로 생성하게 되면 같은 리소스(같은 uri)에 대해서는 api가 한개 생성됩니다. 저는 아래 두가지 경우를 모두 api 명세서로 보여지게 생성하고 싶은데 여러가지 방법을 찾아보는데 마땅히 나오지 않아 질문드립니다.ㅠㅠ 아시는 분 있으시면 꼭 좀 댓글달아주시기 바랍니다.ㅠㅠ @GetMapping(value = "/{nickname}", headers = JwtProperties.ACCESS_HEADER_STRING) @UserAuthen @UserAuthor @ApiOperation(...) @ApiResponses({ ... }) @ApiImplicitParams({ @ApiImplicitParam(name = "nickname", value = "회원 닉네임", required = true), @ApiImplicitParam(name = JwtProperties.ACCESS_HEADER_STRING, value = "엑세스 토큰", required = true) }) public DataResponse<PostListResponse> userPage2(@PathVariable("nickname")String nickname, @RequestHeader(JwtProperties.ACCESS_HEADER_STRING) String accessToken, @RequestBody SearchFormAboutOtherUserPost form) { ..... } @GetMapping(value = "/{nickname}", headers = {JwtProperties.ACCESS_HEADER_STRING, JwtProperties.MYSESSION_HEADER_STRING}) @UserAuthen @UserAuthor @ApiOperation(...) @ApiResponses({ ... }) @ApiImplicitParams({ @ApiImplicitParam(name = "nickname", value = "회원 닉네임", required = true), @ApiImplicitParam(name = JwtProperties.ACCESS_HEADER_STRING, value = "엑세스 토큰", required = true), @ApiImplicitParam(name = JwtProperties.MYSESSION_HEADER_STRING, value = "마이페이지 엑세스 토큰", required = true) }) public DataResponse<PostListResponse> userPage3(@PathVariable("nickname")String nickname, @RequestHeader(JwtProperties.ACCESS_HEADER_STRING) String accessToken, @RequestHeader(JwtProperties.MYSESSION_HEADER_STRING) String my_sessionToken, @RequestBody SearchFormAboutSelfUserPost form) { .... }