
Redis 캐시를 활용하여 중복 없이 조회수를 세는 로직에 대해서 포스팅하려고 합니다. 기존에 썼던 방법기존에는 sql의 update로직을 사용하여 조회수를 올렸습니다.UPDATE items SET views = views + 1 WHERE item_id = '1'; 장점update 문이 수행될 때, 레코드에 락이 걸리면서 다른 트랜잭션이 해당 행을 읽거나 변경하지 못하도록 방지하여 동시성에 안전합니다.단점상품을 클릭할 때마다, 조회수를 증가시키는 sql문을 보내야 한다는 부담이 있었습니다.중복 조회 방지를 위한 로직을 따로 만들어야 했습니다.Redis 캐시를 사용한 이유캐시에 저장했다 한 번에 조회수를 업데이트할 수 있습니다.Redis 자체가 싱글 스레드로 처리되므로 동시성 문제를 방지할 수 있습니다...
제가 팀 프로젝트를 했을 때, Spring Security를 사용하여 JWT 토큰을 이용한 인증/인가 방식을 구현했습니다.그런데, 프로젝트 종료 후 생각해보니 왜 JWT 인증 방식을 사용했는지, 세션 방식을 사용하면 되지 않았는지를 생각하게 됐습니다.그래서, 이번 포스팅은 JWT에 대해 알아보고, 팀 프로젝트에서 꼭 JWT를 사용했어야 됐는지를 이야기해 보려고 합니다.결론먼저 말씀 드리면, 꼭 JWT 인증 방식을 사용하지 않아도 됐다.입니다. (저의 생각이 틀릴 수 있습니다!)우선, JWT 인증 방식에 대해 알아봅시다!토큰 기반 자격 증명우선, 토큰은 '입장권'이라고 생각을 하면 됩니다. 서버에서 이 토큰을 보고 인증과 인가를 처리합니다.입장권이라는 말은 서버에서 사용자 정보를 별도로 관리하지 않는다는 ..

앞선 포스트에서는 정기 결제를 구현할 때 스프링에서 제공하는 스케쥴러를 사용했습니다.하지만 정기 결제 로직을 구현하는 데 있어서 런타임에 동적으로 스케쥴러의 주기를 바꿀 수 없는 문제가 있어서 Quartz 라이브러리를 사용하게 되었습니다. 문제를 다시 회고해 보자면,런타임 환경에서, 첫 결제일을 기준으로 주기 변경을 하기 힘들다.스케쥴을 db에 영속적으로 저장하기 힘들다.였습니다. 그런데, quartz 라이브러리를 사용하면 위의 두 가지 문제가 해결됩니다.또한, 두 스프링 스케쥴러보다 훨씬 더 디테일하고 자세하게 설정이 가능합니다. 설정 환경은 Springboot 2.7.5, Quartz 2.3.2, java 11 버전입니다.우선 Quartz는 스프링 스케쥴러보다 더 구체적인 기능 구현이 가능합니다.저..

프로젝트에서 정기 결제 스케줄을 만들기로 결정했습니다.사용자가 주기를 설정하면,예를 들어 30일 주기로 배송을 정하면 30일마다 결제가 되게 해야 했습니다(프로젝트에서 결제가 되면 배송이 된다고 가정).그리고 사용자는 배송 주기를 변경할 수 있고, 취소도 할 수 있습니다.처음에는 어떻게 구현해야 할지 막막했지만 자바로 구현할 수 있는 스케쥴러를 찾아보다 Spring에서 제공하는 Scheduling Tasks를 사용하게 되었습니다. https://spring.io/guides/gs/scheduling-tasks/ Getting Started | Scheduling TasksAlthough scheduled tasks can be embedded in web applications, the simpler a..

대용량 데이터 삽입mysql 8.4.2 + Springboot를 이용해서 대용량 데이터 삽입을 한 내용에 대해 포스팅하려고 합니다.약 10만 명의 유저 mock 데이터를 생산하여 데이터베이스에 넣는 시간을 비교해 보겠습니다. 대략적인 개요는 아래와 같습니다.10만 명의 mock 유저 데이터를 만든다.jpa saveAll()을 사용해서 데이터베이스에 insert를 한다. (id 생성 전략 -> Table )jpa batch insert를 설정하고 insert 한다.jdbc batch insert를 설정하고 insert 한다멀티스레드를 활용하여 jdbc batch insert를 한다.설정 환경은 다음과 같습니다.mysql 8.42Springboot 2.7.5mac m1RAM 16gb intellj1. 10만..
디자인 패턴 중 전략 패턴의 예를 들어 이해하려고합니다!전략 패턴특정한 계열의 알고리즘들을 정의하고 각 알고리즘을 캡슐화하며이 알고리즘들을 해당 계열 안에서 상호 교체가 가능하게 만든다.(출처: 위키피디아)보통 상속보단 인터페이스를 활용하여 사용합니다.장점클라이언트 코드의 수정 없이 행위를 확장할 수 있습니다.(OCP, DIP 준수) -> 테스트 또한 확장된 코드만 하면 됩니다.단점클래스의 복잡성이 증가할 수 있습니다.오리 특징 출력 프로그램전략 패턴을 사용해서 오리의 특징을 출력하는 간단한 프로그램을 작성해 보았습니다.오리는 종류마다 나는 것(이하 fly)과 꽥꽥 소리를 내는(이하 quack) 특징을 다르게 갖고, 추후에 추가되거나 변경될 수 있습니다.1) 먼저 변경이 될 가능성이 있는 부분인 fly ..
@Builder스프링으로 Lombok을 사용하면 객체를 생성할 때, @Builder를 통해 객체를 생성하는 경우가 많습니다.생성자에 매개 변수가 많을 때, @Builder를 사용하면, 코드를 읽기가 훨씬 쉬워집니다.new 생성자를 통해 객체를 생성하면 User 객체에 필요한 파라미터가 무엇을 의미하는지 알아보기가 힙듭니다.빌더를 통해 객체를 생성하면, 파라미터로 무엇이 들어가는지 알아보기가 쉬워집니다.@Builderpublic User(String displayName, String password, String email) { this.displayName = displayName; this.password = password; this.email = email;} //new 생성..
final이번 포스팅은 자바에서 final 키워드에 대해 포스팅하려고 합니다.스프링 프로젝트를 하면 DI를 할 때나 static 키워드를 선언할 때, 변하지 않는다는 개념으로 사용하는데, 사용하면서도 계속 무슨 의미인지 헷갈리는 느낌이 있어 공부할 겸 포스팅해보려고 합니다. 클래스에서 final 선언클래스에 final을 선언하면 상속을 해 줄 수 없습니다..String, StringBuilder, StringBuffer 등에서 사용되는데 이 클래스를 상속받아 클래스의 기본 속성을 변경하는 것을 막기 위해 사용됩니다.메서드에서 final 선언메서드에서 final을 선언하면 오버라이딩을 할 수 없게 됩니다.이것 역시, 메서드를 변경하는 것을 막기 위함입니다.변수에서 final 선언변수에서 final을 선언하..
Variable오늘은 자바의 변수에 대해 포스팅하려 합니다.변수의 종류, 스코프, 라이프 타임에 대해 알아보겠습니다.변수의 종류자바의 변수 종류부터 알아보겠습니다.1. 인스턴스 변수(not static field)static 키워드 없이 클래스 안에 선언된 필드(변수).클래스의 인스턴스마다 변수의 값이 다름.stack에 저장된다.(객체는 heap에 저장, 참조 변수는 stack)2. 클래스 변수(static field)static 키워드가 붙은 필드.모든 클래스에서 공용으로 사용가능하다.JVM의 메모리 영역에 저장된다.3. 로컬 변수메서드에서 임시로 상태를 저장하는 변수.{}안에서만 사용가능하다.stack에 저장된다.4. 파라미터 변수메서드의 인자로 사용되는 변수.stack에 저장된다.int a; // ..
이번 포스팅은 StringBuffer를 알아보고 StringBuilder와의 차이에 대해 포스팅하려고 합니다.StringBuffer와 StringBuilder의 차이우선, StringBuffer는 StringBuilder와 마찬가지로 불변 객체가 아닙니다.따라서, 문자열을 수정할 경우 String처럼 새로운 객체가 생성되지 않습니다.차이점- 두 클래스의 차이점은 thread-safe한가 그렇지 않은가로 나눌 수 있습니다.- StringBuffer의 경우 thread-safe합니다. StringBufferd가 가진 메서드에 synchronized가 붙어 있는 것을 확인할 수 있습니다. 즉, 멀티 스레드인 상황에서 안전합니다.- 반면, StringBuilder의 경우는 thread-safe하지 않습니다. 멀..
- Total
- Today
- Yesterday
- 조회수
- 알고리즘 문제풀이
- 리트코드
- StringBuilder
- redisson
- 문자열더하기
- 전략 패턴
- 빌더패턴
- 람다
- Quartz
- java
- final
- redis
- 알고리즘
- leetcode
- jwt
- 싱글톤패턴
- scheduler
- jpa
- 항해99
- 얕은복사
- 디자인패턴
- 스트림
- 대용량데이터
- 프로그래머스
- StringBuffer
- 함수형 인터페이스
- 기능개발
- 깊은복사
- springboot
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |