분류 전체보기(609)
- 
                
                  
                  비동기 환경에서 Spring Security 인증 정보 유지하기
배경FineAnts 프로젝트의 서비스 중에서 사용자 계정의 알림 설정을 업데이트하는 서비스가 존재합니다. 알림 설정을 업데이트 한 후에 변경 이벤트를 발행시켜서 변경된 알림 설정이 전부 비활성화이고 FCM 토큰이 존재하는 경우에 해당 FCM 토큰을 제거합니다. 알림 설정을 변경하는 코드는 다음과 같습니다.@Slf4j@Service@RequiredArgsConstructorpublic class UpdateNotificationPreference { private final MemberRepository memberRepository; private final ApplicationEventPublisher eventPublisher; @Transactional @Authorized(s..
2025.10.20 - 
                
                  
                  Obsidian 편집기에서 이미지 붙여넣기 할때 마크다운 형식으로 생성 설정
배경옵시디언(Obsidian) 편집기를 이용하여 마크다운 파일에 이미지를 추가해야 하는 경우가 있습니다. 이러한 경우 보통 이미지를 복사한 다음에 편집기 창에서 붙여넣기 버튼을 누르면 이미지가 생성되고 이미지 파일은 옵시디언 보관함의 특정 경로에서 생성됩니다. 예를 들어 옵시디언 편집기 창에서 이미지를 붙여넣어 보겠습니다. 이미지를 붙여넣으면 옵시디언 보관함의 최상위 경로에 "Pasted image 20250825124318.png"이라는 이름으로 파일이 저장되고 마크 다운 파일의 링크 값을 보면 "![[이미지 파일 이름]]" 형식으로 작성된 것을 볼수 있습니다. 문제점위와 같이 이미지를 붙여넣으면 옵시디언 편집기에서는 이미지가 잘 보이지만 Github 저장소와 같이 마크다운 파일을 업로드하게 되면 이..
2025.08.25 - 
                
                  
                  Gradle기반 jar 파일 배포
POJO(Plain Old Java Object) 기반으로 예적금 계산기 애플리케이션(invest72)을 구현하였습니다. 해당 프로젝트에는 spring 프레임워크나 web과 관련된 모듈이 없이 순수한 자바 객체로 구현된 프로젝트입니다. 이렇게 만들어진 invest72 모듈을 배포하여 관련된 프로젝트에서 사용할 수 있다면 좋겠다고 생각하였습니다. 이 글에서는 Gradle 기반으로 빌드된 jar 파일을 로컬 개발 환경에서 Github 원격 저장소에 있는 Github Packages에 배포하는 방법을 소개합니다. 배포하기 위한 invest72 프로젝트의 빌드 환경은 Gradle 기반이고, Java 언어는 17을 사용하였습니다.1. Gradle Task 작성자바 프로젝트의 build.gradle 파일에 접근하여..
2025.07.06 - 
                
                  
                  선풍기 버튼 디자인에 대하여
최근에 목욕을 하고 싶어서 자주 들리는 사우나에 방문했다. 목욕을 마치고 나서 머리카락을 말리기 위해서 드라이기를 사용하려고 했다. 화장대에는 드라이기, 스킨, 로션 등의 사우나에서 기본으로 비치되어 있는 화장품들이 있었다. 나는 드라이기를 들어서 머리카락을 말리고 있었는데, 왼쪽에 선풍기가 있었다. 아마 손님들이 선풍기를 사용해서 머리카락만이 아니라 몸 전체적으로 남아있는 물기를 말리라고 비치한 것일 것이다. 나는 선풍기를 켜서 몸에 있는 물기를 닦아내기 위해서 선풍기의 버튼에 손을 가져다 되었지만 선풍기는 작동하지 않았다. 왜냐하면 선풍기의 어떤 버튼이 바람을 나오게 하는지 알 수 없었기 때문이다. 어떤 사람들은 아니 무슨 선풍기 하나 못트냐고 생각할 수 있다. 그런데 쉽지 않다. 선풍기의 버튼들은 ..
2025.05.14 - 
                
                  
                  Spring JPA 대용량 데이터 조회 최적화, 300만건 포트폴리오 손익 데이터 처리 개선 사례
배경데이터베이스에 포트폴리오 손익 내역(PortfolioGainHistory) 데이터가 300만개인 상태에서 포트폴리오 종목 조회시 응답 시간이 길어지는 문제가 발생하였습니다.포트폴리오 종목 조회 API : /api/portfolio/:portfolioId/holdings 포트폴리오 손익 내역 데이터를 가져오기 위한 JPQL은 다음과 같았습니다.@Query(value = """ select p, p2 from PortfolioGainHistory p inner join Portfolio p2 on p.portfolio.id = p2.id where p.portfolio.id = :portfolioId and p.createAt findFirstLatestPortfo..
2025.04.29 - 
                
                  
                  직접 구현한 소셜 로그인을 왜 Spring Security로 재구현 했을까?
개요이 글에서는 기존 시스템에서 직접 구현한 OAuth 2.0 기반 소셜 로그인(Google, Kakao, Naver) 기능을, Spring Security 프레임워크를 도입하면서 해당 프레임워크에 맞게 재구현하게 된 배경과 이유를 소개합니다. 마지막으로 직접 구현한 소셜 로그인 인증 시스템의 문제점과 Spring Security를 도입하면서 어떻게 구조를 개선하였는지도 다룹니다. 직접 구현한 소셜 로그인 방식소셜 로그인의 수행 과정기존 직접 구현한 소셜 로그인 방식의 수행 과정은 다음과 같습니다.사용자는 소셜 플랫폼 인증을 위한 URL 생성을 서버에게 요청합니다.서버는 소셜 플랫폼에 맞는 URL을 생성하여 응답합니다.생성한 URL에는 인증 후 발급받은 인가 코드를 전달할 리다이렉션 주소가 쿼리 파라미터..
2025.04.18