오늘 한 것 요약
Redis를 이용해서 분산락 구현
락 이란?
서비스를 구현 할 때 짧은 시간 내에 많은 요청이 들어오는 경우가 있다.
회원가입을 예로 들자면
public UserResponseDto createUser(UserRequestDto requestDto) {
String name = requestDto.getName();
String email = requestDto.getEmail();
String password = requestDto.getPassword();
String phone = requestDto.getPhone();
String encodedPassword = passwordEncoder.encode(password);
User user = userRepository.save(new User(name, email, encodedPassword, phone));
return new UserResponseDto(user);
}
UserRequestDto가 들어와서
name, email, password, phone 을 설정하고
password를 인코딩 한 뒤에
userRepository로 저장하는 과정을 거치는데
userRepository에 저장되기 전에 다른 request가 들어와서 먼저 저장된다면
두 리퀘스트 다 email의 유효성 검사가 끝난 뒤라서 둘 다 데이터베이스에 저장될 수 있는 상황이 생긴다.
그러므로 락을 구현해서 여러 요청이 한번에 왔을 때 하나의 요청만 해결하고 다른 요청은 버리는 로직을 구현했다 .
@Service
@RequiredArgsConstructor
public class UserService {
private final UserRepository userRepository;
private final BoardRepository boardRepository;
private final ParticipantRepository participantRepository;
private final PasswordEncoder passwordEncoder;
private final RedissonClient redissonClient;
@Transactional
public void createUser(UserRequestDto requestDto) {
String lockKey = "createUserLock"; // 락의 키 설정
RLock lock = redissonClient.getLock(lockKey);
try {
lock.lock(); // 락 획득
// createUser 메서드의 나머지 로직 수행
String name = requestDto.getName();
String email = requestDto.getEmail();
String password = requestDto.getPassword();
String phone = requestDto.getPhone();
String encodedPassword = passwordEncoder.encode(password);
User user = userRepository.save(new User(name, email, encodedPassword, phone));
new UserResponseDto(user);
} finally {
lock.unlock(); // 락 해제
}
}
구현이 되었는지 확인은 JMETER를 통해 했는데, 한번에 많은 요청을 보낼 수 있어서 Jmeter를 사용했다.
csv파일을 읽어서 각 항목을 채워줬다.
1000번의 request를 52초 동안 받았던 모양이다.
이제 유저를 확인해보면
623개의 row가 있으니, 1000번의 요청에서 622번의 요청만 DB에 저장된 것을 볼 수 있다.
락을 통해 concurrency를 해결한 것이다.
내일 해야하는 것
락을 통해 막혔을 때 ( 락을 얻지 못했다면 ) , 에러메세지를 보내도록 코드 수정
도커 환경 구성
'항해99 > [항해99] Spring' 카테고리의 다른 글
[Spring] 24.01.25 - Spring Project 완료! (0) | 2024.01.27 |
---|---|
[Spring ] 24.01.24 - TIL (0) | 2024.01.24 |
[Spring] 24.01.15 - TIL (0) | 2024.01.16 |
[Spring] 게시판 만들기 (0) | 2024.01.04 |