생계유지형 개발자/Spring Framework 11

[Spring/Mybatis] Select 결과를 결과타입 내 다른 객체에 매핑

Mybatis 문법에서 의 결과 컬럼을 resultType 또는 resultMap 속성에 객체명 또는 매퍼 id를 정의하여 특정 DTO(Data Type Object)에 매핑한다. 예를 들어, SELECT a, b, c, d FROM table 쿼리를 실행할 때, DTO 객체에 a, b, c, d라는 필드가 있으면 알아서 매핑이 된다. 이때 a, b, c, d라는 각각의 컬럼 또는 필드가 서로 데이터 타입이 일치해야한다. 데이터 타입이 상이하고 오토캐스팅에 실패하면 오류가 발생한다. 그리고 기본적으로 int, boolean, double 등의 기본 자료형과 String, Integer 등과 같은 자료형 객체일 때 매핑이 된다. 하지만 모든 사용자 정의 객체(여기선 DTO)가 기본타입의 필드만 가지고 있는..

[Spring/Kotlin] 변경 불가능한 프로퍼티 변수 바인딩 Immutable Property Binding (Feat. @ConfigurationProperties)

Property Binding (Normal) 스프링에서 빌드 환경에 따라 변경되는 상수값을 사용하기 위해 보편적으로 application.yml (또는 .property)에 문자열을 작성하고 소스코드에서 @Value 또는 @ConfigurationProperties 애노테이션을 사용해 변수에 바인딩 시킨다. 나는 주로 아웃바운드 API 주소를 개발환경과 운영환경에 달리 설정해주기 위해 사용한다. YML 설정파일 ### application-dev.yml api: calendar: http://alpha-api.calendar.example.com:5001/connect/schedules map: url: https://map-dev.example.com/api/v1/auth/room api-key: x..

[Gradle] war 실행 시 Exploded war 생성하기 (Groovy, Kotlin DSL)

Groovy 문법 build.gradle task explodedWar(type: Copy) { into "$buildDir/exploded" with war } Kotlin DSL 문법 build.gradle.kts val explodedWar by tasks.register("explodedWar") { into("$buildDir/libs/exploded") with(tasks.war.get()) } tasks.war { finalizedBy(explodedWar) } gradle war 실행 프로젝트에서 사용하는 문법에 따라 위의 내용을 gradle 설정파일에 추가하고 war 작업을 실행한다. gradle war [options]... [프로젝트 경로]/build/exploded 또는 [프로젝트 ..

[Spring5] Thylemeaf Layout Dialect 적용하기

Thymleaf layout dialect 라이브러리를 사용해서 Thymleaf를 , , 등 모든 페이지에서 공통으로 사용하는 영역에 대해서 별도의 파일로 분리가 가능하다. 그리고 각각의 페이지에서 필요한 script나 style을 정의해 사용할 수도 있다. 이를 위해 사용되는 지시자로 fragment, layout, replace 등이 있다. 1) Thymleaf Layout Dialect 라이브러리 추가 (build.gradle.kt) /** Thymeleaf */ implementation("org.springframework.boot:spring-boot-starter-thymeleaf") /** Thymeleaf Layout Dialect */ implementation("nz.net.ultra..

[Spring5] Thymeleaf + Vue CDN 혼용하기

WebFlux와 Kotlin 언어를 사용했지만, 프레임워크나 개발언어무관하다. 단지 Thymeleaf와 Vue.js(CDN 방식)를 혼용하는 방법을 포스팅한다. templates/index.html {{val.name}} 1. Controller 또는 RouterFunction이 index 화면을 렌더링하면 thyList 라는 데이터를 반환할 것이다. 그러면 th:each에 정의한 대로 thyList 데이터를 사용해 div 목록을 생성할 것이다. 2. 하단에는 vue를 cdn 방식으로 정의하고 inline 스크립트에서 Vue 인스턴스를 생성했다. Vue 데이터 정의 부분에서 Thymeleaf 문법으로 vueList에 thyList를 주었다. 따라서 v-for 반복문에 따라 div 목록을 생성할 것이다. ..

[Spring5] Spring MVC vs WebFlux

아래 블로그에서 개념적으로 그리고 기초적으로 두 프레임워크의 차이점이 무엇인지 잘 정리한 것 같다. kimyhcj.tistory.com/343 Spring WebFlux Spring5에 도입된 WebFlux Spring MVC 는 Java EE의 Servlet Spec에 기반하여 만들어 졌고 본질적으로 Blocking + 동기방식입니다. Spring Framework 3.x부터 비동기 방식을 지원하고 있지만 S.. kimyhcj.tistory.com

[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..

[Spring5] WebFlux + Thymeleaf + Kotlin

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

[Spring] proprteis 파일 한글 깨짐

# 변경 전 (한글 깨짐) # --------------------------------- # message-locale_ko_KR.properties # --------------------------------- common.day1=\uc77c common.day2=\uc6d4 common.day3=\ud654 common.day4=\uc218 common.day5=\ubaa9 common.day6=\uae08 common.day7=\ud1a0 common.btn1=\uc870\ud68c common.btn2=\ub4f1\ub85d common.btn3=\uc800\uc7a5 common.btn4=\uc0ad\uc81c # 변경 방법 1) 설정(맥 기준 Preferences) > Editor > F..

[spring] application.yml에 정의한 값이 상수이며 0으로 시작할 때 @Value 형변환 오류

아래와 같이, application.yml 파일에 daemon.send_number라는 Property를 정의하고 Java 클래스에서 @Value 애노테이션을 사용해서 smsSendNumber 변수를 선언했다. application.yml daemon: send_number: 0317263623 #네이버 사내정보서비스 대표전화번호 SmsSender.java public class SmsSender { @Value("${daemon.send_number}") private String smsSendNumber; //... log.info("MEX API sender: {}", smsSendNumber); } 위의 코드에서 당연히 smsSendNumber 변수에 0317263623 라는 값이 들어가야 하는데..