Posts by Year

2023

정렬된 다른 리스트 기준으로 정렬하기

2개의 리스트가 있고, 정렬된 하나의 리스트를 기준으로 나머지 하나의 리스트를 정렬해야 하는 경우에 Java8에서 추가된 List의 sort 메소드와 Comparator를 이용해서 쉽게 처리할 수 있다.

Back to Top ↑

2022

Builder로 Jackson Deserialize하기

개인적으로는 DTO 클래스가 필요할 때 불변 클래스로 만드는 것을 선호합니다. 여러 장점이 있지만 그 중에서도 객체 값이 중간에 변경될 일이 없기 때문에 다른 걱정이 없이 사용할 수 있는 장점이 특히 매력적인 것 같습니다.

사용중인 DB 커넥션 수 확인하기

현재 커넥션 수 확인하기 DB 커넥션 수가 제대로 동작하는지 확인하고 싶은 경우가 있다면 HikariDataSourcePoolMetadata클래스를 이용해서 현재 사용 중인 커넥션 수를 확인할 수 있습니다.

Back to Top ↑

2021

Git 명령어

git을 사용하고는 있지만 그때그때 필요한 기능만 사용하다 보니 모르는 명령어 또는 제대로 알고 사용하고 있지 않은 명령어가 있다는 생각이 들었습니다. 보통 업무를 할 때는 툴을 통해서 많이 작업하다 보니 특히 그랬던 것 같은데 이번 기회에 공부할 겸 정리를 한번 해봤습니다.

Docker Nginx 그리고 Logrotate

docker로 nginx를 실행하고 logrotate 설정하는 방법을 확인해 보겠습니다. nginx alpine 이미지에는 logrotate가 없지만, 호스트에 logrotate가 있다면 docker volume을 통해서 log 파일을 logrotate를 실행할 수 있습니다. 이렇...

Back to Top ↑

2020

Spring ThreadPoolTaskExecutor 설정

ThreadPoolTaskExecutor는 이름에서 알 수 있듯이 스레드 풀을 사용하는 Executor입니다. 상위 인터페이스를 확인해 보면 java.util.concurrent.Executor를 Spring에서 구현한 것을 확인할 수 있습니다. 이 스레드 풀을 사용할 때 설정에 ...

AdSense PIN 번호 받다

AdSense PIN 번호 받은 기념으로 블로그에 대해서 다시 한번 생각해봤다.

Spring Data JPA에서 SQL Function 사용하기

JPA를 사용하면서 SQL function을 사용하고 싶은 경우가 생길 수가 있습니다. 예제를 통해서 필요한 상황과 해결 방법을 알아보겠습니다.

Kotlin에서 property와 function의 사용 구분

kotlin을 이용해서 개발하고 있지만 최근에서야 property와 function의 차이점을 알게 된 것 같습니다. 어떻게 구분해서 사용하는 것인가? 대한 고민 없이 그냥 사용했었는데요. 그 차이에 대해서 고민한 내용입니다.

Kotlin에서 mock 테스트 하기

예전에는 테스트 코드를 작성하려고 해도 스스로도 익숙하지 않았고 테스트 코드 작성에 대해 호의적이지 않은 사람이 있거나 일정 압박으로 테스트 코드를 작성하다가도 중간에 포기한 적이 많았습니다. 지금 진행하는 프로젝트는 kotlin으로 개발하고 있으며 구성원 모두가 테스트 코드의 ...

Java8 stream sum 구하기

Java8 숫자 타입 List에서 합계를 구하는 방법입니다. Integer, Long, Double은 Stream의 reduce()나 전용 Stream을 이용해서 바로 sum 구할 수 있고 BigInteger, BigDecimal은 reduce를 이용해서 구합니다.

JPA Criteria로 관계 설정 없이 조인하기

JPA Criteria에서 Entity 관계를 설정한 경우에는 조인 쿼리를 통해서 Entity를 조회할 수 있습니다. Order와 Member가 N:1로 설정되어 있을 때 JPA Criteria로 조회하는 방법을 확인해보겠습니다. @Entity @Table(name = "memb...

@ManyToOne의 N+1 문제 원인 및 해결

Hibernate에서 @ManyToOne의 FetchType을 LAZY로 설정해도 추가 쿼리가 실행되는 이유와 N+1 현상이 발생하는 과정을 확인해보겠습니다.

Spring Boot Actuator Graceful Shutdown

Spring Boot 환경에서 application을 shutdown 하는 방법 중 대표적인 것이 actuator의 shutdown endpoint 기능을 이용하는 것입니다. 이 endpoint는 예상과 달리 처리 중인 요청이 있더라도 그냥 shutdown 처리를 합니다. 정말로 ...

Spring Boot Bean Validation 제대로 알고 쓰자

지난번에 작성한 Java Bean Validation 제대로 알고 쓰자에 이어서 Spring Boot 환경에서 Validation을 어떻게 사용할 수 있는지 확인해보겠습니다. Spring에서도 Hibernate Validator를 사용합니다. Java Bean Validation에...

Java Bean Validation 제대로 알고 쓰자

개발하면서 제일 중요하게 생각하는 것 중에 하나가 validation입니다. 개발하고 운영하다 보면 클라이언트로부터 입력받은 값의 오류로 발생하는 장애가 꽤 많습니다. 잘못된 값을 전달받아 즉시 오류가 발생하면 그나마 다행입니다. 오류 없이 그대로 데이터가 저장이나 수정되고 그 데...

Enum and Jackson in Spring

지난번에 작성한 Enum and @RequestParam in Spring에 이어서 이번에는 JSON으로 전달된 Request Body에서 Enum 타입을 처리하려면 어떻게 해야 하는지 확인해보겠습니다.

Enum and @RequestParam in Spring

Spring에서 문자나 숫자로 전달된 Request Parameter를 Enum 타입으로 처리하는 방법과 custom conveter를 만드려면 어떻게 해야 하는지 확인해보겠습니다.

Kotlin and Jackson (ObjectMapper)

kotlin 환경에서 Jackson 라이브러리를 사용할 때 객체 변환이 생각대로 잘 안될 수 있습니다. 어떤 경우가 있는지 어떻게 해결할 수 있는지 확인해 보겠습니다.

Spring Transaction 적용 범위 제어 방법

Spring을 사용하면 트랜잭션을 설정하기 위해 보통은 @Transactional 애노테이션을 많이 사용합니다. @Transactional은 클래스나 메서드에 지정해서 사용하게 됩니다. 그러다 보니 트랜잭션 적용 범위를 제어하기가 힘들 수 있는데요. 이럴 경우에 사용할 수 있는 방...

JdbcTemplate Bulk Insert ID 조회

이전에 작성했던 JPA Batch Insert with MySQL 글에서 JDBC Batch와 JdbcTemplate을 이용한 bulk insert 처리하는 방법에 대해 잠깐 얘기한 적이 있었습니다. 이번에는 batch insert 이후에 생성된 데이터의 키값을 가져오는 방법에 대...

Hibernate에서 Custom ID 생성하기

보통 테이블의 키값은 DB에서 제공하는 sequence나 auto increment 같은 증가 값 형태를 많이 사용하는데요. 특정 방식으로 키값을 관리해야 하는 경우도 있습니다. 예를 들면 uuid나 주문번호처럼 일정 패턴으로 생성하는 값을 키값으로 사용하는 경우가 있습니다.

코로나19와 재택근무

지난주 목요일부터 저희 회사도 재택근무를 시작했습니다. 코로나19 바이러스로 재난위기 경보 수준이 “심각” 단계로 되면서부터 재택근무가 가능한 산업분야에서는 많이 도입하는 것 같습니다.

Kotlin val property and nullable columns in JPA

기존 테이블 기준으로 Kotlin Entity를 생성 하려다 보면 property type을 nullable 과 not null 중에 고민하게 되는 상황이 있습니다. 왜 이런 상황이 생기는지 어떻게 해결하는지 좋을지 확인해보겠습니다.

Spring Data JPA Audit in Kotlin

Kotlin으로 Entity를 만들 때 등록일/수정일 정의를 어떻게 하는 게 좋을지 고민한 내용입니다.

@EmbeddedId 객체 필드 중에 null 이 있으면?

PK 컬럼이 not null인 것 처럼 JPA에서 @Id 애노테이션이 있는 필드도 not null 이어야 합니다. PK 컬럼이 여러개인 복합키인 경우에도 PK로 지정한 컬럼은 모두 not null 이어야 하는데요. JPA를 사용하면서 이부분에 대해 경험한 내용입니다.

Http Request File in Intellij

뒤늦게 알게된 Http Request File 기능이 좋아서 메뉴얼 참고해서 내용 정리립니다.

Spring Data JPA에서 Insert 전에 Select 하는 이유

이전 글에서 bulk insert 처리를 할 수 있는 방법 중에 하나가 @Id 값 알고 있는 경우라고 했었는데요. 실제로 잘 되는지 확인하는 과정에 발생한 문제 내용을 공유합니다.

Back to Top ↑

2019

JPA Batch Insert with MySQL

JPA에서 Batch Insert가 되지 않아서 그 이유를 확인한 과정을 공유합니다. Spring, Kotlin, MySQL 환경기준으로 작성했습니다.

Back to Top ↑

2018

SSH 기본 사용법

SSH 기본 사용방법에 대해 알아보겠습니다. 접속명령 SSH의 기본 포트는 22번입니다. > ssh 아이디@호스트 # SSH 접속 > ssh 아이디@호스트 -p포트 # SSH 접속 포트변경 Key 생성 접속할 때마다 매번 계정과 패스워...

Collectors.toMap은 NPE 주의가 필요하다

Java8에서 Collectors.toMap()을 사용할 경우 NPE 발생에 대한 주의가 필요합니다. 개발 및 테스트 환경에서는 이상이 없었는데 운영에서 오류가 발생한 경험에 대한 내용입니다.

Back to Top ↑

2017

Map에서 key와 value 바꾸기

Map에서 key와 value의 위치를 서로 변경해야 할 일이 생길 수 있습니다. 어떻게 처리해야 할지 살펴보겠습니다. 기본적으로 Map은 중복된 key 값을 가질 수 없지만 value는 중복일 수 있습니다. 그래서 서로 위치를 변경하게 되면 value는 List로 처리해야 합니다.

Java DecimalFormat Pattern

오랜만에 사용하려면 기억나지 않는 DecimalFormat 클래스의 Number Format Pattern을 정리합니다.

Java8 stream으로 중복된 요소 존재 확인

Java8 stream을 사용하여 중복된 요소가 있는지 확인하려면 distinct()를 호출한 후 count() 정보와 원본 리스트의 size()를 비교하여 알 수 있습니다.

Back to Top ↑