728x90

2022/03 10

Kotlin DSL

코틀린이란 언어는 상당히 문법적으로 코드를 간결하게 작성할 수 있는 기능을 많이 제공한다. "중위 연산자", "확장 함수", "람다구문의 it" 등 을 지원하고 있다. 우리는 이러한 방법을 이용해 좀 더 간결하게 코드를 작성할 수 있다. 예를 들면 아래와 같이 말이다. 1.to("one") 1 to "one" 확장함수를 이용하면 아래처럼 조금 더 객체지향 적인 코드를 짤 수 있다고 생각한다. StringUtil.capitalize(s) // java s.capitalize() // kotlin 내부 DSL 또한 코틀린에서는 좀 더 가독성 좋은 코드를 작성할 수 있도록 내부 DSL 또한 지원한다. 여기서 짚고 넘어가야 할 점이 있는데 DSL 에 대해서 조금 알아보자. 우리가 보통 잘 알고 있는 DSL 은 ..

Kotlin 2022.03.28

Jackson Databind 에서 is, get, set 을 이용하면 자동으로 값으로 인식하는 이유

회사 코드를 작성하다가 DB 에 Json 파일을 업로드 하던 중에 자꾸 'isXXX' 로 적어둔 함수를 Jackson 라이브러리에서 Property 로 만드려고 하는 현상을 목격하였다. 이게 도대체 왜 그런거지? 라는 생각이 들었는데, 기본적으로 get / set / is 의 경우에는 해당 필드가 어떤 값을 나타내는지에 대한 함수라고 생각해서 Jackson 라이브러리가 이렇게 만드는 건가? 라는 생각이 들었다. 하지만 그게 편하다고 보통의 오픈소스 라이브러리에서 그렇게 만들지는 않으므로 무언가 따르는 규칙이 있을거라고 생각했다. 사실 저 위의 문구만 봐도 감이오는 사람이 있을텐데. 바로 자바 빈 규약 (Java Bean notation) 이다. 예전에 한번 본적이 있었는데 한글 블로그에는 대다수가 그렇게..

Java 2022.03.22

[JPA] Transactional read only 일때 성능상 이점

회사에서 @Transacational(readOnly = true) 일때 어떤 성능점 이점이 있을까? 라는 것을 생각해보았다. 기본적으로 무거운 Dirty Check 등을 안한다의 지식을 알고 있었는데, 근데 Dirty Check 는 왜 무거운데? 그리고 Snapshot 비교는? 등등 너무 궁금한 점이 많아져서 코드를 직접 분석하기로 했다. 일단 첫번째 코드는 isReadOnly 에 대한 분석인데, 설명을 간략하게 설명하면 아래와 같다. 이걸 read-only transaction 으로 optimize 할건지에 대한 여부를 알려주는 flag 라고 생각하면 된다. 참고로 어떻게 현재 트랜잭션에서 readOnly 여부를 알려주는 코드는 아래에 있다. 우리가 @Transactional(readOnly=true..

Spring 2022.03.21

Kotlin 의 확장함수가 좋은 이유

사실 우리가 특정 클래스를 이용하다보면 자신이 수동으로 생성한 Mapper 혹은 라이브러리로 만들어진 Mapper 를 통해서 해당 클래스를 변환해야 하는 일이 생길 수 있다. 근데 나는 이런 Mapper 를 쓰는게 좋은 코딩이지는 잘 모르겠다. 너무 번잡하게 만드는 것이 아닌가? 라는 생각이 든다. 그래서 공통모듈 Mapper 를 쓰는걸 좋아하지 않는다. 코드로 설명하면 대략적으로 아래와 같다. Integer a = 10; String b = StringMapper.from(a); System.out.println(b) // "10" 위의 코드가 Mapper 를 쓰는 예시인데 나는 이게 객체지향스러운가 라는 의문도 있긴하다. 사실 대부분 위처럼 쓰는 사람은 많지 않을테고, 아래처럼 쓰는 경우가 훨씬 많다..

Kotlin 2022.03.18

Kotlin Spring 에서 Required = false 대신 ?(nullable) 을 사용가능한 이유

회사 코드를 짜다가 문득 생각이 하나 들었는데 Java 에서 @RequestParam(Required = false) 대신 Optional Long id 이런식으로 사용하면 동일하게 작동할 수 있다는 사실을 알고 있었다. 이것이 가능한 이유는 Spring Framework 의 RequestParamArgumentResolver 코드에 아래와 같은 코드가 존재한다. 여기서 중요한건 parameter.nestedIfOptional 인데 해당 Type 이 옵셔널인지 확인해주는 코드이다. 그래서 코틀린에서도 ?(nullable-type) 을 통해서 충분히 가능하지 않을까 생각하고 동일 위치에 디버그를 찍어보았다. 위의 디버깅 결과가 결론을 말해주는데 즉, 코틀린에서는 required = false 를 사용할 이..

Spring 2022.03.17

Hibernate 1 차 Cache 에 대해서 알아보자

Hibernate 에서는 데이터베이스의 부하를 줄이기 위해서 1차 캐시를 이용한다. 1차 캐시란 Transaction 내에서 작동하는 캐시를 뜻한다. 이 글은 위의 1차 캐시가 어떻게 작동하는지 알기에 본다고 생각하고, Hibernate 의 코드를 분석하는데만 신경을 쓸 것이다. 코드는 매우 간단합니다. @Service public class UserService { private final UserRepository userRepository; public UserService(UserRepository userRepository) { this.userRepository = userRepository; } @Transactional public void test() { User user = new Us..

Spring 2022.03.10

왜 계층간의 모델을 형성해야 하는가?

최근 읽었던 책 만들면서 배우는 클린 아키텍쳐와 그리고 리뷰를 하면서 받았던 질문들 중 "언제 DTO 를 사용해야 하나요? 혹은 왜 계층간 DTO 를 사용해야 하나요?" 라는 질문을 받은 적이 있다. 예전부터 한번쯤 정리해야지 했었는데, 이제는 글로 적어두는게 나을거 같아서 해당 내용을 글로 적어보려고 한다. 일반적인 우리의 서버 아키텍쳐는 아래와 같은 구조를 가지고 있을 것 이다. 우리는 보통 Repository 는 특정 외부 저장소 혹은 내부 저장소에 질의 하는 방법을 구현하고 있을 것이고, Service 는 우리가 수행해야 할 도메인(비즈니스) 로직을 구현하고 있을 것이다. Controller 계층은 외부세계에서의 요청을 받고, 내부세계에서 쓰기 좋게 외부세계로 부터 받아온 데이터 모델을 변환(Co..

Architecture 2022.03.07

[MySQL] ngram parser 를 이용할때 'a' 가 검색이 잘되지 않는 이유

이전에 ngram parser 를 이용한 자동완성 기능을 만들었다고 했었다. 실제로 적용해보니 문제가 있었는데 아래와 같은 문제가 발생했다. 위의 화면을 보면 'ach' 가 포함되어 있는 것만 검색하려고 BOOLEAN MODE 를 적용해서 쿼리를 날렸음에도 ach 가 없는 김루루 라는 콜럼이 검색되게 된다. 이유가 무엇일까? 문제 추론 처음에는 MySQL 의 Ngram Parser 의 Token size 를 1로 저장해놔서 아래와 같이 잘려서 그냥 알파벳만 들어가 있어도 검색이 되나 싶었다. 하지만 위와 같은 추론을 하기에는 무언가 연관성이 없어보였다. 왜냐하면 다른 글자로 검색을 해봤을때는 너무 잘 나오는 것이다. 이때까지만 해도 'a' 가 문제인줄을 몰랐다. 그래서 알아보던 도중 ngram parse..

728x90