안녕하세요, 도토리입니다.
잘못된 정보가 있거나 오류가 있으면 언제든지 댓글로 이야기 해주세요!! 😅
테스트코드가 중요하다는 말은 수없이 하여도 부족하다고 생각한다..!
물론 모든 케이스에 대해 완벽하게 테스트코드를 작성한다면 좋지만 우리 모두는 빠르게 기능개발 하는것 또한 매우 중요하다.
그렇게 평소와 같이 기능개발을 하다가, application.yaml에 db 서버 정보와 외부와 인터페이스하는 계정정보 혹은 key값들이 그대로 있는것이 보안조치사항에 걸려서 jasypt를 적용하여 아래와 같이 암호화 하였다.
그러나.. 암호화 하고나니 테스트코드 돌릴때 환경변수로 지정해둔 Encription 하는 Key값을 찾을 수 없다며... 서버가 뜨지도 않았으며 이로인해 테스트가 돌지 않는것이다..
// 생략
datasource:
url: jdbc:mysql://localhost:3306/example
username: ENC(vCQ1A43ZsTYinswPhr49CH7Pw4Gj8pd3W5T/WHbYkCnXF0=)
password: ENC(EsOVooVcddfugrWGp7epayZXQG3AY3TCQwZX+qspsbOquM=)
// 생략
그리하여 미래의 나와.. 혹은 고통받고 있을 누군가를 위하여 완벽한 방법은 아니지만.. 빠르게 일단 테스트를 돌릴 수 있도록 조치한 부분을 일단 공유하고자 한다.
추후에 더 좋은방법으로 개선할 경우 글을 수정하여 반영하도록 하겠다!
참고 사이트: https://okky.kr/questions/1380314 (답변해주신분.. 대단하십니다...)
Test Code 도는데 왜 환경변수를 못가져와?
인텔리제이에서는 아주 고맙게도 아래와 같이 Configuration에서 환경변수를 세팅할 수 있다.
-Djasypt.encryptor.password = password 로 만약 암호화 할 키를 password로 지정한다면.. 서버가 뜨기전에 환경변수로 password를 지정할 수 있다.
그러나, test코드를 돌릴때를 보자.
단순하게 처음에 들었던 생각은 모든 test코드 별로.. 위와 같이 Configuration에 각각 환경변수를 집어넣어주는것이였다.
하지만, 생각만해도 테스트코드가 몇십개만 되더라도 말이안되는 소리였다.
게다가 다 넣어준다고 하더라도 등록해둔 환경변수는 읽어갈 수 없다.
왜냐하면 Test 환경이 아닌 일반적인 서버를 띄우는것은 JVM을 직접적으로 실행시키면서 VM Option 을 줄 수 있기 떄문에 정상적으로 동작하는거고 Gradle Test 의 경우 내가 직접적으로 JVM을 실행하는게 아니고 Gradle 내부적으로 JVM을 실행시키기 때문에 VM Option 이 먹히지 않는다..
즉, 인텔리제이가 직접 JVM을 실행시키면서 VM Option에 설정된 환경변수를 읽어갈 수 있지만,
Test의 경우에는 Gradle에서 내부적으로 JVM을 실행시키면 인텔리제이에 등록해둔 환경변수는 읽어갈 수 없다는 것이다..!
어떻게 테스트코드에서 환경변수를 물고가지?
그래서 저는..
테스트코드가 돌기전에 환경변수를 세팅하는것을 생각했습니다.
Junit에서 테스트 돌기전에 수행하는 @Before이 있죠..
이걸로 BaseTest에다가 저는 아래와 같이 세팅했습니다..!
// 생략
private static String password = "example";
@BeforeAll
static void setup() {
System.getProperties().setProperty("jasypt.encryptor.password", password);
}
// 생략
물론 암호화하는 키를 보호하기위해서.. 소스코드에 키를 담지 않으려고 노력한것인데..
테스트가 돌아야하기때분에.. 매번 테스트코드가 돌기 전에 환경변수를 세팅하였습니당..!
이로 인해 테스트코드는 정상적으로 돌았지만.. 뭔가 찜찜한것은 남아있네요..
아래는 또 다른 방식의 환경변수 세팅 법입니다.
(저는 build.gradle에다가 하드코딩해두는것보다 차라리... test코드에다가 적어두는게 좀 더 낫다.. 라고 ㅠㅠㅠ 생각을 해서 아래보단 위를 택했습니다..)
이 방식은 Gradle test 명령을 내릴 때 "JVM 실행할때 VM Option 도 좀 줘" 라는 느낌으로 명령을 추가하는겁니다.
build.gradle 파일에 아래와 같이 jvmArgs를 추가하면 환경변수를 물고 테스트를 돌린다고 합니다.
tasks.named('test') {
useJUnitPlatform()
jvmArgs '-Djaja=123'
}
마무리
다른 방법으로 좀더 Key를 안전하게 세팅하고? jasypt의 뜻과 맞게? 좋은방법이 있다면 업데이트를 하겠습니다..
알고 계신다면,, 댓글로 도와주시면 감사하겠습니다..!!
'JAVA' 카테고리의 다른 글
[JAVA HashMap] Key 1개에 Value 2개 이상 담기 (1) | 2023.08.31 |
---|---|
[JAVA] Exception을 떨어트리고 response를 custom 해보자! (0) | 2023.08.30 |
[JAVA / 해결] MapStruct(Mapper) DTO <-> Entity 자동 생성 안될때 (0) | 2023.07.12 |
[JAVA] 대량 데이터 Insert 속도 개선 관한 이야기 - 2편 (0) | 2022.11.22 |
[JAVA] 대량 데이터 Insert 속도 개선 관한 이야기 - 1편 (0) | 2022.11.20 |