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 |