728x90
반응형

0+ 스프링 49

Spring Boot에 Redis와 연동하여 처리율 제한 장치(Rate Limiter) 적용하기(Spring Boot + Redis + Bucket4j)

Spring Boot에 Redis와 연동하여 처리율 제한 장치(Rate Limiter) 적용하기(Spring Boot + Redis + Bucket4j) 포스팅 동기 개인 프로젝트를 진행하면서 처리율 제한 장치를 적용해야하는 상황이 발생했습니다. 처리율 제한 장치를 구현하기 위해서는 크게 2가지 방법이 있는데, Client와 Server 사이에 MiddleWare를 두어서 Gateway를 이용하는 방법과 Server에서 구현하는 방법이 있습니다. 저는 Gateway를 사용하기에는 규모가 작은 프로젝트라서 Server에 직접 구현하였습니다.^^ 추가로 처리율 제한 장치에 여러 알고리즘이 존재하는데, 리소스를 고려하여 구현이 간편한 토큰 버킷 알고리즘을 사용했습니다.^^ 이 모든 내용을 혼자만 알고있기에는 ..

0+ 스프링 2023.10.22

[스프링 DB] MySQL의 트랜잭션 격리 수준(Transaction Isolation Level) 파헤치기

[DB] MySQL의 트랜잭션 격리 수준(Transaction Isolation Level) 파헤치기 모든 내용은 InnoDB를 기준으로 설명합니다.^^ 트랜잭션 격리 수준이란? 백엔드 개발자라면 트랜잭션 격리 수준(isolation level)이란 용어를 들어본 적이 있을 것 입니다. 그런데 트랜잭션 격리 수준 정확히 뭔가요? 🤔 트랜잭션 격리 수준이란 여러 트랜잭션이 동시에 처리될 때 특정 트랜잭션이 다른 트랜잭션에서 변경하거나 조회하는 데이터를 볼 수있게 허용할지 말지를 결정하는 것 입니다. 즉, 하나의 트랜잭션 내에서 또는 여러 트랜잭션 간의 작업 내용을 어떻게 공유하고 차단할 것인지 결정하는 것을 의미 합니다. 트랜잭션 격리 수준은 크게 4가지로 구분 됩니다. READ UNCOMMITTED RE..

[스프링 DB] 트랜잭션 전파(propagation)

[스프링 DB] 트랜잭션 전파(propagation) 트랜잭션 전파에 대해서 알기 전에, 먼저 트랜잭션에 대해서 간단하게 설명 하겠습니다.^^ 트랜잭션? 🤷‍♀️ 트랜잭션(Transaction)을 번역하면 “거래” 라는 의미 입니다. 데이터베이스에서 트랜잭션은 하나의 “거래”를 안전하게 처리하도록 보장해주는 것을 의미합니다. 다시 말하면 작업의 완전성을 보장해주는 것 입니다. 👍 참고 트랜잭션은 하나의 Connection을 가져와 사용하다가 닫는 사이에 발생합니다. 트랜잭션의 시작과 종료는 Connection객체를 통해 이뤄지기 때문입니다. 2023.07.06 - [0+ 스프링/0+스프링 DB] - [스프링 DB] 트랜잭션의 이해 [스프링 DB] 트랜잭션의 이해 [스프링 DB] 트랜잭션의 이해 개발을 하..

[스프링 DB] 데이터를 저장할 때 파일에 저장해도 되는데, 데이터베이스에 저장하는 이유?

[스프링 DB] 데이터를 저장할 때 파일에 저장해도 되는데, 데이터베이스에 저장하는 이유? 개발을 하면 자연스럽게 데이터베이스와 연동하여 데이터를 저장, 수정, 삭제, 조회 합니다. 데이터를 저장할 때 파일에 저장해도 되는데, 데이터 베이스에 저장하는 이유가 무엇일까요? 🤔 가장 큰 이유는 바로 데이터베이스는 트랜잭션이라는 개념을 지원하기 때문입니다.!!!!! 트랜잭션? 트랜잭션(Transaction)을 번역하면 “거래” 라는 의미 입니다. 데이터베이스에서 트랜잭션은 하나의 “거래”를 안전하게 처리하도록 보장해주는 것을 의미합니다. 다시 말하면 작업의 완전성을 보장해주는 것 입니다. 참고 트랜잭션은 하나의 Connection을 가져와 사용하다가 닫는 사이에 발생합니다. 트랜잭션의 시작과 종료는 Conne..

[스프링 DB] 커넥션 풀과 DataSource의 개념

[스프링 DB] 커넥션 풀과 DataSource의 개념 커넥션 요청 문제 우리가 개발한 애플리케이션이 DB와 통신하기 위해서는 커넥션이 필요합니다. JDBC를 사용하면 아래와 같은 흐름으로 커넥션을 획득합니다. JDBC가 제공하는 DriverManager는 라이브러리에 등록된 DB 드라이버들을 관리하고, 커넥션을 획득합니다. 문제 그런데 이와 같은 과정은 문제가 있습니다. 바로 커넥션을 매번 새롭게 만들어야하기 때문입니다. 커넥션을 새로 생성하는 과정은 생각보다 많은 리소스를 사용합니다. 커넥션 풀 이러한 문제를 해결하기 위해 나온 방법이 바로 커넥션 풀이라는 방법 입니다. 커넥션 풀 방법은 커넥션을 미리 생성해두고 필요할 때 꺼내서 사용하고 사용을 마친후 다시 커넥션 풀에 반납하는 방법 입니다. 커넥션..

[스프링 DB] JDBC의 개념

[스프링 DB] JDBC의 개념 JDBC 등장 이전 문제 인식 애플리케이션을 개발할 때 중요한 데이터는 대부분 데이터베이스에 보관합니다. 왜 데이터베이스에 보관할까요? 🤔 그 이유는 데이터베이스는 트랜잭션이라는 개념을 지원하기 때문입니다. App Server와 DB의 흐름 1. 커넥션 연결: 주로 TCP/IP를 사용해서 커넥션을 연결 2. SQL 전달: App Server는 DB가 이해할 수 있는 SQL을 커넥션을 통해 DB에 전달 3. 결과 응답: DB는 전달받은 SQL을 실행하고 그 결과에 응답 고객사의 요청으로 DB를 MySQL에서 Oracle로 변경하게 된다면 어떻게 될까요?🤔 MySQL과 Oracle는 커넥션을 연결하는 방법, SQL을 전달하는 방법, 결과를 응답 받는 방법이 모두 다릅니다. 다..

[스프링 Core] 도대체 DI(Dependency Injection) 란 무엇인가?

[스프링 Core] 도대체 DI(Dependency Injection) 란 무엇인가? 스프링의 핵심 3대 요소 AOP, IOC, DI를 들어보신 적이 있을 것 입니다. 오늘은 DI가 도대체 무엇인지 확실하게 설명해드리겠습니다…!! 그리고 스프링 컨테이너가 IoC인 이유를 알아봅시다. 문제 인식 🤔 public class Driver { private Avante avante; public Driver() { this.avante = new Avante(); } public void drive() { avante.start(); } } 위 클래스는 2가지 문제점이 있습니다. 두 클래스가 강하게 결합 객체들간의 관계가 아니라 클래스간의 관계가 맺어짐 두 클래스가 강하게 결합 Driver 클래스는 Avante..

[스프링 Core] 스프링 빈 초기화(@PostConstruct, @PreDestroy)

[스프링 Core] 스프링 빈 초기화(@PostConstruct, @PreDestroy) 우리는 스프링 빈을 등록하고 초기화 해야하는 작업을 해야할 때가 있습니다. 객체를 생성할 때 초기화하면 되지 않나? 🤔 라고 생각할 수 있습니다. 하지만, 객체를 생성하는 생성자와 초기화 작업은 분리하는 것이 좋습니다. 그렇다면 어떻게 스프링 빈을 초기화할 수 있을까요? 참고 생성자 안에서 상대적으로 무거운 초기화 작업을 함께 하는 것보다는 객체를 생성하는 부분과 초기화 하는 부분을 명확하게 나누어 관리하는 것이 유지보수에도 좋습니다. 스프링 빈 생명주기 🌱 먼저 스프링 빈의 생명주기에 대해서 알아야 합니다. 스프링 빈은 아래와 같은 생명주기를 갖고 있습니다. 객체 생성 -> 의존관계 주입 -> (데이터 사용 가능)..

[JPA] 조건절을 포함한 일대다 페이징 최적화

[JPA] 조건절을 포함한 일대다 페이징 최적화 방법 일대다 조인에서 페치조인을 사용하면 페이징을 할 수 없습니다. 우리는 일대다에서 일(1)을 기준으로 페이징하는 것이 목적입니다. 그런데 데이터는 다(N)를 기준으로 row를 생성합니다. 그렇다면 페이징을 하기 위해서는 지연로딩으로 1+N 문제가 발생하는 것을 모르는척 해야할까요? 🤔 일대다 페치조인의 문제 일대다 페치조인을 하면 다(N)를 기준으로 데이터가 생성됩니다. Order OrderItem라고 할 때 다음과 같습니다. 우리는 Order를 기준으로 페이징을 하고 싶습니다….! 😭 조건절을 포함한 일대다 페이징 최적화 방법 목표 Item의 상품명을 조건으로 Order를 Delivery, OrderItem, Item 데이터를 함께 조회하여 페이징 되..

[스프링 + 포트원] 스프링으로 포트원 사용해서 결제 구현 하는 방법(Spring Boot, JPA, PortOne)

[스프링 + 포트원] 스프링으로 포트원 사용해서 결제 구현 하는 방법(Java, Spring Boot, JPA, PortOne) 포스팅 동기 쇼핑몰을 개발하면 결제 부분에서 어떻게 해야할지 막막한 개발자들이 있을 것 입니다. 저 또한 그랬습니다. 😭 결제를 구현하기 위해서는 각 PG사에서 제공하는 API를 사용하여 개발을 진행해야하는데, 만만한 작업이 아니라고 생각합니다… 이러한 문제를 해결하고자 포트원이라는 업체가 등장했습니다. 그런데…. 이마저도 막상 개발하다보면 어려움을 느낍니다… 그리고 구글링을 하다보면 대부분 javascript를 사용하여 구현한 예제들만 있고, Spring을 사용한 예제는 별로 없는 것 같더군요.. ㅎㅎ 저는 이러한 답답함에 조금이라도 도움을 드리고 싶어 글을 작성하게 되었습니..

0+ 스프링 2023.06.03
728x90
반응형