2023.05.12

Jay Ji·2023년 5월 12일
0

I write TIL I close my Eyes

목록 보기
28/28
post-thumbnail

5월 4일부터 5월 11일, 일주일간 미니 프로젝트를 진행하였다.

💌위드인 (WithIn)
우리 조직의 이야기를 공유하기 위한 커뮤니티 사이트
좋은 일은 다 같이 축하해주고, 슬픈 일은 다 함께 위로와 격려를 해줄 수 있는 우리만의 공간!

📆 프로젝트 기간
2023년 5월 5일 ~ 2023년 5월 11일

🗝 ERD




🛠 트러블 슈팅

Trouble Shooting

1. Swagger 버전 불일치

  • Swagger 적용을 위해서는 2가지의 Spring Framework가 존재한다.
    • SpringDoc
      • 클래스단위로 @Tag 어노테이션을 사용해서 그룹
    • SpringFox
      • 클래스뿐만 아니라 메소드 단위로도 같은 어노테이션을 넣어줘야 한다.
    • SpringDoc과 SpringFox는 둘다 Swagger를 도와줄 수 있게끔 하는 라이브러리이지만, SpringDoc이 SpringFox보다 후발 주자로 나온 라이브러리로 더 발전시킨 모습이다.
  • 이번 프로젝트에서는 처음에 SpringFox로 Swagger 적용을 하려 하였으나 localhost:4000/Swagger-ui/index.html 서버를 찾지 못하는 현상이 반복적으로 일어났다. 그래서 SpringDoc으로 변경하여 Swagger 적용을 진행하였다. 여기서 또한 SpringFox 때와 같은 Trouble이 발생하였는데 이에 대한 원인으로 현재 사용하고 있는 Spring boot의 버전과 관련되었다.
    • SpringDoc을 주입하기 위해 사용된 implemetation은

implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:1.9.6'

이는 springBoot 2.~~ 에 적용이 가능한 springDoc이였다. 하지만, 현재 프로젝트에서는 springBoot 3.0.6 환경에 있었으므로 버전을

implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.0.2'

으로 변경하여 주입하여야 했다.

  • Swagger를 통해 Controller의 정보를 가져오기 위해서는 각 Controller Class 마다 @Tag 어노테이션을 붙여서 가져올 수 있다는 메뉴얼이 있다. 하지만, SpringBoot에 있는 자동 스캐닝 기능으로 어노테이션을 명시적으로 나타낼 필요없이 모든 컨트롤러의 정보를 가져올 수 있다.
    • Spring Boot는 기본적으로 @RestController 어노테이션이 선언된 클래스를 컨트롤러로 인식 → Spring Boot는 자동으로 API 엔드포인트를 생성하여 해당 엔드포인트에 대한 정보를 Swagger UI에 표시

2. jasypt 관련 트러블 슈팅

  • application.yml 파일에서 Github에 공유되면 안 되는 정보들을 암호화 하기 위해 jasypt 라이브러리를 사용했다.
  • 암호화에 사용한 jasypt.password 가 코드 내부에 존재하면 암호화한 의미가 없기 때문에 외부에서 전달 받아 사용할 수 있도록 했다.

@Value("${jasypt.password}")
private String encryptKey;

  • 많은 오류가 발생했는데 yml의 데이터 베이스 설정 값들을 읽지 못 해서 일어났다. 즉, 암호화된 정보들을 읽지 못 하고 있다고 판단할 수 있다.
  • 이를 토대로 몇 가지 추론을 할 수 있다.
  1. jasypt.password를 제대로 받지 못 하고 있다. 그래서, 암호화된 정보를 복호화 하지 못 한다.
  2. 복호화 하는 로직이 존재하지 않아서 암호화된 정보를 읽고 있다.
  3. JasyptConfig의 설정이 잘 못 됐다.
  • 이 중에서 가장 가능성이 높은 복호화 로직이 존재하지 않는지 확인했고, 실제로 없었다. 코드로 구현할 수도 있지만, 더 간편한 방법을 선택했다. @EnableEncryptableProperties 를 application에 추가하는 것으로 해결할 수 있다.
@SpringBootApplication
@EnableJpaAuditing
@EnableEncryptableProperties
public class WithInApplication {
	...
}

@EnableEncryptableProperties는 jasypt라이브러리를 활성화하고, 암호화된 값을 복호화하는 빈을 생성한다. 따라서, jasypt로 암호화한 정보들을 쉽게 관리할 수 있다.

  • @EnableEncryptableProperties 적용 후 문제 없이 작동 했다. 혹시 복호화에는 문제가 없는데 Configuration에 -Djasypt.password=**** 를 넘겨주지 않으면 어떤 오류가 나올지 궁금해서 테스트 해봤다.

배포 관련 트러블 슈팅과 동일한 오류가 발생한다.

3. 배포 관련 트러블 슈팅

  • 이번 프로젝트의 배포로는 EC2 Instance를 통해 서버를 실행하는 방법을 선택하였다.
  • Instance 생성과 Instance 연결 그리고 git Repository를 현재 인스턴스에 clone 절차까지 무난히 진행되었다. (추가로 S3 클라우드 스토리지 서비스와 RDS 관계형 데이터베이스 서비스도 모두 연결을 마친 상태였다.)
  • 다음으로 EC2 Instance를 통해 서버 실행 단계에서

java -jar WithIn-0.0.1-SNAPSHOT.jar

프로젝트 폴더 속 jar 파일을 실행을 진행하였지만, 아래와 같은 오류가 나타났다.

이 오류는 현재 프로젝트에서 작성된 설정 정보를 암호화하기 위해 사용된 jasypt의 password를 찾지 못하여 일어난 오류이다.

현재 jasypt.encrypt.key는 인텔리제이 내 Run/Debug Configuration에서 Build 시 호출되는 명령어

-Djasypt.password=**

를 넣어두었다.

password를 찾기 위해 .jar파일을 실행하는 명령어에서 아래와 같은 코드를 추가하였다.

java -jar WithIn-0.0.1-SNAPSHOT.jar --jasypt.password=값

(이 방법은 jasypt.password 프로퍼티를 명령줄 인수로 전달하여 실행하는 방법으로 일시적인 목적으로 사용할 수는 있지만, 보안상 취약점이 될 수 있다.)

보안상 취약점이 존재하는 것과 추가로 서버 실행은 정상적으로 작동하였지만, 서버 작동에서 연결 거부 또는 연결 시간 오래걸림의 문제가 생겼다.

이러한 이유를 예상해본 결과 jasypt password 인수를 찾지 못하는 현상인 것 같다.

  • --jasypt.password=값 옵션은 Spring Boot의 옵션으로 인식되어야 하지만, java -jar WithIn-0.0.1-SNAPSHOT.jar 명령어는 순수한 Java 명령어이므로, Spring Boot의 옵션을 인식하지 못한다.

그래서 이를 해결할 방법으로 Build 시 호출되는 명령어를 jar 파일 실행 명령어와 함께 작동되도록 넣어주는 방식을 해보았다.

-jar -Djasypt.password=** WithIn-0.0.1-SNAPSHOT.jar

이렇게 실행을 해보았더니 모두 정상적인 호출이 가능한 것을 확인하였다.

CRUD부터 배포까지 많은 것을 배울 수 있던 한주였다.

profile
Think out of the Box

0개의 댓글