반응형

전체 글 428

Java Map 반복시키는 가장 효율적인 방법

Java Map Interface 반복시키는 가장 효율적인 방법 Map Interface Map 인터페이스는 Key와 Value를 하나의 쌍으로 저장하는 방식의 자료형이며, 리스트나 배열과 같이 순차적으로(sequential) 해당 요소 값을 구하는 것이 아니라 'key를 통해 value를 가져오는 방식'이 가장 큰 특징입니다. 구현체 중 가장 많이 사용되는 클래스는 HashMap이며, 순서가 필요한 경우 입력된 순서대로 데이터가 출력되는 LinkedHashMap, 입력된 key의 sort 순서로 데이터가 정렬되는 TreeMap 등이 있습니다. 아래는 java에서 map을 반복시키는 몇 가지 방법들에 대해 어떤 방법이 더 효율적인지 궁금하여 비교하며 정리해 본 내용입니다. Map 반복 방법 Map map..

Programming/Java 2023.07.26

Spring Boot 자동 구성 AutoConfiguration 동작 원리 파헤치기

Spring Boot 자동 구성 AutoConfiguration 동작하는 원리 파헤치기 Spring Boot AutoConfiguration 자동 환경 설정(AutoConfiguration)은 Spring Boot의 가장 대표적인 기능이라고 할 수 있는데요. 스프링 부트는 spring-boot-project의 하위 모듈인 'spring-boot-autoconfigure'라는 프로젝트를 통해 web, aop, jdbc, jpa, redis 등, 수많은 자동 환경 설정(자동 구성)을 제공합니다. (spring-boot-starter 안에 spring-boot-autoconfigure가 포함되어 있습니다.) 개발자의 입장에서는 사용할 라이브러리의 의존성만 추가하게 되면 autoconfigure를 통해서 해당 ..

java stream BigDecimal add 합계 구하는 방법

java stream을 통해 BigDecimal 합계 또는 연산하는 방법 부동소수점의 부정확성으로 인해 java에서는 소수점에 대한 정확한 계산이 요구되거나 화폐 단위를 사용할 때 BigDecimal 타입을 사용하는데요. 해당 포스팅은 'java에서 stream을 활용하여 BigDecimal을 연산하는 방법'에 대해 정리한 내용입니다. 코드 예시 List bigDecimalList = Arrays.asList( BigDecimal.valueOf(1.123), BigDecimal.valueOf(0.335), BigDecimal.valueOf(2.10101), BigDecimal.valueOf(0.54321) ); //stream을 사용하지 않는 경우 연산 BigDecimal sum = BigDecimal...

Programming/Java 2023.07.19

@Conditional 어노테이션의 기능과 확장(@ConditionalOnXxx)

@Conditional 어노테이션의 기능과 확장 '@Conditional' 어노테이션은 Spring 4.0(released on 2013)부터 제공되기 시작했는데요. @Configuration, @Component, @Bean 어노테이션과 함께 사용되며, 이름 그대로 특정 조건을 만족하는지를 구별하는 기능입니다. 직접 사용할 일이 많을 것 같지는 않았지만 spring boot 자동 구성에 중요한 역할을 하는 당, 흥미 있는 기능이라고 생각되어 정리해 보았습니다. 아래 내용에서는 @Conditional 어노테이션을 직접 구현 및 적용하여 조건에 따라 동작하는지 여부를 살펴보고, 스프링 부트에서 확장된 @ConditionalOnXxx 어노테이션 기능을 통해 자동 구성이 실행되는 부분에 대해 간단하게 살펴보겠..

java image resize library 이미지 리사이즈 라이브러리 비교해보기

Compare java image resizing libraries 해당 포스팅에서는 썸네일 생성 등, 이미지의 사이즈를 조절하는 기능을 java에서 구현하기 위해 사용할 수 있는 몇 가지 라이브러리와 해당 라이브러리들의 사용 방법에 대해 살펴봅니다. + 마지막에는 각 라이브러리들을 사용한 image resizing 결과를 비교해 보는 내용도 포함되어 있습니다. java.awt.Graphics2D Image.getScaledInstance() thumbnailator Imgscalr 1. java.awt.Graphics2D 'Graphics2D Class'는 graphics contexts에 대한 추상화를 제공하는 기본 클래스인 Graphics Class를 확장한 것으로 java 플랫폼에서 2차원 텍스트..

Programming/Java 2023.07.15

@QueryDelegate 어노테이션으로 QueryDSL where절 간결하게 사용하기

QueryDSL @QueryDelegate 어노테이션 사용해 보기 'QueryDSL'은 정접 타입을 이용해서 SQL 등의 쿼리를 생성해 주는 오픈 소스 프로젝트이며, 이름 그대로 query(데이터 조회)에 특화되어 있습니다. * dsl(Domain Specific Language) 특정 도메인을 적용하는데 특화된 프로그래밍 언어 문자가 아닌 코드로 쿼리를 작성하기 때문에 컴파일 시점에서 문법 오류를 발생할 수 있다는 장점이 있으며, 동적인 쿼리 작성이 편리하고, 쿼리의 제약 조건 등을 메서드 추출을 통해 재사용할 수 있다는 장점이 있는데요. 해당 포스팅은 '@QueryDelegate Annotation을 통해 QueryDSL의 where 조건절을 간결하게 사용하는 방법'에 대해 정리한 내용입니다. 예시 ..

Java 8, 11, 17 버전별 추가된 기능 (+ 무슨 버전을 써야할까?)

java 8, 11, 17 버전이 많이 사용되는 이유와 버전별 추가된 기능 최근 몇 년 동안 java에서 가장 많이 사용되는 버전은 'java 8'으로 저 역시 실무에서는 java 8만 계속 사용하고 있는데요. 자바는 2021년 9월 출시된 LTS 버전 java 17 이후로 2023년 7월 현재 java 20 버전까지 출시가 된 상태입니다. 이처럼 java에는 다양한 버전이 있는데요. 아래 jetbrains의 '2022년 개발자 생태계 설문조사'를 살펴보면 자바 개발자들이 사용하는 버전이 java 8, 11, 17에 집중되어 있는 것을 볼 수 있는데, 그 이유는 무엇일까요? 해당 포스팅은 자바 생태계에서 java 8, 11, 17이 많이 사용되는 이유와 각 버전별로 추가된 기능에 대해 정리한 내용입니다...

Programming/Java 2023.07.05

GCP 암호화폐 채굴로 인한 리소스 중단 이슈 (your Google Cloud Project is engaging in cryptocurrency mining)

your Google Cloud Project is engaging incryptocurrency mining 최근 사용 중이던 gcp compute engine vm 인스턴스에 대해 아래와 같은 메일을 받았습니다. 'your Google Cloud Project is engaging in cryptocurrency mining, resulting in the suspension of all project resources displaying this behavior.' '귀하의 구글 클라우드 프로젝트가 암호화폐 채굴에 참여하고 있으며, 프로젝트의 모든 리소스가 일시 중단됩니다.' gcp console에 접속하여 해당 프로젝트를 확인해 보니 메일의 내용처럼 vm 인스턴스가 정지된 상태였는데요. 무료 서버..

IT Info 2023.07.02

java ip 접속 국가 정보 확인하기(GeoIP2, GeoLite2)

GeoIP2, GeoLite2를 사용하여 java에서 ip 접속 국가 정보 확인하는 방법 글로벌 서비스를 운영하는 경우 접속 ip를 통해 국가 정보를 확인해야 하는 경우가 있을 수 있으며, 글로벌 서비스가 아니더라도 해외에서 들어오는 요청을 차단하기 위해 접속 ip에 대한 지역 정보가 필요한 경우가 있습니다. 해당 포스팅은 java에서 client ip를 통해 접속 국가 정보를 확인할 수 있는 api인 'GeoIP2(com.maxmind.geoip2)'와 무료 데이터베이스 'GeoLite2'를 사용하는 방법에 대한 내용입니다. * 무료 데이터베이스인 GeoLite2와 유로 데이터베이스 GeoIP2는 정확도 측면에서 차이가 있습니다. GeoLite2 다운로드 아래 예시에서는 GeoLite2를 다운로드하여 ..

Programming/Java 2023.06.29

gcp wordpress 워드프레스 설치 방법(php 8.1)

구글 클라우드 플랫폼, 워드프레스 설치하는 방법(php 8.1) 최근 워드프레스 블로그에 관심이 있어 찾아보게 된 'GCP(Google Cloud Platform)에 WordPress를 설치하는 방법'에 대한 포스팅입니다. 아래 내용은 Ubuntu 20.04 LTS 버전에서 작업된 내용임을 참고 부탁드립니다. 2023년 6월 26일 기준 워드프레스의 최신 버전은 6.2.2인데요. Wordpress 5.9부터 PHP 8.1에 대한 베타 지원이 추가되었기 때문에 해당 포스팅에서는 PHP 8.1 버전을 설치하였습니다. (기존에 많이 사용되던 7.4 버전에 비해 8.1 버전의 성능이 많이 향상되었다고 합니다.) 전체 과정을 간단하게 설명드리면 Apache2, MariaDB, PHP 설치에 이어 데이터베이스 생성..

IT Info 2023.06.26

@RedisHash keyspace 사용 시 주의할 점 (RedisKeyValueAdapter)

얼마 전 @RedisHash를 통해 redis를 사용하는 과정에서 @Indexed 어노테이션을 통해 secondary index를 적용한 필드에 대해 ttl(time to live)가 적용되지 않는 현상을 해결하는 방법에 대한 포스팅을 하였는데요. 2023.05.26 - [Programming/Spring Boot] - RedisHash 사용 시 @Indexed 필드 TTL(timeToLive) 적용 안되는 문제 RedisHash 사용 시 @Indexed 필드 TTL(timeToLive) 적용 안되는 문제 @RedisHash @Indexed field ttl not working Spring Boot에서 @RedisHash + RedisRepository(CrudRepository를 상속받은)를 통해 인..

Programming/Error 2023.06.22

JPA 연관 관계 매핑 - 조인 테이블(@JoinTable) 개념과 적용 방법

Join Column, Join Table 관계형 데이터베이스에서는 정규화를 통해 의미 있는 데이터의 집단으로 테이블이 구성되며, 이렇게 구성된 각 테이블끼리는 연관 관계를 갖게 되는데요. 서로 연관 관계가 있는 데이터가 여러 테이블에 나눠서 저장될 수 있기 때문에 필요한 경우 여러 테이블에서 데이터를 효과적으로 검색하기 위해 조인(join)이 사용되는 것은 필수적입니다. * 정규화란 불필요한 데이터 모델의 중목을 최소화하고, 데이터의 일관성과 유연성을 확보하기 위한 목적으로 테이블을 구조화하는 프로세스입니다. 데이터베이스에서 테이블의 연관 관계를 설계하는 방법은 'Join Column'을 사용하는 방법과 'Join Table'을 사용하는 방법 크게 두 가지로 나뉩니다. 대부분의 경우 외래키(Foreig..

PropertyReferenceException: No property found for type 발생 원인과 해결 방법

PropertyReferenceException: No property found for type 발생 원인과 해결 방법 작업 중 'PropertyReferenceException: No property found for type' 예외가 발생하였고, 원인을 찾는데 한 시간이 넘게 걸렸지만 원인은 결국 아주 사소한 것(오타)이었는데요. jpa, querydsl을 사용하며 생각보다 자주 만날 수 있는 오류인 것 같았으며, 발생한 케이스 외에도 몇 가지 비슷한 경우가 있어 함께 정리한 내용입니다. (아래 예시에서 사용된 NoticeMember는 단순 예시를 위한 Entity 명입니다.) Caused by: org.springframework.data.mapping.PropertyReferenceExcepti..

Programming/Error 2023.06.17

Redisson 분산락을 사용하는 이유와 기본적인 사용 방법

동시성 문제(Concurrency Issue)와 분산락(Distributed Lock) 동일한 자원(data)에 대해 여러 스레드가 동시에 접근하면서 발생하는 '동시성 문제'는 상품의 재고 관리 등, 프로세스의 여러 곳에서 발생할 수 있는데요. 이러한 동시성 문제를 해결하는 방법 중 하나로 '분산락'이 있으며, 아래 내용은 'Redisson을 통한 분산락을 사용하는 방법'에 대한 정리입니다. * 동시성 문제(concurrency issue) - 하나의 스레드가 데이터를 수정 중인 상황에서 다른 스레드에서 수정 전의 데이터를 조회하여 수정함으로써 데이터의 정합성(consistency)이 깨지는 문제를 말합니다. * 분산락(distributed lock) - 경쟁 상황(race condition)에서 하나의..

Java List null check 방법 (isEmpty, size)

Java List null check 프로젝트를 진행하다 보면 List를 활용하는 부분에서 NullPointerException이 발생하는 경우를 생각보다 자주 접할 수 있는데요. 아래 내용은 java에서 list에 대한 null 체크를 하는 몇 가지 방법에 대해서 정리한 것입니다. List.isEmpty(), List.size() - isEmpty() //Returns true if this list contains no elements boolean isEmpty(); List interface의 isEmpty() 메서드는 해당 리스트 객체가 아무런 요소도 가지고 있지 않을 때(리스트가 비어있을 때) true를 반환합니다. //NullPointerException 발생 List list = null;..

Programming/Java 2023.06.09
반응형