[주간리포트]4월 3주차

zzarbttoo·2023년 4월 16일
0

앞으로 주마다 개발/기술적인 부분에서 경험했던 일 및 그에 대한 감상들을 정리하고자 한다
(and 잡담..)


업무

1. restdoc 을 이용한 문서 자동화 및 api 명세서 작성

  • mobile frontend 연동 작업을 위해 restdoc을 이용한 명세서 작성

1) 겪은 일

  • webTestClient에서 getMapping에 대한 pathVariable은 달 수 있었는데 queryParam에 달아줄 값들을 어떻게 풀어야 할 지 몰랐음
  • 근데 pathvariable과 마찬가지로 uri 상에 표시를 해줬어야 했음
 
     String pathvariable = "pathvariable";
     String queryParam = "queryParam" 
    
     webTestClient.get()
                .uri("/endpoint/{pathvariable}?queryparameterName={queryparameterName}", pathvariable, queryParam)
                .exchange()
                .expectStatus().isOk()
                .expectBody().consumeWith(
                        document("/document/test",
                               RequestDocumentation.pathParameters(RequestDocumentation.parameterWithName("pathvariable").description("암호화된 seq")),
                                RequestDocumentation.queryParameters(RequestDocumentation.parameterWithName("queryParam").description("queryParameter")),
                                responseFields(
                                        fieldWithPath("code").type(JsonFieldType.STRING).description("repsonseCode"),
                                        fieldWithPath("msg").type(JsonFieldType.STRING).description("msg"),
                                        subsectionWithPath("data").type(JsonFieldType.ARRAY).description("data")
                                ),
                                responseFields(beneathPath("data[]").withSubsectionId("info"), new FieldDescriptor[]{
                                         subsectionWithPath("dataInfo").type(JsonFieldType.STRING).description("data 하위 정보").optional(),
                                })
                        )
                );
                
                

2) 보완할 점

@ExtendWith({RestDocumentationExtension.class})
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@ActiveProfiles("local")
class RightsControllerTest {

    @Autowired
    private WebTestClient webTestClient;

    @Autowired
    private ApplicationContext context;

    @BeforeEach
    public void setUp(RestDocumentationContextProvider restDocumentation) {
        webTestClient = WebTestClient
                .bindToApplicationContext(context)
                .configureClient()
                .filter(documentationConfiguration(restDocumentation))

                .exchangeStrategies(ExchangeStrategies.builder()
                        .codecs(configurer -> configurer.defaultCodecs().maxInMemorySize(-1))
                        .build())
                .build();
    }
    
... 생략 
  • 현재 위와 같이 매번 @BeforeEach를 이용해 설정을 하고 있는데 이를 파일당이 아니라 test code 전역적으로 해야할 듯 하다 '
  • 아직 우리는 build 단계에서 -x test를 하고 있기 때문에 큰 문제는 없지만 자동 배포 + 테스트 코드까지 실행하려면 빌드 시간도 중요해질 듯 하다

2. python + selenium을 이용한 테스트 자동화

  • 업무 중 속도 개선이 있었는데 이전 코드와 비교해서 얼마나 성능이 향상됐는가를 테스트 하기 위해 python + selenium 을 이용해 로딩시간까지의 테스트를 진행했다
  • 백엔드 개선만 했지만 데이터가 잘 못 전달될 경우에 프론트엔드에서 엄청 시간이 느려지기 때문에(백엔드와 프론트가 결합된 타임리프 사용중) 데이터 전체에 대해 테스트 할 겸 테스트 자동화 코드를 작성했다

1) 진행한 것

  • python에서는 굳이 chronium을 미리 깔지 않아도 라이브러리로 실시간으로 받아서 이용할 수 있는 것 같아서 편리했다
  • 렌더링 시간 != 로딩시간인 것을 알았다(프론트알못)
  • 크롤링이든 테스트든 특정 태그가 로딩될 때 까지 기다렸다가 진행해야 한다는 것을 알았다
	wait = WebDriverWait(driver, 10)  # 최대 10초 동안 대기

	# load 이벤트가 발생할 때까지 대기
	wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'XPATH 루트 복사해서 사용')))

2) 진행해야 할 것

  • select box를 랜덤으로 골라서 search 하는 코드를 짜야하는데 자동화 하는 것 보다 차라리 테스트 케이스를 많이 찾고 직접 하는게 낫지 않나라는 생각이 들어서 갈등 중이다

3. jwt 토큰 작업

  • mobile 백엔드에서는 임시방편으로 session 방식을 사용하고 있었는데, 프론트에서 로그인 후에도 로그인 페이지로 이동된다는 문의가 왔다
  • 어차피 reactive 상황에서 session 방식을 사용하는 것보다는 jwt를 사용하는 것이 더 권장된다고 하길래 팀장님과 협의하고 auth server에 관련 로직을 추가하도록 했다
    • axios에서 spring security session 로그인 방식을 사용하기 위해서는 withCredential 옵션 true를 설정해야한다
    • login 페이지로 이동되는 것은 프론트 라우팅 문제였고 이에 대해 해결돼서 사실 session 방식을 사용해도 되나 스케쥴이 살짝 꼬여서 빠르게 auth service에 추가를 진행해야겠다고 생각했다

1) 진행한 것, 알게된 것

  • 암튼 그래서 jwt 관련 작업을 진행하는 중인데 jwt 공식 홈페이지에서 기존 토큰을 복호화 했을 때 secret key 값이 없어도 복호화가 되는 것을 보고 기절할 뻔했다
    • 알고보니 공식 홈페이지에서는 secret key 가 없어도 되고, 서버단에서 복호화 할 때만 필요한 것이였다
    • 그것을 보고 accessToken에 중요한 값은 절대 넣지 말아야겠다고 생각했다
    • 이미지의 경우에도 accessToken에 직접 넣는 것 보다는 이미지 위치를 보통 넣는다고 하여 그렇게 구현하기로 했다
  • @Primary, @Qualifer, @Autowired를 사용할 때 하나의 값에 무조건 @Primary가 설정돼있지 않으면 @Qualifer을 명시적으로 설정해도 주입이 안되는 것을 확인했다
    • 꼭 @Qualifer("bean이름") 을 설정하지 않으면 @Primary를 설정해줘야 할 듯 했다
  • 사용되는 곳이 없는 @Bean의 경우에 springboot에서 등록을 안해준다는 것을 알 수 있었다

2) 진행해야 할 것

  • 기존 auth service를 확인했는데 auth service의 jwt 발급 방식이 특정 서비스에 종속적으로 짜여있어서 들어오는 endpoint에 따라 다른 로직을 타도록 변경해야 할 것 같았다
  • resolver을 이용해 각각 다른 spring security AuthenticationManager를 이용하도록 config 설정을 해야한다고 하니 다음주에 그 작업을 진행하면 될 듯 하다
  • java 17 -> 11 환경으로 포팅하려니 텍스트 블록을 사용 못하는게 별로였지만 해당 서버에서 다른 서비스도 있기 때문에 java 버전을 올리지 못해 더럽게 처리하게 됐다
    • 차후에 docker로 배포하면 상관 없지 않을까 싶다

개인적

  • 개인적으로는 오토마타에 대해서 학습하려고 하고 있다
  • 그리고 ipad mini를 중고로 샀는데 관련해서 집에서 서버를 구축할 수 있으면 하고 싶다
  • 일본어 N3 시험 등록을 했는데 공부를 많이 해야할 듯 하다
  • 엘라스틱서치 공부도 해야하는데...
  • 근데 그 와중에 스쿼트 중량 치다가 허리를 다쳐서 지금 너무 고통속에 앉아있따 흑흑..... (2주 연속 부상당함)
    다음주에는 좀 건강했으면 좋겠다
profile
나는야 누워있는 개발머신

0개의 댓글