본문 바로가기

활동/SK네트웍스 Family AI 캠프 2기

SK네트웍스 Family AI 캠프 2기 : 18th week (9월 2주차)

이번에는 주간 끝자락에 추석 연휴가 몰려 있어서 잠시 숨 돌릴 틈이 생겼어요!

부족한 부분을 재정비할 시간이 생겨서 기쁩니다 ^_^

마지막 미니 프로젝트를 진행하면서 부족하다고 느꼈던 부분들을 열심히 보충해야겠어요.

 

다들 풍성한 한가위 보내시고 행복한 연휴 보내시길 바라요!

저도 잠시 숨 돌리면서 다음 단계를 위해 미리 준비해야겠습니다.

 

달은 아니지만... 달처럼 환하게 빛나는 미러볼 아래에서 춤추는 펭귄들처럼...^^ 즐겁고 행복한 추석 연휴 보내세요~~!~!

 

 

● 성취

이번 주간에는 마지막 미니 프로젝트에 참여했습니다.

팀 리더 입장에서 미니 프로젝트를 안정적으로 마무리지었다는 점이 가장 큰 성취라고 생각합니다!

 

마지막 미니 프로젝트 조는 최종 프로젝트까지 이어지기 때문에 팀원들을 탐색하기에 좋은 기회라 생각했어요.

함께 할 팀원들 성향을 알아야 프로젝트 진행 시에 훨씬 수월하기 때문이죠!

 

각각의 팀원들이 어떤 것을 잘하는지, 어떤 부분이 약한지, 어떤 진로를 희망하는지를 알고 있어야 협업할 때 시너지를 낼 수 있더라구요.  

 

시간 등의 자원이 충분할 때는 팀원 희망 진로 위주로 업무를 배치하고, 자원이 부족할 때에는 장/단점 위주로 업무를 배치함으로써 서로 윈윈하는 구조로 프로젝트를 진행하는 편이거든요.

 

이번 미니 프로젝트에서는 큰 주제로 'django 웹 프레임워크 기반의 RAG 시스템 구현'을 지정받았습니다.

세부 주제는 각 팀의 재량에 맡기셨어요.

 

저희 팀은 SK네트웍스 계열사 중 하나인 '워커힐 호텔'의 리워즈 멤버십 약관에 영감을 받아서 프로젝트를 진행했습니다. 

세부 프로젝트 주제는 '워커힐 리워즈 멤버십 Q&A 챗봇 서비스'로 귀결되었습니다.

 

주변에서 걱정을 많이 했던 팀에 배정받았던 터라 초반에 걱정이 많았는데, 프로젝트를 시작하니까 불안감이 눈 녹듯이 사라졌어요.

 

프로젝트 이해도가 높고 행동이 빠른 유빈이, 기획 및 문서 작업에 능한 영재 오빠, Java 백엔드 개발 경험이 있는 인교 언니, 레이아웃 및 색상 배치 감각이 있는 서연 언니 덕분에 프로젝트를 안정적으로 끝낼 수 있었습니다!

 

우리 팀원분들... 앞으로 있을 최종 프로젝트에서도 잘 부탁드리겠습니다!

저도 끝까지 열심히 임해보겠습니다~!

 

 

● 학습 & 개선

이번 주간에는 최종 프로젝트에서 결과물 배포 시 사용하게 될 기술 위주로 배웠습니다.

대표적으로 AWS, Docker, Kubernetes 등이 있었어요.

 

기억을 오래 보존하기 위해 간략하게나마 정리해보겠습니다!

 

# AWS (Amazon Web Services)

이전에는 웹 서비스를 하기 위해서 물리적 서버가 필요했어요.

하지만 몇 년 전부터 클라우드 서버가 부상하기 시작했습니다.

 

클라우드 서버가 등장하면서 물리적 서버가 없는 사람들도 쉽게 웹 서비스를 할 수 있게 되었어요.

그 덕분에 소규모 창업가들도 웹 서비스를 손 쉽게 시작할 수 있게 되었답니다!

스타트업 지원 프로그램을 보면 AWS 비용 지원이 리스트에 적혀 있는 경우가 많은데 다 이유가 있는 것이더라구요.

 

AWS에는 다양한 서비스들이 존재하지만, 그 중 대표적인 서비스 4가지만 뽑아보면 아래와 같아요.

  • EC2 : 해당 서비스를 통해 가상 머신을 필요한 만큼 빌려서 사용할 수 있어요.
  • S3 : 해당 서비스를 통해 정적 파일(사진, 비디오, 문서, 프론트엔드 코드 등)을 저장할 수 있어요.
  • RDS : 해당 서비스를 통해 RDB를 관리할 수 있어요. MySQL, PostgreSQL 등을 사용할 수 있답니다.
  • VPC : 해당 서비스를 통해 가상 네트워크를 설정함으로써 서버와 데이터를 안전하게 관리할 수 있어요.

더 많은 AWS 서비스를 알아보고 싶으시면 아래 링크를 참고해 주세요!

👉 AWS 서비스 :

https://aws.amazon.com/ko/products/?aws-products-all.sort-by=item.additionalFields.productNameLowercase&aws-products-all.sort-order=asc&awsf.re%3AInvent=*all&awsf.Free%20Tier%20Type=*all&awsf.tech-category=*all

 

AWS 서비스를 사용하면 필요한 만큼 자원을 조절함으로써 유연하게 사용할 수 있어요.

 

하지만... 관리를 하지 않는 경우에는... 요금이 유연하게 늘어날 수도 있으니 조심해야 합니다...^^

따라서 AWS를 사용하는 경우에는 보안을 철저히 신경써야 해요.

특히 GitHub 등의 외부 사이트에 코드를 업로드할 때 api-key를 유출하지 않았는지 꼭 확인해야 합니다!

 

 

# Docker

 

Docker의 상징은 위 그림과 같습니다.

컨테이너를 운반하는 고래가 아주 귀엽게 생겼죠?

 

IT에서는 종종 바다와 관련된 비유를 사용합니다.

대표적으로 포트(port)가 있겠네요.

 

Docker는 영어로 부두 노동자를 의미합니다.

그림과 연결 지어서 생각해 볼까요?

저는 '컨테이너를 옮기는 부두 노동자 고래씨'라고 이해했어요.

 

그러면 컨테이너는 어떤 역할을 할까요?

 

Docker의 컨테이너는 개발 환경 구축을 편리하게 만들어 주는 역할을 합니다.

도커의 컨테이너 이미지 기능을 사용하면 내 개발 환경을 다른 사람에게 편하게 전달할 수 있어요.

반대로 다른 사람 개발 환경도 편리하게 구축할 수 있답니다.

 

사람들에게 '개발자' 이미지에 대해 질문하면 코드 작성하는 모습 위주로 떠올리곤 합니다.

그러나 개발자들은 모두 알고 있는 사실이 하나 있습니다.

코드 작성보다 더 까다롭게 느껴지기도 하는 작업이 바로 '개발 환경 구축'이라는 것을요...!

 

프로젝트를 동시에 여러 개 하다 보면 프로그램끼리 충돌하는 경우를 종종 볼 수 있습니다.

그런 케이스를 방지하기 위해 VirtualBox로 여러 가상머신을 만들기도 하지만... 역시나 무겁습니다!

왜냐하면 각각의 가상머신에 게스트OS를 할당해서 그 위에 프로그램을 설치하는 방식이거든요.

 

그러나 Docker를 사용하면, 하나의 OS 커널 위에 여러 개의 컨테이너를 실행함으로써 프로그램 사이의 충돌을 방지해 줄 수 있습니다.

즉, 여러 개의 가상머신을 관리하는 것보다 훨씬 가벼운 '컨테이너' 형태로 실행 환경을 격리하는 것이라 볼 수 있는 것이지요.

 

클라우드 서버(AWS 등) 기반 프로젝트에서도 많이 쓰이는 기술 중 하나라 중요합니다!

 

 

# 쿠버네티스 (Kubernetes)

 

 

Kubernetes는 그리스어로 '항해사(조타수)'라는 뜻을 갖고 있습니다.

로고도 이를 나타내 듯이 배 조종키 모양을 하고 있네요.

 

Kubernetes는 과연 어떤 역할을 수행하기에 이런 로고와 이름을 갖게 된 걸까요?

 

앞에서 Docker를 다루면서 컨테이너에 대해 언급했습니다.

한 개의 컨테이너만 있을 때는 관리가 쉽지만, 컨테이너가 늘어나면 관리 난이도 역시 올라갑니다.

Kubernetes는 이런 케이스를 위해 사용합니다.

 

사실 저는 모든 비즈니스는 항해와 비슷하다고 생각합니다.

항해 시에 폭풍이 몰아쳐서 바다가 험해질 때도 있지만, 태양이 쨍쨍한 탓에 바람 한 점 없이 잔잔할 때도 있습니다.

따라서 컨테이너도 날씨를 고려하면서 관리해야겠지요?

비즈니스 서버 운영도 마찬가지에요.

어떤 날에는 트래픽이 몰리기도 하지만, 어떤 날에는 트래픽이 잠잠하기도 합니다.

Kubernetes는 트래픽이 많아지게 되면 자동 확장 및 관리해주는 역할을 수행해요.

그리고 오류가 발생한 컨테이너가 있으면 다시 실행시키는 역할도 담당한답니다!

 

 이렇게 생각하니까 항해사라는 이름 뜻이 납득 가더라구요!!

즉, 쿠버네티스는 컨테이너들을 대규모로 배포하고 관리하는 역할을 편하게 돕는 도구라고 이해할 수 있습니다.

 

● 개선

이번 주간에는 Django 프레임워크와 웹 개발 관련된 내용 위주로 복습을 진행했습니다.

처음에는 어려웠는데 점점 익숙해지는 듯한 느낌이 듭니다!

좀 더 친숙해지도록 많이 노력해야겠어요....^^

 

# MVT 패턴

웹 프로그래밍에서는 '디자인 패턴'이라는 것이 있습니다.

'디자인 패턴'은 효율적인 웹 개발을 위해 선배 개발자가 남긴 족보라고 생각해도 무방합니다.

 

가장 많이 알려진 디자인 패턴으로는 MVC(Model-View-Controller)이 있습니다.

이 패턴은 전자정부 프레임워크 프로젝트에서 많이 사용하는 Spring 등에서 자주 쓰여요.

여기서 Model은 DB로부터 CRUD(Create, Read, Update, Delete) 작업을 수행하고, View는 사용자에게 보여주는 화면을 구성하고, Controller는 데이터를 처리하는 논리적 작업을 수행합니다.

 

그렇다면 Django에서는 어떤 패턴을 많이 사용할까요?

바로 MVT(Model-View-Template) 패턴입니다!

MVT 패턴에서 View는 위에서 소개한 Controller와 유사하고, Template는 View와 비슷합니다.

 

 

그림으로 MVT 패턴을 표현하면 위와 같습니다.

이 패턴을 사용하면 Django 웹 개발을 효율적으로 진행할 수 있습니다!

왜냐하면 대부분의 Django 예제가 MVT 패턴을 따르거든요!

 

 

# GET & POST

GET과 POST를 이해하기 전에 앞서 HTTP(HyperText Transfer Protocol)를 이해하고 있어야 합니다.

HTTP는 웹 브라우저와 서버가 서로 통신하기 위해 사전에 약속한 방식입니다.

 

HTTP 요청 방식에는 여러가지가 있지만, 그 중 가장 대표적인 것이 GET과 POST입니다.

 

• GET

GET은 서버에서 데이터를 가져오기 위해 사용하는 HTTP 요청 방식으로, URL에 데이터를 포함해 전송합니다. 

 

위 사진은 구글에 '추석'을 검색한 모습입니다.

사진 속 링크를 잘 보시면 q=추석 등의 글귀가 적혀 있는 것을 볼 수 있습니다.

이런 형태를 가진 링크는 GET 요청의 결과물이라고 생각할 수 있어요!

 

GET 요청의 특징 중 캐시가 가능하기 때문에, 나중에 같은 요청이 들어오면 서버 통신 없이 빠르게 캐시된 결과를 보여줄 수 있습니다.

 

그러나 URL에 데이터를 포함하기 때문에, 전송 가능한 데이터 길이가 제한적이고 POST에 비해 보안이 더 취약하기 때문에 주의해야 합니다.

 

 • POST

POST는 서버에 데이터를 보내고 처리해 달라는 내용의 HTTP 요청 방식입니다.

회원 가입, 리뷰글 작성, 파일 업로드 작업 등에서 주로 사용됩니다!

 

POST는 데이터를 HTTP 본문에 해당하는 body에 담아서 전송하기 때문에, GET 방식보다는 보안 면에서 더 탄탄합니다.

물론 전송하려는 데이터에 암호화를 하지 않으면, 개발자 도구/와이어샤크(Wireshark) 등의 도구를 사용해서 내용물을 볼 수 있기 때문에 주의해야 합니다!

그래서 많은 개발자들이 암호화 때문에 HTTP 아닌 HTTPS를 권장하는 것입니다.

HTTPS는 HTTP에 Secure(보안)을 강화시킨 버전의 프로토콜로, 암호화 기능이 포함되어 있거든요. 

 

그리고 GET 요청과는 다르게 데이터 전송 시에 길이 제한이 없을 뿐만 아니라, 캐싱 기능도 지원하지 않는답니다! 

 

• GET & POST 특징 요약 및 비교

특징 GET POST
목적 데이터 조회 (읽기) 데이터 전송 및 처리 (쓰기)
데이터 전송 방식 URL에 쿼리 문자열 포함 HTTP 요청 본문에 포함
캐싱 기능 O (브라우저 캐시) X
데이터 길이 제한 O X
보안 보안 취약 HTTPS와 함께 사용 시 비교적 안전
+) 물론 이 방법이 항상 철통 보안은 아님!

 

 

# CSRF 

Django 코드를 작성하다 보면 {% csrf_token %}이라는 태그를 볼 수 있습니다.

이 코드는 왜 사용되는 것이며, CSRF는 무슨 뜻을 의미할까요?

 

먼저 CSRF에 대해 알아보겠습니다.

CSRF는 Cross Site Request Forgery의 줄임말로, 사이트 간 요청 위조를 의미해요.

외부인이 사용자를 속여서 웹 사이트에 원하지 않는 요청을 보내는 공격 방식이 여기에 해당해요.

 

개발자가 설계한 POST 방식과 다른 의도로 POST 요청을 보내는 것도 CSRF에 해당한다고 볼 수 있습니다.

유해한 POST 요청을 보냄으로써 DB 및 시스템에 치명적인 손상을 입힐 수도 있으니 조심하는 게 좋겠지요...?

금융 DB 등 보안이 중요한 분야에 이런 공격이 들어올 생각을 하니... 상상만으로도 아찔하네요...^^;;

 

Django 프레임워크에서는 CSRF 공격을 방지하기 위해 'csrf_token'이라는 기능을 제공합니다.

해당 기능을 사용하면 서버에 요청 받을 때마다 Django가 세션을 통해 CSRF 토큰 값을  발행한 후, 웹 페이지에 토큰 값을 전송합니다.

여기서 발행한 토큰 값은 신분을 대조하는 용도로 사용해요.

외부인이 공격 용도로 POST 요청을 보냈을 때, 토큰 값 내용도 함께 확인함으로써 신분 검사를 하거든요.

따라서 csrf_token은 일종의 신분 검사증과 비슷한 역할을 한다고 이해하시면 좋을 것 같습니다! 

 

Django 웹 프레임워크를 사용하면 비교적 쉽게 csrf_token 기능을 사용할 수 있답니다!

직접 하나하나 구현하는 것보다 확실히 편하겠죠?

바로 이런 점 때문에 프레임워크를 사용하는 것이랍니다.

 

 

추석 연휴에 마냥 놀고 싶은 마음을 꾸욱 참고... 블로그 포스팅을 끝까지 작성하니까 확실히 뿌듯하네요! 

이제 남은 시간 동안 최종 프로젝트를 위해 체력 관리를 좀 해야겠어요.

 

끝까지 화이팅하겠습니다~~!!

 

+) 부족한 부분이 있으면 댓글로 말씀해 주세요! 겸허한 마음으로 더 공부하겠습니다.