전체 글
-
Flyway 이용기🧑🏻💻 프로젝트/motimo 2025. 6. 15. 15:18
✍️ 상황최근 진행 중인 프로젝트에서 TodoEntity와 TodoResultEntity 간의 관계를 어떻게 표현할지에 대해 고민할 일이 있었습니다.TodoResultEntity는 TodoEntity와 1:1 관계를 가지고 있지만 ORM 상에서는 연관관계 매핑을 하지 않고 단순히 todoId를 저장하는 방식을 택했습니다. @Column(name = "todo_id", nullable = false)private UUID todoId;연관관계를 명시적으로 선언하는 대신 ID를 직접 관리하면서 느슨하게 연결하는 구조로 설계 ❗ 팀원 리뷰에서 지적된 문제이 설계에 대해 팀원으로부터 다음과 같은 리뷰를 받았습니다. TodoResult와 Todo는 연관 관계를 맺어주는 게 좋지 않을까요?ID만 저장하는 방식으로 ..
-
UUID v4 / UUID v7🧑🏻💻 프로젝트/motimo 2025. 5. 30. 16:25
이번 프로젝트에서 UUID를 기본 키(PK)로 사용하기로 결정한 이후 어떤 성능적인 영향이 있을지에 대한 고민을 바탕으로 이 글을 작성하게 되었습니다.저희 프로젝트에서 사용하는 관계형 데이터베이스(RDB)는 PostgreSQL입니다. ✅ PostgreSQL의 Index는 기본적으로 B-Tree🐘 PostgreSQL 공식 문서 에 따르면PostgreSQL은 여러 인덱스 타입을 제공하지만 기본적으로 CREATE INDEX는 B-tree 인덱스를 생성합니다. B-tree는 대부분의 일반적인 상황에 적합하며 정렬 가능한 타입에 가장 효과적으로 동작합니다.📌 Hibernate에서 UUID 생성 방식Spring Data JPA에서 아래와 같이 UUID를 사용하는 경우@Entitypublic class UserE..
-
CQS / CQRS 패턴 적용기🧑🏻💻 프로젝트/motimo 2025. 5. 25. 18:17
⚠️ 작업 배경 및 문제 상황public class AuthService { private final UserService userService; @Transactional public User loginFromOAuth2(OAuth2UserInfo oAuth2UserInfo, String registrationId) { return userService.existsByEmail(oAuth2UserInfo.getEmail()) ? updateExistingUser(oAuth2UserInfo) : registerNewUser(oAuth2UserInfo, registrationId); }} 🌟 팀원의 피드백..! ?..
-
Kotest + Mockk 적용기🔖 Kotlin 2025. 5. 14. 15:24
Spring 기반 프로젝트에서 Kotlin을 사용하더라도 기존에 익숙하던 테스트 프레임워크인 JUnit, AssertJ, Mockito 등을 그대로 사용할 수 있습니다. 이번에 Kotlin을 처음 도입한 프로젝트에서 아직 Kotlin의 문법에 익숙하지 않은 상태로 테스트 코드를 작성하다 보니 자연스럽게 기존 Java 스타일의 JUnit 기반 테스트 코드를 작성하게 되었습니다. import org.junit.jupiter.api.Testimport org.assertj.core.api.Assertions.assertThatimport org.mockito.Mockito.*class UserServiceTest { private val userRepository = mock(UserRepository:..
-
MySQL Full-Text Search 도입기💻 computer science/📦 database 2025. 4. 14. 13:13
💣 배경 및 문제 상황초기에는 단순히 사용자들이 "제목" 또는 "설명"에 포함된 키워드로 LIKE '%keyword%' 검색을 수행하도록 설계했지만 문제가 발생🔸 방식SELECT * FROM table_A WHERE title LIKE '%keyword%' OR description LIKE '%keyword%';실제 사용한 쿼리는 아니지만 이런 식으로 사용 🔍 LIKE 문 동작 방식 분석 1️⃣ 예시 테이블 생성CREATE TABLE table_A ( id BIGINT PRIMARY KEY AUTO_INCREMENT, author_id BIGINT, title VARCHAR(255), description VARCHAR(255), created_at TIMESTAMP DEFAULT CUR..
-
Spring data R2DBC🧑🏻💻 프로젝트/beomstory 2025. 4. 13. 13:13
이번에 진행하는 프로젝트가 Kotlin + Coroutine을 이용함에 따라 DB 통신 기술을 비동기로 사용하도록 해야 했습니다.spring-data-jpa를 사용하지 못하기에 database와 비동기로 통신할 수 있는 기술에 대해서 찾아보게 되었습니다.📌 Hibernate ReactiveHibernate Reactive는 JPA의 Reactive 구현체로 JPA 반응형 구현체ORM 기능을 전부 활용 가능!!For a given Session object, nested calls to withTransaction() occur within the same shared transaction context. However, notice that the transaction is a resource loca..
-
🚐 Kafka 메시지 발행 최적화: 동기 방식에서 코루틴까지의 여정🧑🏻💻 프로젝트/beomstory 2025. 3. 24. 17:45
⚠️ 문제 상황트랜잭션 아웃박스 패턴을 사용하여 outbox 테이블에서 배치 단위로 데이터를 가져와 Kafka로 메시지를 발행하는 과정에서 메시지가 실제로 Kafka에 정상적으로 전달되었는지 확인하는 기능이 필요했습니다. 🤔 초기 접근법 - 동기적 처리 KafkaTemplate.send().get()Kafka에 메시지가 정상적으로 전송되었는지를 확인하기 위해 get() 메서드를 사용했습니다.val successfulIds = mutableListOf()pendingMessages.forEach { message -> try { val topic = kafkaProperties.getTopicForOutboxType(message.outboxType) kafkaTempla..
-
CLOVA Studio API 이용하여 답변 받기☁️ infra/Naver Cloud Platform 2025. 3. 7. 13:33
이번 502 포텐데이(비사이드 x 네이버 클라우드) 해커톤에 참여해 CLOVA Studio를 이용한 경험을 작성하고자 한다.http://bside.best/projects/detail/P250219095755 📌 CLOVA Studio 플레이그라운드Naver Cloud 콘솔 > CLOVA Studio 서비스 접속 > 플레이그라운드 왼쪽의 파라미터들을 통해서 하고자하는 기능에 따라 커스텀을 진행하면 된다.해당 화면에 대한 설명은 해당 링크를 통해서 확인하면 된다. ✏️ 프롬포트 작성 만들 서비스의 이름과 페르소나를 부여해주어야 한다.모델에게 성격, 캐릭터 등을 부여하는 작업을 프롬포트 엔지니어링이라고 한다.CLOVA Studio 에서는 프롬포트를 시스템 지시문이라는 이름으로 사용꿈을 해몽하는 모델을 ..