전체 글
[우아한 테크 캠프 팀 프로젝트] 파일 이동 및 삭제 My-Storage(3)
다음은 파일 이동과 삭제에 대한 내용이다. 데이터 무결성에 과하게 집중했는데, 시간이 지나서 문제가 될 수 있음을 깨달았다. 당시에는 도메인 지식이 부족해서 더 폭넓게 생각하지 못한 것 같아 아쉬움이 있는 부분이다. 당시 구현할 때, 파일 이동과 삭제에 있어서 중요한 것은 폴더의 하위 파일 및 폴더들이 동시에 이동하고 삭제되어야 한다는 부분에 집중했다. 현재 DB 상에 구현된 파일 트리 구조는 pk를 기반으로 parent를 찾아가기 때문에 이동의 경우 해당 파일이나 폴더의 Parent ID 값만 바꿔주면 됐다. 삭제의 경우 하위 파일들을 모두 찾아서 한 번에 삭제해야 했다. 이때 락을 걸지 않으면, 삭제 중인 폴더에 어떤 파일을 추가할 수 있고, 타이밍이 맞지 않아서 새로 추가된 파일은 삭제되지 않는 문..
[우아한 테크 캠프 팀 프로젝트]동기 처리 vs 비동기 처리, 비동기 처리에서 발생한 OOM 문제 My-Storage(2)
내가 학습한 CS를 바탕으로 비동기가 더 적절하다고 가정하고 파일 업로드 기능을 구현했다. 그리고 파일 쓰기 작업을 비동기 처리하며 순차적으로 쓰고, 정확히 잘 써졌는지 확인하는 다른 작업들이 추가되었다. 이론적으론 비동기가 리소스를 많이 사용하더라도 결국 I/O 작업이 가장 오래 걸리기 때문에 동기 처리보다 빨라야 할 것이다. 그래서 두 방식을 직접 비교하는 테스트를 진행했다. 사실 테스트는 가장 마지막에 했지만, 정리하는 글이니까 순서상 먼저 정리하려고 한다. 그 과정에서 여러 문제를 만나고 나름 해결했지만 그건 뒤에서 다시 정리하고 여기선 단순히 비교한 결과를 정리한다.테스트 환경우선 사용한 t3 micro 인스턴스는 대역폭이 5Gbps라서 부하를 주었을 때 서버 처리 속도가 더 빨라서 정확한 비교..
[우아한 테크 캠프 팀 프로젝트] File Upload 구현하기. 효율적인 I/O처리를 위한 InputStream과 OutputStream의 분리 My-Storage(1)
우아한 테크 캠프에서 3주 동안 진행하는 팀 프로젝트를 시작하게 되었다. 3주라는 짧은 시간 안에 아이디어를 내고 기능 구현도 하고 발표까지 해야 했다. 팀은 제비 뽑기로 결정했다. 제비 뽑기로 할 줄은 생각도 안 해서 나처럼 CS 공부가 중요하다고 생각하는 분과 팀을 하기로 했었고, 어떤 주제를 할지 미리 정했었다. 조작한 것처럼 제비 뽑기에서 그 분과 한 팀이 되었고 다른 팀원들에게 해당 주제와 대략적인 기능들을 설명해 주었는데 긍정적인 반응이라서 시작하게 되었다.주제와 주제 선택 이유주제는 네이버의 MyBOX, 구글의 Google Drive와 같은 클라우드 스토리지 서비스이다.이 주제를 선택한 이유는 클라우드 스토리지도 일종의 파일 시스템이고, 그렇다면 CS를 많이 활용할 수 있지 않을까?라는 생각..
소켓 프로그래밍을 하다가 발생한 의문점(왜 내 서버 소켓은 브라우저의 요청 클릭 한 번에 두 개의 커넥션을 생성하나요..?)
문제 발생우테캠에서 주어진 과제인 WAS 만들기를 하다가 콘솔에 하나의 요청에 대한 응답이 가기 전에 추가로 커넥션이 맺어지는 것을 목격했다.빨리 기능 구현을 해야 하지만, 나는 무슨 이유로 이런 현상이 발생하는지 궁금했고, 궁금한 건 또 못 참기에 삽질을 시작했다소켓 커넥션에서 발생한 이중 연결 요청이상했던 점은 커넥션을 맺은 후, 아무런 데이터를 보내지 않는다는 것이다. 그래서 처음에 Inputstream으로 데이터를 읽으면 아무것도 읽지 못한다.근데 그걸 에러로 응답해도 브라우저는 신경 쓰지 않고 다음에 오는 에러 응답만을 받아서 렌더링을 한다..근데 이거 불가능하지 않나..? 뭔지는 모르겠지만 첫 커넥션에 대한 응답은 브라우저가 받질 않는 것 같다..?이게 정상 요청일 때도 이렇게 동작해서 브라우..
우아한테크캠프(우테캠) 합격 및 2주차까지의 후기
우테캠 지원작년 네이버 면접에서 쓴 맛을 보고 방향성을 새로 잡으며 공부하던 중, 우아한 형제들에 전환이 가능한 우아한 테크 캠프에 지원했다.작년 면탈 이후 CS 지식이 부족하다 생각하여 CS에만 집중하고 있었는데 마침 자체 서비스를 가진 우아한 형제들에서 우테캠 모집을 하였다. 당시 코테에서 많이 탈락하여 자신감이 많이 떨어졌고, 이전에 이미 부트 캠프를 했었기에 큰 기대는 하지 않고 지원을 했다.코딩 테스트코딩 테스트는 1차와 2차 두 번 진행했다.1차 코딩 테스트(알고리즘)1차 코딩 테스트는 java로만 응시가 가능했고, 개인적으로 문제는 쉽게 느껴졌다. 알고리즘 문제를 잘 풀어낼 수 있는 것을 확인하는 것이 아닌, java 언어를 어느정도 잘 사용할 수 있는지 확인하는 듯한 시험이었다. 물론 그렇..
코드리뷰 적용, 다시 Redis로.. - MiniPay(5)
코드 리뷰이전에는 굳이 Redis를 사용할 필요가 없다고 생각해서 MySQL을 사용하여 기능을 구현했다. 해당 기능은 이체 트랜잭션을 분리하여 발생한 데이터 정합성 문제를 해결하기 위해 이체 발생 로그를 저장하는 기능이다. 하지만 코드 리뷰에서 데이터가 오래 유지되지 않고 금방 사라져도 되는 데이터라는 점에서 Redis와 같은 메모리 기반의 DB 사용하면 좋겠다는 리뷰를 받았다. 이전에도 Redis를 사용하면 된다고 생각했지만 delete 연산 때문에 사용하지 않은 것인데 뭔가 다른 방법이 필요했다. 현재 producer, consumer 구조를 사용하고 있기에 Redis를 해당 구조에서 사용할 방법을 찾아보았다.Redis Stream찾아보니 Redis가 지원하는 많은 데이터 형식 중 Stream이라는 ..
ThreadPoolTaskExecutor를 사용한 비동기 처리로 이체 서비스 만들기 - MiniPay(3)
Mini Pay step 2 간단 설명 step 1을 끝내고 step 2로 넘어왔다. step 2는 다른 사람의 메인 계좌에 이체를 하는 것과 매일 00시에 이체 한도를 초기화 하는 것이었다. 개인적으로 페이 서비스의 step 중에서 가장 고민을 많이 했으며 가장 재밌어 보이는 step 이었다. step 2에서 고민해야 할 점은 사용자들이 동시에 요청을 보냈을 때 돈의 정합성 문제와 다수의 요청을 동시에 효율적이게 처리해야 할 방법이었다. 효율적이고 정확한 처리를 위한 고민 먼저 돈과 관련되어 있기 때문에 정합성이 가장 중요했다. 왜냐하면 내가 이체를 했는데 나의 계좌에는 돈이 빠져나갔지만, 상대는 돈이 들어오지 않은 상황이 발생하면 안되기 때문이다. 그래서 잠깐 생각을 해 봐도 A→B 라는 돈의 흐름에..
Github Action CommunicationsException: Communications link failure, profile 설정과 @SpringBootTest 동작 방식 이해로 해결하기 - MiniPay(2)
문제 로컬 환경에서 테스트하고 빌드까지 잘 되는 것을 확인했지만, github action을 사용한 build에서 데이터베이스와 연결이 안 된다는 에러가 발생했다. 해결 과정 1. Github Actino에서 MySQL을 사용하기 Github Action 환경이 어떻게 되어 있는지 간단하게 살펴 보았다. 이벤트를 발생시키면 Runner에서 동작하는 원리였는데 얘가 컨테이너 내부에서 작업을 실행한다. 해당 컨테이너 환경에 MySQL이 없어서 발생하는 에러였고, MySQL을 사용할 수 있는 설정을 포함해서 해결할 수는 있었다. 하지만 그러면 전체 작업 수행 시간이 늘어나는 문제가 있어서 다른 방법을 고민해 보았다. 만약 이 방법을 사용할 것이라면 아래처럼 작업을 추가해 주면 된다 services: mysql..