2023-01-09-TIL
2023-01-09-TIL
Today I Learned
Jackson
Jackson은 자바에서 가장 널리 쓰이는 JSON 라이브러리다. jackson-databind는 스트리밍 API(jackson-core) 위에서 자바 객체와 JSON을 서로 바꾸는 데이터 바인딩 패키지이고, 중심에는 ObjectMapper가 있다(jackson-databind).
1
2
3
ObjectMapper mapper = new ObjectMapper();
MyValue value = mapper.readValue(json, MyValue.class);
String out = mapper.writeValueAsString(value);
README는 ObjectMapper를 한 번 만들어 재사용하라고 권한다. Javadoc은 모든 설정을 읽기나 쓰기 호출 전에 끝낸다는 조건에서 인스턴스가 스레드 안전하다고 적는다(ObjectMapper Javadoc 2.14). 첫 사용 이후에 설정을 바꾸면 반영될 수도 안 될 수도 있다. 호출마다 다른 설정이 필요하면 불변 객체인 ObjectReader, ObjectWriter를 만들어 쓰라고 하고, 이들은 생성 비용이 가벼워 호출마다 만들어도 된다고 설명한다.
첫 번째 링크는 하이퍼커넥트가 로컬 캐시를 Redis 같은 글로벌 캐시로 옮기면서 겪은 직렬화 문제를 정리한 글이다. 외부 저장소에 넣었다 꺼낸 값이 원래 객체와 같아야 하는데, getter나 생성자에 로직이 있으면 값이 달라질 수 있어서 필드만 직렬화하도록 가시성을 조정했다. 또 Object 타입으로 역직렬화하면 원래 타입을 알 수 없어서 타입 정보를 함께 저장해야 했고, Throwable처럼 자기 자신을 참조하는 필드는 무한 루프를 일으켰다. 캐시처럼 “직렬화한 값을 나중에 그대로 복원해야 하는” 용도에서는 API 응답용 JSON과 요구사항이 다르다는 점을 배웠다.
- https://hyperconnect.github.io/2019/10/28/jackson-serialize-for-global-caching.html
- https://d2.naver.com/helloworld/0473330
Duck Typing
“If it walks like a duck and it quacks like a duck, then it must be a duck”
Duck Typing이란, 어떤 사물이 오리처럼 행동하면 오리라고 간주할 수 있다는 프로그래밍 용어이다. 즉, 어떤 객체가 특정 목적을 위해서 사용될 수 있다면 해당 타입이 될 수 있다고 간주하는 기법이다. 타입이 강하게 정해지는 언어와는 달리 파이썬 등 일부 언어에서는 동적으로 정해진 역할을 수행할 수 있다면 해당 타입으로 간주하여 실행될 수 있다. 따라서 객체에서 기존 메서드를 호출하기 위해 타입을 지정할 필요가 없으며, ‘필요한 메서드(행동)’가 정의되어 있으면 invoke 할 수 있다.
Python 공식 용어집은 덕 타이핑을 객체의 타입을 보고 올바른 인터페이스인지 판단하지 않고, 메서드나 속성을 그냥 호출하거나 사용하는 스타일이라고 정의한다. 그래서 type()이나 isinstance() 검사를 피하고, 대신 hasattr() 검사나 EAFP 스타일을 쓴다(Python Glossary: duck-typing). EAFP는 “Easier to ask for forgiveness than permission”의 줄임말로, 일단 있다고 가정하고 호출한 뒤 없으면 예외를 잡는 방식이다.
1
2
3
4
5
6
7
8
9
10
11
class Duck:
def quack(self): return "Quack"
class Robot:
def quack(self): return "Beep quack"
def make_sound(x):
return x.quack() # 타입은 묻지 않는다
make_sound(Duck())
make_sound(Robot())
자바처럼 정적 타입 언어에서는 Robot이 Quackable 인터페이스를 구현한다고 선언해야 같은 코드를 쓸 수 있다. 덕 타이핑은 이런 선언 없이 유연하게 쓸 수 있는 대신, 필요한 메서드가 없다는 사실을 실행 시점에야 알게 된다는 대가가 있다.
- https://en.wikipedia.org/wiki/Duck_typing
- https://realpython.com/lessons/duck-typing/
- https://stackoverflow.com/questions/4205130/what-is-duck-typing
- https://nesoy.github.io/articles/2018-02/Duck-Typing
- https://siyoon210.tistory.com/156
Todo
- https://www.oreilly.com/
- https://if.kakao.com/session
- https://refactoring.guru/design-patterns
댓글
아직 댓글이 없습니다