이번 포스팅 내용은 kotlin 과 jackson 조합시에만 발생하므로 java 이용시엔 해당하지않는다. 정확히말하면 jackson 에서 kotlin 지원을 위한 모듈인 jackson-module-kotlin 의 문제다. jackson-module-kotlin 2.10.0 까지는 data class 를 json 으로 serialize 시 is 로 시작하는 프로퍼티에 대해 is 를 제거한 key 로 serialize 했다. 쉽게 코드를 보고 얘기하자면 data class Person( val isDeveloper: Boolean ) 이 클래스를 serialize 시 json 형태는 이런 형태였다. {"developer":true} jackson-kotlin-module 2.10.1 부터는 이 스펙이 변경되..

JPA 유튜브 중에 아래와같은 동영상이 있어 이 문제를 해결해보고자한다. https://www.youtube.com/watch?v=brE0tYOV9jQ&t=156s 먼저 방송에서도 언급하지만 코드베이스는 매우작다. BOOK 엔티티와 BOOK_STORE 엔티티 두개만 존재하고 이 둘은 BOOK(N) : BOOK_STORE(1) 관계이다. @Entity @Getter @Setter public class Book { @Id @GeneratedValue @Column(name = "BOOK_ID") private Long id; @Column(name = "ISBN") private String isbn; @Column(name = "TITLE") private String title; @ManyToOne p..
멀티 스레드간에 동기화를 하기위해선 락을 잡아야한다. 자바에서 락을 잡는법은 모두들 알고있을 synchronized 키워드를 이용한 모니터락을 잡는방법과 1.5부터 추가된 Lock 인터페이스의 구현체를 이용하는 방법이 있다. 이 두 방식에서 각각 데드락 상태가 됐을때 스레드덤프의 내용은 동일한 내용일까? 이 포스팅에서는 그 차이를 확인해보려한다. 먼저 synchronized 키워드를 이용한 간단한 데드락 코드를 작성하자. private final Object lock1 = new Object(); private final Object lock2 = new Object(); public static void main(String[] arg) { ExecutorService es = Executors.new..
Java 1.5 에 추가된 concurrent 패키지엔 유용한 동기화 클래스들을 제공해준다. 이 클래스들을 이용하면 손쉽게 멀티 스레드에 안전한 코드를 작성할 수 있다. 이번 포스팅에서는 concurrent 패키지 내에 있는 3개의 동기화 클래스를 간략하게 알아보고자 한다. 1. CountDownLatch Latch 의 사전적 의미는 '걸쇠' 이다. 원하는 지점에서 await() 메서드를 호출해서(걸쇠를 걸어서) 코드의 진행을 중단시키고, 다른 스레드들에서 원하는 횟수만큼 countDown() 메서드를 호출해주면 그때 비로소 코드가 진행되게 된다. 코드로 확인해보자. 원하는 횟수를 지정한 인스턴스를 생성한다. 해당 예제코드에서는 5를 지정했다. CountDownLatch countDownLatch = n..
2020년 3월 17일 GA 예정인 JDK 14 의 몇가지 피처들을 정리해본다. Pattern Matching for instanceof (Preview) 런타임에 객체의 타입을 확인하는 instanceof 연산자는 보통 아래와같은 관용구(idiom)로 많이 사용된다. if(obj instanceof String) { String s = (String) obj; } 이 instanceof 연산자를 확장하여 아래와같은 문법을 지원한다. if(obj instanceof String s) { // String 타입의 s 변수 사용 } 코틀린에 대한 경험이 있는 사람이라면 바로 느꼈겠지만 코틀린의 스마트 캐스팅과 유사한 문법으로 보인다. 다만 한가지 좀 이해하기 어려운 스펙이 있는데 if (obj instanc..
CI(Continuous Integration) 란 말은 예전부터 많이 들어본 분들이 있을것이다. CI 와 함께 대표적인 CI 툴로 jenkins 를 알고있고, 사용하고있는 분들도 많을 것이다. 그러다가 언젠가부터 CI 를 넘어서서 CD 라는 용어가 들리기 시작했다. 어떤자료는 D 를 delivery 를 사용하기도하고, 어떤자료는 deployment 를 사용하기도한다. 대충 비슷해보이기는하는데 delivery 와 deployment 는 무슨 차이가 있을까? 혹은 같은 내용인데 두 가지 용어로 불리는걸까? 그리고 CD(delivery 든 deployment 든지간에) 와 CI 는 어떻게 다를까? 그 차이를 알아보자. CI(Continuous Integration, 지속적인 통합) 코드는 지속적으로 변경되고..
기본적으로 kotlin의 generics 는 자바와 많은 부분에서 비슷하다. 하지만 몇가지 달라진점, 추가된점들이 있는데 그 것들을 정리한다. 기본적으로 자바의 generics 을 어느정도 이해하고있다는 가정하에 얘기가 진행되므로 generics 전체를 자세히 설명하지는 않는다. 1. Star Projection * 를 이용해서 표현한다. 특정 타입을 지정하지않을때 사용하며, 자바의 와일드카드라고 생각하면 된다. 와일드카드와 동일하게 타입을 캡쳐하지않기때문에 타입안정성을 보장받지못한다. 다만 자바의 와일드카드처럼 한정적 와일드카드(bounded wildcard) 문법은 지원하지않는다. // 와일드카드처럼 사용 가능. val list: List = listOf(1, 2, 3) // 타입을 캡쳐하지않기때문에..
1. collection val evens: List = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) .filter { it % 2 == 0 } 코를린에서 처음 이런 코드를 봤을때 아무 생각없이 난 이렇게 생각했었다. '오 코틀린은 stream 호출안해도 알아서 stream 으로 바꿔주나보다' 이렇게 생각한 근거는 딱히 없다. 그냥 stream 과 동일한 API 를 제공하고있어서 그렇게 생각했던것 같다. (많이 알겠지만 filter, map 과 같은 api들은 매우 범용적인 네이밍이라 프로그래밍 언어 차원을 넘어서서 여기저기서 많이 제공하고있는 명칭이다.) 하지만 그게 아니란걸 알게되어 이 포스팅을 작성하게됐다. 사실 신중히 고민해봤다면 이상한걸 느꼈어야한다. stream 으로 변..
1. 자바의 지역변수 스레드 세이프 자바에서 지역변수는 람다나 익명클래스 내에서 값을 변경할 수 없다. 람다나 익명클래스에서만 값을 변경할 수 없을뿐아니라 람다나 익명클래스에서 읽고(read) 있다면 외부 메서드 내에서도 값을 변경할 수 없다. 이 규약을 지키기위해 람다가 없던 자바7까지는 익명클래스에서 외부 메서드의 지역변수를 읽기위해선 지역변수를 final 로 선언했어야했고, 람다가 추가된 자바8 이상에서는 effectively final(사실상 final) 이라는 규약으로 final 변수가 아니더라도 람다나 익명클래스에서 읽고있다면 사실상 final 이 되어 어디서도 값을 변경할 수 없다. public void test() { int number = 100; new Runnable() { @Over..
면접관으로 들어가서 알고있는 디자인 패턴이 어떤게 있는지를 질문해보면 가장 많이 나오는 대답이 MVC패턴과 싱글톤 패턴이다. 커뮤니티를 봐도 디자인패턴에 대한 질문은 싱글톤의 비중이 압도적이다. 개인적으로 싱글톤이 왜 이렇게 인기가 많을까 생각해봤는데 패턴이 추구하는 바가 비교적 명확하고, 처음 패턴을 공부하는 초보 개발자들이 적용하기에도 가장 만만해서 그런게 아닐까싶다. 그럼 이제 싱글턴 패턴에 대해 알아보자. 싱글턴 패턴은 애플리케이션 내에서 하나의 클래스가 하나의 인스턴스만 생성하는걸 강제하는 패턴이다. 자바에서 객체를 생성하는 메커니즘은 생성자를 이용해서 객체를 생성하는 것이다. public class Singleton { public Singleton() { } } Singleton single..
- Total
- Today
- Yesterday
- http
- frontcode
- frontend개발환경
- code
- Spring
- mariadb
- toby
- servlet
- Design Pattern
- programming
- generics
- Git
- MySQL
- java8
- clean code
- javascript
- TEST
- OOP
- DesignPattern
- EffectiveJava
- backend개발환경
- 정규표현식
- Jackson
- Kotlin
- db
- JPA
- spring cloud
- java
- JavaScript Core
- go-core
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |