반응형

Develop 51

Kotlin (꿀)Tips!

Kotlin은 이미 많은 곳에서 사용하여 기본적인 문법에 대해선 다들 아실 것이라 생각합니다. :) 이미 많은 곳에서 Kotlin을 도입했거나 도입중 일 것입니다. 그리하여 이번 글에서는 Kotlin은 Tip의 관한 내용을 정리해보려합니다. 이 글은 Kotlin 홈페이지에서 Kotlin tips 의 내용을 정리한 글입니다. 좀 더 자세한 내용을 원하신다면 링크를 참조해주세요. 1. Timing Code 메서드 혹은 로직의 실행시간을 측정하려면 기존에는 System 시간을 가져와서 빼거나 StopWatch를 이용해서 start하고 stop하는 불편함을 감수했었습니다. 하지만 kotlin에서 지원하는 measureTimedValue 를 사용한다면 쉽게 실행시간과 반환 값을 구할 수 있습니다. @OptIn(E..

Develop/kotlin 2022.04.18

[Redis] 성능개선 - 캐싱 처리 3가지 방법

들어가기 전에 서비스 배포 전 성능 개선을 하면서 왜 캐싱을 써야했는지 캐싱을 쓰면서 어떤 이슈들이 발생했는지에 대해 작성해보겠습니다. 모든 코드는 Kotlin으로 진행하였으며 Github에 올려두었습니다. 캐싱을 사용했던 이유 서비스를 배포하기 전 성능 테스트를 진행하던 중 특정 API에서 성능이 매우 떨어지고 있었습니다. 5초 이상?! @Service class TempService( val storeRepository: StoreRepository, val categoryRepository: CategoryRepository ) { fun init(storeId: Long): ResInitDTO { // 1. DB에서 특정 상점 데이터 조회 val store: Store = storeReposito..

Develop/spring-data 2021.08.17

[kotlin] Querydsl-JPA GroupBy 사용했을 경우 Paging처리 방법

들어가기 전에 Querydsl-JPA를 사용할 때 Query에 GroupBy 절이 포함된다면 fetchCount(), fetchResults() 메서드를 사용할 수 없습니다. 정확히 count() 를 사용할 수 없습니다. 이럴 경우 PageImpl을 사용하여 Paging 처리해야 하는 경우에 대해서 정리해보겠습니다. 모든 소스는 Github에 올려두었습니다. 에러발생 GroupBy절을 포함하고 fetchCount(), fetchResults() 메서드를 사용하면 아래와 같은 에러가 발생합니다. Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: having near line 5, column 1 GroupBy를..

Develop/spring-data 2021.08.06

[Kotlin] Spring-Batch QuerydslPagingItemReader 개선편

들어가기 전에 Spring-Batch 에서 Chunk 개념을 이용하려면 ItemReader를 사용합니다. ItemWriter에서 ItemReader에서 사용한 쿼리에 영향을 미치는 상태값을 변경할 경우가 있습니다. 이와 같은 경우 필요한 기능을 정리한 글입니다. ItemReader를 사용한 Query ItemReader는 Query에 offset과 limit을 사용합니다. // 1 select id, address, name from person where state = 'STUDY' limit 5 // 2 select id, address, name from person where state = 'STUDY' offset 5 limit 5 // 3 select id, address, name from ..

[kotlin] Spring-Batch Alert 처리 ( Logback을 이용한 Slack 연동 )

이번 글에서는 Spring-Batch에서 오류가 났을 경우 에러를 Alert처리하는 글을 정리하겠습니다. 모든 소스는 Github에 올려두었습니다. Alert처리하는 방법은 여러가지 종류가 있습니다. Prometheus, Alert-Manager를 이용한 방법 Slack을 이용한 Webhook 방법 그 외 등등.. 이번 글에서는 Slack을 이용한 Webhook 방법에 대해서 정리하겠습니다. Prometheus, Alert-Manager를 이용한 방법은 추 후에 작성예정입니다. Prometheus, Alert-Manager 구현 방법에 대해서는 여기 를 참조해주시기 바랍니다. 적용 방법 Logback을 적용하여 Error 로그가 작성된 경우 Slack으로 Webhook을 날리는 방식입니다. Slack C..

[Kotlin] Spring-Batch (JPA 적용) Junit5를 이용한 Test Code 작성

이번 글에서는 JPA를 적용한 Spring Batch Job을 테스트하는 글을 작성하겠습니다. 모든 소스는 Github에 올려두었습니다. 들어가기 전에 테스트 환경에서의 데이터베이스는 H2, Test Docker Container, Local 환경에 Database 띄우기 등 다양한 방법으로 테스트할 수 있습니다. 하지만 이번 글에서는 실제 DB에 붙었을 경우 테스트 데이터를 생성 삭제하기 위해서는 어떻게 하는지에 대해 작성했습니다. Job 먼저 JOB을 살펴보겠습니다. @Configuration class SimpleJobConfiguration( val jobBuilderFactory: JobBuilderFactory, val stepBuilderFactory: StepBuilderFactory, v..

[Kotlin] Application 설정값 가져오는 방법 - ConfigurationProperties로 구성

이번 글에서는 Kotlin에서 아래의 application.yml의 설정값을 읽어오는 방법을 정리해보겠습니다. 이 글에서 사용하는 설정방법은 SpringBoot 2.2.1 이상 버전부터 지원가능한 방법입니다. 모든 소스는 Github에 올려두었습니다. Application.yml sample: kotlin: language: kotlin study-days: 30 java: language: java study-days: 90 test: javaTest build.gradle.kts 아래의 디펜던시가 추가되있어야 ConfigurationProperties를 사용할 수 있습니다. dependencies { annotationProcessor("org.springframework.boot:spring-boo..

Develop/kotlin 2021.05.17

[Querydsl-JPA] 자주 사용하는 기능 정리 (Kotlin)

이번 글에서는 다양한 프로젝트를 진행하면서 자주 사용되었던 Querydsl-JPA를 정리해보겠습니다. Kotlin Querydsl-JPA 설정방법이 궁금하신 분은 지난번 작성한 이글을 참조해주시기 바랍니다. 모든 소스는 Github에 올렸습니다. 참조해주세요 :) 간단한 목차입니다. 찾으시는 기능이 있으시다면 아래의 목차를 복사하여 Ctrl + F 로 검색하시면 빠르게 찾으실 수 있습니다. 간단한 RUD Read 전체조회 원하는 필드만 조회 QueryProjection Annotation Projections.fields Update Delete 게시판 관련 쿼리 케이스 Paging 기능 추가 케이스 Page && Sort 기능과 검색조건 포함된 케이스 Many Dynamic Query 대용량 데이터 처..

Develop/spring-data 2021.05.10

Querydsl-JPA 코틀린스럽게 작성하기 ( 설정 포함 )

글 작성 목차는 아래와 같습니다. Kotlin Project에 Querydsl-JPA 설정 Kotlin스럽게 작성하기 Kotlin Project Querydsl-JPA 설정 먼저 Spring Initializer를 이용하여 Kotlin 프로젝트를 생성해보자! Build Script : Gradle Language : Kotlin Packaging : Jar Spring Web : Web Project를 위한 디펜던시 ( @RestController, @Service ... ) Spring Data JPA : JPA를 설정을 위한 디펜던시 ( Entity, Repository ) H2 Database : Entity기반으로 테이블을 생성할 메모리형 데이터베이스 코틀린 프로젝트를 만들고 build.gradl..

Develop/kotlin 2021.04.29

[Monitoring] Kotlin + Actuator + Prometheus + Grafana + CAdvisor + Node-Exporter + AlertManager 구현

Monitoring을 구현해보자! 모든 소스는 Github에 올려두었습니다. 왜 Monitoring을 사용해야하는가? 먼저 Monitoring의 중요성에 대해서 간략히 정리해보겠습니다. Monitoring이 없는 서비스를 운영하고 있다고 가정합니다. 그 와중 버그가 없다면 다행이지만 버그가 발생하는 경우가 생깁니다. 만약 Monitoring이 없다면 버그가 발생했는지 조차 인지하지 못하고 고객센터를 통해 문의가 들어와야 확인할 수 있을 것 입니다. 또한 서버 용량, 메모리등의 문제로 서버가 다운될 수도 있습니다. 이럴 경우 선 버그 후 조치가 이루어질 것입니다. 하지만 Monitoring이 있었다면 버그가 발생하기 전 예방할 수 있고 문제가 되었을 경우 시각적으로 제공되는 데이터를 통해 대응을 빠르게 할..

Develop/devops 2021.04.08

[Kotlin] Spring-Batch 적용

이 글은 Kotlin으로 Spring Batch를 구현한 내용을 정리한 내용입니다. 코드의 양이 많아 중요한 부분 위주로만 작성하였습니다. 모든 코드는 Github에 있습니다. 참조해주세요. 글을 작성하기에 앞서 작업한 내용은 지난번 작성한 글을 기준으로 작성하였습니다. 함께보시면 이해하시기 편할 것 입니다. 이 글에서는 Spring-Batch가 무엇인지에 대해서는 다루지 않겠습니다. Spring-Batch를 Java, Querydsl-JPA로 구현이 가능해야 이해하는 데 무리가 없을 것입니다. build.gradle.kts import org.jetbrains.kotlin.gradle.tasks.KotlinCompile plugins { val kotlinVersion = "1.4.31" id("org..

Querydsl Join Table Sort 적용 ( 번외로 Pageable와 비슷한 것을 구현해보자! )

Front-End에서 데이터 테이블을 이용하여 데이터를 보여주고 있었습니다. 이 때 각 컬럼의 Sort를 설정하여 데이터를 정렬하는 Querydsl을 사용하기 위해 적용한 내용을 정리한 글입니다. 모든 소스는 Github에 있습니다. 사용하게 된 이유 화면에서 넘겨주는 Sort관련 정보는 N개의 테이블에 대한 정보가 넘어올 수 있습니다. 예를 들어 Store, Staff 2개의 테이블이 존재하고 같은 field의 이름이 존재합니다. @Entity @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Store { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long i..

Develop/spring-data 2021.03.14

Jenkins API를 이용하여 Item build하기

재직중인 회사에서 자동화를 위해서 Spring-batch와 Jenkins를 이용하여 무언가를 체크하는 로직을 만들었고 요청이 들어올때마다 실행해주고 있었습니다. 하지만 이것도 불편하다!! 웹에서 버튼을 눌렀을 때 Jenkins의 Item을 실행해보자! Jenkins Token 발급 먼저 Jenkins에서 Token을 발급받아야만 Jenkins API를 사용할 수 있습니다. Token을 발급받아보겠습니다. 먼저 People에 들어가 발급받는 유저를 선택하고 Configure로 진입합니다. 구성화면에 진입한 후 Add New Token 버튼을 클릭합니다. 토큰 명을 입력하고 Generate 버튼을 클릭합니다. 생성된 토큰을 저장합니다. Code 작성 Jenkins와 통실할 클래스를 생성합니다. applica..

Develop/devops 2021.03.10

[백기선님의 자바 라이브 스터디] 12주차 - 애노테이션

www.youtube.com/watch?v=HLnMuEZpDwU 목표 자바의 애노테이션에 대해 학습하세요. 학습할 것 (필수) 애노테이션 정의하는 방법 @retention @target @documented 애노테이션 프로세서 먼저 재미삼아 Annotation 발음에 대해서 이야기를 해주셨네요~ 어노테이션, 애너테이션, 애노테이션 다 상관없다고 합니다 :) 제 생각도 같아요. 중요한 건 이게 아니니깐요 ~ Annotation 의미 그대로 풀이한다면 주석입니다. 하지만 일반적으로 알던 주석 ( // ) 과는 다르게 @ 기호를 사용합니다. 소스 코드에 추가할 수 있고 메타데이터의 일종입니다. Annotation 용도 자바는 선언적 프로그래밍 방식입니다. Annotation이 없었을 땐 xml에 각 클래스를 ..

Develop/java 2021.03.05

[Querydsl] 성능개선 - 3편 ( group by, 커버링 인덱스, update )

이 글은 우아한 형제들 콘서트에서 이동욱님의 영상을 보고 정리를 위한 글입니다. 이 글에 작성된 예시는 모두 Github에 올려두었습니다. Group By 최적화 Mysql 사용 시 index가 걸려있지 않는 컬럼을 group by 할 경우 file sort가 발생합니다. Index가 걸려있지 않는 경우 select * from house group by name Index가 걸려있는 경우 select * from house group by id file sort가 발생하면 성능이 떨어질 수 밖에 없습니다. 이 경우 order by 절에 null을 넣으면 file sort가 발생하지 않습니다. select * from house group by name order by null 하지만 안타깝게도 Quer..

Develop/spring-data 2021.02.04
728x90
반응형