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가지 - 똑같은 이력서 속에서 돋보이는 법
게시글
질문&답변
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
질문&답변
4-5 그래프 강의 내용에 대해 질문드립니다.
안녕하세요 chohk 님!! 좋은 질문 감사합니다!!먼저, chock 님의 말씀이 정확합니다!! 인접 리스트의 공간복잡도를 올바르게 분석해보겠습니다. 최악의 경우(완전 그래프)N개의 노드가 각각 다른 모든 노드와 연결된 경우각 노드는 N-1개의 간선 정보를 저장따라서 총 공간복잡도는 O(N * (N-1)) = O(N^2)일반적인 경우간선의 수 E가 노드 수 N보다 적은 경우(E 공간복잡도는 O(N + E)제 강의에서 인접 리스트의 공간복잡도를 O(N)으로 설명한 것은 "E 의 개수가 매우 작거나 비례하는 그래프의 형태" 임을 상정하고 표현했던 것 같습니다. 정확히는 O(N + E)로 표현하는 것이 맞습니다. 인접행렬과 인접리스트의 공간복잡도를 비교하는 상황이었기에, 간선이 별로 존재하지 않는 경우라는 전제가 깔려있어서 이와 같이 설명을 했던 것 같습니다.그럼에도 불구하고 chohk 님이 말씀해주신것처럼 최악의 경우에서는 O(N^2) 도 가능하다는 것을 고려하는 것이 맞다고 생각합니다 이 부분은 교재에 반영을 해두도록 하겠습니다 좋은 피드백 너무너무 감사드립니다!! 추가적으로 말씀해주신 내용은 문제의 입력값 범위에 따라 결정해보시면 좋을 것 같습니다예를 들어 노드의 개수의 범위는 0 간선의 개수의 범위는 0 와 같은 입력값일 경우에는 N+E 의 범위가 N^2 까지는 갈 수 없겠다. O(N) 이라고 보고 풀면 되겠다 라고 생각해주시면 좋을 것 같습니다.
- 0
- 2
- 34
질문&답변
테스트코드 실행
(사진)헛 제가 이거 설명을 깜빡했네요!!!Intelliji 설정 > 플러그인 > jmh 검색 후 설치하셔야 해당 벤치마크 테스트 코드의 실행 버튼이 나타날거에요!!kongminoo 님 질문넘넘 감사드립니다!! 덕분에 강의를 개선할 수 있을 것 같습니다 __피드백 주심에 대한 감사의 의미로 커피 기프티콘을 드리겠습니다 아래 카카오톡 오픈 링크로 연락 부탁드립니다!!https://open.kakao.com/me/ding_coding_co감사합니다
- 0
- 2
- 60