본문 바로가기

전체 글155

Kotlin in Action #7. 연산자 오버로딩과 기타 관례 'Kotlin in Action' 책을 학습하고 정리한 내용입니다. 7. 연산자 오버로딩과 기타 관례 언어 기능을 타입에 의존하는 자바와 달리 코틀린은 함수 이름을 통한 관례에 의존한다는 점이 특징이다. 이러한 관례를 선택한 이유는 기존 자바와 호환성을 맞춰야 하는데, 코틀린 쪽에서 자바 인터페이스를 변경할 수 없기 때문이다. 코틀린은 기존 자바 코드를 바꾸지 않음에도 새로운 기능을 부여할 수 있다. 산술 연산자 오버로딩 코틀린에서 관례를 사용하는 가장 단순한 예는 산술연산자이다. 자바에서는 원시 타입과 String 타입에 대해서만 + 연산자를 사용할 수 있다. 코틀린에서는 다른 클래스에 대해서도 산술연산자를 사용할 수 있게 기능을 정의할 수 있다. 이항 산술 연산 오버로딩 Plus data class를.. 2021. 8. 16.
Kotlin in Action #6. 코틀린 타입 시스템 'Kotlin in Action' 책을 학습하고 정리한 내용입니다. 6. 코틀린 타입 시스템 null 가능성 코틀린에서는 null에 문제점을 컴파일 시점으로 옮겼다. null이 될 수 있는지 여부를 타입 시스템에 추가함으로써 컴파일러가 컴파일 시 미리 감지 할 수 있기 때문에 실행 시점에 발생할 수 있는 가능성을 줄였다. null이 될 수 있는 타입 자바의 차이점으로 코틀린은 타입 시스템이 null이 될 수 있는 타입을 명시적으로 지원한다. 타입 이름 뒤에 물음표를 붙이면, 타입의 변수나 프로퍼티에 null 참조를 저장할 수 있다. 물음표가 없는 타입은 null 참조를 할 수 없으며, 컴파일 시 에러가 발생한다. val number1: Integer? = null val number2: Integer =.. 2021. 8. 16.
@Id와 @Convert가 같이 있을 때 정상 동작하지 않는 이유 문제 상황 Entity에서 테이블의 컬럼이 String 타입인 것을 LocalDate 타입으로 변경하려고 했습니다. 기존에 정의 되어 있는 Converter 구현체가 있었기 때문에 @Convert 어노테이션을 사용해서 적용했는데, 실제로 Converter로 로직을 타지 않고 java.sql.Date 클래스의 valueOf 메서드가 호출되고 있었습니다. java.sql.Date 클래스의 valueOf 메서드는 문자열 날짜 값을 파싱할 때, 날짜 형식이 yyyy-[m]m-[d]d가 아니면, IllegalArgumentException 에러를 던지고 있습니다. 테이블에 저장되어 있는 값이 마침 yyyymmdd로 저장되어 있어서 계속 에러가 발생했습니다. class LocalDateConverter : Attr.. 2021. 8. 16.
Kotlin에서 SLF4J Logger 객체 생성 방법 Java에서는 Logger 객체를 직접 개발자가 생성하지 않고, Lombok의 @Slf4j 어노테이션을 클래스 레벨에 붙여서 사용합니다. Kotlin에서는 Lombok을 잘 사용하지 않기도 하고, Logger 객체를 생성하는 다양한 방법이 있지만 현재 프로젝트에서는 간단하게 아래와 같은 코드로 사용하고 있습니다. class TestClass { private val log = LoggerFactory.getLogger(javaClass) fun testMethod() { log.info("test log") } } 매번 LoggerFactory를 사용하는 동일한 코드를 반복하기 싫으면, 아래 링크를 통해 3가지 방법은 참고 할 수 있습니다. https://www.reddit.com/r/Kotlin/com.. 2021. 8. 16.
zsh, 환경 변수 추가 (Kotlin에서 환경 변수 값 가져오기) 1.terminal 실행한 뒤, 환경 변수 설정 $ echo 'export GH_USERANME=jayden-lee' >> ~/.zshenv 2.변경 사항 반영 $ source ~/.zshenv 3.환경 변수 설정 테스트 $ echo $GH_USERNAME Kotlin 에서 환경 변수 값 가져오기 fun main() { val ghUsername = System.getenv("GH_USERNAME") println(ghUsername) // jayden-lee } 2020. 4. 4.
Logback JSON 포맷으로 출력하기 의존성 추가 build.gradle 파일에 아래 의존성을 추가한다. compileOnly("ch.qos.logback.contrib:logback-jackson:0.1.5") compileOnly("ch.qos.logback.contrib:logback-json-classic:0.1.5") JsonLayout 설정하기 logback.xml 파일에 로그 메시지를 JsonLayout으로 출력되도록 설정한다. 추가적으로 JacksonJsonFormatter을 설정하면 Json 로그 메시지가 Json Formatter가 적용되어 출력된다. yyyy-MM-dd'T'HH:mm:ss.SSSX Etc/UTC true true 2020. 2. 28.
Github Action 에서 Submodule 설정 방법 프로젝트에 submodule이 등록되어 있으면, Github Action에서 checkout을 할 때 반드시 Submodule 옵션을 설정 해야 합니다. 만약 다른 Module에서 Submodule에 있는 소스코드를 참조 하고 있다면, "unresolved reference" 에러 메시지가 표시되고 빌드 에러가 발생합니다. Submodule 설정은 간단합니다. submoudles: true 한 줄만 추가 하면 됩니다. Submodule을 접근할 때 토큰을 필요로 한다면, 토큰 값도 같이 설정하면 됩니다. ${{ secrets.GITHUB_TOKEN }} 정보는 Setting > Secrets 에서 미리 설정 해놓은 값을 가져옵니다. - name: Checkout uses: actions/checkout@.. 2020. 2. 28.
Kotlin in Action #3. 함수 정의와 호출 'Kotlin in Action' 책을 학습하고 정리한 내용입니다. 3. 함수 정의와 호출 코틀린에서 함수 정의와 호출하는 방법에 대해서 살펴보는 것을 중점으로 한다. 그리고 더 나아가 확장 함수 및 프로퍼티를 사용함으로써 코틀린이 자바와 함께 사용했을 때 어떤 장점이 있는지 알아보자. 코틀린에서 컬렉션 만들기 코틀린에서 set, list, map 컬렉션 객체를 생성하고 어떤 클래스에 속하는지 출력하면 익숙한 텍스트를 볼 수 있다. fun main(args: Array) { var set = hashSetOf(1, 5, 10) var list = arrayListOf(1,2,3) var map = hashMapOf(1 to "one", 3 to "three", 5 to "five") println(set.. 2020. 2. 23.
Kotlin in Action #2. 코틀린 기초 'Kotlin in Action' 책을 학습하고 정리한 내용입니다. 2. 코틀린 기초 이번에는 모든 프로그램에서 필수 요소인 변수, 함수, 클래스 등을 코틀린에서 어떻게 선언하고 활용하는지 살펴본다. 또한, 제어 구조문과 스마트 캐스트, 예외처리에 대해서도 알아본다. 함수와 변수 Hello World 프로그램 Hello World를 콘솔에 출력하는 프로그램을 만들어보자. 코틀린에서는 함수 하나로 쉽게 만들 수 있다. fun main(args: Array) { println("Hello World") } 함수를 선언할 때 fun 키워드를 사용한다. 자바와 다르게 파라미터 이름 뒤에 파라미터 타입을 쓴다. 함수를 클래스 안이 아닌 최상위 수준에 정의할 수 있다. 배열도 일반적인 클래스와 마찬가지이다. 코틀린.. 2020. 2. 17.