OurMemory 프로젝트 진행 기록

김동영·2022년 2월 18일
0

OurMemory 프로젝트

목록 보기
1/6

목차

  1. 로깅 작업
  2. 프로필 이미지 업로드
  3. Heroku Postgres 적용
  4. DB 컬럼 암호화

1. 로깅 작업

  1. Request & Response
    • 22.02.17 ~ 22.02.19
      • 일회성 데이터인 리퀘스트, 리스폰스 데이터를 필터 단계에서 캐싱 객체에 담는다
      • 이후 캐싱된 데이터를 인터셉터 단계에서 출력시킨다.
        https://hyunsoori.tistory.com/12
      • jsonString 문자열을 보기 좋게 출력하기 위해 ObjectMapper 를 사용한다.
        https://kodejava.org/how-to-pretty-print-json-string-using-jackson/
      • 리퀘스트 Url 및 쿼리스트링, 바디 기록하도록 수정.
      • multipart 파일 등 스트림을 사용하는 파일의 경우, 리퀘스트래퍼가 스트림을 가로채서 읽은 뒤, 파일업로드 핸들러가 다시 읽는다.
        이 과정에서 이미 읽어서 끝난 스트림을 다시 읽기 때문에 아래 오류가 발생하게 된다.
        이를 해결하기 위해 멀티파트 데이터를 담는 파라미터가 전달된 경우, 캐싱하지 않도록 함.
       org.springframework.web.multipart.MultipartException: Failed to parse multipart servlet request; 
       nested exception is java.io.IOException: 
       org.apache.tomcat.util.http.fileupload.FileUploadException: Stream closed
    • 22.02.18
      • 기준 프로필이미지 업로드에만 사용되기 때문에 profileImage 파라미터를 조건으로 필터링함.
    • 22.02.24
      • content type 으로 구분하도록 수정(멀티파트리졸버 코드 참고)
    • 22.03.05
      • inputstream 을 오버라이드해서 캐싱된 인풋스트림으로 대체하면 읽을 수 있다고 함.(ContentCachingRequestWrapper / ContentCachingResponseWrapper)
        래퍼클래스를 위 스프링 기본 클래스로 대체하여 구현한 뒤, 바디만 로깅하지 않도록 수정.
        리퀘스트의 경우, 바디를 받지 못함. 리스폰스의 경우, 스웨거 화면이 표시되지 않음.
        => 필터 단계에서 ContentCachingResponseWrapper.copyBodyToResponse() 메소드를 반드시 호출해야 실제 리스폰스바디에 데이터가 세팅된다.
        => ContentCachingRequestWrapper 의 경우, inputStream을 두번 읽을 수 없기 때문에 해당 클래스로 로깅할 경우, 컨트롤러에서 읽을 때 아래와 같은 오류가 발생한다.
        org.springframework.http.converter.HttpMessageNotReadableException: Required request body is missing:
        at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.readWithMessageConverters(RequestResponseBodyMethodProcessor.java:163)
        따라서 재사용가능한 래퍼클래스를 따로 생성하여 처리하도록 한다.
        ContentCachingRequestWrapper 로깅 문제 수정
    • 22.03.02 ~
      • WebTestClient 가 의존성 주입되지 않아 실패함.
        WebTestClient 로 스프링 컨트롤러 테스트 구현
        인터셉터, 세션 테스트 로직 구현
      • 아직 세션은 없기 때문에 TestRestTemplate 로 작업함.
        TestRestTemplate 적용 블로그
      • 대표적인 성공, 실패 테스트 케이스 구현
      • 특이사례(로깅할 수 없는 멀티파트 리퀘스트) 테스트 케이스 구현 중
        TestRestTemplate 에서 요청 전 request 를 직렬화한다.
        이때, 디폴트생성자가 없어 직렬화할 수 없는 ByteArrayInputStream(멀티파트 데이터) 가 있어서 아래 오류가 발생한다.
        org.springframework.http.converter.HttpMessageConversionException: 
        type definition error: [simple type, class java.io.ByteArrayInputStream];
        nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: 
        	No serializer found for class java.io.ByteArrayInputStream and no properties discovered to create BeanSerializer 
          (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) 
          (through reference chain: org.springframework.mock.web.MockMultipartFile["inputStream"])
    • 22.03.04

2. 프로필 이미지 업로드

  • iOS 이미지 업로드
    22.03.01
    헤더, 리퀘스트 크기는 정상으로 설정되는 것으로 보여짐.
    그러나 받고 리퀘스트 단계에서 확인해보면 컨텐츠내용이 없는 것 같다.
    와이어샤크로 요청을 확인해보려했으나, 제대로 확인하지 못함.
    우선 다른 이슈 처리를 위해 이 내용은 보류.

3. Heroku Postgres 적용

기존 AWS RDS(MySQL) 이 성능에 비해 가격이 비싸서 Heroku Postgres 로 변경함.

  • 22.03.30 ~
    • Heroku App 생성 및 postgres add on 작업
    • 데이터베이스 연결 테스트(feat. Dbeaver)
    • Spring Boot 에 PostgreSQL 디펜던시 및 설정 추가
    • 블로그 참고하여 테스트 진행
    • 테스트 과정 중 DB 정보가 웹과 달라 접속실패 발생
    • 이를 해결하기 위해 CLI 설치 후 접속하여 config 설정을 통해 DB 정보 찾아냄
      heroku app config 확인
      커멘드
      heroku login
      heroku config -a ourmemory-postgres(app name)
      DATABASE_URL 값 확인
    • 기존 MySQL 문법 변경
    • 이를 해결하기 위해 @Comment 사용이 필요함. 이는 스프링부트에 내장된 의존성인 하이버네이트 5.6.0 이상부터 지원된다고 한다. stackOverflow 참고
    • 하이버네이트 5.6.0 이상 사용하기 위해 스프링 부트 2.5.6 -> 2.6.5 로 변경
    • ControllerHandler 매핑 전략이 ant_path_matcher -> path_pattern_parser 로 변경되어 swagger2, 3 가 지원되지 않는다고 한다.
      해결방안 중 부트 버전을 낮출 수는 없기 때문에 application.yml 에 아래 설정 추가하여 기본 값을 변경함.
      spring.mvc.pathmatch.matching-strategy=ant_path_matcher
      관련 블로그 글
    • @Comment 어노테이션을 설정했음에도 실제 DB 컬럼에 코멘트가 추가되지 않음.
      로그 분석 및 해결 필요. -> 불가능할 경우, 부트 버전을 다시 낮추는 방안도 생각할 것
  • 22.04.13
    • heroku 정책 상 90일 주기로 데이터가 다른 데이터베이스로 이관된다.(maintenance 작업)
    • 이에 따라 모든 접속정보가 변경되는 경우가 있으며, 정확한 원인과 해결방법을 찾아야 한다.

4. DB 컬럼 암호화

  • 22.04.13
    • 데이터베이스 컬럼이기 때문에 암복호화 가능한 AES256 방식 채택
      AES256 자바로 구현하기
    • JPA 방식으로 데이터베이스를 관리하기 때문에 이에 맞춰 필요한 컬럼에 @Convert 어노테이션을 붙여 암복호화를 자동화하도록 계획함.
    • 현재 어노테이션을 설정했음에도 동작하지 않아 어노테이션부터 적용되도록 수정한 뒤 암복호화 로직을 추가 구현할 예정임.
      @Convert 적용 블로그
  • 22.04.14
    • 암복호화에 사용되는 키 길이가 잘못되어 예외 발생, 키 값 수정 후 기능 구현 완료.
    • 데이터 조회에 사용되는 컬럼을 암호화할 경우, 조회할 때마다 다시 암호화하여 비교해야한다.
    • 이를 공통으로 해결하는 방법이 있는지 확인 필요.(예. Dto 파라미터에 @Converter 설정)

서트봇 등등 작성 내용들 이 곳에 모을 것.

profile
k8s, 프레임워크와 함께하는 백엔드 개발자입니다.

0개의 댓글