전체 글 353

@blocknote 호환 컨텐츠 자동 번역 기능 구현

BlockNote(React를 위해 구축된 오픈소스 기반의 블록 스타일 텍스트 에디터)를 사용하고 있는 상황이었다링크 : https://www.blocknotejs.org/ 번역 기능을 구현해야 했는데, 기존 브라우저에서 제공하는 번역 기능이 blockNote의 텍스트 블록을 텍스트로 취급하지 않아 번역이 되지 않는 문제가 있었다 그래서 블로그 작성 시 다국어 번역본을 자동으로 제공하기 위해 해당 에디터의 구조를 분석하고 번역 수행 로직을 구현했다0. translation 진행 전 호출 위치 선정요구사항에 따라 블로그 게시물을 생성이 완료된 후 번역 대상 컨텐츠에 대한 업데이트(번역 컨텐츠는 별도의 컬럼으로 관리한다)를 수행하고, 본 컨텐츠를 업데이트하는 경우사용자의 필요에 따른 번역 API를 호출하는 ..

자바☕ 2026.01.14

CICD : Github Action + AWS IAM + AWS S3 + AWS EC2 + AWS Code Deploy

0. 사전기술 스택 : Github Action, AWS EC2, AWS Code Deploy, AWS S3, Docker1. appspec.ymlpermission을 작성할 때-object 부분에 경로를 정확하게 작성해야 한다-owner, group의 경우 EC2 내부의 사용자, 그룹을 의미하고 별도로 생성하지 않는 한 ubuntu EC2의 경우 ubuntu가 기본값이다+ 설정하는 방법sudo adduser 사용할사용자이름* (ubuntu) 사용자 이름에 대문자를 사용하고 싶은 경우:sudo adduser --force-badname 사용할사용자이름 *After Install 설정을 통해 deploy.sh를 지정하여 code deploy가 해당 쉘 스크립트를 시작하도록 지정한다2. workflow1. ..

인프라 2025.12.12

단일 인덱스 vs 복합 인덱스 vs 인덱스 머지(Index Merge)

1. 단순 인덱스장점 :- 관리 편함- 쓰기 성능 향상- 저장공간 절약 단점 :- 단일 인덱스만으로 이뤄진 여러 검색 조건의 조회 쿼리 수행 시 하나의 인덱스만 사용하거나 인덱스 머지를 수행- 정렬이 필요한 경우 별도의 정렬 수행해야 한다2. 복합 인덱스 : 생성 순서와 사용 컬럼이 정해진 여러 인덱스 키를 가진 하나의 인덱스장점 :- 해당 순서에 맞는 전체 또는 일부 검색을 수행할 경우, 단일 인덱스와 인덱스 머지보다 빠른 성능으로 조회 가능- 커버링 인덱스 : 검색조건이 모두 복합 인덱스인 경우 테이블을 읽지 않고 인덱스만 읽고 반환하기 때문에 성능 향상- 인덱스 생성 순서와 쿼리 정렬 순서가 일치할 경우 별도의 정렬 작업을 수행할 필요 없음 단점 :- 순서에 맞지않는 검색조건은 인덱스를 타지 못함e..

RDB🗂️ 2025.11.25

10.21 TIL : SQL 필터를 통한 데이터 정제

DB에서 varchar로 저장된 json String에 대해 한글인 경우의 데이터를 추출해야 했다. 다만, 한글이어도 상관없는 키와 한글 데이터가 같이 섞여있기 때문에, 이를 제외하는 것이 중요했다 완성된 쿼리 :WITH W1 AS ( -- 1. 본 테이블에서 한글이 포함된 모든 데이터 조회 SELECT sequence, content FROM board b WHERE b.content RLIKE '[가-힣]'),W2 AS ( SELECT sequence, REGEXP_SUBSTR( b.content -- 패턴: "key":" 뒤에 오며, 한글을 포함하고, 닫는 따옴표 직전까지의 내용을..

TIL, WIL/TIL📘 2025.10.22

09. 25 TIL : Gson 라이브러리의 JsonObject 객체 활용 시 주의할 점

0. 문제 상황-> JsonObject에서 String인 값을 toString() 메서드를 활용해 값을 참조했지만, 왜인지 \"A\" 의 형태로 문자열 안에 따옴표까지 추가된 형태로 데이터를 반환하고 있었다 1. 공부한 내용JsonObject.get(memberName).toString() 메서드를 활용할 때 주의할 사항 가장 기본인 Object의 toString() 메서드는public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode());}로직을 가지고 있다 이 로직을 통해 호출할 경우, 해당 객체의 "주소"를 문자열로 반환받을 수 있다 이와 다르게 JsonObject의 경우, 상위 객체인 Js..

TIL, WIL/TIL📘 2025.09.25

07. 03 TIL : @Configuration 클래스

@Contiguration 의 역할에 대해 조금 착각한 부분을 적어본다 해당 클래스는 스프링 빈 컨테이너에 다른 컴포넌트들과 마찬가지로 @Bean으로 등록된 클래스로, 스프링에 의해 의존성 관리 및 라이프 사이클 관리가 이루어지는 클래스 컴포넌트의 한 종류에 속한다 나는 유틸리티 클래스(흔히 ~Util.java로 네이밍하는 클래스)와 혼동해 설정 클래스에 의존성 주입이나 다른 라이프 사이클 등을 적용하면 안될 것으로 혼동했다 하지만 그럴 필요 없이, 유틸리티 클래스는정적 메서드의 집합으로, 어디서나 재사용이 가능하고 스프링의 관리를 받지 않는 클래스를 의미한다 이미 @Configuration을 붙임으로, 스프링의 관리를 받는 설정 클래스는 유틸리티 클래스가 아닌 것이다 그렇기 때문에설정 클래스에 의존성 ..

TIL, WIL/TIL📘 2025.07.03

Spring에서 브라우저의 정적 자원에 대한 메모리 캐시 최적화 전략

@ControllerAdvice 및 ResourceHandlerRegistry를 활용해 Resolver 버전을 자동 관리흔히 스프링으로 view까지 제공하는 경우(JSP, ThymeLeaf 등), 참조하는 js를 수정하는 경우 브라우저는 기존 js를 메모리에 캐싱해 둔 상태이기 때문에 클라이언트가 일일히 캐시를 지워줘야 하는 불편함이 있다 일반적인 대안으로 import 소스 명시할 때, 날짜나 ?version=123 등으로 관리하는 방법이 제시된다 다만, 날짜의 경우, 해당 날짜 또는 시간(버전에 시간까지 명시한 경우)가 경과하면브라우저는 바로 새로운 버전으로 캐싱하기때문에 네트워크에 요청을 시간이 경과할 때마다 계속 날린다 또한 버전의 경우, 수동으로 application.yml 등에서 관리를 해줘야하..

Spring🍃 2025.06.13

04. 29 TIL : SQL 쿼리에서 CASE 문의 중복 사용

쿼리문을 작성하다가, 공통 조건 A가 있고, 분기점이 2개 이상인 CASE 문을 작성할 떄 가독성 및 속도 향상을 위해 공통 조건을 하나로 사용하려고 한다 -> 기존SELECT CASE WHEN 공통조건 A AND 분기점 B THEN C, WHEN 공통조건 A AND 분기점 D THEN E END...-> 개선안 : CASE 문의 중복 사용SELECT CASE WHEN 공통조건 A THEN CASE WHEN 분기점 B THEN C, WHEN 분기점 D THEN E END END...이 방식으로 개선이 가능하다

TIL, WIL/TIL📘 2025.04.29

Spring messging, Stomp를 활용한 메세지 관리 + 다중 세션 관리 구현

0. 해결해야 하는(구현해야 하는) 문제(요구 사항)- 사이트에 실시간으로 접속한 사람의 목록과 해당 사용자들이 현재 어떤 페이지, 탭에 접속해있는지를 확인해보고자 했다 - http, rest API를 통한 구현도 가능하겠지만, 이는 진정한 "실시간"을 의미하는 것이 아니며, 조금이라도 연결이 끊어지기 때문에 웹소켓(WebSocket) 프로토콜을 통한 접근을 시작했다 - 현재 프로젝트 환경에서는 스프링을 사용하고 있고, 스프링에서 웹소켓 프로토콜을 활용할 때 순수 웹소켓을 사용해도 되지만, Stomp 프로토콜을 사용해 더욱 간편한 구현이 가능하므로, 이 개발을 진행했다-> 사용한 기술 스펙1) stomp2) spring messing3) event Listener4) ConcurrentHashMap1. ..

Spring🍃 2025.04.20