Instructor 변다빈(@davin111) 2020.08.29.(토) 13:00
서버와 DB의 역할과 RDB, ORM의 개념
슬라이드 참고
- 없음
- 0번째 세미나까지는 공식 일정에 포함되어있지 않으므로, 요청에 따라 미리 불참 밝혀주신 외 분들도 영상으로 다시 보실 수 있도록 하겠습니다. 당연히 함부로 외부 공유는 하시면 절대 안됩니다..! 화면 켜셨던 사람들의 초상권 문제도 있을 수 있습니다. 그리고 앞으로의 세미나부터는 매번 모든 분들께 녹화 영상 드리지 않을 것 같아요! 실시간 참여가 중요하고, 제가 알려드리는 것보다 스스로 공부하고 직접 삽질하는 경험이 훨씬 중요함을 기억해주세요. 제 소개 등 앞 부분이 약간 잘렸다고 합니다. 그리고 두 번째 영상 앞 부분이 첫 번째 영상 뒷 부분과 겹쳐져 있습니다. 두 번째 영상의 10분 경 정도부터 안 겹쳐지는 것 같네요. 비공개 동영상으로, 링크가 있어야만 조회되는 영상들입니다.
- seminar 0 - part 1
- seminar 0 - part 2
- 세미나 중 답한 것과 답하지 못한 것 모두 아래에 정리합니다. 제 답변에는 당연히 부정확하거나 주관적인 의견이 섞여있을 수 있습니다. :) 저를 너무 믿기보다, 더 많고 정확한 정보를 얻고 싶다면 구글링을 병행해주세요.(저도 답하려고 구글링 많이 합니다 ㅎㅎ)
- 혹시 rest api 형식과 graphql의 장단점이 뭐라고 생각하시나요..?
GraphQL 을 질문하시다니 뭔가 이미 여러가지를 나름 알고 계시는 분이 아닌가 싶네요. 저는 아직 거의 사용해본 적은 없는데, 일단 처음 들어보셨을 분들께 이것이 뭔지에 대해서만 간단히 짚고 넘어가자면, 아까 세미나에서 서버가 DB에 SQL을 통해서 데이터를 가져오고, 조작한다고 말씀드렸는데요. GraphQL은 이와 비슷한 query 언어이지만, frontend/client가 서버로부터 데이터를 가져오기 위해 개발된 언어로, 좀 더 사용자 기준으로 앞단에 위치한다고 할 수 있습니다. 즉 설명드렸던 REST API의 포지션에 해당하는 것인데요, REST API는 하나의 화면을 위해서도 다양한 자원을 가져오기 위해 서버에 요청을 여러 번 해야하는 경우가 자주 생깁니다. GraphQL은 그런데 요청하는 입장에서 서버의 데이터 구조를 알고 있다는 전제를 갖고, 한 번의 요청으로 필요한 여러 데이터를 입맞대로 가져올 수 있다, 라는 것에 크게 지향점을 두고 있습니다. 프론트에서 좀 더 주체적으로 데이터를 알아서 퍼가는 느낌이라고 해야할까요? 이것만 보면 GraphQL이 훨씬 효율적으로 보이지만, 아직 GraphQL은 큰 프로젝트에서 적극적으로 적용되는 경우가 거의 없고, 초기 단계라고 할 수 있는 편입니다. 또한, 프로젝트의 복잡도가 올라갈수록 생각보다 간단하게 해결될 수 있는 부분이 줄어들고, 요청을 보낼 endpoint와 response 구조만 알아서 갖다 쓰면 되는 REST API 방식에 비해, 프론트가 서버의 데이터구조에 대해 보다 훨씬 인지하고 있어야 하는 영역이 많고, 또한 잘못된 요청을 했을 때 이를 어떻게 걸러낼지를 고려하는 것이 어려운 등 개발 과정이 원활하지 못할 수 있다는 것도 단점인 것 같습니다. 이 링크 등 여러 좋은 글들이 많으니 참고하셔도 좋을 것 같습니다. 너무 넓고 다양한 측면을 가진 주제를 쉽게 말한 경향이 있지만, 현재 여기에서는 이 정도가 좋을 것 같습니다.
- 좀 뜬금없지만 여러 사기업에서도 외부인에게까지 코드를 공개하는 것 같은데, 그 이유나 배경이 궁금합니다. 그냥 다 같이 코드를 공유하고 상부상조하는 분위기인 건가요? 어찌 보면 영업 비밀 아닌가 싶어서요
오픈 소스에 대한 질문이신 것 같은데요, 일단 당연히 기업의 직접적인 이익이나 리스크와 관련된 코드는 전혀 공유하지 않습니다. 그런 점에서 기업의 공유되지 않는 코드가 훨씬 많다고 얘기할 수 있기는 하죠. 그럼에도 오픈 소스 방식으로 기업이 코드를 공유하기도 하는 이유는, 일단 잘 운영되는 경우에는 회사 외부 자원으로 프로젝트를 발전시킬 수 있기 때문일 것입니다. 좋은 개발자들이 자발적으로 리뷰를 하고, 자신의 코드를 기여해주기도 하니까요. 또한 프로젝트의 피드백을 외부에게서 얻을 수 있다는 점도 장점일 것입니다. 그리고 훌륭한 오픈 소스 프로젝트를 운영하는 기업은 당연히 그만한 개발 역량을 가지고 있다는 것이고, IT 개발자들이 선호하는 투명하고 적극 적인 소통을 하는 분위기를 가지고 있을 가능성이 높습니다. 그렇기에 기업 자체에 대한 관심을 높일 수 있다는 점에서도 좋을 것입니다. 기업에 국한하지 않고도, 저는 자신의 코드와 지식을 공유하는 것에 많은 분들이 적극적이면 좋겠네요. 특히 개인 입장에서 외부에 공유하지 말아야할 코드는 그리 많지 않을 것이라 생각하거든요. 자신의 실력이 많이 부족한 것 같아도, 힘들게 완성한 프로그램이라도, 남들과 공유하는 자세를 많이 가져서 관련 생태계에 기여하면 좋겠다고 생각합니다. 어쩌면 이번 세미나도 그런 의도로 진행되고 있는 것이구요!
- 와플스튜디오에서는 어떤 클라우드 플랫폼을 이용하나요?
주로 AWS를 이용하고, 특정 프로젝트에 한해 다른 플랫폼을 이용하기도 하는 것 같습니다. 참고로 저도 AWS에 가장 익숙합니다.
- node나 java로도 서버를 짤 수 있는데 파이썬 짤때의 장점이 있나요??
사실 Python 서버의 장점은, 개발 생산성 측면 외에서는 별로 없을 수 있다고 생각합니다. 어디까지나 상대적으로 굳이 비교하자면의 얘기지만, Python 자체가 속도 가 느린 편이기도 하구요. 많은 분들이 Python에 대해서는 비교적 익숙하다고 설문에 답해주신 것에서 볼 수 있듯, Python 자체가 처음에 접근이 쉽고 개발 생산성 이 높은 편입니다. 그런 점에서 대학생 프로젝트, 프로토타입의 서버 개발, 초창기 스타트업 등에서 많이 채택된다고 생각합니다. 또한 Python은 함수의 parameter와 변수 등의 type을 명시하지 않는 언어(Python 3에서 명시를 굳이 할 수는 있는 다소 부질없는 문법이 추가됨)인데요, 이것이 장점이기도 하지만 또한 잘못된 코드가 에러 없이 실행되어 무서운 결과를 가져오거나, 런타임(실제 동작) 시점에 가서야 발견이 된다는 아쉬운 지점도 많습니다. 또 세미나 중에도 언급드렸듯, Python은 인터프리터 언어이기 때문에 컴파일을 할 필요가 없어서 Django shell 같은 인터페이스도 활용할 수 있고, 코드를 수정했을 때 매번 컴파일 시간을 가지지 않아도 된다는 장점 이 있습니다. 그 때문에 런타임 동작이 비교적 느려지고, 컴파일 때 체크될 수 있는 에러가 체크되지 못한다는 단점도 가지지만요. Django만이 Python으로 서버를 개발하는 유일한 방법은 아닌데요, Flask, SQLAlchemy, Alembic 등의 라이브러리 및 프레임워크를 이용해서도 서버 개발을 할 수 있습니다. 다만 Django가 공식 문서도 워낙 잘 되어있고, 참고할 자료도 많아 처음 서버 개발을 시작하시기에 분명히 좋은 프레임워크라고 말씀드릴 수 있겠습니다. 실제로 ORM이 워낙 잘 되어 있는 부분들도 많구요.
- 와플스듀디오에서 서버비는 어떻게 부담하나요?
이번 학기에는 아직 확정된 것은 없지만 기업의 지원을 받기도 합니다. 이번에 코로나19로 인해 지속적으로 비대면이 유지되면, 여러분이 납부해주신 회비 역시 이후 프로젝트들에서의 인프라 자원 요금으로도 사용될 것 같습니다.
- OOP에 대해서는 어디까지 알면 되나요? python class에 대해 이해하고 있으면 충분한가요?
사실 제대로 된 Python(뿐만 아니라 대부분 언어) 프로그래밍을 하시려면 기본적인 OOP 개념들과 이를 개발할 수 있는 기본적인 경험을 갖추셔야 합니다. 그러나 프로그래밍과 개발은 당연히 끝이 있는 일은 아니기에, 어느 정도 수준이면 된다라고 말씀드리긴 어렵습니다. 확실한 것은 현재 OOP 자체에 대해서 내가 너무 생소하다 싶으면 본격적으로 관련된 개념들을 찾아보시고, 관련 코드를 짜보셔야 한다는 것입니다. 특히 추상화, 캡슐화, 상속, 디형성 정도의 개념에 대해서는 반드시 알아야하고, Python에서 해당 개념이 실제로 어떻게 구현되는지 알아야 한다고 말씀드릴 수 있습니다.
- 웃긴 질문이긴 한데, 영화 보면 나오는 서버실? 은 클라우드 서비스를 제공하는 업체에서 갖고있는 건가요?
그렇습니다. 클라우드 컴퓨팅 서비스를 제공하는 기업들은 아주 거대한 서버실, 데이터센터들을 갖고 있고, 주로 안정과 냉각 등을 위해 지하에 위치시키는 편입니다. 이런 클라우드 컴퓨팅 서비스가 나오기 전에는, 서비스를 운영하는 개인이나 기업이 실제로 물리적인 컴퓨터를 갖추고 있어야 했고, 정전 등의 사고나 갑작스런 사용자 증가 등에 대해서도 더 힘들게 대응해야 했었겠죠. 그러나 요즘에도 연구 기관, 기업들 등에서 서버실을 가지고 있는 경우들도 있는데요. 특히 직접 GPU를 사서 쓰는 경우에 해당 컴퓨터들을 물리적으로 보유하고 있는 경우가 많습니다. 덥고 시끄러운 공간들이 있죠. 제가 일하고 있는 매스프레소에도 R&D 팀에서 사용하는 컴퓨터들이 있는 서버실이 있습니다. 가끔 문제가 생기면 가서 수동으로 뭘 해줄 때도 있습니다.
- cpp로 OOP 공부를 했어도 충분할까요?
네, C++로 OOP 개념을 익히셨다면, 사실 충분하시리라 생각합니다. 그냥 C++에 대응되는 것이 Python 문법으로는 이렇구나, 정도 느끼고 가볍게 경험해보시면 될 것 같네요.
- 혹시 django, mysqlclient 등 버젼 정보 담은 requirements.txt도 따로 올려주시나요? 아니면 토이 프로젝트 이전의 과제까지는 상관없나요?
굉장히 좋은 질문 감사합니다. 일단 0번째 세미나 시작 전에도 이 README.md랑 같은 디렉토리에, 제가 세미나 중에 보여드렸던 waffle_backend 서버를 위해 사용한 라이브러리들이 포함된 requirements.txt를 포함시켰습니다. Python 버전은 3.8.3 을 사용했습니다. 참고로 이런 toy 수준 프로젝트에서는 사실 크게 상관이 없을 수 있지만, 언어와 라이브러리, 프레임워크의 버전 관리에 각별히 신경 쓰시기 바랍니다. 각 프로젝트마다 Python 가상환경을 통해 독립된 환경을 유지하고, 절대 꼬이지 않게 관리해주세요. 이런 부분을 귀찮아서 대충 하면 나중에 반드시 후회할 날이 올 것 입니다. 다른 모든 것에 대해 마찬가지이지만, Windows 역시 Python 가상환경이 가능하지만 Windows임을 감안하여 구글링 하셔야한다는 것 잊지 마세요. 과제 관련해서는 환경에 신경 쓰셔야하는 경우 명시적으로 공지 잘 드리도록 하겠습니다.
- 혹시 vscode 와 pycharm 중에서는 무엇을 더 선호하시나요?
회사에 들어가기 전까지는 Visual Studio Code를 프론트와 백엔드 개발 모두에 있어서 애용했는데, 회사를 다니면서 같은 서버 개발자 분의 설득으로 PyCharm으로 개종하게 되었습니다. 때문에 Python 개발을 할 때에는 최근엔 항상 PyCharm을 쓰고 있구요, Java는 IntelliJ IDEA, 그 외는 VSCode를 사용하고 있습니다. extension 등도 워낙 다양해서 IDE는 그냥 자기가 세팅해서 활용하기 나름이라 취향 차이인 거 같지만, 저는 뭔가 JetBrains의 PyCharm, IntelliJ IDEA, DataGrip 라인업이 마음에 드네요. 좀 무거운 편이긴 한 거 같습니다.
- jupyter notebook을 깔았어도 크게 다른 건 없지요?
일단 저는 Jupyter Notebook으로 서버 개발을 해본 적은 한 번도 없는데요, 다른 점... 어떤 측면에서의 질문인지 모르겠지만 여러 모로 많고 힘들 것 같습니다. 가급적 그러지 말아주세요 ㅜㅜ 일단 구글링을 해봐도 Django를 Jupyter Notebook에서 사용하기 위해 설치하고 해야할 것들을 설명하는 글들이 있네요. 왜 그런 힘든 길을 가시려 하시나요... 그리고 Python과 Jupyter Notebook이 하나의 컴퓨터에 있어도 문제 없습니다. 제가 그렇거든요.
- 백엔드 세미나 인원이 제일 많은데 인기가 제일 많은 이유가 뭐라고 생각하시나요?
일단 서버 특성상, 그 앞은 웹 프론트엔드와 iOS, Android 개발로 다양하게 나뉠 수 있는데, 서버는 여러 서비스에서 공통되게 사용되므로 아무래도 관심 있는 비율이 본질적으로 높을 수 있다고 생각합니다. 또한 Python의 프레임워크를 이용한다는 것도 접근성 문턱 측면에서 낮다고 인식되어(실제로 비교적 쉽다는 것은 아닙니다) 그럴 수도 있다고 생각하구요. 또 다른 개발에 비해 인프라, 데이터사이언스, 머신러닝 등 연구개발 등으로 연결될 수 있는 여지가 좀 더 가까이 있는 편이라 컴퓨터공학 등 다양한 전공자 분들과 여러 진로를 염두에 두고 있는 분들이 선호하는 경향성도 있을 것 같네요.
이번 0번째 세미나에서는 정말 폭넓은 주제를 개괄적으로 빠르게 여러가지 다뤘는데요, 직접 본인이 경험하는 것보다는 제가 설명하는 것에 더 방점이 찍혀 있었습니다. 각자의 실력 차이가 다양해서 오늘 진행한 내용이 상당히 쉽다, 라고 느낀 분들도 있으실텐데요. 만약 본인이 그렇게 느끼지 않았다면, 제가 드릴 과제 등과 별개로, 상당한 시간 투자를 해주시기 바랍니다. 학기가 시작해 학교를 다니실 예정이라면 바로 지금부터, 최대한 시간 투자를 해두는 것이 좋습니다. 언택트의 시대인데 이만큼 집에 콕 박혀 컴퓨터만 하기 좋은 시기도 없는 걸요 🤪 세미나 자체는 시간상 한계가 크므로, 경우에 따라 다르겠으나 가급적 세미나 시간에 직접 실습을 진행하는 시간은 가급적 가지지 않으려고 합니다. 인원도 많고, 일일이 구체적인 문제 상황에 대해 모두를 대응해주며 나아갈 수는 없으니까요. 때문에 세미나 때는 제가 주로 내용을 전달 하고, 상시적으로 과제와 개인 개발들을 통해 소통하고자 합니다. 애초에 프로그래밍과 개발 공부는 매우 정직하게 본인이 시간을 투자하고 고민한 만큼 결실이 나타나는 편이라, 스스로 투자를 하지 않고 세미나만 열심히 한다면 전혀 도움이 되지 않을 것임을 기억해주세요! 이제부터는 본격적으로 속도를 내보도록 하겠습니다! 세미나 준비와 과제 고민, 질문 답변에도 상당한 시간이 듭니다. 당연히 저보다는 시간을 많이 투자하셔야 한다는 생각으로 우리 같이 열심히 해봐요~
- assignment.md 참고.
- due: 2020.09.04.(금) 23:59
Backend 세미나를 진행해나가는 과정에서 feedback 주시면 지속적으로 참고하도록 하겠습니다. 물론 익명이고, 여러 번 남겨주실 수도 있습니다. < 참여하러 가기 >