728x90

분류 전체보기 166

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..

MySQL 으로 형태소 분석기 없는 자동완성만들기

오늘은 간단하게 형태소 분석기 까지는 필요없는 자동완성 기능을 만들때 빠르게 만들 수 있는 방법을 해보려고 한다. 실제로 회사에도 적용한 방법이다 :) Ngram-Parser 를 택한 이유 일단 MySQL 에 ngram parser 를 이용한 방법인데 ngram parser 를 선택한 이유는 아래와 같았다. 첫째, 자동완성으로 검색되야 할 데이터 들이 MySQL 에서 관리되야 할 대상들이였다. -> 사실 NoSQL 로 가져가면 대표적으로 ES 형태소 분석 parser 나 빠른 검색등이 가능하다고 알려져 있으나 내 조건은 위와 같았다. 두번째, 딱히 ES 를 이것만을 사용하자고 추가하기에는 자원의 낭비이다. -> 굳이 MySQL 로도 가능한데 얼마 차이 안나는 성능때문에? 의문이다. 그리고 ROW 수가 적..

Spring 2022.02.24

Spring 에서 왜 Private Method 는 Cglib Proxy 에 포함이 되지않을까?

Spring 면접 하면 잘 등장하는 단골 질문 중 하나이다. 이 개념을 이해하기 위해서는 일단 Proxy 디자인 패턴에 대해서 간단하게 짚고 넘어가야 한다. 우리가 흔히 볼 수 있는 Server-Client 형태는 아래와 같다. Client 는 Server 에 요청을 보내고, Server 는 요청을 처리한다. 만약 객체 세상으로 가져온다고 했을때는 아래 그림처럼 A 객체가 B 객체에게 협력을 요청하는 것일 수 있다. 근데 만약 B 객체는 너무나 은밀한 친구라 중간에 누군가 자신이 한것처럼 대신 행동을 하는 척 해줬으면 좋겠다 라고 해보자. 그렇다면 A 객체는 B 객체와 이야기 하는것 같지만 사실은 대리자가 대신 해주고 있는 것으로 객체를 설계 해주어야 할 것이다. 위와 같은 설계가 될 것 이다. 하지만 ..

Spring 2022.02.22
728x90