본문 바로가기

Programing/Framework

(70)
fastcampus: 실무 프로젝트로 배우는 Kotlin & Spring - Part 4/Ch02/03 오류 발견 위치: https://fastcampus.app/courses/211160/clips/779520?position=1248&organizationProductId=13720 Part 4. 실제 예제를 기반으로 자바 프로젝트에 코틀린 도입해보기 ch02. 자바 프로젝트(ToDo프로젝트) 코틀린으로 리팩토링 하기 03. 컨트롤러 레이어 리팩토링 22:51 자바로 되어 있는 코드를 코틀린으로 옮기는 것을 예제로 보여 주는 강좌였다. 18:04경에 Assert.notNull 을 코틀린의 checkNotNull로 바꾸는 부분이 있었다. 이 부분을 보면서 저 변환은 계약 위반이라고 생각했다. 그 이유는 무엇일까? 기존에 Assert.notNull 는 스프링이 제공해주는 Assertion utility이다. 코드를 ..
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를 사용하게 되면 구현체에 따라 반환하는 예외가 다양해질 수 있는데 이렇게 하면 예외 처리도 힘들어지기 때문에 프레임워크 역할의 스프링이 의미를 파악할 ..
[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..
Spring boot: HttpMessageConverters 는 누가 만들어줄까? RestTemplate 에 대해 통합 테스트를 만드는 과정에서 HttpMessageConverters 빈이 없다고 에러가 났다. 그러면 이 HttpMessageConverters 빈은 누가 만들어주고 있었을까? 스프링 부트에는 여러 Auto Configuration 이 있는데 HttpMessageConvertersAutoConfiguration 가 해주고 있었다. package org.springframework.boot.autoconfigure.http; @Configuration @ConditionalOnClass(HttpMessageConverter.class) @AutoConfigureAfter({ GsonAutoConfiguration.class, JacksonAutoConfiguration.c..
Kotlin DSL Gradle: 멀티 모듈로 변경하기 단일 모듈 기반의 프로젝트 spring initializr 에서 프로젝트를 만들면 기본적으로 단일 모듈 기반의 프로젝트를 생성한다. 이 구조는 단순하고 만들기 쉽지만 단점도 있다. 핵심 비즈니스 구현을 하는 도메인 영역과 세부사항의 일종인 구현 기술의 코드가 섞이게 되기 때문이다. 실무를 하면서 일종의 기술 영역인 JPA의 Entity 가 도메인 영역인 서비스를 통과해 Controller 까지 전달했던 것을 본 적이 있다. 물론 자바나 코틀린에서는 패키지를 구분하여 모듈을 분리할 수 있는 구조를 제공한다. 하지만 이것은 구조화적인 것으로 의존성에 대해 직접적인 통제를 할 수 없다. 페리페리크 안티 패턴(Périphérique anti-pattern) 헥사고날 아키텍처 - 혹은 '포트와 어댑터' - 라는 ..