본문 바로가기

분류 전체보기

(91)
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..
[Git] 커밋 히스토리 관리를 위한 명령어 : cherry pick, rebase cherry pick 원하는 커밋 가져오기 특정 커밋을 현재 HEAD가 가리키는 브랜치에 추가할 수 있게 해준다. 다른 브랜치에 있는 커밋을 지금 내 브랜치에 가져와서 커밋할 수 있는 것 git cherry-pick abc123 git cherry-pick abc123..bfe123 git cherry-pick abc123^..gde123 rebase 동작 과정 이미 푸시한 커밋에 대해서는 rebase하지 말기 위과 같은 커밋 히스토리를 가질 때, feature/rebase-test 브랜치에서 git rebase develop를 실행했을 때 동작 과정은 아래와 같다. 두 브랜치가 나뉘기 전인 공통 커밋으로 이동하고 나서 그 커밋부터 지금 checkout한 브랜치가 가리키는 커밋까지 diff를 차례로 만들..

반응형