본문 바로가기

Programing

(393)
WebClient: 기본 헤더 설정을 Consumer 를 이용하기(Java/Kotlin) Java WebClient 에 공통적으로 사용하는 헤더가 있다면 defaultHeader 를 이용하여 설정해놓으면 매번 WebClient 사용할 때마다 설정할 필요가 없어진다. WebClient webClient = WebClient.builder() .baseUrl("http://markbucciarelli.com") .defaultHeader("Authorization", "Bearer 7e0af818e0564a238bbcf6b9a0f7c176") .build(); Authorization 는 알려져 있는 헤더이므로 org.springframework.http 패키지의 HttpHeaders 클래스의 상수에 이미 정의되어 있다. package org.springframework.http; public ..
[Spring] @Repository Bean에서 예외 변환 없이 전파하기 @Component 는 스프링 IOC 컨테이너에 Bean 을 등록할 때 붙이는 어노테이션이다. 실제 업무를 하다보면 @Controller, @Service, @Repository 로 유스케이스 별로 특정 의미를 더 부여하여 특징을 부여할 수 있다. 더 자세한 것은 스프링 레퍼런스 1.10.1. @Component and Further Stereotype Annotations 참고 @Repository 의 경우 다른 스테레오 타입과 달리 예외 변환기(Exception Translation)를 거친다는 것이 차이점이 있다. 이유는 하이버네이트나 JPA 같은 DAO를 사용하게 되면 구현체에 따라 반환하는 예외가 다양해질 수 있기 때문이다. 세부 사항의 예외가 프레임워크를 넘어 던져지면 구현체의 예외를 알아야 ..
[Kotlin] byte[]을 String으로 바꾸기 과거에 [Java] byte[]을 String으로 바꾸기 글을 쓴 적이 있다. 요즘은 코틀린을 주로 사용을 해서 글을 다시 써보았다. 방법에 대해서는 https://www.baeldung.com/kotlin/byte-arrays-to-hex-strings 에 잘 나와 있기에 링크를 참고하는 것이 더 좋다. 최초 코드 원래 코드을 method extract 로 리팩토링을 해보니 아래와 같이 표현을 할 수 있는 코드였다. (원래코드는 아래에 나옵니다. ^^;;) private fun bytesToHexString(bytes: ByteArray): String { val hash = StringBuilder() for (aByte in bytes) { val hex = Integer.toHexString(0x..
SimpleR2dbcRepository 를 사용한 R2DBC 학습 계기: Spring Tips: Reactive Summit Keynote: Here and There → Spring R2DBC + MySQL 회사에서 WebFlux 를 사용하여 프로젝트가 되어 있었다. Redis는 ReactiveRedisTemplate 을 사용하여 작성이 되어 있었으나, RDBMS는 jooq 를 이용하고 있었는데 ExecutorService 를 이용해서 CompletionStage 로 바꾸고 Mono.fromCompletionStage 로 래핑을 사용하는 형태로 구성이 되어 있었다. R2DBC를 이용하면 ReactiveRedisTemplate 를 사용하는 것처럼 Mono 나 Flux로 바로 받을 수 있으니 좀 더 편하게 사용할 수 있을까 생각했는데 Spring Data R2DBC 드라..
Electron ≥ 12.x : 컨텍스트 분리(Context Isolation) 3년전에 둘째 출산 휴가 때 진행했던 serami 프로젝트를 얼마 전에 다시 보게 되었다. 이메일 인증을 개발하면서 템플릿의 결과를 확인하게 위해 사용을 했는데 개발한지 오래되었다보니 Github에서 버전 업데이트에 대한 경고를 그 동안 지속적으로 받고 있었다. 라이브러리 업데이트를 하고나서 보니 "Uncaught ReferenceError: require is not defined" 에러가 발생했다. 에러의 부분을 찾아보니 리액트를 bootstrap 하는 부분인 require 이라는 부분에 문제가 발생하였다. 일단 찾아보니 Electron 12 부터 Context Isolation 이라는 것이 활성화 되었고 Renderer Process 에서 수행할 수 있는 것들이 제한이 생겼다. stackoverfl..
[WebFlux] block()/blockFirst()/blockLast() are blocking, which is not supported in thread 후기 백엔드를 개발하다가 이제 회원 백엔드를 맡으면서 Spring WebFlux를 다루게 되었다. 아직 Reactive Stack에 대한 경험이 부족해서 도메인 객체를 포함해서 DB연결 및 Redis 연결을 동기식으로 처리를 했다. 그런데 이전에 개발된 회원 번호에 대한 유효성 확인을 하는 함수가 Mono 를 반환하게 되어 있었다. 어디서 들은 지식으로 block()을 이용해서 블로킹 처리를 하려고 했더니 아래와 같은 에러 메시지가 발생했다. block()/blockFirst()/blockLast() are blocking, which is not supported in thread reactor-http-nio-2 누가 이렇게 에러를 던지나 찾아보았다. Mono의 block()은 아래와 같이 구현되어 ..
Spring Boot: JPA(Hibernate) 네이밍 전략 spring.jpa.hibernate.naming.physical-strategy 및 spring.jpa.hibernate.naming.implicit-strategy 을 통해 테이블 이름이나 컬럼 이름에 대한 네이밍 전략 설정이 가능하다. 네이밍 컨벤션에는 여러가지가 있다. camelCase: 앞자는 소문자 단어 사이에 대문자 PascalCase: camleCase와 같은데 첫 글자가 대문자이다. Initial Capitals, Initial Caps, InitCaps 로도 불린다. snake_case: 모든 문자는 소문자(lowercase)로 단어간 구분은 언더스코어(_)로 구분한다. kebab-case: 모든 문자는 소문자(lowercase)로 단어간 구분은 대시(-)로 구분한다. ALL CAPS:..
ServletModelAttributeMethodProcessor 와 @PathVariable ServletModelAttributeMethodProcessor 은 ModelAttributeMethodProcessor 상속받아 서블릿을 위한 위한 구현체이다. 가령 Spring MVC 에서 @PathVariable 을 이용해 URI 템플릿을 파라미터로 받아올 때 ServletModelAttributeMethodProcessor 가 사용된다. 사례 예로 아래와 같은 코드가 있을 때 requestNo 과 memberNo 에는 URI path의 템플릿 값이 들어오게 된다. @RestController public class VPNController { @GetMapping(value = "/vpn/{memberNo}/{requestNo}", produces = MediaType.APPLICATION_JS..