본문 바로가기

분류 전체보기

(92)
[kotlin vs java ] 코틀린과 자바의 차이, 코틀린의 장점 기존에 java로 구현했던 spring 프로젝트를 kotlin으로 전환했다. 코틀린을 도입하기로 결정한 이유는 다음과 같았다. 왜 kotlin인가? 간결성, 생산성 코틀린은 자바보다 더 간결하고 직관적이라, 쓰고 읽는 데 시간이 덜 걸린다. 자바에 존재하는 여러 가지 번로운 준비 코드(생성자, 게터, 세터 등)들을 코틀린은 묵시적으로 제공하기 때문에 그런 준비코드 없이 더 깔끔하다. 기능이 다양한 표준 라이브러리를 제공하기 때문에 반복되는 코드를 줄일 수 있다. 안정성 실행 시점에 오류를 발생시키는 대신 컴파일 시점 검사를 통해 오류를 더 많이 방지해준다. 코틀린은 null이 될 수 없는 값을 추적하며, 실행 시점에 NullPointException이 발생할 수 있는 연산을 사용하는 코드를 금지한다. 자..
Kotlin/Spring 에서 logger 객체로 로그 출력하기 기본 사용방법 class TestClass { private val log = LoggerFactory.getLogger(javaClass) fun testMethod() { log.info("test log") } } 동작원리 파헤치기 LoggerFactory.getLogger() public static Logger getLogger(...) getLogger는 Logger 객체를 반환하는 static getter이다. Logger 실제 Logger 인터페이스 안에 info, debug, warn과 같은 메소드들이 선언되어 있다. public interface Logger { public void debug(Marker marker, String msg); public void info(String ..
[Spring] 하나의 build.gradle 파일로 여러 내부 프로젝트 빌드하기 하나의 프로젝트 내부에 여러개의 subProject가 존재하는 프로젝트의 경우 아래와 같이 build.gradle 파일이 여러개다. (서브 프로젝트 들이 모두 같은 빌드로직을 따른다면 여러 개일 필요 없다.) 전체 프로젝트 build.gradle 서브 프로젝트 각각의 build.gradle build.gradle buildscript { dependencies { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${kotlinVersion}" classpath "org.jetbrains.kotlin:kotlin-allopen:${kotlinVersion}" classpath "org.jetbrains.kotlin:kotlin-noarg:${kotlinVers..
[Java] Builder Pattern Builder Pattern 생성자에 매개변수가 많을 때 사용하는 방법 필수 매개변수 만으로 생성자를 호출해서 빌더 객체를 얻는다. 그 다음 빌더 객체가 제공하는 세터 메소드들로 원하는 선택 매개변수들을 설정한다. 빌더 패턴에 대한 자세한 내용은 이펙티브 자바 item2를 보고 링크에 정리했다. public class NutritionFactsBuilder { private final int servingSize; private final int servings; private final int calories; private final int fat; private final int sodium; private final int carbohydrate; public static class Builder..
@RequestBody로 지정한 객체에 꼭 기본 생성자가 필요할까? (com.fasterxml.jackson.databind.exc.InvalidDefinitionException) 에러 com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `객체!` (no Creators, like default construct, exist): cannot deserialize from Object value (no delegate- or property-based Creator) 에러 메세지를 읽어보면 requestBody로 전달되는 객체에 기본 생성자가 없어서 에러가 난다는 뜻이다. request로 전달되는 객체의 기본 생성자 아래처럼 requestBody로 전달되는 객체는 아무 파라미터를 넣지 않아도 생성되는 기본 생성자가 필요하다. @PostMapping("/page/data")..
[Java] Nested Class (중첩 클래스) 중첩 클래스 : 다른 클래스 안에 정의된 클래스 중첩 클래스는 자신을 감싼 바깥 클래스에서만 쓰여야 하며, 그 외의 쓰임이 있으면 중첩 클래스로 구현하면 안된다. Nested Class를 사용하는 이유 소스의 가독성, 유지보수 오직 한 곳에서 사용되는 클래스들의 논리적인 그룹핑 방법 한 클래스가 다른 하나의 클래스에서만 사용될 경우 → 두 클래스를 함께 두는 것이 논리적임 캡슐화 증대 private으로 다른 클래스들로 부터 감추자 Nested Class의 종류 static nested class local inner class (non-static) anonymouse inner class static nested class public class University { static class Stude..
[Spring] EHcache를 이용해 캐시 간단하게 적용하기 (feat. @ Cacheable) 자주 바뀌는 값이 아닌데, 데이터베이스에 접근해서 가져오는데 시간이 걸려서 불편할 때가 있다. 이럴 때 간단하게 서버 단에서 캐시로 들고 있을 수 있다. 필요성 데이터 중 매번 실시간 데이터를 반드시 반영해야 하는 경우가 아닐 때 복잡한 쿼리라 가져오는 작업이 빠르지 않을 때 위와 같은 경우 캐시 라이브러리를 이용해서 관리하면 성능에 도움이 된다. 스프링의 어노테이션을 이용해서 쉽게 캐싱처리를 할 수 있다. EHcache 자바 기반 캐시 오픈소스 기본 JVM메모리에 저장된다. 레디스처럼 별도의 서버 설치 없이 사용할 수 있어, 가볍게 사용하기 좋다. EHcache는 로컬캐시로서 특정 서버에 종속된다. → 따라서 멀티 서버 환경에서는 데이터 싱크가 필요하다. 장 : 데이터 접근이 빠르다. 단 : 동기화가 ..
[airflow] excution_date, macros를 이용해 DAG 실행 시점 지정하기 execution_date 기준 : execution_date의 기준은 utc 필요성 : datetime.now()로 설정하면 특정일에 dag이 실행되지 않아서 다음날 실행하는 경우, backfill로 과거 날짜를 실행하는 경우 등에 문제가 될 수 있음 execution_date에 저장되는 값 전날의 데이터를 배치하고 싶으면 그냥 execution_date를 사용하면 된다. ds, ds_nodash도 마찬가지 → 전날의 데이터를 가져오기 위해 yesterday_ds를 사용하지 않아도 된다. ex) 아래와 같이 설정된 DAG에서 default_args = { 'start_date': datetime(2021, 10, 18), ... } → 처음 실행 시점 : 2021-10-18 → 그때의 execution..