728x90

분류 전체보기 173

Domain 모델에 Domain 로직을 담아야 하는 이유

최근 DDD 와 관련된 공부들을 꾸준히 해나가고 있는데, 사실 이건 DDD 에 해당하는 것이 아니라 객체지향에서도 당연한 일이기도 하다. 객체가 자신의 행위(Behavior) 에 대한 인터페이스를 제공하는 것은 당연하기 때문이다. 함수형 프로그래밍에서는 객체를 모델로 만들어 두고, 행위를 정의하는 곳을 분리하여 두는 것으로 알고 있다. 하여튼 각각의 프로그래밍 패러다임으로 어떻게 구현하든 도메인 모델에 그와 관련된 행위가 정의되어 있는 것이 좋은 이유에 대해 설명해보려고 한다. 이건 사실 좋은 코드를 작성하는 가장 원칙적인 기준인 응집도에 관한 문제이기도 하다. 응집도에 대한 것을 모른다면 내가 적은 아래 글을 읽어보길 바란다. 나는 좋은 코드를 작성하는 원칙은 전부 응집도와 결합도 부터 시작한다고 생각..

Architecture 2022.05.01

Spring-Cloud-Sleuth 비동기 요청시 서버간 TraceId 보존하는 방법

방법을 찾게 된 계기 Java 나 Kotlin 에서는 ThreadLocal 을 이용가능하다. 주로 Logback 의 MDC 에서도 이 ThreadLocal 을 이용해서 하나의 스레드내에서 동작하는 특정 값을 로깅하기 위해 이용한다. Slueth 또한 MDC 를 이용하는데 MDC 에 traceId 와 spanId 를 저장한다. traceId 를 어떻게 Thread 에서만이 아닌 서로 다른 서버에서도 똑같은 값으로 주어 좀 더 흐름을 찾기 쉽게 만들까? 라는 고민을 하다가 아래와 같이 삽질을 하게 되었다. 예시 백문이 불여일타라고 예시코드로 시작해보자. 일단 ThreadPoolTaskExecutor 를 테스트를 위해서 대충 만들어보자. 이제 Async 에서는 위의 ThreadPoolTaskExecutor 를..

Spring 2022.04.27

오늘자 삽질 - Spring Kafka

회사에서 Spring Kafka 를 연동하던 중에 Local 에서 콘솔로 Topic 에 직접 Message 를 쏘니 잘 안되는 상황이 발생했다. 그래서 처음에는 아 key-serializer 와 value-serializer 가 잘못 설정되어 있나? 라는 생각을 했다. 사실 내가 짠 코드가 아니여서 코드를 디버깅 좀 해보다가 처음에는 KafkaRecord 에 자꾸 코드에서 DeserializerException 을 넣길래 아니 이게 key-value deserializer 가 잘못되어 있는거 아니야? 하고 빼고 하니깐 Default Serializer 인 StringDeserializer 로 값이 넘어와서 잘 보였다. 하지만 Object 로 Mapping 되지 않았다. 그래서 궁금해서 ErrorHandl..

Spring 2022.04.13

Spring Web Flux 에 대해

어제 Block, NonBlock, Sync, Async 에 대해서 정리했는데 참고하려면 아래글을 읽으면 좋을 것 같다 http://roach-wiki.com/doku.php?id=block block [Roach'Wiki] roach-wiki.com 생각해보니 요즘 컴퓨팅 환경을 생각했을때 Spring WebFlux 성능이 진짜 좋을 수 밖에 없지 않나? 라는 생각이 들었다. 사실 그래서 예전에 공부하려다만 Spring Reactor 에 대해서 공부해보려고 한다. 들어오자마자 WebClient 가 나왔는데.. 나중에 Feign, WebClient(Reactor), RestTemplate 성능 테스트를 한번 해봐야겠다. 17일부터 동규님이 NextStep 에서 진행하는 인프라 공방도 수강하니까.. 그거 ..

끄적 2022.04.08

기존에 있던 Object 를 Bean 으로 등록하는 방법

Spring Bean 은 MetaData 정보를 가지고 저장되는데 해당 정보를 나타내는 클래스는 BeanDefinition 이다. 가지고 있는 MetaData 정보는 아래와 같다. - package-qualified Class Name - IoC Container 내에서의 Spring Bean 동작 요소 (LifeCycle, Scope, etc..) - 의존성을 지니고 있는 다른 Bean 과의 관계 - 새롭게 만들어질 Bean 에 적용될 Configuration 정보들 (Hibernate Connection Pool Size 과 같은 것들) 즉, IoC Container 에서 해당 Bean 을 어떻게 생성해야 할지 정보를 적어 놓는 것이다. 부가적으로 ApplicationContext 에서는 사용자가 생..

Spring 2022.04.05

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
728x90