์ค๋์ Redis๋ฅผ ์ฌ์ฉํด์ ์บ์๋ฅผ ์ ์ฉํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
์ฌ์ค ์ด๋ฒ์ด Redis๋ฅผ ์ฒ์ ์ฌ์ฉํ๋ ๊ฑฐ๋ผ... ์ด์ง์ ๊ณต๋ถ์ฉ์ผ๋ก ์์ฑํ๊ฑฐ๋ผ ๋ง์ด ์ด์ํ ์๋ ์์ต๋๋ค.
์ถ๊ฐ๋ก... ์ง๊ธ ๋ ๋์ค๋ฅผ ์ด๊ณณ์ ๊ณณ์ ์ ์ฉํด ๋ณด๋ ค ํ์์ผ๋.. ์ ๊ฐ ์ฝ๋๋ฅผ ๋๋ฌด ์๋ง์ผ๋ก ์ง์ ๊ทธ๋ฐ์ง... ์ ์ฉํ๋ ค๋ฉด ๋ฌด์ธ๊ฐ ๋๋์ ์ธ ์์ ์์ ์ด ํ์ํด ๋ณด์ด๋๊ตฐ์... ๊ทธ๋์ ์ผ๋จ์... ๋ค.. ๋ญ ๋ก๊ทธ์ธ ์์๋ง ์ ์ฉํ๋๋ก ํด๋ณด์์ต๋๋ค..^^
๊ฒ๋ค๊ฐ ํ ์คํธ์ฝ๋๋... ์บ์๋ฅผ ์ ์ฉํ๋ ์๊ฐ ๋ฉธ๋งํด ๋ฒ๋ ธ๋๋ฐ, ํ ์คํธ ํ๊ฒฝ์์ ๋ ๋์ค๋ฅผ ์ ์ฉํ์ง ์์ผ๋ ค๊ณ ์จ๊ฐ ๋ฐฉ๋ฒ์ ๋ค ์จ๋ดค์ผ๋ ์คํจํ์ต๋๋ค...
ํน์ ์ฌ๊ธฐ์ ์ ์ ๊ฐ์ด ๋ ๋์ค๋ก ์บ์ ์์ฑํ๋ ๊ฒ์ ๋ฐ๋ผํ์ ๋ค๋ฉด... ํ ์คํธ์ฝ๋ ๋๋ฆด ๋๋ ๋นผ๊ณ ๋๋ฆฌ๋ ๊ฒ์ผ๋ก...ใ ใ ใ
๋์ค์ ๊ผญ ๊ณ ์ณ๋ณด๊ฒ ์ต๋๋ค..ใ ใ
- ์ํ๋ฆฌํฐ๋ฅผ ์ด์ฉํ JSON ๋ฐ์ดํฐ๋ก ๋ก๊ทธ์ธ (์๋ฃ)
- JWT๋ฅผ ์ด์ฉํ ์ธ์ฆ (์๋ฃ)
- ๋๋ฉ์ธ, ํ ์ด๋ธ ์ค๊ณ, ์ํฐํฐ ์์ฑ (์๋ฃ)
- ๋๊ธ ์ญ์ ๋ก์ง ๊ตฌํ (์๋ฃ)
- ํ์๊ฐ์ + ์ ๋ณด์์ ๋ฑ ํ์ ์๋น์ค ๊ตฌํ (์๋ฃ)
- ๊ฒ์ํ ์๋น์ค ๊ตฌํ (์๋ฃ)
- ๋๊ธ ์๋น์ค ๊ตฌํ (1๋๊ธ -> *(๋ฌดํ) ๋๋๊ธ ๊ตฌ์กฐ) (์๋ฃ)
- ์์ธ ์ฒ๋ฆฌ (์๋ฃ)
- ๊ฒ์๊ธ ํ์ด์ง (์๋ฃ)
- ๋์ ์ธ ๊ฒ์ ์กฐ๊ฑด์ ์ฌ์ฉํ ๊ฒ์ (์๋ฃ)
- AOP๋ฅผ ํตํ ๋ก๊ทธ (์๋ฃ)
- ์บ์ (์งํ ์ค)
- ์์ธ ๋ฉ์ธ์ง ๊ตญ์ ํ
- ์นดํ ๊ณ ๋ฆฌ๋ณ ๊ฒ์ํ ๋ถ๋ฅ
- ์ฌ์ฉ์ ๊ฐ ์ชฝ์ง ๊ธฐ๋ฅ
- ๋ฌดํ ์ชฝ์ง ์คํฌ๋กค
- ๊ฒ์๋ฌผ & ๋๊ธ์ ๋ํ ์๋
- ์ชฝ์ง์ ๋ํ ์๋
- ์ ์ํ ์ฌ์ฉ์ ๊ฐ ์ค์๊ฐ ์ฑํ
- ํ์๊ฐ์ ์ ๊ฒ์ฆ(์: XX๋ํ๊ต XX๊ณผ๊ฐ ์๋๋ฉด ๊ฐ์ ํ ์ ์๊ฒ)
- Swagger๋ฅผ ์ฌ์ฉํ API ๋ฌธ์ ๋ง๋ค๊ธฐ
- ์ ๊ณ & ๋ธ๋๋ฆฌ์คํธ ๊ธฐ๋ฅ
- ์ด๋๋ฏผ ํ์ด์ง
- ๋ฐฐํฌ (+ ๋ฌด์ค๋จ ๋ฐฐํฌ)
- ๋ฐฐํฌ ์๋ํ
- ํฌํธ์ ์ด๋ํฐ ์ค๊ณ๋ฅผ ๋ฐ๋ฅด๋ ํจํค์ง ๊ตฌ์กฐ ์ค๊ณํ๊ธฐ
- ...
Redis ์ค์นํ๊ธฐ
์ฐ์ Redis๋ฅผ ์ค์นํด์ ์ฌ์ฉํ๋๋ก ํ๊ฒ ์ต๋๋ค.
์๋ ์ฌ์ดํธ์ ๋ค์ด๊ฐ์ Redis๋ฅผ ๋ค์ด๋ฐ์ ์ฃผ์ธ์! (๋งฅ์ด๋ผ๋ฉด,, ๋งฅ ๋ฒ์ ๋ค์ด๋ฐ๋ ๋ฒ ์น๋ฉด ๋์ฌ๊ฒ๋๋ค..)
https://github.com/microsoftarchive/redis/releases
์ค์น ๊ฒฝ๋ก๋ ์๊ด ์๊ณ , ๋ฑํ ์ด๋ ค์ด ๊ฑด ์์ผ์ค๊ฑฐ์์ ์๋ง..? (์ ๋ ํ๋๋ฐ์ ๋ญ..)
์ค์น๋ฅผ ์๋ฃํ์ ์ ํด๋๋ก ๋ค์ด๊ฐ์๋ฉด ๋ค์๊ณผ ๊ฐ์ด server.exe์ cli.exe๊ฐ ์์ผ์ค ๊ฒ๋๋ค.
server๋ฅผ ๋จผ์ ์คํํด ์ฃผ์ ๋ค์์ ๋ช ๋ น ํ๋กฌํํธ(cmd)๋ก ๋ค์ด๊ฐ์ ๋ค์ ๋ช ๋ น์ด๋ฅผ ์ณ์ฃผ์ธ์
netstat -an | findstr 6379
(ํน์ ํฌํธ๋ฒํธ๋ฅผ 6379๊ฐ ์๋ ๋ค๋ฅด๊ฒ ์ค์ ํ์ จ๋ค๋ฉด ์ค์ ํ์ ํฌํธ๋ฒํธ๋ฅผ ์ณ์ฃผ์ธ์)
์ฐธ๊ณ
Redis ์ค์ง ํ๋ ๋ฐฉ๋ฒ
Powershell ์ ๊ด๋ฆฌ์๋ชจ๋๋ก ์คํ์ํจ ํ ๋ค์์ ์ ๋ ฅํ๋ค.
net stop redis
Redis ์คํ ์ํค๋ ๋ฐฉ๋ฒ
Powershell ์ ๊ด๋ฆฌ์๋ชจ๋๋ก ์คํ์ํจ ํ ๋ ๋์ค ํด๋๋ก ์ด๋ํ์ฌ ๋ค์์ ์ ๋ ฅํ๋ค.
.\redis-server.exe redis.windows.conf
Redis ์์กด๊ด๊ณ ์ถ๊ฐ & application.yml ํ์ผ ์์
build.gradle์ ๋ค์๊ณผ ๊ฐ์ด redis ์์กด์ฑ์ ์ถ๊ฐํด์ค๋๋ค.
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
application-dev.yml๊ณผ application.prod.yml์ ๋ค์ ์ค์ ์ ์ถ๊ฐํด ์ฃผ๋๋ก ํ๊ฒ ์ต๋๋ค.
(dev์๋ง ํด์ฃผ์ ๋ ๋๊ณ , ํ์ผ์ด application.yml ํ๋๋ผ๋ฉด ๊ฑฐ๊ธฐ์ ํด์ฃผ์๋ฉด ๋ฉ๋๋ค!)
spring:
cache:
redis:
time-to-live: 86400000 #mills ๋จ์ -> [1์ด : 1000] -> [1์ผ : 86400000]
redis:
port: 6379 #์ค์ ํ ํฌํธ๋ฒํธ
host: 127.0.0.1
๊ทธ๋ฆฌ๊ณ Cache ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ค๋ฉด ๋ค์ ์ ๋ ธํ ์ด์ ์ ์ ํ๋ฆฌ์ผ์ด์ ์์์ ์ ๋ฌ์์ฃผ์ ์ผ ํฉ๋๋ค.
@EnableCaching
์ ์ ๊ฒฝ์ฐ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ด๋์ ์ ์ฉํ ๊น?
์ฌ์ค ์บ์๋ฅผ ์ด๋์ ์ ์ฉํ๋ฉด ์ข์๊น ํ๋ค๊ฐ ๋ง๋ ํ ์์ด๋์ด๊ฐ ๋ ์ค๋ฅด์ง ์์์ ๋งจ ์ฒ์์๋ Post List์ ํ๋์ Post ์ ๋ณด์ ๋ํด์ ์ ์ฉํ๋ ค ํ์ต๋๋ค.
๊ทธ๋ฐ๋ฐ... ์์ ๊ณผ ์ญ์ ๊ฐ ๋ฐ์ํ๋ฉด ์บ์๋ฅผ ์ง์ฐ๋ ์ฝ๋๋ฅผ ์์ฑํ๋๋ฐ... ์ด๊ฒ ์ง๊ธ ์ ๊ฐ ์ง ์ฝ๋๊ฐ ๋๋ฌด ์๋ง์ด๋ผ ์ด๋ฅผ ์ ์ฉํ๋ ค๋ฉด ์ ๋ง ๋ค ๋ฏ์ด ๊ณ ์ณ์ผ ํ๋ ์ํฉ์ด์์ต๋๋ค. (ํน์ ์ ๊ฐ ๋ ๋์ค ์ฌ์ฉ๋ฒ์ ์์ง ์ ๋ชฐ๋ผ์ ๋ฐฉ๋ฒ์ด ์์ง๋ง ๋ชจ๋ฅด๋ ๊ฒ์ผ ์๋ ์์ต๋๋ค.)
๊ทธ๋์ ๊ทธ๋ฅ ๋ก๊ทธ์ธ ํ ์ ์ ์ ๋ณด๋ฅผ ์ ์ฅํด ๋์ด์, ์ดํ ๋ก๊ทธ์ธ ์์ ์บ์๋ฅผ ํตํด ๋น ๋ฅด๊ฒ ๋ก๊ทธ์ธ ํ ์ ์๋๋ก ์ฝ๋๋ฅผ ์์ฑํ์์ต๋๋ค.
ํ์ ์ ๋ณด๋ ์ ์์ ๋์ง ์๊ธฐ์, ์บ์์ ์ ์ฉํด๋ ๋ฌธ์ ์์๊ฑฐ๋ผ ์๊ฐํ์ฌ ์บ์๋ฅผ ์ด์ฉํ๊ฒ ๋์์ต๋๋ค.
(์ถ๊ฐ๋ก ๋ ๋์ค ์บ์์ ๋ํด ๊ณต๋ถํ ๋, ์ ๊ฐ ์ฐธ๊ณ ํ ์ฌ์ดํธ์ ๋๋ค. ํ๋ฒ์ฏค ์ฝ์ด๋ณด์๋ฉด ์ข์ ๊ฑฐ ๊ฐ์์!)
https://souljit2.tistory.com/m/72
์บ์ ์ ์ฉ - @Cacheable
MemberRepsitory - findByUsername()
@Cacheable(value = CacheLogin.USER, key = "#p0")
์์ ์ ๋ ธํ ์ด์ ์ ๋ฌ์์ฃผ์์ต๋๋ค.
public interface MemberRepository extends JpaRepository<Member, Long> {
@Cacheable(value = CacheLogin.USER, key = "#p0")//String ๋งค๊ฐ๋ณ์๋ p0, p1,...
Optional<Member> findByUsername(String username);
boolean existsByUsername(String username);
Optional<Member> findByRefreshToken(String refreshToken);
}
์ฐธ๊ณ ๋ก CacheLogin์ ์ ๊ฐ ๋ง๋ค์ด์ค ํด๋์ค๋ก ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public final class CacheLogin {
public static final String USER = "login_user";
}
(์๋ ธํ ์ด์ ์ ์ด๋์ ์ธ ์๊ฐ ์์ด์ static final String์ผ๋ก ์ ์ํด ์ฃผ์์ต๋๋ค.)
์ ์ ์ฝ๋์์๋ AccessToken์ ๊ฐ์ง๊ณ ๋ก๊ทธ์ธ ์ MemberRepository์ findByUsername ๋ฉ์๋๋ฅผ ํตํด ํ์์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๋ฏ๋ก findByUsername์ ์บ์๋ฅผ ์ ์ฉํด ์ฃผ์์ต๋๋ค.
์บ์ ์ญ์ - @CacheEvict
๋ค์์ ํ์ ์ ๋ณด๊ฐ ์์ ๋๊ฑฐ๋, ํ์ํํด๋ฅผ ํ ๊ฒฝ์ฐ ์บ์์์ ์ง์์ฃผ๋ ์ฝ๋๋ฅผ ์์ฑํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
์ง๊ธ ์ ์ ์ฝ๋ ์ํ๋ก๋ ์งํํ ์๊ฐ ์์ด MemberService์ MemberServiceImpl ์ฝ๋๋ฅผ ์์ ํด ์ฃผ์์ต๋๋ค.
(update, updatePassword, withdraw ๋ฉ์๋์ username์ ๋ฐ์์ค๋๋ก ์ฝ๋๋ฅผ ์์ ํ์์ต๋๋ค.)
public interface MemberService {
/**
* ํ์๊ฐ์
* ์ ๋ณด์์
* ํ์ํํด
* ์ ๋ณด์กฐํ
*/
void signUp(MemberSignUpDto memberSignUpDto) throws Exception;
void update(MemberUpdateDto memberUpdateDto, String username) throws Exception;
void updatePassword(String asIsPassword, String toBePassword, String username) throws Exception;
void withdraw(String checkPassword, String username) throws Exception;
MemberInfoDto getInfo(Long id) throws Exception;
MemberInfoDto getMyInfo() throws Exception;
}
์ดํ update, updatePassword, withdraw ๋ฉ์๋์ ๋ค์ ์ด๋ ธํ ์ด์ ์ ์ ์ฉํ์ฌ ์บ์๋ฅผ ์ญ์ ํ๋๋ก ํด์ฃผ์์ต๋๋ค.
@CacheEvict(value = CacheLogin.USER, key = "#pN") // N์ N๋ฒ์งธ ๋งค๊ฐ๋ณ์์ ๊ฐ
MemberServiceImpl์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
@Service
@RequiredArgsConstructor
@Transactional
public class MemberServiceImpl implements MemberService{
private final MemberRepository memberRepository;
private final PasswordEncoder passwordEncoder;
/**
* ํ์์ ๋ณด ์์
*/
@Override
@CacheEvict(value = CacheLogin.USER, key = "#p1")
public void update(MemberUpdateDto memberUpdateDto, String username) throws Exception {
...
}
/**
* ๋น๋ฐ๋ฒํธ ๋ณ๊ฒฝ
*/
@Override
@CacheEvict(value = CacheLogin.USER, key = "#p2")
public void updatePassword(String asIsPassword, String toBePassword, String username) throws Exception {
...
}
/**
* ํ์ํํด
*/
@Override
@CacheEvict(value = CacheLogin.USER, key = "#p1")
public void withdraw(String checkPassword, String username) throws Exception {
...
}
... ์๋ต
}
์ฌ์ค MemberServiceImpl์ด ์๋๋ผ MemberService ์ธํฐํ์ด์ค์ ์ด๋ ธํ ์ด์ ์ ๋ฌ์๋ ๋์ง๋ง.. ๊ทธ๋ฅ Impl์ ๋ฌ์๋ดค์ต๋๋ค.
(ํน์ ๋ค๋ฅธ ๊ตฌํ์ฒด๋ ์บ์ ์ฌ์ฉ์ ์ ํ ์๋ ์์์์..? ...ใ ใ )
์์ ๊ฐ์ด ์ฝ๋๋ฅผ ์์ ํ์ จ๋ค๋ฉด MemberController์์ ์ค๋ฅ๊ฐ ๋์คํ ๋ฐ, ๋ค์๊ณผ ๊ฐ์ด username์ ์ธ์ ์์น์
SecurityUtil.getLoginUsername()
๋ฅผ ์ถ๊ฐํด ์ฃผ์๋ฉด ๋ฉ๋๋ค.
(์ถ๊ฐ๋ก ํ ์คํธ์ฝ๋์์๋ ์ปดํ์ผ ์๋ฌ๊ฐ ๋ง์ด ๋ฐ์ํ ํ ๋ฐ, ๋ค ์์ ์ฝ๋๋ฅผ ๋ฃ์ด์ฃผ์๋ฉด ํด๊ฒฐ๋ฉ๋๋ค.)
์ด์ Member๋ฅผ ์ง๋ ฌํ ํ ์ ์๋๋ก Serializable๋ฅผ implement ํด์ฃผ๋ฉด ๋์ ๋๋ค
public class Member extends BaseTimeEntity implements Serializable {
...
}
ํ๋ฒ ์คํํด ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
์ฐ์ redis๋ฅผ ์คํ์ํจ ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํ์์ผ ์ฃผ์ธ์
๋ก๊ทธ์ธ ํ๋ฒ ํด๋ณด๊ฒ ์ต๋๋ค.
๋ค์๊ณผ ๊ฐ์ด DB์ ์ฟผ๋ฆฌ๊ฐ 1ํ ๋ฐ์ํฉ๋๋ค.
์ด ์ํ์์ ๋ค์ ๋ก๊ทธ์ธ์ ํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
์ฟผ๋ฆฌ๊ฐ ๋ฐ์ํ์ง ์๊ณ ๋ฐ๋ก ๋ก๊ทธ์ธ์ด ๋์์ต๋๋ค!
(AccessToken์ ๊ฐ์ง๊ณ ์ธ์ฆ์ ํ๋ ๊ฒฝ์ฐ์๋ ๋ง์ฐฌ๊ฐ์ง๋ก DB ์กฐํ ์์ด AccessToken๋ง ์ ํจํ๋ค๋ฉด ๋ก๊ทธ์ธ๋ฉ๋๋ค!)
์ค๋์ ์ด๋ ๊ฒ ์ ๋ง ๊ฐ๋จํ๊ฒ ๋ ๋์ค๋ฅผ ์ฌ์ฉํด์ ์บ์๋ฅผ ์ ์ฉํด ๋ณด์์ต๋๋ค.
์ ์ฒด ์ฝ๋๋ ๊นํ๋ธ์์ ํ์ธํ์ค ์ ์์ต๋๋ค.
https://github.com/ShinDongHun1/SpringBoot-Board-API
ํ๊ณ
์์ฆ WebFlux ๊ณต๋ถํด๋ณธ๋ค๊ณ Reactive Stream๋ถํฐ ํ ๋น๋ ๋ฐฉ์ก ๋ณด๋ฉด์ ๊ณต๋ถ์ค์ธ๋ฐ ๋๋ฌด ์ด๋ ต๋ค์..ใ ใ
๊ทธ๋ฆฌ๊ณ ์คํ๋ง ๊ฒ์ํ์ด ์กฐ๊ธ ๋ธํ๊ฒ... ๋๋ฌด ์ฌ๋ฏธ๊ฐ ์๋ฌ๊น์...ใ ใ
์ง๊ธ ํ ๋ค๋ค์ฏ๋ฒ์งธ๋ก ๊ณต๋ถํ๋ฉด์ ๊ณ์ ๊ฒ์ํ๋ง ๋ง๋๋๋ฐ.. ๋ณด์ด๋ ๊ฒ๋ ์๊ณ ... ๋ญ๊ฐ ๊ทธ๋ด๋ฏํ ๊ธฐ๋ฅ๋ ์์ด ๊ฒ์ํ๋ง ๋ง๋ค๋ค ๋ณด๋ ์กฐ๊ธ ๊ฑฐ๋ฆฌ๋๊ธฐ ํ๊ณ ์ถ์ด์ก์ต๋๋ค..
๊ฒ๋ค๊ฐ ์ด์ ๊ฐ๊ฐ์ด๋ผ.. ใ ใ ...
์ฌ์ค ์... ์์ง ๋ชป ํ ๊ฒ ์ค์ ๊ตญ์ ํ๋ ์ด๋๋ฏผ ํ์ด์ง, ์๋ฆผ ๊ฐ์ ๊ฒฝ์ฐ๋ ์ ๋ฒ์ ์น๊ตฌ๋ค์ด๋ ๋ํ ๋๊ฐ๋ ํด๋ณด๊ธฐ๋ ํ๊ณ ๊ทธ๋์ ์๋ง ์ํ ๊ฑฐ ๊ฐ์ต๋๋ค.(๊ฒ๋ค๊ฐ ๊ตญ์ ํ๋ ๊ทธ๋ฅ ์ง์ง ๋จ์ ๋ ธ๊ฐ๋ค๋ผ..ใ )
์นดํ ๊ณ ๋ฆฌ๋ณ๋ก ๊ฒ์ํ ๋๋๋ ๊ฒ์ด๋ ์ชฝ์ง ๋ฑ๋ ๋ณ๋ก ์ด๋ ต์ง๋ ์์ ๊ฑฐ ๊ฐ์ผ๋ .. ๋์ค์ ๋ฐฉํ์ด๋ ์๊ฐ์ด ๋๋ค๋ฉด ๋ค์ ํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค..ใ
๋ฐฐํฌ๋ฅผ ์๊ฐ์ด ๋ ๋๋ค๋ฉด ํ๋ฒ ๊ณต๋ถํด์ ํด๋ณด๊ฒ ์ต๋๋ค!!!
์ฌ์ค ๋ญ ์ฑ ๋ณด๊ณ ํ๋ฉด ํ ์ ์์๊ฑฐ ๊ฐ๊ธด ํ๋ฐ.. DB์ฐ๊ฒฐ์ด๋ผ๋๊ฐ ๊ทธ๋ฐ ๋ถ๋ถ์์ ๋ ๋จธ๋ฆฌ์ํ ๊ฑฐ ๊ฐ์์.. ํ๊ต์ํ ํ๋ฉด์ ํ๋ก์ ํธ ์งํํ ๋ ์กฐ๊ธ ๊ณต๋ถ์ข ํ๊ณ ๋์ค์ ๊ณ์ํด์ ์์ฑํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
๊ฒ์ํ ๋ง๋ค๊ธฐ๋ ๋์ด ์๋์ง๋ง... 1๋ถ์ ์ข ๋ฃ..? ์ ๋๋ผ ํ ๊น์..?
๋ค ๋ญ ์ฌ์ค ์ฌ๊ธฐ๊น์ง ๋ด์ฃผ์๋ ๋ถ๋ค๋ ๊ฑฐ์ ์์ ๊ฑฐ ๊ฐ๊ธด ํ์ง๋ง.. ์๋ฌดํผ!!!
๋๋ฆ์ ๋ณ๋ช ์ ํ์๋ฉด, ๊ณต๋ถ๋ฅผ ํ๊ธฐ ์ซ์ด์ ์ข ๋ฃํ๊ฑด ์๋๋ผ๋ ์ ..!!!
์๋ฌดํผ ๋ค ๊ฐ์ฌํฉ๋๋ค!
Reference
https://goni9071.tistory.com/473
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=hulint&logNo=80202537250
https://yzink.tistory.com/m/31
https://souljit2.tistory.com/m/72
https://www.baeldung.com/spring-boot-redis-cache
https://docs.spring.io/spring-data/data-redis/docs/current/reference/html/#scripting