🌱 spring
-
Transactional Outbox Pattern🌱 spring 2024. 4. 23. 22:19
💡 Transactional Messaging 비동기 메시징을 활용한 서비스 구현에서는 비즈니스 로직이 실행되었을 때, 이를 표현하는 이벤트도 온전하게 발행되는 것이 중요하다. 도메인 로직이 완료된 이후에 이벤트가 발행되지 않는다면, 해당 이벤트를 바라보는 컨슈머는 특정한 로직을 실행할 수 없게 되고, 이로 인해 전체 서비스의 데이터 정합성이 깨지거나 특정한 로직에서 버그가 발생할 수 있기 때문이다. 📖 Transactional Messaging 서비스 로직의 실행과 그 이후의 이벤트 발행을 원자적(Atomically)으로 함께 실행하는 것 Transactional Messaging의 구현 방법은 2가지가 존재한다. 1️⃣ 트랜잭셔널 아웃박스 패턴 (Transactional Outbox Pattern) ..
-
@TransactionalEventListener 적용해보기 😎🌱 spring 2024. 3. 17. 15:31
개인 프로젝트 진행 중 게시물을 생성하는 기능을 처리하는 도중 이미지 업로드하는 과정에서 고민이 생겼다. 📍 이미지를 올리는 이미지 서비스와 게시물을 게시하는 다른 서비스들 간의 호출을 통해 게시물을 올리는 기능을 구현하고자 한다. 이때, 이미지를 S3에 업로드하는 것이 성공하고나서 게시물 서비스에서 게시물을 만드는 도중 실패(예외)했을 경우 S3에 업로드된 이미지에 대한 문제가 발생할 것이라고 생각. 🤔 생각해본 해결 방법 1 - 이미지 업로드와 게시물 작성을 별도 처리 이미지 관련 요청을 먼저 처리한 후, 게시글과의 연관관계를 null로 설정 후, 게시글이 저장되면 그때 매핑 ⚠️ 위의 방식을 사용했을 때, 발생할 수 있는 문제 - 사용자가 이미지만 등록하고 게시글은 저장하지 않는다면?? 리소스를 낭..
-
🍀 MongoDB - QueryDsl with Spring🌱 spring 2023. 5. 30. 14:44
프로젝트를 진행하는 도중 여러 조건을 통해 mongoDB에 있는 데이터를 조회하는 기능이 필요했다. 이에 따라 복잡한 쿼리를 쉽게 작성하기 위해 QueryDsl을 적용해보고자 했다. 📌 QueryDSL 💡 QueryDSL은 정적 타입을 이용해 SQL과 같은 쿼리를 생성할 수 있도록 해주는 오픈소스 프레임워크 JPQL을 Java 코드로 작성할 수 있도록 하는 라이브러리 🧑💻 Query DSL 설정 📖 build.gradle plugins { id "com.ewerk.gradle.plugins.querydsl" version '1.0.10' } ... dependencies { ... implementation group: 'com.querydsl', name: 'querydsl-mongodb', vers..
-
⚠️ WebFlux Error 처리🌱 spring/🍀 webflux 2023. 5. 1. 13:39
📌 Functional Level 💡 Error Handling 1. onErrorReturn Reactive Stream에서 Error가 발생했을 경우 정해진 Fallback value를 리턴 public final Flux onErrorReturn(T fallbackValue); public final Flux onErrorReturn(Class type, T fallbackValue); public final Flux onErrorReturn(Predicate
-
🐱 Tomcat🌱 spring 2023. 3. 12. 01:41
🐱 Tomcat 스프링 부트에서는 기본적으로 내장 서버로 톰캣을 사용한다. 📖 내장 서버(Embedded server)를 사용하는 이유 애플리케이션을 더 쉽게 개발하고 배포할 수 있도록 도와준다. 개발 및 테스트 용이 내장 서버를 사용하면 별도의 WAS를 설치하거나 구성할 필요가 없다. 따라서, 애플리케이션을 개발 및 테스트하는데 훨씬 용이 애플리케이션 개발 과정에서 코드를 수정하면 서버를 다시 시작해 변경 사항을 반영할 수 있다. 단일 패키지 배포 내장 서버를 사용 시, 애플리케이션과 서버가 단일 패키지로 묶여 있어 애플리케이션을 쉽게 배포할 수 있다. 서버를 설치하거나 구성하는데 필요한 복잡성이 줄어들고 배포 프로세스가 간소화된다. 높은 이식성 내장 서버를 사용하면 애플리케이션을 다른 환경으로 이식하..
-
ThreadLocal🌱 spring 2023. 1. 18. 19:08
📌 ThreadLocal 💡 한 스레드에 의해서만 일고 쓰일 수 있는 변수 서로 다른 두 스레드가 하나의 변수에 접근했을 때, 해당 변수는 공유자원으로 동시성 문제가 발생할 가능성이 있다. ThreadLocal은 오직 한 스레드에 의해 읽고/쓰일 수 있는 변수를 생성한다. 두 스레드가 같은 코드를 실행하고 이 코드가 하나의 threadLocal 변수를 참조하더라도 서로의 threadLocal 변수를 볼 수 없다. 예시 ThreadA가 ThreadLocal 변수에 접근하여 1이라는 값을 저장. 동시에 ThreadB가 ThreadLocal 변수에 접근해 2라는 값을 저장 1이라는 값을 2가 덮는 것이 아니다 ❌ 각 스레드별 전용 저장소에 각각의 값이 저장된다. ⇒ 멀티 스레드 환경에서 공유 자원의 동시성 문..
-
🌊 Connection Pool🌱 spring 2023. 1. 13. 16:26
인프런 김영한 님의 스프링 DB 1 강의를 듣고 정리한 글 (결제하고 못 들은 강의 듣고 다시 내용 정리하기) 커넥션풀 ❓ 데이터베이스 커넥션을 획득 과정 DB 드라이버를 통해 커넥션 조회 TCP/IP 커넥션 연결 (DB 드라이버 - DB) 커넥션이 연결되면 Id, PW와 같은 부가정보 DB에 전달 내부 인증을 완료 후 내부에 DB 세션 전달 DB는 커넥션 생성 완료 응답을 보낸다. DB 드라이버는 커넥션 객체를 생성해 클라이언트에 반환 매번 커넥션을 새로 만드는 것은 매우 복잡하고 시간도 많이 걸린다. ⇒ 커넥션을 미리 생성해두고 사용하는 ‘커넥션 풀’ 이라는 방법을 사용. 커넥션 풀 초기화 애플리케이션을 시작하는 시점에 커넥션 풀은 필요한 만큼 커넥션을 미리 풀에 보관 default - 10개 ❗커넥..
-
JDBC ❓🌱 spring 2023. 1. 13. 15:11
인프런 김영한 님의 스프링 DB 1 강의를 듣고 정리한 글 (아직 듣지 않고 결제한 강의 들으면서 다시 정리하기) ❓JDBC 애플리케이션을 개발 시 데이터는 대부분 데이터베이스에 저장한다. 애플리케이션 서버와 DB - 일반적인 사용법 1. 커넥션 연결 주로 TCP/IP를 사용해서 커넥션을 연결한다. 2. SQL 전달 애플리케이션 서버는 DB가 이해할 수 있는 SQL을 연결된 커넥션을 통해 DB에 전달한다. 3. 결과 응답 DB는 전달된 SQL을 수행하고 그 결과를 응답한다. 애플리케이션 서버는 응답 결과를 활용한다. ⚠️ 문제 : 데이터베이스마다 커넥션 연결 방법, SQL 전달 방법, 결과 응답받는 방법이 모두 다르다. ⇒ 다른 종류의 DB로 변경시 애플리케이션 서버에 개발된 DB 사용 코드도 함께 변경..