TIL 20231221

2023. 12. 20. 16:54스프링

Web Layer을 작성하기 전에, API를 테스트를 할 수 있어야 하는데,

테스트는 코드를 직접 작성해서 테스트를 해도 되고, 도구를 이용해서 하기도 한다.

특히, 도구들을 이용하면 API 명세에 대한 기능도 제공을 한다.

그 도구 중 대표적으로 Postman과 Swagger이 있다.

 

각각 장점과 단점을 간략히 살펴보자면, 

 

Postman

 

  • 장점
    API 모니터링 : 작성한 API를 주기적으로 실행하는것을 예약할 수 있고, 이에 따른 API의 성공 실패 여부에 대한 모니터링이 된다.
    Mock 서버 : 실제 개발을 하지 않고도, 지정한 데이터를 응답하는 Mock Server를 만들 수 있어, Frontend 개발자 입장에서 Backend API의 완성을 기다리지 않고 테스트가 가능하다.
    환경변수 기능 : 다양한 환경 변수를 지정할 수 있어, 여러 환경에서 테스트가 가능할 수 있도록 한다.
    팀 간 협업 기능 : 환경 및 문서를 공유하기 위한 다양한 기능들을 제공하여 팀 간의 협업이 쉽다.
  • 단점
    유료 기능 : 유용한 기능 일부들에 대해서는 유료 결제를 해야한다.
    필요 리소스 : 생각보다 컴퓨터의 자원을 많이 써서, 사양이 낮은 컴퓨터에서는 돌리기 힘들 수 있다.
    러닝 커브 : 유용한 기능들을 익히려면 학습비용이 꽤 든다.

 

Swagger

 

  • 장점
    명확한 API 문서화 : 구조적이고, 읽기 쉬운 API 문서 생성 기능을 제공한다.
    문서 생성 자동화 : 약간의 설정을 통해 API 문서를 자동적으로 생성할 수 있다.
    API Request 검증 : 문서에 작성된 스펙에 따라 API의 Request와 Response를 좀 더 빠르게 검증할 수 있다.
  • 단점
    초기 구축 비용 : Postman에 비해 초기에 구축을 하는데 시간이 걸릴 수 있다.
    REST API 외적인 지원 : REST API외의 API Style을 지원하지 않다.
 
 
 

한 줄로 요약해보자면, Postman은 조금 더 테스트에 특화 되어있고, Swagger는 Documentation에 특화되어있다.

 

일단 이 강의에서 배워볼 친구는 Swagger라고 한다.

 

build.gradle.kts 의 dependencies 항목에

 

implementation("org.springdoc:springdoc-openapi-starter-webmvc-ui:2.2.0")

 

이를 추가해주고, 실행해주면 아래의 화면이 띈다!! 이 화면을 조금 수정해보려고 하는데,

 

 

 

 

수정을 하려면 아래처럼 작성해줘야 한다!! 처음으로 annotation을 이용해보았다 ㅋㅋㅋ 작성해주었더니!

 

 

@Configuration
class SwaggerConfig {

    @Bean
    fun openAPI() : OpenAPI = OpenAPI()
        .components(Components())
        .info(
            Info()
                .title("Course API")
                .description("Course API schema")
                .version("1.0.0")
        )
}

 

 

 

 

 

짠 이렇게 바뀌었다!! 이것처럼 이 역시도 변화를 주면 바꿀 수 있다는 것을 배울 수 있었다 ㅎㅎ

이걸 보여주는 냐고 따로 한번 해봤던거 같다 ㅋㅋㅋㅋ

 

그러고 본격적으로 하기 전 폴더를 나눠서 만들어주었다.

 

 

 

 

그리고 데이터 클래스를 만들어준다음 자료형을 지정해주고 작성하였다!

 

 

data class CourseResponse(
    val id: Long,
    val title: String,
    val description: String?,
    val status: String,
    val maxApplicants:Int,
    val numApplicants: Int,
)

fun main(args:Array<String>){
    val courseResponse = CourseResponse(
        id = 1L,
        title ="abc",
        description = null,
        status = "CLOSED",
        maxApplicants = 30,
        numApplicants = 30
    )

    val (id,title, description) =courseResponse
    println(id)
    println(title)
}

 

아래처럼 pirintIn이 잘된것을 볼 수 있다~

 

 

 

 

그 다음으로, CreateCourseRequest 파일을 만들어서 데이터를 적어주었다.

 

data class CreateCourseRequest (
    val title: String,
    val description: String?
)

 

 

이건 아이디는 자동으로 부여되는거라 안적어도 되고, 아까 작성한 것과 다르게 나머지도 자동으로 할당이 될 것이다.

 

그 외에도 수정하는? 다른 파일도 생성하여 같게 만들어주었다.

 

컨트롤러 만들어줘서

@RequestMapping("/courses")
@RestController
class CourseController {

    @GetMapping
    fun getCourseList():ResponseEntity<List<CourseResponse>> {
        TODO()
    }

    @GetMapping("/{courseId}")
    fun getCourse(@PathVariable courseId: Long): ResponseEntity<CourseResponse> {
        TODO()
    }

    @PostMapping
    fun createCourse(@RequestBody createCourseRequest: CreateCourseRequest): ResponseEntity<CourseResponse> {
        TODO()
    }

    @PutMapping("/{courseId}")
    fun updateCourse(
        @PathVariable courseId: Long,
        @RequestBody updateCourseRequest: UpdateCourseRequest
    ): UpdateCourseRequest {
        TODO()
    }

    @DeleteMapping("/{courseId}")
    fun deleteCourse(@PathVariable courseId: Long) {
        TODO()
    }
}

 

 

PathVariable은 경로 변수를 표시하기 위해 메서드에 매개변수에 사용되는 것이다.

이를 덧붙여주었다. 받아주는 것도 작성하였고,,,

 

그러고 RUN 하니 

 

 

 

 

 

이렇게 나오는 거 까지 하였다..

굿,, ㅎ

 

 


솔직히 이렇게 한 게 오래 걸린건 아니지만 이해가 안돼서 여러번 해봤던거 같다 ㅠㅠ 이걸 응용해서 과제를 해야하는데 벌써부터 머리가 아프다.. 그치만 해내야지? 난 잘할 수 있다 !!! 지금은 힘들어도 다 큰 자산이 될 거라고 믿고 그날 그날 최선을 다해서 공부하자 파이팅

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

TIL 20231226  (0) 2023.12.26
TIL 20231222  (0) 2023.12.22
TIL 20231220  (0) 2023.12.20
TIL 20231219  (0) 2023.12.19
TIL 20231218  (1) 2023.12.18