Language

    Gson 직렬화/역직렬화를 이용하여 데이터를 가공하기

    예를 들어 TimeStamp 형식으로 수신되는 데이터를 LocalDateTime 으로 저장해야 하는 경우 역직렬화 클래스를 만들어 주어야 합니다. LocalDateTime 이라는 class 를 역직렬화 하기 위해 JsonDeserializer 를 상속받은 Adapter class 를 만들어줍니다. import com.google.gson.* import java.lang.reflect.Type import java.time.LocalDateTime import java.time.ZonedDateTime class TimestampConvertAdapter : JsonDeserializer { override fun deserialize(json: JsonElement, type: Type, jsonDes..

    Observer 패턴 예제

    Observer Interface interface Observer { fun update() } Subject Interface interface Subject { fun register(obj: Observer) fun unregister(obj: Observer) fun notifyObservers() fun getUpdate(obj: Observer): String } Topic Class class Topic : Subject { private val observers: MutableSet = mutableSetOf() private var message: String = "" override fun register(obj: Observer) { observers.add(obj) } overri..

    var list = mutableListOf<T>() 를 사용하지 마세요.

    변경할 수 있는 리스트를 만들어야 한다고 가정해 봅시다. val list1 = mutableListOf() var list2 = listOf() 위 두가지 모두 다음과 같은 방법을 이용하여 변경할 수 있습니다. list1.add(1) list2 = list2 + 1 모두 정상적으로 작동하지만 장단점이 있습니다. 두 가지 모두 변경 가능 지점(mutating point)가 있지만 위치가 다르다는 점입니다. 첫 번째 코드는 구체적인 리스트 구현 내부에 변경 가능 지점이 있습니다. 멀티스레드 처리가 이루어지면 내부적으로 동기화가 적절하게 되어 있는지 알 수 없어 위험하게 됩니다. 두 번째 코드는 프로퍼티 자체가 변경 가능 지점입니다. 따라서 멀티스레드 처리의 안정성이 더 좋다고 할 수 있겠지만 구현을 잘못 하..

    Hex 데이터(16진수)를 String 으로 표현하는 방법

    최근에 알개 된 방법입니다. 평소에는 logger.info($"data : {hexVal[0].toString("X2")}"); 이러한 식으로 표현했으나, logger.info($"data : {hexVal[0]:X2}"); 이러한 문법도 지원하는 것을 알았습니다.

    [Querydsl] n시간 이전 데이터 삭제

    @Transactional fun exampleMethod(): Long { var date = LocalDateTime.now() date = date.minusHours(1) return queryFactory .delete(table_name) .where(table_name.updatedAt.lt(date)) .execute() } 위 코드는 아래와 같이 작동됩니다. 현재 시간이 2021년 11월 20일 10시 5분 이라면, DELETE FROM `table_name` WHERE `table_name`.updatedAt < '2021-11-20 09:05:00' 위와 같은 쿼리문이 작성되는 것입니다. 쿼리 진행 후 삭제가 된 데이터의 갯수를 리턴하도록 되어 있습니다.

    yyyy-mm-ddTHH:mm:ss(LocalDateTime) 를 원하는 데로 주무르기(T 만 없애는 등)

    val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss", Locale.KOREA) val nowDateTime = LocalDateTime.now() val localStartDateTime = LocalDateTime.parse(nowDateTime.toString(), formatter) val DT = DateTimeFormatter.ofPattern("HH시 mm분 ss초").format(localStartDateTime) LocalDateTime.parse(nowDateTime.toString(), formatter) 에 변환할 LocalDateTime 형식의 변수를 할당하여 주시고 리턴되는 값을 변경하고 싶으시다면, DateTi..

    코틀린에서 java.time.LocalDateTime 을 비교하기

    import java.time.Duration import java.time.LocalDateTime 임포트를 해줍니다. val targetDate: LocalDateTime = LocalDateTime.of(2021, 9, 27, 17, 37, 39) val nowDate = LocalDateTime.now() // 2021, 9, 27, 17, 38, 00 val duration: Duration = Duration.between(targetDate, nowDate) 위와 같이 코드를 구성해 주면... 20초 라는 결과를 얻을 수 있습니다. 나노초 단위도 얻을 수 있습니다. 소요 시간을 한글로 표현 및 출력하려면 아래처럼 작성할 수 있습니다. val hours = seconds / 3600 val m..

    Composer Error Fix - it is missing from your system. Install or enable PHP's fileinfo extension

    처음에는 이 문제를 보고 다르게 이해를 했다가 패키지를 업데이트 하려고 했다. 하지만 해당 문제가 아니라, Problem 1 의 두번째에 있는 leafue/flyststem 을 보면, 내 시스템에 빠진게 있다. PHP의 fileinfo 확장을 설치하거나 활성화 해라 라고 되어 있다. 그래서 php.ini 를 살펴보면!!! 이렇게 주석 처리된 곳이 있다. 해당 부분을 풀어주고 다시 composer update 를 진행해 보자. 성공적으로 패키지가 설치/로드 되었다.

    C# .Net Core 로 만든 Linux 기반 멀티 소켓 서버 Base Project 공개

    https://github.com/Kuass/Csharp-Socket-Server Kuass/Csharp-Socket-Server Easy-to-customize projects that serve as the foundation for a powerful socket server. - Kuass/Csharp-Socket-Server github.com 소켓 서버 예제는 많지만 .Net Core 로 작성된 예제나 너무 간단하게만 이루어진 소켓 예제가 주류로 이루어 진 것 같아 Base Project 를 작성해 Github에 공개했습니다. 해당 서버에서는 자체적으로 Protocol 을 정의하여 여러분들이 직접 Custom 하기 용이한 형태로 개발된 상태입니다. 어디까지나 Base 예제이고 작동은 확인했으나..

    maven Project 를 gradle Project 로 변경할 때 dependencies 고치기(maven repository 활용)

    Minecraft 플러그인 빌드도구를 Maven 에서 Gradle 로 변경하면서 HikariCP 와 querydsl-sql 등을 그대로 작성하면 dependencies { implementation 'com.zaxxer:HikariCP' } 이렇게 작성하게 됬는데, 찾을 수 없다고 gradle 에서 build 에러가 났다. 그럴땐 https://mvnrepository.com/artifact/com.zaxxer/HikariCP 여기서 모듈을 검색한 뒤에 여기에 있는 글을 그대로 작성해주고 나서 빌드가 성공적으로 되었다.