7년차 백엔드 개발자로, 안정적인 결제 시스템과 고성능 서비스 아키텍처 설계에 특화되어 있습니다.
주요 경험으로는 다음과 같습니다.
17분 만에 유심칩을 배달하는 배송 서버 설계
300건의 테스트 케이스와 k6 부하 테스트를 거친 정기/단건 결제 서버 설계
3.5억건의 유저책 데이터를 역정규화를 통해 최적화
Kotlin, Spring, Django, Python, Node, TypeScript, AWS, Docker 등의 기술을 사용하여 프로덕션 서비스를 개발 및 운영한 경험이 있습니다. 새로운 기술을 배우고 서비스에 적용하는 것을 즐거워합니다.
또한 개발 지식을 공유하고자 YouTube 채널을 운영하고 있으며, 19,100명 이상의 구독자와 함께 성장하고 있습니다. 배워온 지식을 제 것으로 만들기에 도움이 되고 있습니다.
서비스를 개발하기 위해서는 커뮤니케이션이 가장 중요하다고 생각합니다. 적극적인 커뮤니케이션으로 문제 해결과 비즈니스 발전을 위해 노력하고 있습니다. 이러한 점을 바탕으로 더 좋은 개발자로서 성장하기 위해 더 치열하게 학습하고, 경험하고, 노력하고 있습니다.
여러분과 함께 성장하는 강의를 만들어보겠습니다.
강의
로드맵
전체 1수강평
- 6주 완성! 백엔드 이력서 차별화 전략 4가지 - 똑같은 이력서 속에서 돋보이는 법
- 6주 완성! 백엔드 이력서 차별화 전략 4가지 - 똑같은 이력서 속에서 돋보이는 법
- 6주 완성! 백엔드 이력서 차별화 전략 4가지 - 똑같은 이력서 속에서 돋보이는 법
- 6주 완성! 백엔드 이력서 차별화 전략 4가지 - 똑같은 이력서 속에서 돋보이는 법
- 6주 완성! 백엔드 이력서 차별화 전략 4가지 - 똑같은 이력서 속에서 돋보이는 법
게시글
질문&답변
INDEX의 첫번째 칼럼은 정렬이 상관이 없는 것이 맞는지 궁금합니다
안녕하세요 석찬님!! 너무너무 좋은 질문 감사합니다! 우선 질문에 답을 해드리면 인덱스 첫번째 칼럼의 정렬 방향은 분명히 의미가 있습니다! 실제 측정 결과에서도 DESC로 정렬된 인덱스가 약 2배 빠른 것을 확인하신 것처럼, 성능 향상에 도움이 됩니다.그 이유는 다음과 같습니다.인덱스 스캔 방향과 쿼리 정렬 방향의 일치: 쿼리에서 ORDER BY order_date DESC를 사용하고 있으므로, 인덱스도 DESC로 생성하면 추가 정렬 작업 없이 바로 결과를 반환할 수 있습니다.인덱스 스캔 효율성: B+Tree에서 양방향 스캔이 가능하긴 하지만, 역방향 스캔은 일반적으로 순방향 스캔보다 더 많은 비용이 듭니다. 말씀주신대로 B+Tree는 leaf 노드 간에 양방향 링크가 있어 역방향 탐색도 가능합니다. 그러나 순방향 스캔은 디스크/메모리 액세스 패턴이 최적화되어 있습니다. 역방향 스캔은 캐시 지역성(cache locality)이 떨어질 수 있습니다.만약에 오름차순으로 정렬이 되어있는데 내림차순으로 검색을 하는 경우라면, 날짜 필터에 맞는 첫 지점을 찾은 후 순방향으로 읽고, 메모리에서 다시 DESC로 정렬해야 합니다. 반대로 내림차순으로 정렬이 되어있는데 내림차순으로 검색한다면 날짜 필터의 반대쪽 끝(가장 최근 날짜)에서 시작해 순방향으로 읽으면 바로 DESC 정렬된 결과가 나옵니다. 특히 LIMIT 100과 같은 제한이 있을 때, DESC 인덱스는 필요한 100개 레코드만 읽고 즉시 반환할 수 있습니다.즉, 인덱스의 정렬 방향은 분명히 의미가 있으며, ORDER BY 절의 정렬 방향과 일치시키는 것이 성능상 유리합니다. 특히 최신 데이터를 우선적으로 조회하는 패턴이 많은 애플리케이션에서는 내림차순(DESC) 인덱스가 큰 성능 향상을 가져올 수 있습니다!!좋은 질문해주셔서 감사합니다. 언제든 편하게 질문해주세요!
- 0
- 2
- 4
질문&답변
1-5 파이썬 max 함수를 사용하지 않는 이유
안녕하세요 유담님!! 좋은 질문 감사합니다넵 맞습니다 말씀해주신대로 초심자 입장에서 생각하기 위함입니다!알고리즘 공부할 때 max() 같은 내장 함수 안 쓰고 직접 구현하는 건 코딩의 기초체력을 키우기 위한 방법이라고 생각합니다!.내장 함수만 쓰면 편하긴 한데, "최댓값을 어떻게 찾지?"라는 고민을 못해보게 됩니다. 직접 변수 하나 만들고, 리스트 돌면서 비교해보고, 더 큰 값 나오면 갱신하는 과정을 경험해보는 게 중요해서 이와 같이 구현하도록 했습니다!.좋은 질문 감사합니다 언제든 편하게 질문해주세요!!
- 0
- 2
- 6
질문&답변
ImprovedOrder의 구조에 대한 질문입니다.
안녕하세요 gogoDevelop님!! 열공하시는 모습 아주 좋습니다 🔥반정규화와 관련된 좋은 고민을 하고 계시는군요!!제가 보기에는 두 번째 방법인 "ImprovedOrder에 orderItems 필드 추가"가 더 좋은 방향인 것 같습니다.반정규화를 했다고 해서 객체 간의 관계를 완전히 끊을 필요는 없습니다!. JPA의 장점은 객체 관계를 자연스럽게 표현할 수 있다는 건데, 이걸 포기하는 건 아쉬울 것 같습니다.게다가 totalItems만 필요한 경우에는 orderItems를 불러오지 않으니까 FetchType.LAZY로 설정하면 성능상 이점도 그대로 누릴 수 있습니다. 필요할 때만 orderItems를 조회하게 되니 반정규화의 성능 이점은 유지하면서도, 필요할 때는 관계를 활용할 수 있을 것 같습니다.첫 번째 방법(orderNumber로 별도 조회)도 가능하긴 하지만, 결국 N+1 문제가 다시 발생할 수 있고, 명확한 관계가 코드에 표현되지 않아서 좀 아쉬운 부분이 있습니다.결론적으로, totalItems 같은 자주 쓰는 정보는 반정규화해서 성능을 확보하고, 동시에 orderItems와의 관계도 LAZY로 유지해서 필요할 때만 사용하는 방식이 균형 잡힌 접근법이라고 생각합니다!!좋은 질문 해주셔서 감사합니다!!
- 0
- 2
- 0
질문&답변
포트폴리오 질문이 있습니다.
안녕하세요 gogoDevelop 님!! 프로젝트하시면서 고민이 생기셨었군요결론부터 말씀드리자면, 웹 디자인 없이 비즈니스 로직 중심의 프로젝트를 포트폴리오에 담는 것은 매우 괜찮습니다! 오히려 백엔드 개발자로서는 이런 접근이 더 차별화될 수 있어요.백엔드 개발자에게 가장 중요한 것은 비즈니스 로직 설계와 시스템 아키텍처입니다. 복잡한 비즈니스 요구사항을 해결하는 능력은 프론트엔드보다 백엔드 개발자에게 더 중요하죠. 실제 기업에서도 백엔드 개발자가 API 설계, 동시성 제어, 대규모 트래픽 처리와 같은 문제를 해결하는 역할을 담당합니다. 프론트엔드는 다른 팀원이 맡는 경우가 많고요.동시성 문제, 분산 시스템 설계, 데이터 정합성 등의 고민은 기술적 깊이를 보여줍니다. 이런 프로젝트는 단순히 "CRUD 애플리케이션을 만들었다"는 것보다 훨씬 인상적입니다!!말씀하신 방향(인터넷 배송 도메인에 대규모 동시성 처리 추가)은 아주 좋습니다! UI가 없더라도 아키텍처 다이어그램, 시퀀스 다이어그램 등을 추가하셔서 복잡한 시스템을 이해하기 쉽게 시각화하는 것도 좋은 방법입니다.기업들은 백엔드 개발자를 평가할 때 비즈니스 문제 해결 능력, 기술적 깊이, 확장성 고려, 코드 품질 등을 중요하게 봅니다. 이런 측면에서 볼 때, 말씀하신 프로젝트는 백엔드 포트폴리오로 매우 적합합니다!!자신 있게 "프로젝트"라고 칭하고 포트폴리오에 담으셔도 됩니다. 오히려 이런 실무 중심의 접근은 많은 기업에서 높이 평가받을 것이니 걱정말고 꾸준히 정진하셨으면 좋겠습니다!!
- 0
- 2
- 0
질문&답변
후보정 로직에 대해 궁금한 것이 있습니다.
안녕하세요 이력서 강의의 열수강생 gogoDevelop님!!! 🔥🔥🔥🔥좋은 질문 해주셔서 감사합니다!! 강의에서 설명드린 방식은 이론적으로는 데이터 정합성을 보장하지만, 말씀하신대로 실제 서비스에서는 말씀해주신대로 고려해야 할 부분이 더 있습니다! 말씀해주신 것처럼 예약 직후 사용자가 예약 정보를 조회했을 때 예약번호가 없다면 불완전한 경험을 제공하게 됩니다. 이는 "예약 완료"라고 안내했는데 정작 예약 정보가 없어 보이는 모순된 상황을 만들 수 있습니다.따라서 다음과 같은 추가 처리가 필요합니다! 예약번호가 없을 때 "처리 중" 같은 상태를 보여주고, 자동 새로고침이나 안내 메시지를 제공합니다. 또한 스케줄러로 5분마다 체크하는 것과 별개로, 예약 직후 예약번호 저장 실패 시 즉시 1-2회 재시도하는 로직 추가하는 방법도 있을 것 같습니다! 만약 예약번호가 즉시 필요한 서비스라면 아예 동기식으로 로직을 변경해야 하는 경우도 있을 것 같아요 질문해주신 내용은 실제 서비스 개발 시 매우 중요한 고민 포인트입니다. 강의에서 다룬 후보정 방식은 기본 패턴으로, 실제 적용 시에는 다음과 같은 고려사항을 추가로 반영해보면 좋을 것 같습니다사용자 경험을 해치지 않는 추가적인 UI/UX 전략즉시 재시도와 정기적 보정의 조합비즈니스 중요도에 따른 동기/비동기 처리 선택오늘도 좋은 질문 감사드립니다!!
- 0
- 2
- 0
질문&답변
5주차 진도 나가기전 질문입니다.
안녕하세요 영욱님! 좋은 질문 감사합니다! 우선, 알고리즘 공부하시면서 정말 많은 분들이 비슷한 경험을 하시니 걱정하지 마시길 발반디ㅏ!!4주차 숙제인 멜론 베스트 앨범뽑기부터 난이도가 확실히 올라가는 편입니다. 모든 숙제를 100% 이해하고 5주차로 넘어가는 것이 이상적이지만, 실제로는 그렇게 하기 어려울 수 있습니다. 따라서, 일단 5주차 강의를 들어보시는 것을 추천드립니다! 실전 문제풀이 과정을 통해 어떻게 접근하는지 보는 것만으로도 배울 점이 많습니다. 또한 동시에 이해가 안 되는 3-4주차 숙제들은 반복해서 복습하세요.학습은 선형적으로 진행되지 않을 수 있습니다. 때로는 앞으로 나아가면서 돌아와 복습하는 과정이 더 효과적일 수 있습니다."문제를 풀다가 '아 나 더이상 이 이상은 작성 못하겠어' 할때 정답과 해설영상을 봐왔는데"이 방식에 대해서 저는 좋다고 생각합니다! 결국 알고리즘 학습에서 중요한 것은 충분히 고민하는 시간과 막히는 지점을 파악하는 것이라고 생각합니다!다만, 10분 이상의 시간을 쓰지는 마세요. 차라리 빠르게 해설을 본 다음에 다시 풀어보는 것을 추천드립니다. 결국 알고리즘 문제는 훈련과 같기에, 여러번 떠올려보고 여러번 풀어보시는 것이 더 효율적일 거에요!! 시간이 너무 소모된다고 느끼신다면, 타이머를 설정해보시길 추천드립니다알고리즘은 근육과 같아서 반복해서 훈련할수록 강해집니다. 지금 어렵게 느껴지는 것은 매우 자연스러운 과정이니 포기하지 마시고 계속 도전해보시길 바랍니다!!! 언제든 또 질문해주세요 좋은 하루 보내시길 바랍니다!!
- 0
- 1
- 12
질문&답변
소수 나열하기 2차 개선 조건식 위치
안녕하세요 인프런님! 헉 닉네임이 인프런일수도 있군요 우선 좋은 질문 감사합니다!! 질문해주신 내용에 대해서 답변드리면, 말씀해주신 내용이 맞습니다! 그 두 가지 조건식의 차이점은 조건 순서의 차이입니다. 논리적으로는 완전히 동일하지만, 실행 효율성 측면에서는 차이가 있습니다. 파이썬에서 and 연산자는 단락 평가(short-circuit evaluation) 방식을 사용합니다. 즉, 첫 번째 조건이 False라면 두 번째 조건은 아예 평가하지 않습니다.즉, 다음과 같은 코드에서 다음 순서로 동작합니다 if i * i 먼저 i * i 조건을 확인합니다.이 조건이 False라면(즉, i가 n의 제곱근보다 크다면), 나머지 조건(n % i == 0)은 확인하지 않고 넘어갑니다.이것이 성능 향상을 불러오는 이용은 다음과 같습니다.나머지 연산(%)은 계산 비용이 비교적 높습니다:나머지 연산은 나눗셈을 포함하기 때문에 단순 비교보다 CPU 사이클을 더 많이 소모합니다.제곱근 이상의 소수로는 확인할 필요가 없습니다:수학적으로, 어떤 수 n이 합성수라면 반드시 √n 이하의 소수로 나누어 떨어집니다.예: 16은 2로 나누어 떨어지므로, 8(16÷2)로 나누어 떨어지는지 확인할 필요가 없습니다.불필요한 연산 회피:i * i > n이라면, 그 이후의 모든 i에 대해서도 나머지 연산을 할 필요가 없습니다.따라서 단락 평가 때문에 나머지 연산의 횟수를 줄여 성능을 향상시킨다고 봐주시면 좋을 것 같습니다! 언제든 또 질문주시고 좋은 하루 되시길 바랍니다!!
- 0
- 2
- 20
질문&답변
더하거나 빼거나 문제 질문
안녕하세요 오승택님! 좋은 질문 감사합니다 재귀 함수에 대한 질문에 답변드리겠습니다!이 코드에서 가장 이해하기 어려운 부분은 재귀 호출의 실행 순서입니다. 학생이 혼란스러워하는 부분을 명확히 설명해 드리겠습니다.재귀 함수가 실행되는 방식은 "깊이 우선 탐색(DFS)"이라고 생각하시면 됩니다. 첫 번째 재귀 호출이 완전히 끝날 때까지 두 번째 재귀 호출은 대기하게 됩니다.원리를 다음과 같이 설명해 드리겠습니다!처음에 get_all_ways_by_doing_plus_or_minus(array, 0, 0)으로 시작합니다.이 함수는 두 개의 재귀 호출을 합니다:get_all_ways_by_doing_plus_or_minus(array, 1, 0+1) → (array, 1, 1) (더하는 경우)get_all_ways_by_doing_plus_or_minus(array, 1, 0-1) → (array, 1, -1) (빼는 경우)중요한 점은 첫 번째 호출 (array, 1, 1)이 완전히 끝날 때까지 두 번째 호출 (array, 1, -1)은 실행되지 않습니다.(array, 1, 1) 호출은 다시 두 개의 호출을 생성합니다:(array, 2, 1+1) → (array, 2, 2)(array, 2, 1-1) → (array, 2, 0)이런 식으로 첫 번째 경로가 끝(배열의 마지막 요소)까지 도달한 후에야 다음 경로가 탐색됩니다.이것을 트리로 시각화하면 이렇게 됩니다!! (0,0) / \ (1,1) (1,-1) / \ / \ (2,2) (2,0) (2,0) (2,-2) ... 이런 식으로 계속됨코드 실행 순서는 깊이 우선이기 때문에,(0,0) → (1,1) → (2,2) → ... → 끝까지 간 후(0,0) → (1,1) → (2,0) → ... → 끝까지 간 후(0,0) → (1,-1) → (2,0) → ... → 끝까지 간 후(0,0) → (1,-1) → (2,-2) → ... → 끝까지따라서 get_all_ways_by_doing_plus_or_minus(array, 1, -2)는 건너뛰는 것이 아니라, get_all_ways_by_doing_plus_or_minus(array, 1, 1)의 모든 하위 호출이 완료된 후에야 실행됩니다.좋은 질문 감사드립니다! 한 번 디버그 모드 등을 이용해서 순서를 살펴보시는것도 좋을 것 같습니다 혹시 더 궁금하신 점ㅇ 있으시면 편하게 더 질문해주세요! ㅎ.ㅎ
- 0
- 1
- 19
질문&답변
노션에 오타가 있는 거 같아요
안녕하세요 민우님!!! 제보 감사합니다!!! 🥰🥰🥰덕분에 교재를 잘 수정했습니다!! 항상 수강 열심히 해주시고 교재 피드백도 주셔서 감사드리옵니다 🙇🙇🙇
- 0
- 2
- 23
질문&답변
이진트리 vs 완전 이진트리
안녕하세요 애롱님!! 좋은 질문 감사합니다!이 애니메이션 부분을 말씀해주신 것 같습니다 이 부분은 애롱님의 말씀이 정확합니다!!완전 이진 트리(Complete Binary Tree)는 모든 레벨이 완전히 채워져 있어야 하며, 마지막 레벨은 왼쪽부터 차례대로 채워져야 합니다.이미지를 보니 오른쪽에 표시된 "완전 이진 트리"의 마지막 레벨에서 오른쪽에 노드가 있는데 왼쪽이 비어있다면, 이는 완전 이진 트리의 정의에 맞지 않습니다. 완전 이진 트리에서는 새 노드가 추가될 때 항상 왼쪽부터 채워져야 합니다. 애니메이션을 제작하다가 실수했던 것 같습니다 이 부분은 시일내에 수정해두도록 하겠습니다피드백 주심에 대한 감사의 의미로 커피 기프티콘을 드리겠습니다 아래 카카오톡 오픈 링크로 연락 부탁드립니다!!https://open.kakao.com/me/ding_coding_co감사합니다 (사진)
- 0
- 2
- 38