오늘 한 것 요약

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