본문 바로가기

Programing

(403)
[Java] byte[]을 String으로 바꾸기 같이보기: Kotlin 에 대한 내용은 [Kotlin] byte[]을 String으로 바꾸기 를 참고하세요. 주의: 실무에서 아래에 적혀있는 BigInteger를 이용해서 테스트를 진행하다가 특정한 상황일 때 제대로 변환을 못하는 경우를 발견하였다. 처음으로 시작하는 16진수 숫자가 7F 이하일 경우만 제대로 동작을 한다. 예를 들어 0xDD 일 경우는 앞에 0으로 채운다. "dd20e7d3a2f1e814993511540a404615" 일 경우 크기가 16이 아닌 17개인 앞이 0으로 채워진 값을 반환하는 문제가 발생했다. 그래서 javax.xml.bind.DatatypeConverter의 parseHexBinary 를 쓰기를 권장한다. 2020-02-05 see https://inneka.com/pro..
JDK8 업데이트를 하다(181 to 211), SHA / AES 오늘 배포가 있어서 도비님하고 develop 브랜치에 개발한 것을 서로 merge를 하였다. 그런데 내 노트북에서는 테스트 코드가 모두 성공하는데 도비님 노트북에서 테스트 코드가 계속 깨진다. 깨지는 부분은 AES-256 암호화 하는 쪽 문제이다. 키의 크기는 맞는데 메세지가 달랐다. AES Illegal key size or default parameters 오늘 아침에 도비님께 물어보니 자바 특정버전 까지는 AES 256 암호화를 미국내에서만 사용하도록 제한을 걸어놓았다고 한다. 나의 JDK버전은 1.8 181릴리즈라 제한이 풀려서 문제가 없었던 것이다. 도비님의 버전은 그 이하였나보다. https://blog.kjslab.com/94 를 참고하자. 이참에 JDK8 릴리즈 업데이트를 해놓아야 겠다. ..
부모클래스에서 로깅시 서브클래스의 이름 찍기 추상클래스에서 로그를 찍고 싶을 때가 있다. lombok을 쓰고 있기에 단순히 abstract class 위에 @Slf4j 을 붙여주면 땡이지만 이렇게 하면 로그 클래스 이름이 Abstract 클래스 이름만 나오게 된다. 이럴 경우 상속받는 서브타입의 클래스이름이 찍게 하려면 어떻게 하면 될까? 1안 - 타입을 저장하여 파라미터로 받게 하는 방법 처음에는 2안이 있는 줄 모르고 타입을 저장하는 enum을 만들어서 Abstract 클래스의 생성자로 주입을 시켰다. 물론 이 방법도 동작을 했지만 @SuppressWarnings("unchecked") 를 붙여야 했고 서브타입이 추가 될 때 관련 없는 enum을 수정해야 한다는 것이 SRP 위반으로 보였다. 2안 - Object.getClass() 를 이용하는..
[Util] EUC-KR to JavaScript escaped string 파일럿 성으로 만들어보았는데 결국 쓰지 않을 것 같지만 아카이브용으로 기록해둔다. public static String toJsonEucKr(String str) { if (Objects.isNull(str)) { return null; } byte[] euckr = str.getBytes(EUC_KR); StringBuilder sb = new StringBuilder(euckr.length * 5); // 1: 5B -> 6: \u005B , 2: B0E6 -> 6: \uB0E6 boolean isMultibyte = false; for (byte b : euckr) { if (isMultibyte) { sb.append(byteToHex(b)); isMultibyte = false; } else {..
[Sonarqube] Make sure using this hardcoded IP address is safe here. 코드상에 하드코딩된 IP주소가 있을 경우 소나큐브는 아래와 같은 취약성 경고를 내놓는다. Make sure using this hardcoded IP address is safe here. 문제는 실제 의미없는 더미로 IP주소도 깨알같이 잡아낸다는 것이다. 하지만 소나큐브 코드상에 인 경우에는 대상에 포함시키지 않는 것 같은데 이상하게 잡힌다. (구버전의 소나큐브라서 그런가?) https://github.com/SonarSource/sonar-java/blob/master/java-checks/src/main/java/org/sonar/java/checks/HardcodedIpCheck.java#L71 회피책 //NOSONAR 주석을 붙여서 회피하는 방법도 있지만 뭔가 아쉽다. InetAddress.an..
[스프링 부트] StringHttpMessageConverter 를 쓸 때 주의점 제목이 길어져서 생략했지만 2.1.2.RELEASE 부터 적용되는 이야기이다. 스프링부터 2.1.2.RELEASE 에서 의존하는 스프링 프레임워크 버전은 5.1.4.RELEASE 이다. spring-web:5.1.4.RELEASE 에 들어있는 StringHttpMessageConverter 클래스의 코드가 아래와 같이 변경된 것을 알 수 있었다. getContentTypeCharset 메서드가 해주는 역할은 미디어타입에 따라 캐릭터셋을 돌려주는데, 크게 3가지 부분에서 사용이 된다. readInternal: 메세지를 읽을 때 getContentLength: 컨텐츠의 길이를 계산할 때 writeInternal: 메세지를 쓸 때 문제는 getContentTypeCharset의 로직의 분기가 추가됨에 따라 J..
[spring boot] Type-safe Configuration Properties 쓸 때 주의점 스프링부트에서 Configuration Properties의 기능은 설정을 접두어를 통한 그룹핑을 할 수 있어서 유용하다. 어제 배포 과정에서 실제 환경에 배포를 하였음에도 테스트 환경의 설정이 적용되어 배포 지연이 있었다. 원인을 살펴보니 yml 파일에 boolean 타입의 프로퍼티가 is가 붙어 있는 형태였다. is-real: true 이에 대응하는 Java 클래스는 아래와 같았다. private boolean isReal; 문제는 해당 필드는 설정이 적용되지 않는 것이었다. 어떻게 확인을 했나? 1. 생성자에서 초기화 테스트 생성자를 만들어서 해당 필드를 임의의 값을 설정해서 했는데, 스프링 프레임워크에 의한 값 덮어씀이 발생하지 않았다. 따라서 값 매핑이 제대로 되지 않는다고 판단할 수 있다. 2..
[Google 스프레드시트] AWS 로그 찾기 올해 초와 작년 두 해에 걸친 로그를 찾아야 했다. 배치 작업이 돌았는지, 또한 제대로 돌았는지를 확인해야 할 일이 생겼기 때문이다. 대상은 DB에서 쿼리를 통해 뽑으면 되는데, 문제는 수행된 결과는 AWS CloudWatch에 적재되어 있었다. 보안상 AWS CLI가 막혀서 API를 통한 방법은 할 수 없었다. 결국 AWS Console에서 로그를 찾아야 했는데, 페이징을 수행하기 때문에 뭔가 찾는 작업이 더뎠다. 구글 스프레드 시트에 DB에서 뽑은 key는 찾았는데, 그 key가 특정 로그에 있는지 찾는 것은 어려웠다. 처음에는 검색 시간으로 바이너리서치를 통해 날짜를 점점 줄여서 했지만 이것도 날짜마다 마지막 결과가 어디에 있는지 알 수 없었다. 결국 나중에 쓴 방식은 날짜와 키를 기반으로 로그 링..