생계유지형 개발자 67

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

java.lang.ExceptionInInitializerError: com.sun.tools.javac.code.TypeTags

# 오류 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.7.0:compile (default-compile) on project demoShop: Fatal error compiling: java.lang.ExceptionInInitializerError: com.sun.tools.javac.code.TypeTags -> [Help 1] # 원인 스프링부트 2.0.2, Lombok 버전을 1.16.x 사용 중이었다. 원인은 모르겠으나 Lombok 버전을 변경하니까 컴파일 성공했다. # 해결 org.projectlombok lombok 1.18.12 provided ※ 참고 vocado.tistory.com/1..

[Tomcat] Unrecognized VM option 'PrintGCDateStamps'

# 오류 톰캣 실행경로(/bin)에 setenv.sh 를 생성하고 JVM 옵션을 추가로 부여했다. (아래 CATALINA_OPTS) 톰캣을 실행하니 Unrecognized VM option 'PrintGCDateStamps' 가 발생한다. [irteam@dev-1784smartcontrol-ncl bin]$ ./catalina.sh run Using CATALINA_BASE: /home1/irteam/apps/tomcat Using CATALINA_HOME: /home1/irteam/apps/tomcat Using CATALINA_TMPDIR: /home1/irteam/apps/tomcat/temp Using JRE_HOME: /home1/irteam/apps/jdk Using CLASSPATH: /ho..

[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 또는 [프로젝트 ..

[Vue] Vue CDN으로 사용 시 this가 window를 가르킬 때

Vue 프로젝트가 아닌 html에서 CDN 방식으로 사용할 때 종종 this.데이터 또는 this.메소드가 동작하지 않을 때가 있다. this가 vue가 아닌 전역 글로벌 객체인 window를 가르킬 때 이다. 특히 자주 쓰이는 axios 비동기 호출을 한 후 콜백처리할 때 this를 사용해도 vue가 동작하지 않는 것이 대표적이다. 아래 샘플코드처럼 getMyList 메소드 내에서 this는 vue를 가르키지만, axios.then() 콜백함수의 this는 window를 가르킨다. new Vue({ el: '#container', data: { mylist: [] }, methods: { getMyList() { this.mylist = Array()// this -> vue axios.get("/v1..

[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