분류 전체보기 41

실전 스프링 부트(Spring Boot in Practice)

요 1-2년 간 스프링하고 거리를 두고 지냈네요. 그 전 약 6년 간의 경험들과 다르게 새로운 도전(으로 애써 포장;;)을 하고 있다 보니 그렇게 됐습니다 😇 그 새 스프링 세계는 6.0이 나와서 자바 17+을 써야만 한다면서요? 물론 다른 크고 작은 변화들이 많겠지만 그걸 어떻게 다 따라가요... 😇 언젠가는 스프링을 다시 하게될지도 다신 안할지도 모르고, 그래도 업계에 뭔 일이 일어나고 있는지 큰 틀에서라도 알아는 둬야겠고...하던 차에 운좋게도 출판사 서평이벤트에 당첨이 돼서 이렇게 강제로 책을 읽은 후 글을 남기고 있습니다. (땡스 제이펍 🙏❤️) 이 책은 제목에 in Practice(실전) 라는 말이 붙어있는 만큼, 기본적으로 스프링 부트의 다양한 기능을 실전 위주로 설명하고 있어서 좋네요. 스..

Innovation/Reading 2023.09.19

Spring Batch와 Reactive는 같이 갈 수 있을까...? 🤔

이러저러해서 Spring Batch를 사용해 데이터 동기화 배치를 개발하고 있습니다. 이 때, 이 데이터를 사용할 원 서비스와 동일하게 R2DBC MySQL Driver를 통해 DB 접근하게 설정했는데요, 아래처럼 코드를 작성하고 실행을 해보니 뭔가 이상합니다. @Bean @JobScope fun step() = stepBuilderFactory.get(dataSyncStepName) .chunk(chunkSize) .reader(...) .processor(...) .writer(dataWriter()) .build() fun dataWriter() = ItemWriter { items -> val results: Flux = synchedRepository.saveAll(items) // Reacti..

카테고리 없음 2021.04.13

Spring Boot R2DBC Autoconfig Disable

스프링 부트에서 R2DBC를 쓸 때 설정 초기라 DB도 없고 해서 DB 설정을 끄려고 이렇게 해봤습니다. @SpringBootApplication(exclude = [ DataSourceAutoConfiguration::class, DataSourceTransactionManagerAutoConfiguration::class ]) 허허... 뭐가 문젠진 몰라도 잘 안되는군요. *************************** APPLICATION FAILED TO START *************************** Description: Failed to configure a ConnectionFactory: 'url' attribute is not specified and no embedded..

Spring - 예외를 던지지 않고 처리하기

Java를 비롯한 많은 언어에서 예외처리에 대한 이야기는 이미 수없이 논의되었고, 논의 중이고, 앞으로도 논의될 예정입니다. 거기에 소소하게 돌 하나 얹어보려는 마음으로 짤막하게 글 써봅니다...라고 썼지만, 예외 자체를 다룰 생각은 아니고, Spring에서의 예외처리 경험을 잠깐 이야기해보려고 합니다. 알다시피 Spring MVC가 요청을 받아 응답을 돌려주는 과정에서 처리되지 않은 예외가 발생하면 Spring MVC는 500 에러를 돌려줍니다. 2020-10-09 16:27:07.984 ERROR 45790 --- [ctor-http-nio-2] a.w.r.e.AbstractErrorWebExceptionHandler : [d7b3bd38-1] 500 Server Error for HTTP GET "..

이상한 Kotlin의 세계 - Type inference

이거슨 사실 일종의 버그라 Kotlin이 이상하다고 하긴 애매하지만, 어쨌든 이것 때문에 스프링의 주요 기능이 동작하지 않고 있으니까 이상한걸로 치기로 했다. (링크 - p.19 WebTestClient Type Inference Issue in Kotlin) 수다쟁이 Java에 불만을 가진 사람들이 만든 JVM 기반의 언어들 중 Kotlin의 타입 추론은 참 이상하다는 느낌을 받았다. // Java class A { int a; char b; } void inner() { System.out.println("(void)"); } void inner(T t) { System.out.println(t.toString()); } void outer() { inner(); inner(10); inner("te..

이상한 Kotlin의 세계 - Iterable.map()

Java야 뭐, 기존 타입이 functional programming에 적합하지 않기 때문에, Array, List, Set 등등의 타입을 다 Java 8부터 제공하는 Stream으로 변환해놓고 처리하니까... import java.util.*; import java.util.stream.*; public class A { public static void main(String[] args) { // 1. Array String[] ss = { "1", "2", "3" }; Stream.of(ss) .map(s -> Integer.valueOf(s)) .forEach(i -> System.out.println("Value: " + i + " (" + i.getClass().getName() + ")"))..

누구나 쉽게 스칼라+플레이 - 스칼라 입문부터 게시판, 채팅 프로그램 제작까지

책 정보: 링크 한빛미디어의 서평 이벤트를 통해 제공받은 책입니다.책을 읽다보니 스칼라를 배움에 있어서 어려운 이론을 가능한 배제하고 쉽게 사용할 수 있도록 접근한 저자의 노력이 느껴졌습니다. 그러다보니 기반이 되는 내용을 건드려줬으면 하는 아쉬움이 있습니다만, 그건 이 책을 다 읽은 각 독자들의 몫이라 생각합니다. 다만, 가끔씩 나타나는 설명 없이 넘어가거나 잘못된 설명은 스칼라/플레이에 처음 접근하는 사람들에게 오히려 혼란을 줄 수 있지 않을까 우려가 되는 부분도 있습니다. 제가 발견한 내용은,for, if-else 예제 코드에서 스칼라 문법의 장점을 살리지 못함 (for-yield, if 문 리턴값 사용 등)loop에 break가 없다는 점이 빠짐'객체'라는 표현이 스칼라의 object와 인스턴스 ..

Innovation/Reading 2017.02.02

Scala Option

Scala에는 Option이라는 재미있는 클래스가 있습니다. 이 클래스는 기본적으로 옵셔널(Optional, 존재 여부가 불확실함)한 값을 표현하기 위해 사용하며, 아래와 같은 정의로 구성되어 있습니다. sealed abstract class Option[+A] extends Product with Serializable object Option extends Serializable object Option은 주로 Empty Option 값(None)을 만들어내기 위해 사용합니다. 이 글에서는 Companion class Option 에 대해 주로 다룰 예정입니다. 보다시피, class Option의 선언 옵션 중 sealed 때문에 부가적인 확장이 불가능하며, abstract 때문에 Option 인스턴..

[추상자료형] 리스트(List)

[추상자료형] 리스트(List)정의: 값들의 순서있는 나열 (같은 값이 한 번 이상 나올 수 있다)순서있는 (ordered): 각 값들 간의 대소관계가 아닌, 값들의 등장 순서 예) [1, 2, 3] ≠ [3, 2, 1] 나열 (sequence): 없거나 하나 이상의 값을 순서있게 배치한다.용어객체(entity): 리스트를 구성하는 개별 값 빈 리스트 (Nil, Not in list): 포함하는 객체가 없는 리스트크기(length): 리스트 내 객체의 개수 리스트의 구성List of T = head(T) :: tail(List of T) 타입 T의 리스트(List of T)는 '타입 T 객체인 head'와 '타입 T 리스트(List of T)인 tail'의 재귀로 이루어져 있다. 머리(head): 리스트..