주말이 끝나고 다시 월요일이다.
주말에는 머리를 좀 식혀가며 공부했는데, 다시 열심히 바짝 해보자. 💪
아침에는 동시성 처리 관련한 경험을 트랜잭션 격리수준과 연관지어 정리해보았다.
당시에는 Serializable을 설정하면 무조건 트랜잭션 하나만 데이터베이스에서 동작할 수 있는 줄 알았다. 하지만 트랜잭션이 점유하고 있는 자원에 대해 넥스트 키 락으로 읽기 잠금을 걸어 다른 트랜잭션에서 읽기는 물론 변경이 불가능하게 한다.
InnoDB implicitly converts all plain SELECT statements to SELECT ... FOR SHARE if autocommit is disabled.
추가로 서로 다른 사용자가 동시 요청으로 최대 인원 수보다 많은 참여 데이터가 쌓이는 경우를 어떻게 방지할 지에 대해 고민하였다. 같은 사용자의 동시 요청 방지는 Unique 복합 인덱스로 해결할 수 있었지만 다른 사용자의 경우 아래 조건 문에서만 예외처리할 수 있다.
한 사용자가 참여하여 최대 인원이 꽉 차고, 모임 상태가 COMPLETED로 변경되었을 때 다른 사용자의 참여 요청이 거부될 수 있다.
즉 참여 로직 동안 모임 레코드에 대한 접근 권한을 제한해야 해당 Check-Then-Act 패턴으로 인한 경쟁 조건 이 생기지 않는다. 참여를 위한 모임 데이터에 접근하는 경계를 임계 영역으로 두고 모임 데이터에 동시 읽기가 불가능하도록 쓰기 락을 걸 수 있다.
3일 정도에 걸쳐서 동시성 이슈와 락, 그리고 트랜잭션 격리 수준에 대해 알아보았다.
조금 쉬엄쉬엄 하느라 빠르게 칠 수 있는 토픽을 오래 끌고 온 것 같아서 아쉽다.
오후에는 리트 코드 문제를 3시간 정도 풀었다.
https://leetcode.com/problems/longest-substring-without-repeating-characters/
해결 코드 어제 못 푼 리트코드 문제이다. 가장 긴 중복 문자 없는 부분 문자열을 구하는 문제이다.
순회하다 중복 문자가 나오면 적절한 대응을 하면서 가장 긴 중복 없는 부분 문자열을 구하는 방식으로 접근했다. 적절한 대응을 찾는 과정에서 헤맸다. 아래 대응을 시도하였고 마지막 방식으로 해결하였다.
- 중복 문자만 삭제하기
- 전부 삭제하기
- 중복 문자 이전에 나온 모든 문자를 삭제하기
중복 문자가 나왔을 때 이전에 추가한 문자는 부분 문자열에서 제외한다는 점과 중복 문자 이후에 나온 문자들은 부분 문자열의 후보가 될 수 있음을 고려하였다.
시간 복잡도는 O(N^2)이고 공간 복잡도는 O(N)이다. 중복되지 않는 부분 문자열을 일일이 저장하고 제거하는 방식이기 때문에 두 번 순회할 필요가 있었다.
슬라이딩 윈도우 기법을 사용할 수 있다. (솔루션 참고)
class Solution {
public:
int lengthOfLongestSubstring(string s) {
set<char> st;
int left = 0;
int max_length = 0;
for(int right = 0; right < s.length(); right++) {
while (st.find(s[right]) != st.end()) { // remove all of the left
st.erase(s[left]);
left++;
}
st.insert(s[right]);
max_length = max(max_length, right - left + 1);
}
return max_length;
}
};
하지만 중복 문자열 발견 시 이전에 등록한 문자를 모두 제거한다는 특성 때문에 O(N^2)의 시간 복잡도는 어쩔 수 없는 듯 하다.
그 외에도 배열 문제를 더 풀었다.
https://leetcode.com/problems/contains-duplicate/description/
https://leetcode.com/problems/product-of-array-except-self/
그 동안 느리더라도 꼭 풀고 넘어가려 했는데, 방향성을 조금 수정하여 알고리즘 실력을 키우는 것보다 라이브 코딩에 적절한 실력을 키우려 한다. 말을 하면서 풀면 좋으니 가능한 크루들과 함께 풀 것 🙋♀️
- 자료구조의 시간/공간 복잡도 설명하기
- 코드 작성 전 알고리즘과 코드 구조 설명하기
- 테스트 케이스로 오류 검증하기
- 문자열과 배열과 같이 기본적인 알고리즘과 자료구조를 활용한 문제 위주로 풀기
저녁에는 데이터베이스 복제에 대해 공부하였다.
- 두 개의 DataSource 연결
- 데이터베이스 복제 방식과 바이너리 로그 포맷
- 복제 과정에서 MySQL의 락
- MySQL InnoDB에서 복제 설정과 파라미터
처음에 공부했을 때는 되게 어렵다고 생각했는데 다시 공부해보니 잘 이해가 된다 🤔 역시 아무리 어려워도 이해되는 시점은 오나보다.
'우아한테크코스 > 레벨5' 카테고리의 다른 글
[TIL] 2024/11/13 (0) | 2024.11.13 |
---|---|
[TIL] 2024/11/12 (2) | 2024.11.12 |
[TIL] 2024/11/10 (0) | 2024.11.10 |
[TIL] 2024/11/09 (1) | 2024.11.09 |
[TIL] 2024/11/08 (0) | 2024.11.08 |