생계유지형 개발자 67

[리액티브 프로그래밍] About Webflux, Mono

WebFlux에서 Controller의 요청처리 과정 (Mono 실행 시점) WebFlux에서 Mono.just() 를 사용해 기본적인 Controller를 구현했다. @GetMapping("/mono") fun mono(): Mono { logger.log("print 1") val m: Mono = Mono.just(generateHello()) .doOnNext { logger.log("doOnNext() => $it") } .log() logger.log("print 2") return m } fun generateHello(): String { logger.log("method generateHello()") return "Hello Mono" } * 위 소스에서 logger.log()는 Slf..

[리액티브 프로그래밍] User Thread, Daemon Thread의 차이점

사용자 쓰레드(User Thread)와 대몬 쓰레드(Daemon) 사용자 쓰레드와 대몬 쓰레드의 차이점은 메인 쓰레드(Main Thread)가 종료되었을 때 함께 종료되는가, 그렇지 않은가에 있다. 사용자 쓰레드는 메인 쓰레드가 종료되어도 프로세스를 강제로 종료하지 않는다. (종료하는 주체는 JVM이다.) 반면에 대몬 쓰레드는 메인 쓰레드 또는 남겨진 사용자 쓰레드가 종료되면 강제로 프로세스가 종료된다. 아래 예제 소스코드에서 Reactor라이브러리에서 제공하는 Flux 클래스의 Flux.interval() 함수와 단일 쓰레드를 생성하는 Executors.newSingleThreadExecutor() 함수가 정의되어 있다. Flux.interval() 함수는 내부적으로 대몬 쓰레드를 생성하여 로직을 실행..

[MyBatis] 계층형 결과 리스트 생성 (resultMap, collection 활용)

대표적으로 카테고리의 계층형 결과를 조회할 때 이 방법이 사용될 수 있다. 실제로 실무에서 사용 중인 테이블 구조와 소스코드를 필요한 부분만을 예제로 사용했다. 오라클처럼 계층형 쿼리가 있는 dbms라면 좋겠지만, mysql은 쿼리에서 지원되지 않는다. 별도의 함수를 만들거나 with recursive 라는 지시어를 사용하던데 mybatis로 해결이 되는 일이기 때문에 일일이 시도해보지 않았다. 샘플 데이터 계층 구조 데이터의 계층 구조는 다음과 같다. (* 코드명 ... 코드 형식으로 표기) 인사기준 ... L1 출장 ... L1_M1 국내 출장 ... L1_M1_S1 해외 출장 ... L1_M1_S2 퇴직 ... L1_M2 퇴직금 산출기준 ... L1_M2_S1 퇴직금 중간정산 ... L1_M2_S2..

[SpringBoot] 스프링부트 실행 시 톰캣 에러 (내/외부 톰캣 사용 문제)

# 오류 2021-02-19 10:48:50.749 ERROR 26881 --- [ restartedMain] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPLICATION FAILED TO START *************************** Description: An attempt was made to call a method that does not exist. The attempt was made from the following location: org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getWebServer(To..

[ios] UITextField 사용할 때 키보드 타입 변경

iOS에서 텍스트필드에 문자를 입력할 때 노출가능한 키패드의 종류는 enum 타입으로 정의되어 있고, 소스코드에서 변경 가능하다. Swift @IBOutlet var keywordInput: UITextField! override func viewDidLoad() { super.viewDidLoad() keywordInput.keyboardType = .default } enum UIKeyboardType: int default - Specifies the default keyboard for the current input method. asciiCapable - Specifies a keyboard that displays standard ASCII characters. numbersAndPunctu..

[Spring5] WebFlux + Thymeleaf + Kotlin

스프링 부트 초창기에 Spring MVC 에서 Thymeleaf를 사용해보았는데, WebFlux 에서 사용하기는 처음이었다. 더군다나 코틀린 언어도 처음 접해보는 거라서 많이 낯설었다. 기존에 알던데로 application.yml에 설정을 작성하고, viewResolver를 추가하고, addResourcesHandler를 추가하고.... Spring MVC에서 하던대로 했는데 아무리 해도 templates/index.html을 뷰리졸버가 찾지 못했다. 구글 검색에서 나오는 많은 예시들을 따라해봤는데 여전히 안 되더라.. 폭풍 검색 끝에 실행되는 소스코드를 찾았다. (나중에 webflux에 익숙해지면 이 포스트를 보며 한심하게 느껴지려나....) 프로젝트 명: 두끼 (Dookki) * 그 떡볶이 맞음 bu..

[리액티브 프로그래밍] 리액티브 프로그래밍이란

핵심 용어 Observer (+ Obeservable) Subscriber Scheduler (+ Schedule) Functional Programming Reactive Operators (=> Pre defined function / map, flatMap, forEach 등) ※ Declarative Programming = Functional Programming + Reactive Operators 핵심 Flow 데이터의 발행 -> 데이터의 처리, 가공 -> 데이터를 구독 비동기 작업의 차이 이해 작업 A와 B를 비동기 방식으로 순차적으로 처리할 때, 흔히 알고있는 비동기 방식은 작업 A가 완료되면 작업 B를 호출 즉, 콜백하는 것이다. 이 때, 작업 A는 메인 함수, 작업 B는 콜백 함수라고..

[NodeJS] Node Sass version 5.0.0 is incompatible with ^4.0.0.

이전에 Vue 프로젝트 실행할 때 NodeJS 15 버전과 node-sass 4.14.1 버전이 호환하지 않아서 오류가 발생했었고, node-sass를 호환 버전인 5.0.0으로 설치함으로써 해결했다. 이제 잘 되나 싶었는데 또 다른 버전 문제로 의심되는 오류가 나더라. # 오류 Node Sass version 5.0.0 is incompatible with ^4.0.0. # 원인 이번에는 node-sass와 node-loader의 버전이 상호 지원하지 않는 이유였다. 기존에 설치되어있던 각 모듈 버전은 이러했다. - NodeJS: 14 - node-sass: 4.14.1 - sass-loader: 7.3.1 여기서 NodeJS와 node-sass를 각각 15와 5.0.0으로 올렸고, 컴파일할 때 위의 ..

[NodeJS] Error: Node Sass does not yet support your current environment:

# 오류 Vue 개발을 위해 프로젝트를 실행했는데 제목과 같은 에러가 아래처럼 발생했다. Syntax Error: Error: Node Sass does not yet support your current environment: OS X 64-bit with Unsupported runtime (88) 아무래도 최근에 iOS 개발하면서 NodeJS(노드) 버전을 최신 버전으로 업데이트한게 원인이 아닐까 싶었다. 검색을 해보니 이 오류에 대해서 명쾌하게 설명을 잘 해놓은 블로그 글이 있어서 쉽게 해결할 수 있었다. # 원인 간단하게 노드 버전과 설치된 node-sass 모듈 버전이 상호 지원하지 않는 버전이기 때문이다. 내 컴퓨터에 설치된 노드와 vue프로젝트에 설치된 node-sass의 버전은 다음과 같..