Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

모집 픽스처를 생성하는 API를 구현한다. #538

Open
Tracked by #530
woowahan-pjs opened this issue Jul 4, 2022 · 4 comments
Open
Tracked by #530

모집 픽스처를 생성하는 API를 구현한다. #538

woowahan-pjs opened this issue Jul 4, 2022 · 4 comments
Labels
기능 New feature or request

Comments

@woowahan-pjs
Copy link
Contributor

woowahan-pjs commented Jul 4, 2022

2일

https://www.baeldung.com/spring-webclient-resttemplate

@dongho108
Copy link
Contributor

dongho108 commented Jul 9, 2022

현재 Term관련된 API가 없다.

그냥 Recruitmemt Reqeust Dto에 Term 객체를 포함해서 넘겨줘야한다.

data class RecruitmentData(
    @field:NotBlank
    @field:Size(min = 1, max = 31)
    var title: String = "",

    @field:NotNull
    var term: TermSelectData = TermSelectData(),

    @field:NotNull
    var startDateTime: LocalDateTime = LocalDateTime.MIN,

    @field:NotNull
    var endDateTime: LocalDateTime = LocalDateTime.MIN,

    @field:NotNull
    var recruitable: Boolean = false,

    @field:NotNull
    var hidden: Boolean = true,

    @field:NotNull
    @field:Valid
    var recruitmentItems: List<RecruitmentItemData> = emptyList(),
    var id: Long = 0L
)

Recruitment 생성시 termId 만 넘겨주는 API가 있을때의 문제점

val recruitment = recruitment {
    title = "웹 백엔드 3기"
    termId = 3L
    startDateTime = LocalDateTime.now().minusYears(1)
    endDateTime = LocalDateTime.now().plusYears(1)
    recruitable = true
    hidden = true
    items = items {
        item(title = "프로그래밍 학습 과정과 현재 자신이 생각하는 역량은?", 1, 1000, "우아한테크코스는...")
        item("프로그래밍 학습 과정과 현재 자신이 생각하는 역량은?", 2, 1500, "우아한테크코스는...")
        item("프로그래밍 학습 과정과 현재 자신이 생각하는 역량은?", 3, 2000, "우아한테크코스는...")
    }
}
  • 의도 : db에서 term id로 조회해서 그 term으로 recruitment를 만들어준다.
  • 문제 : term id로 term 을 조회하는 api가 없다.
  • 해결방법
    1. termId를 받지 않는다.
      1. default 생성
      2. name으로 생성

업데이트 내역

2022.08.07 기준 term Id로 조회하는 API가 존재하므로 termId만 받도록 설계 변경하였습니다.
관련 링크 : #561

@dongho108
Copy link
Contributor

인수테스트 DSL fixture 작성시 Term이나 Recruitment 생성 API를 사용하려면 관리자 로그인이 필요하다.
image

1. 관리자 로그인은 Session을 사용하고있다.

2. id, password를 입력하면 JSESSIONID를 받아(어디로 받아오는지 확인불가) 쿠키에 세팅한다.

image
image

3. 관리자 페이지 안에서 요청마다 쿠키에 JSESSIONID를 보내면 API가 동작한다. -예상

image

문제점

Fixture 작성시에 JSESSIONID를 쿠키에 담아 보내면 인가가 될거같은데, JSESSIONID를 어디로 받아오는지 확인이 안된다.

추가

@LoginUser(administor = true) 어노테이션 제거시 JSESSIONID없이도 모집생성 API가 동작하는 것을 확인했다.

@dongho108
Copy link
Contributor

RestAssured vs RestTemplate vs WebClient

Rest Assured

  • rest 기반 테스트를 단순화하기 위한 java DSL
  • 테스트 작성시에 용이함

RestTemplate

HttpClient를 사용하는 Rest용 클라이언트이지만 테스트보다는 개발에 주로 사용

Rest Assured에서 쉽게 사용할 수 있는 대부분의 테스트 관련 기능이 부족하다.

  • 내장된 Hemcrest 매처 지원
  • 테스트 관점에서의 사용 용이성
  • 다양한 인증 프로토콜에 대한 즉시 사용 가능한 지원
  • 로깅 요청 응답
  • 요청 시간 측정 등

Spring WebClient

  • non-blocking & reactive 여서 제한된 스레드로 더 많은 처리량
  • RestTemplate이 클라우드 네이티브 환경에서 제공해야 하는 모든 기능(로드밸런식, 토큰 릴레이, oauth2처리) 보유

Spring WebTestClient

  • WebClient와 함께 테스트 목적으로 제공
  • API는 대부분 WebClient와 유사하며 Http 응답의 모든 부분에 대한 검증허용

결정사항

RestTemplate에 비해 WebClient의 장점이 너무 명확해서 RestAssured와 WebClient를 비교해서 사용하기로 결정했습니다.

둘다 써보고 결정해보려고 했으나…

WebClient사용시 컨트롤러까지 도달하지 못하는 이슈때문에 일단 RestAssured로 구현했습니다.

참고자료

@kbsat
Copy link
Contributor

kbsat commented Aug 7, 2022

WebClient 사용 후기

  • WebClient 를 사용했을 때 포트 번호를 지정해야한다.
    • 보통 인수 테스트를 작성할 때 RandomPort를 사용한다.
    • RandomPort로 인해 정해진 port를 얻기 위해 @LocalServerPort 를 이용해 port를 얻는다.
    • 픽스쳐들은 테스트 코드와 따로 존재하기 때문에 픽스쳐 코드 자체로 port를 알 수 없다.
    • 따라서 WebClient의 포트를 기억할 정적 메서드를 생성함으로써 이 문제를 해결할 수 있을 것 같다.
    • 이게 과연 RestAssured보다 나은지 잘 모르겠다. RestAssured는 애초에 정적메서드를 제공하기 때문에 전역적으로 포트를 공유할 수 있다.
private fun postTerm1(termRequest: TermRequest): TermResponse {
    // val client = WebClient.builder()
    //        .baseUrl("http://localhost/:$port")
    //        .build()

    val client = WebClientConfig.create()

    return client.post()
        .uri("/api/terms")
        .contentType(MediaType.APPLICATION_JSON)
        .bodyValue(termRequest)
        .retrieve()
        .bodyToMono<ApiResponse<TermResponse>>()
        .block()?.body!!
}
  • 위와 같은 불편함 때문에 일단 RestAssured를 사용하도록 한다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
기능 New feature or request
Projects
None yet
Development

No branches or pull requests

3 participants