spring boot 4.1.0 이 릴리즈 되어서 최신 버전으로 업그레이드를 했다. 컴파일도 잘되고 문제가 없다고 생각했지만 redis 를 사용하는 부분에서 stack over flow 가 발생했다.참고로 redis client 로는 redisson 을 사용하고 있었다. 간략한 예제 테스트 코드는 아래와 같다.// 의존성dependencies { implementation("org.springframework.boot:spring-boot-starter-data-redis:4.1.0") { exclude("io.lettuce", "lettuce-core") } implementation("org.redisson:redisson-spring-boot-starter:4.1.0")..
내가 처음 써킷브레이커 개념에 대해 접했던건 Netflix OSS 의 hystrix 를 통해서였다. 그때만 해도 생소했었는데 이제 써킷브레이커는 굉장히 친숙한 기술이 됐다. 그 사이 hystrix 는 저물고 resilience4j 가 자바 진영의 표준 써킷브레이커가 되었다. 써킷브레이커의 개념은 신입 개발자를 채용할때도 어렵지 않게 대답을 들을 수 있다. 특정 루틴이 일정량 실패하면 해당 루틴을 실행하지 않고 즉시 실패했다가(OPEN), 이후 루틴을 다시 실행해보고(HALF-OPEN) 성공한다면 계속 실행하고(CLOSE) 실패한다면 계속 즉시실패(OPEN)하는 형태로 의존 루틴의 장애가 전파되지 않도록 차단하는 기술이다. 꼭 외부 시스템에 한해서 사용하는 기술은 아니지만 보통은 외부 시스템을 호출하는 부..
조회 API 를 만들어야한다면 어떤 메서드를 써야할까? 다들 몇초 걸리지 않아 GET 이라고 답할 것이다.GET /members/928위와 같이 리소스 id 로 접근하는 경우 GET 으로 만드는데 아무런 어려움이 없다. 리소스 id 가 아니라 다른 조건으로 조회를 해야한다면 어떻게 할 수 있을까?GET /members?name={name}이런식으로 query string 을 사용해 표현할 수 있다. 보통은 이정도 수준으로 조회 API 를 설계한다. 하지만 조회 조건이 복잡해지는 경우 query string 을 써야할지 고민이 되는 경우가 있다.GET /members?param1={param1}¶m2={param2}¶m3={param3}¶m4={param4}¶m5={param5..
MSA 환경이 보편화되면서 Circuit Breaker 는 필수가 되어가고있다. java + spring 환경에서는 Netflix 가 만든 Hystrix 를 시작으로 Circuit Breaker 가 대중화됐고, 요즘은 Resilience4j 가 사실상 표준역할을 하고 있다. Resilience4j 를 spring 에 통합해서 사용하는 방법은 대표적으로 두가지 방법이 있는데, spring cloud 에서 제공하는 spring cloud circuitbreaker resilience4j 를 사용하는 방법과 Resilience4j 가 제공하는 resilience4j spring boot 를 사용하는 방법이 있다.// resilience4j spring bootdependencies { implementa..
객체지향, 디자인패턴 등을 공부하고나면 다형성의 이로움과 함께 실무 코드에 적용하고 싶다는 욕구가 생긴다.하지만 막상 해보려고하면 어떻게 해야하는지 감이 잘 잡히지 않고, 꾸역꾸역 해내도 결과물이 썩 만족스럽지 않은 경우가 많다.이 차이는 우리가 공부하는 객체지향 관련 자료들은 java 개발의 사실상 표준 환경이 되어버린 spring 을 염두하고있지 않기 때문이다.간단한 예제와 함께 spring 환경에서 객체지향을 어떻게 구현할 수 있는지 살펴보자. # 요구사항- 트래픽 제어 객체인 TrafficGate 를 구현한다- 정수로 이루어진 유저 id와 modulo 연산을 사용해 10% 단위로 제어하도록 구현한다- 허용 비율은 외부 API를 호출하여 획득한다- 외부 API 가 구현되기 전까지는 모든 유저를 통과..
이전글에서 timeout 에 대한 설명을 적어놨었다. 이후 실제로 문서에 나와있는대로 동작하는지 확인해보기로 했다. 해당글에서 정리한 내용이 정확하다면 response timeout 과 socket timeout 을 훨씬 초과하여 응답이 오더라도 바이트들만 제 시간 내에 도착한다면 예외없이 요청이 성공해야한다. 테스트에 사용한 apache httpcomponents client 의 버전은 5.5이다.org.apache.httpcomponents.client5:httpclient5:5.5 # 코드준비먼저 stream 으로 응답을 하는 간단한 API 하나를 구성했다.@GetMapping(value = "/stream", produces = MediaType.TEXT_PLAIN_VALUE) public S..
spring 에서 제공해주는 RestTemplate 이나 RestClient 를 사용한다면 코어 http 클라이언트로 apache httpcomponents client 를 많이 사용한다. 다양한 설정을 제공해고, 특히 http connection pool 을 제공해주는게 매력적인데 RestClient 와 함께 설정하는 방법은 이전에 적은 글이 있다. 이번 글에선 각 timeout 과 해당 timeout 이 발생했을때 connection pool 의 동작을 알아본다. # TimeoutRequestConnectionTimeoutconnection pool 에서 connection 을 가져오기까지 대기하는 시간connection pool 이 작아 모든 connection 이 사용중인 경우 해당 timeout..
최신 프로젝트는 현재 기준 최신 LTS 버전인 JDK 21 에서 개발하고 있다. JDK 21 에 추가된 기능 중 하나는 JEP(Java Enhancement Proposal) 444 에 포함된 virtual thread 이다. virtual thread 에 대해 간략하게 설명하면 OS 스레드와 별개로 JVM 수준에서 한번 더 추상화한 스레드를 만들고, 이를 OS 스레드와 연결(mount 라고 표현한다)해서 멀티 스레드 프로그래밍을 하도록 하는 개념이다. virtual thread 는 OS 스레드와는 독립적인 라이프 사이클을 갖게되며 virtual thread 를 생성한다고해서 꼭 OS 스레드를 추가로 생성하진 않는다. 기존 JVM 에서는 JVM 수준의 스레드인 플랫폼 스레드라는 개념이 있었지만 이 플랫폼..
자바에서 제네릭을 이용할때 가장 불편한 부분은 타입 소거로 인해 타입 토큰을 전달해야하는 점이다.// 런타임에 T 정보를 알 수 없으므로 이렇게 작성하면 컴파일 에러가 발생한다public T create() throws Exception { return T.class.getConstructor().newInstance();} // 타입 파라미터와 별개로 타입 토큰을 전달해야한다public T create(Class clazz) throws Exception { return clazz.getConstructor().newInstance(); } 코틀린은 inline + rei..
RestClient를 애플리케이션의 http client로 활용할 수 있다. 이때 MediaType이 application/json 인 경우 RestClient는 ObjectMapper를 이용해 body의 직렬화/역직렬화를 수행한다. Http MediaType은 종류가 여러가지인만큼 RestClient는 ObjectMapper를 직접 이용하는게 아니라 각 MediaType을 MessageConverter라는 인터페이스로 추상화하여 활용한다. 다만 최근에는 json이 표준처럼 사용되고 있는만큼 다른 타입에 비해 json을 핸들링해야하는 경우가 많은데, 이때 내부 ObjectMapper의 설정을 변경해줘야할때가 있다. ObjectMapper의 default naming 전략은 camel case인데 snak..
- Total
- Today
- Yesterday
- Jackson
- frontend개발환경
- servlet
- java
- clean code
- TEST
- toby
- mariadb
- EffectiveJava
- backend개발환경
- DesignPattern
- OOP
- JavaScript Core
- Design Pattern
- Kotlin
- java8
- spring cloud
- http
- db
- Spring
- MySQL
- generics
- 정규표현식
- Git
- JPA
- code
- go-core
- javascript
- programming
- frontcode
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 | 31 |

