반응형

IT/PROGRAMMING 23

Kotlin의 모든 클래스에서 logger 객체를 편하게 얻을 수 있는 방법

안녕하세요, 하마연구소 입니다. Java에서 프로그래밍 할 때 편의를 위하여 Lombok을 거의 필수로 이용합니다. 보통 클래스변수의 getter()와 setter()를 자동으로 생성해주는 @Data 어노테이션을 붙이는 것을 많이 사용합니다. 그리고 @Log, @Slf4j 등 logger 객체를 쉽게 얻을 수 있는 기능을 제공하는데, 꽤 유용합니다. 코드가 많이 간단해집니다. Kotlin으로 프로그래밍하면서 이와 같은 logger 객체를 쉽게 얻어주는 라이브러리를 찾아보았지만, 찾지 못했습니다. 최근 Kotlin 버전에서는 Lombok을 공식적으로 사용할 수 있게 되었습니다. (https://kotlinlang.org/docs/lombok.html) 하지만 아직(현재버전 1.5.21) @Log, @Log..

IT/PROGRAMMING 2021.08.18

[Spring] spring-boot 2.1(SpringFramework 5.1)에서 없어진 기능, JSONP 간단하게 구현하기

JSONP 처리를 기본 기능으로 제공하였지만, 스프링부트 2.1(스프링프레임워크 5.1)부터 없어졌다. 이미 Deprecated 처리되어 언제가는 없어질 것을 예상했지만, 담당하고 있는 시스템에서는 아직 JSONP가 필요하였다. 없어진 AbstractJsonpResponseBodyAdvice.java 소스: https://github.com/spring-projects/spring-framework/blob/5.0.x/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/AbstractJsonpResponseBodyAdvice.java spring-projects/spring-framework Spring Fra..

IT/PROGRAMMING 2019.06.09

[Spring] spring-vault에서 @VaultPropertySource 여러개 사용하면 안되는 이유

스프링 기반의 어플리케이션을 개발할 때, 환경설정으로 보안정보를 다루기 위하여 Vault를 이용하게 된다. 일반적으로 가장 간단하게 Vault를 이용하는 방법은 @VaultPropertySource 또는 @VaultPropertySources 어노테이션을 사용하는 것이다. import org.springframework.context.annotation.Configuration; import org.springframework.vault.annotation.VaultPropertySource; @Configuration @VaultPropertySource(value = { "secret/hippolab/wallet1", "secret/hippolab/wallet2", "secret/hippolab/wa..

IT/PROGRAMMING 2019.04.19

YouTube(유튜브) 동영상의 썸네일 이미지 추출하는 방법

살다보면 YouTue(유튜브) 동영상의 특정 장면을 얻어야 경우가 있다. 이럴때는 동영상을 정지 시켜두고 화면 캡쳐를 하거나, 다른 싸제 레코딩 프로그램으로 녹화한 후에 원하는 곳의 화면을 얻을 수 있다. 귀찮다. 정말 원하는 위치의 장면을 이미지로 얻는 것이 아니라면, 기본 썸네일 이미지를 쉽게 얻을 수 있다. 썸네일은 YouTube에서 자동 추출되거나 동영상 게시자가 업로드한 별도 이미지가 있다. 공식적으로는 YouTube Developers에서 제공하는 API를 사용해야한다. YouTube Developers: https://developers.google.com/youtube/ YouTube | Google Developers Integrate YouTube videos and functional..

IT/PROGRAMMING 2019.04.09

[Java] Gson, Jackson(ObjectMapper)으로 JSON 문자열 출력할 때, pretty printing하는 방법

자바에서 JSON 파싱 및 변환을 위하여 많이 사용하는 Gson과 Jackson(ObjectMapper)에서 JSON 문자열을 출력할 때, 이쁘게 출력(pretty printing)하는 간단한 방법을 소개한다. Gson MyObject myObject = new MyObject(); Gson gson = new GsonBuilder() .setPrettyPrinting() .create(); String jsonString = gson.toJson(myObject); Jackson(ObjectMapper) MyObject myObject = new MyObject(); ObjectMapper objectMapper = new ObjectMapper(); String jsonString = objectMa..

IT/PROGRAMMING 2019.04.08

[Spring] ConcurrentKafkaListenerContainerFactoryConfigurer를 사용하고 싶다.

스프링 어플리케이션에서 카프카 토픽에서 값을 쉽게 가져오기 위하여 @KafkaListener 어노테이션을 사용한다. 여러개의 Kafka 서버에 접근해야할 필요가 있어서, 즉 @KafkaListener 어노테이션을 여러개 사용해야 해서, KafkaListenerContainerFactory를 수동으로 만들어야했다. 기왕 만드는김에 최대한 Spring에서 기본적으로 동작하는 방식으로 처리하려고 하니, ConcurrentKafkaListenerContainerFactoryConfigurer 이 녀석을 사용해야했다. spring-boot 버전 1.5.19를 사용하고 있으며, 그에따라 spring-boot-autoconfigure도 버전 1.5.19이다. 아래는 ConcurrentKafkaListenerConta..

IT/PROGRAMMING 2019.03.14

[Spring] Hibernate에서 "Could not build ClassFile" 발생하는 오류 해결

spring-boot 버전 1.4.2에서 현재 1.X 버전 최고인 1.5.19로 업데이트하였다. 한 프로젝트에 Maven 모듈로 여러 어플리케이션이 존재하는 구성이다. 2개 어플리케이션만 제외하고 나머지 어플리케이션은 잘 수행된다. 이 2개 어플리케이션에서는 처음 로딩 중 아래와 같은 예외가 발생한다. 더 특이한 것은 IDE에서 바로 실행시키면(로컬환경) 잘 된다. 서버환경에서만 안된다. 환장하겠다.Exception in thread "main" java.lang.ExceptionInInitializerErrorat com.hippolab.MyTopologyRunner.getApplicationContext(MyTopologyRunner.java:39)at com.hippolab.AbstractTopol..

IT/PROGRAMMING 2019.03.10

[Spring] spring-boot 1.5.X 부터 spring-kafka 사용할 수가 있네요.

스프링에서 @KafkaListener 어노테이션을 사용해서 간단하게 카프카 토픽을 바로보는 consumer를 작성하려면 spring-kafka 라이브러리가 필요하다. spring-boot를 적용한 환경에서 Maven pom.xml에 아래와 같이 dependency를 걸어주면 된다. org.springframework.kafka spring-kafka그런데 라이브러리가 추가가 안되서 확인해보니, spring-boot 1.5.X 이후부터 spring-kafka를 사용할 수 있었다. 직접 필요한 라이브러리들을 모두 추가하는 방법으로 spring-boot 1.4.X에서도 사용할 수 있는 것으로 보이지만, 그러고 싶지는 않았다. 어쩔수 없이 그냥 스프링부트 버전을 올렸다. 현재 최신버전인 spring-boot 2..

IT/PROGRAMMING 2019.03.06

[Java] 일정시간이 지나면 값이 없어지는(expiring) 맵, 캐시로 사용가능한 ExpiringMap

자바 프로그래밍을 하다보면 콜렉션(collection) 중에 맵(Map)을 많이 사용하게 된다.동시성(synchronization) 처리를 위하여 자바는 기본적으로 thread-safe한 java.util.concurrent.ConcurrentMap 객체를 제공한다. 또는 java.util.Collections.synchronizedMap()을 이용해도 된다.그리고 복합키를 이용할 수 있도록 Apache에서 MultiKeyMap 객체도 제공한다.Map에 키와 값을 계속해서 put하게되면 key만 중복되지 않으면 자꾸자꾸 들어가게 된다. 그 개수야 상당하게 크지만 그만큼 메모리 사용량은 늘어나게 된다. 필자도 spring-integration에서 이러한 현상을 발견하게 되었고 이를 해결하기 위하여, 일정시..

IT/PROGRAMMING 2019.02.24

[Java] Iterable을 stream으로 처리하기

자바에서 Iterable 인터페이스를 구현한 객체를 스트림으로 처리하는 간단한 방법이 있다.StreamSupport 클래스를 사용하면 되며, 자바에 기본으로 포함되어 있다.아래 소스와 같이 Iterable에서 Spliterator를 얻어서 stream 처리하면 된다. Iterable iterable = new LinkedList(); Spliterator spliterator = iterable.spliterator(); StreamSupport.stream(spliterator, false) .forEach(data -> { }); StreamSupport.stream()의 두번째 파라미터를 true로 주면 parallel(병렬) 스트림 처리도 가능하다.

IT/PROGRAMMING 2019.02.20

[Spring] spring-boot 버전 1.X와 2.X에서 Page 객체를 ObjectMapper(Jackson) 사용시 차이점

최신 spring-boot 릴리즈 버전은 2.1.3 이다. 특별한 사유가 없는한 새로운 프로젝트를 시작한다면 이 버전으로 셋팅할 것이다. 하지만 2~3년전에 만들어진 프로젝트는 spring-boot 버전 1.X를 사용했을 것이다.필자도 수년전에 개발하고 운영중인 시스템은 spring-boot 1.4.X가 적용되어 있으며, spring-data의 JPA로 DB에서 Pageable을 이용한 페이징과 정렬 처리를 하는 기능이 많다. 이 기능의 반환타입은 Page이며 실제 구현체는 PageImpl로 되어있다. 이 Page 객체를 @RestController의 응답값으로 곧바로 넘기고, ObjectMapper(Jackson)를 통하여 JSON 문자열로 변환된다.최근 spring-boot 1.4.X를 2.X로 버전..

IT/PROGRAMMING 2019.02.19

[Spring] 웹어플리케이션의 Whitelabel 오류 페이지 비활성화

스프링으로 웹어플리케이션을 작성하면 기본적인 오류화면은 아래와 같이 "Whitelabel Error Page"가 보일것이다. 이 오류화면을 없애고 싶다면 아래와 같이 application.properties 파일에 설정을 추가하면 된다. server.error.whitelabel.enabled=false 위 설정은 ErrorProperties.Whitelabel로 바인딩되는데, 기본값은 true 이다.package org.springframework.boot.autoconfigure.web; . . . public class ErrorProperties { ... public static class Whitelabel { /** * Whether to enable the default error page..

IT/PROGRAMMING 2019.02.19

[Java] 클래스에 정의된 제너릭(generic) 타입의 Class를 얻는 방법

자바에서 클래스를 정의할 때, 제너릭(generic) 타입을 종종 사용하게 된다.코딩을 하다보면 이 generic 타입이 어떤 클래스인지 알아야할 때가 있다.방법은 자바 리플렉션을 이용하면 된다. 아래와 같이 ClassUtil 클래스에 2개 메서드를 작성하였다.getGenericTypsClasses() 메서드는 generic 타입을 얻기위한 핵심 코드이며, 복수개로 정의된 generic 타입을 위하여 리스트로 반환한다.getGenericTypsClass() 메서드는 원하는 위치(index)의 generic 타입을 얻기위하여 작성하였다. public class ClassUtil { /** * 클래스에 정의된 generic 타입의 Class를 얻는다. * @param clazz 클래스 * @return Ge..

IT/PROGRAMMING 2019.02.12

[Spring] @RequestMapping의 wildcard 패턴 **의 값을 배열로 얻기

스프링 프레임워크를 이용하여 컨트롤러에 패턴을 등록하면 다양한 URI로 매핑시킬 수 있다.이때 와일드카드(wildcard)를 자주 사용하게 되는데 기본적으로 ?, *, ** 가 있다.아래는 스프링 문서 설명이다. ※ 출처: Spring Web MVC - Web on Servlet Stack (https://docs.spring.io/spring/docs/current/spring-framework-reference/web.html) 또한, {XXXXX}과 @PathVariable 어노테이션을 이용하여 URI의 특정부분을 변수에 할당할 수도 있다. 그리고 정규표현식(regular expression)도 지원한다. 가끔 매핑 패턴을 /path1/path2/** 처럼 여러개의 경로를 지원할 필요가 있는데, 단..

IT/PROGRAMMING 2019.02.09

[Java] IP주소가 loopback(127.0.0.1)인지 확인하는 방법

자바에서 입력한 IP주소가 loopback(127.0.0.1)인지 확인한다. /** * Loopback 네트워크 여부를 확인한다. * @param ipAddr IP 주소 * @return Loopback 네트워크 여부 * @throws UnknownHostException 입력한 IP주소가 잘못되었음 */ public static boolean isLoopbackAddress(String ipAddr) throws UnknownHostException { InetAddress inetAddress = InetAddress.getByName(ipAddr); return inetAddress.isLoopbackAddress(); }

IT/PROGRAMMING 2019.02.08

[Java] IP주소가 사설(private) 네트워크인지 확인하는 방법

자바에서 입력한 IP 주소가 사설(private) 네트워크인지 확인한다./** * 사설 네트워크 여부를 확인한다. * * @param ipAddr IP 주소 * @return 사설 네트워크 여부 * @throws UnknownHostException 입력한 IP주소가 잘못되었음 */ public static boolean isPrivateNetwork(String ipAddr) throws UnknownHostException { InetAddress inetAddress = InetAddress.getByName(ipAddr); return inetAddress.isSiteLocalAddress(); }

IT/PROGRAMMING 2019.02.08

[Spring] Spring bean의 scope를 prototype만 가능하도록 하려면?

public class MyBean implements BeanNameAware, BeanFactoryAware {/** * 빈 이름 */protected String beanName; @Overridepublic void setBeanName(String name) {this.beanName = name;} @Overridepublic void setBeanFactory(BeanFactory beanFactory) throws BeansException {// scope가 prototype만 허용if (beanFactory.isPrototype(this.beanName) == false) {throw new BeanCreationException(this.beanName, "Scope of bean m..

IT/PROGRAMMING 2019.02.06

iOS MDM Vendor CSR Signing

Customer actionCSR 생성openssl 이용키 생성openssl genrsa -des3 -out customer.pem 2048비밀번호 입력CSR 생성openssl req -new -key customer.pem -out customer.csr개인정보 입력DER로 변환openssl req -inform pem -outform der -in customer.csr -out customer.der customer.derMacOS 키체인 이용메뉴: 키체인 접근 -> 인증서 지원 -> 인증 기관에서 인증서 요청CSR 파일 (.certSigningRequest) 생성.csr로 확장자 변경DER로 변환 customer.der생성한 CSR 파일(customer.der)을 MDM verdor에게 전송 (혼..

IT/PROGRAMMING 2019.02.06
반응형