반응형

전체 글 423

Spring Boot 초기 데이터 설정 방법 정리(data.sql, schema.sql)

스프링부트 초기 데이터 설정 방법에 대한 정리 스프링부트에서는 데이터베이스 초기 설정을 위해 기본적으로 script(schema.sql, data.sql) 파일을 사용할 수 있는데요. 관념적으로 데이터 정의어(DDL)는 schema.sql 파일에 작성하고 데이터 조작어(DML)은 data.sql 파일에 작성됩니다. 스크립트 파일의 동작은 spring boot 2.4.x 버전과 2.5.x 버전을 기점으로 차이가 있기 때문에 동작 방식에 대해서 알고 적용할 필요가 있는데요. (스트립트 파일을 적용하는 것의 상위 방식으로는 Flyway 또는 Liquibase라고 하는 마이그레이션 도구가 있습니다.) 아래 내용은 Spring Boot 2.4.x 이하 버전과 2.5.x 이상 버전을 기준으로 스프링 부트에서 scr..

MariaDB 가상 필드를 통한 JSON 인덱싱 방법(Generated Columns)

Indexing a Generated Column to Provide a JSON Column Index. 저장되는 데이터들이 많아지고, 또 그 데이터들의 형태가 복잡 + 다양하게 활용되고 있는데요. 때문에 관계형 데이터베이스(Relational Database)에서도 json 타입을 지원하고, 또 사용자들에게도 많이 사용되는 추세입니다. 'mysql'의 경우 MySQL 8.0.13부터 json 데이터 타입 필드의 인덱싱을 지원하는 반면, 'mariadb'의 경우 아직까지 json 타입의 필드에 대한 인덱싱이 지원되지 않고 있는데요. 아래 내용을 통해 'mariadb에서 가상 필드를 통한 json 타입 필드의 Indexing 방법'을 살펴보겠습니다. (해당 방법은 MySQL에서도 적용될 수 있습니다.) ..

(javascript) input image width, height 이미지 너비, 높이 구하기

javascript - input image width, height 구하는 방법 JavaScript를 사용하여 에 들어온 이미지 파일의 너비와 높이를 구하는 방법이 궁금하여 찾아본 내용입니다. 해당 기능에서 핵심이 되는 것은 javascript에서 사용되는 FileAPI인 'FileReader'인데요. 아래 실제 구현 코드를 통해 내용 살펴보겠습니다. (input type="file"으로 들어온 이미지 파일의 너비와 높이를 구하는 코드) /* FileReader란? 웹 어플리케이션이 비동기적으로 파일의 내용을 읽는 데 사용되는 객체이며, File 혹은 Blob 객체로부터 내용을 읽어옵니다. */ 동작 내용을 살펴보면, 먼저 FileReader 객체 생성 후에 사용되는 'readAsDataURL()' 메..

Apache Kafka 주요 개념 정리 (Cluster, Topic, Producer, Consumer)

kafka 주요 개념 정리(cluster, topic, producer, consumer) 1. 카프카(Kafka)란? Kafka는 링크드인(Linked-in)에서 처음 개발되어 2011년 오픈소스화 된 솔루션인데요. 실시간으로 스트리밍 데이터를 게시, 구독, 저장 및 처리할 수 있는 '분산형 데이터 스트리밍 플랫폼'입니다. 기존의 직접적인(end-to-end) 연결 방식의 아키텍처는 데이터 연동의 복잡성이 높고 확장이 어려운 구조인 반면, Kafka를 사용하면 보내는 쪽에서는 Kafka로 메시지를 보내면 되고, 받는 쪽에서도 누가 그 메시지를 생성하고 보냈는지에 관계없이 단순하게 메시지 자체를 가져와서 처리할 수 있게 됩니다. (단순히 text 형식의 메시지뿐만 아니라 json, xml, java의 O..

(java) Enum field에 Enum List를 사용하며 발생한 코드 리팩토링

enum field에서 enum list를 사용하면서 코드가 리팩토링 되는 과정을 정리하였습니다. 리팩토링(Refactoring)이라는 다소 고급진 단어를 사용하였지만, 상당히 간단한 코드 개선 내용임을 미리 말씀드립니다. (마지막에는 리팩토링에 따른 속도 차이가 비교되어 있으니 참고 부탁드리겠습니다.) Enum Class public enum Status { READY, PROCESSING, CANCEL, TERMINATE, DONE; } (Status Enum Class) public enum ViewStatus { PROCESSING, DONE; } (ViewStatus Enum Class) 예시로 사용될 두 개의 enum class입니다. 어떤 Entity에서 내부적으로 사용되는 실제 상태 값은 ..

Programming/Java 2023.01.13

(MySQL) IN, NOT IN, EXISTS, NOT EXISTS 동작 방식 정리

해당 내용은 IN / NOT IN / EXISTS / NOT EXISTS 동작 방식을 정리한 내용으로 MySQL을 기준으로 실행하고 작성된 내용이지만 MSSQL, Oracle 등에서도 적용되는 내용입니다. (예시에 사용될 orders table, customers table입니다.) (예시에 사용될 orders table의 data입니다.) (예시에 사용될 customers table의 data입니다.) IN SELECT * FROM orders o WHERE o.customer_id IN (1, 2); -- or 연산자로 변환된 쿼리 SELECT * FROM orders o WHERE (o.customer_id = 1 OR o.customer_id = 2); in 구문의 경우 in 구문에 입력된 값들 ..

(Hibernate) Unknown table 'SEQUENCES' in information_schema 원인과 해결 방법

Unknown table 'SEQUENCES' in information_schema INFO 22239 --- [ restartedMain] o.s.b.a.h2.H2ConsoleAutoConfiguration : H2 console available at '/h2-console'. Database available at 'jdbc:mysql://localhost:3306/testdb?autoReconnect=true' INFO 22239 --- [ restartedMain] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default] INFO 22239 --- [ restartedMai..

Programming/Error 2023.01.10

@PostConstruct 어노테이션을 통한 스프링 빈(Bean) 초기화 콜백

@PostConstruct 어노테이션이 사용되는 이유를 알아보기 위해 먼저 스프링 빈의 생명주기에서 부터 초기화 콜백이 무엇인지, 어떤 용도로 쓰이는지에 대해 살펴보겠습니다. 스프링 프레임워크는 IoC(Inversion of Control) 컨테이너를 통해 Bean 객체들을 관리하는데요. 인스턴스 생성부터 소멸까지의 생명주기 관리를 개발자가 아닌 컨테이너가 대신해주기 때문에 개발자는 로직에 집중할 수 있다는 장점이 있습니다. (즉, 객체 관리 주체가 프레임워크가 되는 것입니다.) 스프링 빈 생명주기(Bean LifeCycle) 스프링 컨테이너 생성 -> 스프링 빈 생성 -> 의존 관계 주입 -> 초기화 콜백 -> 사용 -> 소멸 콜백 -> 스프링 종료 Spring Bean은 다음과 같은 생명 주기를 가지..

Programming/Java 2023.01.08

@Scheduled 동작 시 timezone 설정 관련하여 발생한 이슈 정리

spring boot 프로젝트에서 스케줄러 작업을 하던 중 발생한 이슈를 정리한 내용입니다. 이슈는 어플리케이션 기동 시 설정한 'TimeZone이 Scheduler 동작 시 적용되지 않는 것'에서 시작되었으며, 이슈에 대한 원인으로는 Scheduler 동작을 위한 클래스들이 Bean 등록되는 시점과 TimeZone을 설정하는 코드가 실행되는 시점의 차이 때문이었는데요. 아래 코드와 내용을 통해 자세하게 살펴보겠습니다. (CommandLineRunner interface를 통한 timezone 설정과 @PostConstruct annotation을 통한 timezone 설정의 실행 시점 차이) 문제가 된 코드 @EnableScheduling @SpringBootApplication public class..

Kafka TimeoutException 해결 방법 org.apache.kafka.common.errors.TimeoutException: Call(callName=listTopics ...)

kafka 서버 기동을 위해 'zookeeper 서버 기동' -> 'kafka 서버 기동' -> 'kafka 서버에 요청'을 하는 중 'TimeoutException'이 발생하여 해결한 내용입니다. (사용된 kafka 버전은 kafka_2.13-2.7.0 버전입니다.) Zookeeper 및 Kafka 서버 기동 //zookeeper server 기동 $KAFKA_HOME/bin/zookeeper-server-start.sh $KAFKA_HOME/config/zookeeper.properties //kafka server 기동 $KAFKA_HOME/bin/kafka-server-start.sh $KAFKA_HOME/config/server.properties 다음 실행 명령을 통해 zookeeper 서버가..

@Transactional 상태에서 Exception이 발생했을 때 Rollback 동작 과정

@Transactional 어노테이션을 통해 트랜잭션을 선언하고 메서드 내부 로직을 짜던 중 '트랜잭션 안에서 발생하는 예외와 그 예외를 처리하는 방법에 따라 어떻게 롤백이 되는지'에 대한 개념이 명확하지 않아 정리해본 내용입니다. 결론을 먼저 말하자면 Unchecked Exception 발생 시에는 트랜잭션이 롤백되지만, Checked Exception 발생 시에는 트랜잭션이 롤백되지 않는데요. 이어지는 내용을 통해 Unchecked Exception, Checked Exception에 대한 간단한 정리와 더불어, 각 상황에 따른 코드 예시와 동작 과정, 그리고 결과를 살펴보겠습니다. Checked Exception, Unchecked Exception - Checked Exception Compile..

spring 이벤트 사용하기(event publisher, event listener)

최근 프로젝트에서 'Spring Event'를 사용하게 되면서 정리한 내용입니다. 아래 내용에서 자세하게 볼 수 있겠지만 Spring Framework 4.2부터 스프링 이벤트의 사용이 간편해졌는데요. 기본적인 적용은 쉽고 간단하지만 실제 프로젝트에서는 @TransactionalEventListener 등의 조금 더 향상된 기능이 많이 사용되는데 해당 포스팅은 spring event 적용에 대한 기본적인 내용을 담았으며, 함께 사용되는 @TransactionalEventListener 어노테이션에 대한 내용은 추후 따로 포스팅하여 해당 글 하단에 링크하도록 하겠습니다. 1. 스프링 이벤트를 사용하는 이유와 장점 spring event를 사용하는 가장 주된 이유는 '서비스 간의 강한 의존성을 줄이기 위함'..

티스토리 Odyssey Skin 본문 너비(폭) 늘리는 방법

Odyssey skin은 티스토리에서 스킨 변경을 통해 기본적으로 사용할 수 있는 스킨 중 하나인데요. 반응형과 목록 광고 형태가 지원되며, 깔끔한 디자인으로 인해 여러 블로그에서 많이 사용되는 스킨입니다. 해상 스킨을 사용하고 있는 경우에는 아시겠지만, 오디세이 스킨은 기본적으로 적용되는 본문 폭이 넓지 않아 가독성과 공간 활용이라는 측면에서 크게 효율적이지 못한데요. 이번 포스팅은 '티스토리 odyssey skin 본문 너비(폭)를 늘리는 방법'에 대한 포스팅입니다. (해당 스킨에 설정된 css 변경을 통해 본문 폭을 늘리는 방법입니다.) 1. 스킨 편집 본문의 너비를 늘리기 위해서는 티스토리에 로그인 후 '블로그 관리 홈'으로 이동합니다. 그리고 '블로그 관리 홈' 아래에 '꾸미기' 카테고리 하위의..

IT Info 2022.12.20

Base64와 Base64UrlSafe 차이점 (Illegal base64 character 발생 이유)

Base64 encoding, decoding 기능을 사용하던 중 java.lang.IllegalArgumentException: Illegal base64 character 2b 예외가 발생했는데요. 해당 Exception은 Base64와 Base64 UrlSafe의 차이점을 제대로 알지 못하고 사용하였기 때문에 발생한 것이었으며, 해당 문제를 해결하면서 관련 내용을 함께 정리하였습니다. * 결론을 먼저 말하자면 Base64 UrlSafe로 디코딩할 수 없는 문자를 디코딩하려고 했기 때문에 발생한 오류였습니다. Base64란? 8비트의 이진 데이터(Binary Data)를 문자 코드에 영향을 받지 않는 공통 ASCII 문자들로만 이루어진 일련의 문자열로 바꾸는 인코딩 방식을 말합니다. Base64는 6..

Programming/Web 2022.12.17

spring cloud config 개념 및 동작 원리

Spring Cloud Config 개념 및 동작원리와 구현 예제까지 한 번에 정리를 해보려고 했으나, 구현 예제에 대한 내용이 다양하여 한번에 정리하기가 어려울 것 같아서 일단 개념과 동작 원리에 대해서만 먼저 정리하는 포스팅입니다. *.properties, *.yml 파일 spring cloud config에 대해서 살펴보기 전에 .properties 또는 .yml 파일의 역할에 대해서 먼저 살펴보겠습니다. *.properties와 *.yml 파일은 어플리케이션의 환경 설정 값을 가지고 있는 파일로 '환경설정 파일', '외부 설정 파일'(=config file)이라고 불리는데요. 스프링 부트 어플리케이션에서 이러한 환경설정 파일이 필요한 이유는 로컬(local), 개발(dev), 운영(prod) 환경..

반응형