일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- https go
- 코틀린
- image resizer with go
- 코틀린 in
- kotlin
- 자바
- Test
- 공짜블로그
- Convariance
- Java
- 코틀린 out
- https 실습
- standard input
- output stream
- InnoDB
- IntelliJ
- https 서버 구현
- MySQL
- cli 만들기
- JPA
- 개인블로그 hugo
- 돌연변이 테스팅
- resize image with go
- resizer 구현
- Mutation testing
- 객체지향
- standard output
- Pitest
- https implement
- ruby
- Today
- Total
목록Spring (14)
Rlog
최근 Reactive Programming 에 조금씩 관심을 기울여서 보고 있는데 강의를 보다가 하나 궁금한점이 생겼다. 아래 코드를 보면 Flux, Mono Type 으로 Return 하거나 RequestBody 에서 부터 받아서 사용하는데 이게 도대체 무슨차이지? 라는 생각이 들었다. Kotlin Coroutine 이나 JavaScript 의 Promise Model 을 공부하면서 느낀건 결국 Reactive 세상에서 가장 중요한건 아래의 두가지라는 생각이 들었다. Thread 의 Blocking 을 최소화 하는 코드를 작성해라. Lazily 하게 값이 evaluate 되어야 한다. 위의 두가지가 제일 중요하기에 Fully Non-Blocking 이라고 불리는 Web-Flux 에서 Response 에..
Spring 의 Transaction 을 사용하다 보면 이런 생각이 든적이 있을 것이다. 어떻게 Propagation 정책이 동작하는거지? Code 가 Generate 될때 Inline 함수처럼 해당 함수로 들어가는건 아닐 것 같은데? 어떻게 같은 Session 을 공유하는 걸까? 라는 생각이 들 것이다. 아래의 코드를 한번 보자. 김영한님의 스프링 DB 1편 강좌의 예시 코드 중 하나이다. public void updateMoney(Connection conn, String memberId, int money) throws SQLException { String sql = "update member set money = ? where member_id = ?"; PreparedStatement pstm..
방법을 찾게 된 계기 Java 나 Kotlin 에서는 ThreadLocal 을 이용가능하다. 주로 Logback 의 MDC 에서도 이 ThreadLocal 을 이용해서 하나의 스레드내에서 동작하는 특정 값을 로깅하기 위해 이용한다. Slueth 또한 MDC 를 이용하는데 MDC 에 traceId 와 spanId 를 저장한다. traceId 를 어떻게 Thread 에서만이 아닌 서로 다른 서버에서도 똑같은 값으로 주어 좀 더 흐름을 찾기 쉽게 만들까? 라는 고민을 하다가 아래와 같이 삽질을 하게 되었다. 예시 백문이 불여일타라고 예시코드로 시작해보자. 일단 ThreadPoolTaskExecutor 를 테스트를 위해서 대충 만들어보자. 이제 Async 에서는 위의 ThreadPoolTaskExecutor 를..
회사에서 Spring Kafka 를 연동하던 중에 Local 에서 콘솔로 Topic 에 직접 Message 를 쏘니 잘 안되는 상황이 발생했다. 그래서 처음에는 아 key-serializer 와 value-serializer 가 잘못 설정되어 있나? 라는 생각을 했다. 사실 내가 짠 코드가 아니여서 코드를 디버깅 좀 해보다가 처음에는 KafkaRecord 에 자꾸 코드에서 DeserializerException 을 넣길래 아니 이게 key-value deserializer 가 잘못되어 있는거 아니야? 하고 빼고 하니깐 Default Serializer 인 StringDeserializer 로 값이 넘어와서 잘 보였다. 하지만 Object 로 Mapping 되지 않았다. 그래서 궁금해서 ErrorHandl..
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 에서는 사용자가 생..
회사에서 @Transacational(readOnly = true) 일때 어떤 성능점 이점이 있을까? 라는 것을 생각해보았다. 기본적으로 무거운 Dirty Check 등을 안한다의 지식을 알고 있었는데, 근데 Dirty Check 는 왜 무거운데? 그리고 Snapshot 비교는? 등등 너무 궁금한 점이 많아져서 코드를 직접 분석하기로 했다. 일단 첫번째 코드는 isReadOnly 에 대한 분석인데, 설명을 간략하게 설명하면 아래와 같다. 이걸 read-only transaction 으로 optimize 할건지에 대한 여부를 알려주는 flag 라고 생각하면 된다. 참고로 어떻게 현재 트랜잭션에서 readOnly 여부를 알려주는 코드는 아래에 있다. 우리가 @Transactional(readOnly=true..
회사 코드를 짜다가 문득 생각이 하나 들었는데 Java 에서 @RequestParam(Required = false) 대신 Optional Long id 이런식으로 사용하면 동일하게 작동할 수 있다는 사실을 알고 있었다. 이것이 가능한 이유는 Spring Framework 의 RequestParamArgumentResolver 코드에 아래와 같은 코드가 존재한다. 여기서 중요한건 parameter.nestedIfOptional 인데 해당 Type 이 옵셔널인지 확인해주는 코드이다. 그래서 코틀린에서도 ?(nullable-type) 을 통해서 충분히 가능하지 않을까 생각하고 동일 위치에 디버그를 찍어보았다. 위의 디버깅 결과가 결론을 말해주는데 즉, 코틀린에서는 required = false 를 사용할 이..
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..