블로그

일프로

[쿠버네티스] 컨테이너 한방 정리 #3

 기술의 흐름으로 이해하는 컨테이너- 이미지 참고 : 쿠버네티스 어나더 클래스 (https://inf.run/Acobj) 쿠버네티스는 이제 [컨테이너]랑 [가상화] 그리고 [데브옵스]속에 깊숙히 자리잡고 있습니다. 그래서 이 세 가지를 알아야 쿠버네티스를 더 잘 알 수 있게 되는데, 이 단어들은 정말 큰 개념이라서 그냥 용어 설명으로는 이해하기 힘들어요. 그래서 기술에 전반적인 배경을 이해하는 게 중요하다고 생각합니다.그래서 이번 강의는 [컨테이너 한방 정리]로, 쿠버네티스를 잘 이해하기 위해컨테이너를 중심으로한 여러 배경 흐름 들을 이야기 해요. 1. Linux OS 흐름컨테이너를 잘 알기 위해서는 Linux에 대해서 먼저 알 필요가 있습니다.최초에 OS로 unix가 있었고,  한참 시간이 지나고 linux가 나왔어요. 그리고 이 linux를 기반으로 현재까지도 엄청 많은 배포판들이 만들어지고 있습니다.하지만, 다행이도 우리는 이 두 가지 배포판만 알고 있어도 충분해요.debian이랑 redhat 계열인데, debian linux는 커뮤니티용이라고 해서 무료고요. redhat linux는 redhat 이라는 기업에서 만들었고, 유료에요.쿠버네티스를 설치할 때도 이렇게 이 두가지 배포판을 기준으로 설치 가이드를 제공합니다. 데비안과 레드햇 계열에 대한 자세한 얘기는 강의 중에 설명드리고, 여기선 기업용으로 쓰는 redhat에 대해 좀 얘기를 해볼께요. redhat에서 linux 배포판이 만들어지는 순서가 있어요. 최초에는 fedora linux라고 해서 새로운 기능을 개발하는 버전이 있고, 이건 무료고요. 이 기능들이 안정화되면 redhat linux로 이름을 바꿔서 릴리즈를 합니다. 기업은 이걸 설치하면 유지보수 비용을 내야되는 유료 버전이고, redhat enterprise linux 앞자만 따서 RHEL, 렐 이라고도 통상 불러요. 그래서 이걸로 기업들이 설치를 하면 유지보수 비용을 내야 되는 유료 버전 이고, 그리고 이걸 복사해서 만든 게 centOS 배포판 이예요. rhel이랑 똑같이 안정화 버전인데, 무료로 쓸 수 있습니다.기업에서는 주로 redhat 계열을 많이 쓰고, 특히 centOS의 점유율이 높은데 centOS 8은 2021년에 지원을 종료 했고, centOS 7은 2024년도에 지원이 종료가 되거든요. 이 centOS가 종료되는 배경을 좀 말씀을 드리면 시장 점유율이 ubuntu가 압도적이고. 다음은 centOS랑 debian이 2, 3위를 왔다갔다 해요. redhat은 2%지만, 이 수치가 그래도 기업 배포판 중에 1위고요. 이 1위가 된 배경에는 사람들한테 centOS를 무료로 쓰게 해주면서 자연스럽게 redhat을 선택하게 하는 그런 전략이 있었거든요. 근데 현재 redhat은 IBM에 인수가 된 상태예요. 그리고 IBM의 새로운 전략은 centOS에 점유율을 rhel로 당기려는거 같아요.왜나하면 현재 redhat 배포판을 만드는 순서가 이렇게 변경됐거든요.처음엔 마찬가지로 fedora를 통해서 기능 개발을 하고, centOS대신 centOS Stream이라고해서 이 기능들을 테스트하는 배포판이 생겼어요. 테스트 배포판(테스트베드)이라고 생각을 하면 되는데 여전히 무료지만, 이 배포판에서는 바이너리 호환성 보장 안될 수 있다는 얘기를 해요. 무슨 내용인지 몰라도 이제 쓰면 안되나 싶은 생각이 들죠?그리고 테스트 과정이 끝나면, 안정화 버전인 Redhat Linux가 됩니다. 이렇게 배포판을 만드는 프로세스가 바꿨어요. 그래서 기존에 centOS를 쓰던 기업들은 앞으로 고민을 좀 해봐야 되는 게 지금 상황이고요. 아래와 같이 4가지 방법이 있는데 아래와 같습니다.이렇게 4가지 선택지 중에 전 4번을 선택을 했고, 이 강의에 실습 환경으로 사용이 되요. 저도 어떤 linux를 선택할까 고민을 많이 했는데, 1, 2번은 기업의 상황이라 제외를 하고, 타 OS로 ubuntu를 고민을 하다가 그래도 제가 가장 오래 사용을 했고, 문제가 생겼을 때 잘 가이드를 해드릴 수 있어야 하니까 4번, 새로운 복제본을 선택을 했습니다.그리고 AlmaLinux와 RockyLinux 중에서 Rocky Linux를 선택한 이유는 아래와 같아요.구글 트렌드에서 키워드 검색량 확인 (link)CentOS 공동설립자 중 한명 만들었음 (link)클라우드 서비스에서 VM 생성을 Rocky Linux로 하는 사례들 확인Github Watch/Fork/Start 비교 (rocky link), (alma link)  2. Container 흐름자, 이제 컨테이너에 대해서 얘기를 해 볼꺼예요. 지금까지 봐듯이 linux는 꾸준히 발전을 했고, 내부적으로도 많은 코어 기술들이 개발이 됐는데 그중 하나가 격리 기술이예요.chroot라고 해서 사용자 격리를 시작으로 파일이나 네트워크를 분리하는 기술들이 만들어 졌고요. 한참 지난 후에 cgroup이라고해서 각각에 App마다 cpu나 memory를 할당을 할 수 있게 됐어요. namespace는 보통 App 하나가 하나의 프로세스를 차지하거든요. 이 프로세스를 격리 시켜주는 기술이 만들어 지면서 우리는 이제 각각의 App을 소위 말하는 [독립적인 환경]에서 실행을 시킬 수 있게 됩니다.그리고 다음으로 이 기술들을 집약해서 정리한게 LXC라고 해서 linux container에 줄임말 이예요. 이 컨테이너의 어머니이자, 최초의 컨테이너죠. 그리고 이 기술을 기반으로 만들어진 이번엔 컨테이너에 대명사죠. Docker, 요즘은 위세가 많이 죽긴 했어요. 이전까지 컨테이너 기술은 저 같은 평범한 개발자들이 쓰기엔 좀 어려웠다면 docker는 이걸 누구나 쓰기 쉬운 형태로 만들었습니다. 요즘 잘 정리된 블로그 몇 개만 봐도 대강 이해해서 내 OS에 컨테이너를 띄울 수 있죠.docker가 나오고 rkt라고 rocket이라는 컨테이너가 나와요. docker가 보안에 안 좋은 점이 좀 있는데, 이 부분을 공략을 하면서 더 안정적인 컨테이너를 강조를 했고 실제 docker보다 성능도 더 좋다고 해요. docker가 보안에 안 좋은 점은 root권한으로 설치하고 실행을 해야 되기 때문인데, 현재는 rootless 설치 모드가 생겨서 보안이 강화가 됐습니다.한편 쿠버네티스는 점점 표준으로 정착이 되고 있고, 현재는 컨테이너간의 싸움 중입니다. 초반에 docker가 보안에 약하다는 것 까지는 사실 docker 대세에 크게 문제가 없었거든요. 시간이 지나면 충분히 보완 될꺼라는 기대도 있었고 실제로 보완이 됐죠. 근데 docker 위세가 조금씩 꺽이기 시작한 이유가 뭐냐면, 쿠버네티스에서 docker가 빠진 다는 얘기가 계속 있었어서 그래요. 그 이유는 docker가 쿠버네티스와 인터페이스가 잘 안 맞아서 그렇거든요. 물론 처음엔 docker를 메인으로 쿠버네티스가 만들어졌죠. 근데 쿠버네티스가 표준화가 될 수록 docker가 걸림돌이 되고 있는 상황이예요. 이제 누가 쿠버네티스랑 호환성이 좋은지가 컨테이너를 선택하는 중요한 결정요소가 됐습니다.그 이후에 나온 대표적인 컨테이너가 containerd랑 cri-o고요. containerd는 docker에서 컨테이너를 만들어주는 기능이 분리된 거예요. docker가 설치할 땐 간단해 보여도 엄청 많은 기능들이 녹아진 엔진이거든요. 그 큰 엔진에서 containerd 프로젝트만 분리 되서 나왔고 CNCF에 기부 됩니다. 번외로, docker는 현재 mirantis라는 회사에 인수된 상태예요. docker를 정말 많이 쓰지만 기술 투자 대비해서 수익이 큰 편은 아니었던 거 같아요. 그래서 mirantis라는 회사에 인수가 됐고 이 mirantis는 openstack 프로젝트를 하고 있는 회사 거든요. 이 openstack이 뭐냐면, kubernetes 이전에, 가상화에 대세라고 하긴 좀 그렇고, 가장 큰 가능성으로 가상화 시장을 선도한게 openstack 이예요. 저도 개인적으로 한 3년 정도 openstack 관련된 일을 했었고, 그래서 다음 가상화를 설명하는 강의에서 최대한 재미있게 얘기를 해 드릴께요. 여튼 docker가 mirantis에 인수된 이후부터 이 kubernetes 인터페이스를 잘 맞추려고 하고 있기 때문에 쿠버네티스에서 docker는 빠지진 않게 됩니다. 3. Container Orchestration과 Container 흐름강의 영상에서 컨테이너 오케스트레이션(쿠버네티스)과 컨테이너(컨테이너 런타임) 간에 한 단계 더 깊은 흐름을 이야기 합니다.가장 핵심은 쿠버네티스의 kubelet 변화와 그리고 이에 따른 컨테이너 런타임들 간의 흐름이예요. 바로 CRI가 어떤 배경에서 만들어졌고, 쿠버네티스 버전이 올라가면서 CRI가 어떤 방향으로 바뀌는지, 그리고 그에 따른 컨테이너 런타임들 간의 변화를 설명 드립니다. 그리고 컨테이너에서 절대 빼놓으면 안되는 OCI가 있습니다. 컨테이너 표준인데, 컨테이너 런타임들은 이걸 잘 지키고 있기 때문에, 우리는 런타임을 바꾸더라도 기존에 만들었던 이미지를 그대로 사용할 수 있어요  블로그는 여기까지고요. 강의가 오픈 되면 링크 걸어 놓을께요.좋은 하루되세요!  해당 블로그는 [쿠버네티스 어나더 클래스] 강의에 일부 내용입니다. 많은 관심 부탁 드려요!강의 링크 :https://inf.run/Acobj 좋아요 ​♡는 저에게 큰 힘이 됩니다 :) 

데브옵스 · 인프라인프런쿠버네티스어나더클래스지상편일프로kubernetesdevopskubeopscontainer컨테이너한방정리

김정환

웹이 우리를 기억하는 방법, 쿠키

웹사이트는 생각보다 우리를 잘 기억합니다. 어제 장바구니에 담아둔 상품이 그대로 남아 있거나, 며칠 전 로그인했던 상태가 여전히 유지되는 것을 경험해 보셨을 거에요. 하지만 원래 인터넷을 이루는 HTTP는 이런 기억력이 없습니다. 무상태(stateless), "기억하지 못하는" 특성을 지니고 있기 때문이에요. HTTP의 무상태성클라이언트가 서버에 요청을 보낸 뒤에 다시 요청을 보내도, 서버는 같은 사용자인지 전혀 알 수 없습니다. 요청 메시지 안에 클라이언를 식별할 정보가 없으니까요.무상태성 덕분에 서버는 비교적 단순하게 동작할 수 있고, 여러 대의 서버로 쉽게 확장할 수 있습니다. 요청 하나하나가 독립적이므로 어느 서버가 응답하든 상관없기 때문이죠.하지만 현실의 웹 애플리케이션은 사용자를 기억해야 할 필요가 많습니다."다시 방문한 사용자"를 식별해야 하고,로그인 상태를 유지해야 하며,사용자가 담아둔 장바구니 물건도 알고 있어야합니다. 여기서 탄생한 것이 바로 쿠키(cookie)입니다. 탄생 배경쿠키라는 개념은 1990년대 초반, 온라인 쇼핑 카트 기능을 구현하기 위해 고안되었습니다. 당시 네스케이스 개발자가 제안한 방식이 그 시초입니다. 사이트 재 방문 확인 기능이 이를 활용한 첫 사례라고 합니다.재밌는 점은 유닉스 세계에 이미 비슷한 개념이 있었다는 것입니다. 특정한 값을 건네주고 나중에 돌려받는 방식이었는데, 이를 매직 쿠키(magic cookie)라고 불렀습니다. 마치 놀이공원 입구에서 손목에 도장을 찍어주는 것과 같죠. 기본 동작핵심은 단순합니다. 서버와 브라우져가 상태를 주고 받을 수 있도록 HTTP 헤더를 활용하는 것입니다.서버 응답: 서버는 브라우져에게 특정 값을 기억하라고 응답 헤더를 통해 지시합니다. (일종의 도장)브라우져 저장: 브라우져는 이를 쿠키 저장소에 기록합니다. (도장을 손목에 찍음)브라우져 요청: 이후 자동으로 쿠키를 요청 헤더에 실어 보냅니다. (재입장할 때 도장을 보여줌)서버는 이 값을 확인하고 "다시 방문한 사용자"라고 판단할 수 있습니다. 속성쿠키는 단순한 문자열 이상의 기능을 제공합니다.Domain: 어떤 도메인에 이 쿠키를 보낼지 제한합니다. (예: example.com에 설정된 쿠키를 sub.example.com에서도 쓸 수 있음)Path: 특정 경로에서만 쿠키가 전송되도록 제한합니다. (예: /shop에 설정된 쿠키를 /blog 요청에는 미설정 할 수 있음)Max-Age / Expires: 쿠키의 수명을 정합니다. 세션 쿠키(브라우져 종료 시 삭제)와 영속 쿠키(일정 기간 유지)로 나뉘게 되죠.Secure: HTTPS 요청에만 쿠키를 전송하도록 제한합니다. (암호화되지 않은 HTTP에서 숨기기 위한 안전장치)HttpOnly: 자바스크립트 코드에서 쿠키를 읽지 못하게 합니다. (크로스사이트 스크립트(XSS) 공격으로부터 세션 쿠키를 보호)이러한 속성 덕분에 쿠키는 단순한 "메모장"을 넘어 범위, 유효기간, 보안 등을 정밀하게 제어할 수 있답니다. 활용 사례우리는 웹에서는 쿠키를 매우 다양한 방식으로 사용할 수 있습니다.로그인 세션 유지: 사용자가 아이디와 비밀번호로 로그인하면, 서버는 세션을 만들고 세션 ID를 쿠키로 응답합니다. 이후 요청마다 이 세션 ID가 서버로 함께 전송되어 로그인 상태를 유지할 수 있습니다.개인화된 서비스: 사용자가 선호하는 언어, 최근 본 상품 목록 등을 쿠키에 기록해 두고, 다음 방문 때 동일한 환경을 제공할 수 있습니다.광고 트래킹: 광고 네트워크는 쿠키를 활용해 사용자의 웹 활동을 추적하고 맞춤형 광고를 제공합니다. 한계와 대안물론 단점도 있습니다.용량이 제한적입니다. (보통 하나의 쿠키는 4KB, 도메인별 20개 정도 제한)매 요청마다 자동으로 전송되므로 네트워크 트래픽이 늘어납니다.보안에 민감한 값은 쿠키에 저장하지 않아야 합니다. (예: 개인정보)쿠키 대안으로 세션 스토리지, 로컬 스토리지, 토큰 기반 인증(JWT) 등이 사용됩니다. 하지만 여전히 "서버와 클라이언트 간의 신뢰할 수 있는 연결 고리"로써 쿠키는 가장 클래식하고 널리 쓰이는 방식입니다. 결론쿠키는 단순히 브라우져 저장소 중 하나가 아닙니다. HTTP라는 무상태 프로토콜 위에서 "사용자를 기억하기" 위해 탄생한 역사적 맥락과, 서버와 클라이언트가 헤더를 주고받는 과정 속에서 이해할 때 비로소 제대로 된 그림이 보일 것입니다.이 글은 제가 준비한 강의 「웹 개발의 핵심, HTTP 완벽 가이드」 의 2편을 바탕으로 작성하였습니다. 쿠키에 국한되지 않고, HTTP의 기본 구조부터 브라우저 동작 원리, AJAX, 보안, 성능까지 폭넓게 다루고 있습니다. 조금 더 깊이 있는 내용을 원하신다면 강의와 함께 따라오셔도 좋습니다.이 강의에서 다루는 내용1편. HTTP 기본2편. 브라우져3편. AJAX4편. 추가 프로토콜5편. 보안6편. 성능 

웹 개발HTTP네트워크쿠키

6학년 마지막 프로젝트를 도와주세요!!!

안녕하세요, 저는 초등학교 6학년 여학생입니다.저는 IB PYP 교육과정을 학교에서 배우고 있습니다. 9월 26일, 저희는 친구들(2명)과 함께 저희 스스로 모든 탐구과정을 끝내야 합니다. 그리고 저희는 200명의 교사분들이 보러 와주시는 전시회를 진행합니다.하지만 그 전에 저희는 연극을 해야하고 저희는 마지막 단계를 맡았습니다. 다른 아이들은 벌써 대본을 다 써가는데 저희 팀은 그 단계까지 가지 못해 대본을 쓰지 못했습니다. 저희의 마지막 단계는 action 실행하기 입니다. 앞에서의 모든 탐구과정을 실천하는 단계이죠. 그래서 저희는 최대한 빨리 action을 정했고 이제 실행하는 일만 남았습니다.제가 부탁드릴 일은, 간단한 설문조사입니다.아래 문항을 보고 답을 남겨주신다면 정말 감사하겠습니다.Q. 어떤 반려동물 키우고 그 반려동물의 종은 무엇인가요?(예: 강아지, 말티즈)Q. 반려동물이 요즘 기후위기(날씨등) 때문에 힘들어하거나 아픈 경험이 있으신가요?(예: 날씨가 더워 강아지가 열사병에 걸렸다.)그리고.... 염치없지만 한가지 부탁을 더 드릴 것이 있습니다.저희는 버려지는 반려동물, 기후위기 때문에 힘든 반려동물을 위해 키링을 만들어 팔고 그 돈으로 기부를 하고 싶습니다.저희가 키링을 잘 만들지는 못했지만 기부하는 마음으로 동참해 주신다면 너무나도 감사하겠습니다.키링은 하나에 2000원입니다. 어쩌면, 6학년의 가장 큰 행사이자 마지막 프로젝트인 저희의 전시회를 도와주세요!(키링 사진은 답글로 보내드릴게요!!! 인스타 계정도 알려드릴테니 거기서 구매해주세요! ><)

김정환

새로고침 없는 웹, Fetch(AJAX)

인터넷 초창기 웹페이지는 단순했습니다. 버튼을 클릭하거나 폼을 입력하면, 브라우져는 페이지 전체를 새로 불러와 다음 화면을 보여줍니다. 로그인이나 댓글을 작성 할 때마다 화면이 깜박이던 시절이었죠.오늘날 웹서비스는 다릅니다. 메신저, 지도, 쇼핑몰, 은행 앱까지.화면을 깜박이지 않고도 매끄럽게 데이터가 오고 가는데요. 이런 경험을 가능케 만든 핵심 기술이 바로 AJAX(Asynchronous JavaScript and XML)입니다. 폼 요청폼(form) 태그를 통한 전통적인 데이터 전송 방식을 생각해 볼까요.사용자가 값을 입력하고 제출 버튼을 누르면브라우져는 페이지 전체를 지우고 새로운 요청을 보냅니다.서버가 응답을 보내면 브라우져는 다시 전체 페이지를 그립니다. 이 방식은 단순하지만 그만큼 느립니다. 작은 동작 하나에도 전체 화면을 갈아엎는 구조이기 때문이에요. AJAX의 등장화면은 그대로 두고 데이터만 주고 받을 수 있다면 어떨까요? 필요한 부분만 바꾸어 훨씬 매끄러운 사용감을 제공할 수 있을 겁니다.이런 방식을 가능하게 해주는 것이 바로 AJAX입니다.Asynchronous: 페이지 전체를 동시에 요청하지 않고, 데이터만 비동기로 주고 받습니다.JavaScript: HTML form 대신 자바스크립트 코드로 네트워크 요청을 보냅니다.XML: 초창기에는 데이터를 XML로 주고 받았지만, 지금은 가벼운 JSON이 거의 표준입니다. AJAX를 구현한 첫 인터페이스는 XMLHttpRequest(XHR) 객체였습니다.오래된 방식이지만 여전히 많은 브라우져에서 동작합니다.콜백 기반 인터페이스라 다루기 번거롭지만, 과거에는 이것이 표준이었습니다. 시간이 지나면서 Fetch API가 등장합니다.fetch() 함수 하나로 간단히 네트워크 요청을 만들 수 있습니다.프로미스(Promise) 기반이라 비동기 로직을 깔금하게 작성할 수 있습니다.거의 모든 브라우져가 지원합니다. 특별히 구형 브라우져를 신경 쓰지 않는 다면, fetch 하나만으로도 충분합니다. 데이터 형식AJAX 요청은 단순히 "보냈다, 받았다"에서 그치지 않습니다. 어떤 형식으로 데이터를 주고 받느냐도 중요합니다.폼 데이터(FormData, urlencoded): HTML form과 유사한 방식으로, 로그인이나 간단한 값을 전달할 때  적합합니다.JSON: 구조화된 데이터를 교환할 때 널리 쓰입니다. 읽고 쓰기 쉽고, 자바스크립트 객체와 호환성이 높아 표준처럼 사용합니다.Blob, ArrayBuffer: 이미지, 영상 같은 대용량 바이너리를 전송할 때 사용합니다. 응답(Response) 다루기요청을 받은 서버는 응답(Response)을 보내는데요, fetch는 응답을 프라미스로 감싸서 반환합니다.status, ok:  응답이 성공했는지를 나타내는 숫자 혹은 불리언 값headers:  응답 헤더를 담은 객체text(), json(), blob(): 응답 본문을 다양한 형식으로 읽기 위한 함수 예를 들어, 로그인 API 서버가 JSON을 응답하면, 프론트엔드에서는 json() 함수를 통해 자바스크립트 객체로 변환해 사용할 수 있습니다.const jsonData = await response.json(); jsonData // { authenticated: true }이 과정을 통해 화면 일부만 바꾸거나, 사용자에게 알림을 띄우는 식으로 유연한 인터랙션을 만들 수 있습니다. AJAX가 바꾼 웹생각해보면, 우리가 매일 쓰는 웹 서비스의 매끄러움은 대부분 AJAX 덕분입니다.SNS에서 좋아요를 눌러도 화면이 리프레시되지 않는 것지도를 드래그할 때 매끄럽게 새로운 영역이 나타나는 것쇼핑몰 장바구니가 즉시 업데이트되는 것 모두 AJAX와 Fetch API가 만들어낸 새로고침 없는 웹의 풍경입니다. 결론HTTP는 단순히 "요청과 응답" 으로만 설계된 프로토콜이었습니다. 하지만 AJAX가 등장하면서 웹은 앱(APP)처럼 반응성이 좋아지게 됩니다. 웹이 이렇게 변화한 배경과 더불어 아래 주제들을 먼저 익혀 두신다면, 훨씬 폭 넓은 문제 해결 역량을 갖추실 수 있을 겁니다.폼 요청과 AJAX의 차이Fetch API의 기본 사용법다양한 데이터 형식 (JSON, FormData 등)응답 처리 (Response 객체) 더 깊게 이해하고 싶으시다면 제가 준비한 강의  「웹 개발의 핵심, HTTP 완벽 가이드」  3편을 참고해 보세요. 한 단계 성장한 개발자로 나아가는 좋은 출발점이 될 것입니다.이 강의에서 다루는 내용1편. HTTP 기본2편. 브라우져3편. AJAX4편. 추가 프로토콜5편. 보안6편. 성능

웹 개발HTTP네트워크AJAXFETCH

김정환

HTTP를 이해하기 위한 첫 단추, URL

멀리서 단조로워 보이는 산도 한 걸음 다가가면 수많은 나무와 풀로 어우러져 있습니다. 인터넷 또한 그런 것 같습니다. 겉으로는 단일한 공간처럼 보이지만, 그 안에는 수없이 다양한 프로토콜과 데이터로 얽혀 있습니다.웹은 인터넷이라는 단단한 토양을 기반으로 움직이는데요. 잘만 활용하면 멋진 기능을 금방 만들어 낼 수 있습니다. 만약 원리에 대한 이해를 조금 더 넓히신다면, 훨씬 안정적이고 빠른 제품을 만드실 수 있을겁니다.이 글에서는 인터넷을 이루는 기초 요소 중 'URL'이라 부르는 주소에 대해 소개해 드리겠습니다. URL브라우져가 서버로 요청을 보낼 때 URL을 사용합니다. 검색창에 입력하는 그것이 말이죠. 서버를 찾기 위한 '전화번호'라고 생각해도 좋습니다.URL은 일정한 규칙을 갖고 있는데요. 이제부터 이 규칙을 하나씩 소개해 드릴게요.프로토콜://도메인:포트/경로?쿼리문자열#앵커 프로토콜'프로토콜을 맞춘다'라고 표현할 때는, '대화의 규칙을 정하자'라는 뜻입니다. URL 맨 앞에 있는 이 프로토콜(protocol)이 규칙의 종류를 구분하는 요소입니다.http:: HTML 문서를 가리키는 URL입니다. 브라우져는 HTML 문서를 다운로드하고 이것을 사람이 볼 수 있는 형태로 보여줄 거에요.mailto:: 링크를 클릭했는데 메일 앱이 실행된 적이 있나요? 바로 이 프로토콜로 시작하는 URL입니다.tel:: 전화가 걸린다면 당황하실지도 모릅니다. 브라우져는 이 프로토콜로 시작하는 URL을 전화 앱과 함께 실행합니다. 도메인프로토콜에 이어 도메인(domain)은 서버의 위치를 나타내는 규칙입니다. 브라우져는 이 도메인이 가리키는 IP 주소를 찾기 위해 DNS(Domain Name Server)에 질의하기도 합니다.예를 들면 google.com, naver.com 같은 거에요. 각 각 구글 서버, 네이버 서버 위치를 가리킵니다. 직접 서버를 실행해 개발할 때는 "이 컴퓨터"를 가리키는 localhost라는 도메인도 자주 만나게 되실 거에요.도메인은 인터넷이라는 세상에서 국가를 가리키는 역할을 합니다. 포트도메인에 해당하는 서버를 찾았다면, 그 안에서 실행되고 있는 프로그램에 접속할 차례입니다. 한 국가에 들어가기 위해 항구를 찾듯이, 포트(port)는 서버 안에서 실행 중인 프로그램을 식별하는 규칙입니다.무려 65,536개(2^16)개의 포트를 가지고 있는데요, 클라이언트는 이 중 하나를 골라서 들어 갑니다. 마치 한국에 들어올 때 인천항이나 부산항을 선택하는 것처럼요.잘 알려진 포트: 0~1023 구간으로, 운영제제만 쓸 수 있는 특별한 포트입니다. (80: HTTP, 22: SSH)등록된 포트: 1024~49151 구간으로, 여러 애플리케이션이 관례적으로 사용하는 포트에요. 보통 개발 환경에서 자주 사용합니다. (8000: 웹 개발용)동적 포트: 49152~65535 구간으로, 일시적으로 할당되는 포트입니다. (예를 들어 클라이언트가 서버의 80 포트로 요청을 보내면, 서버는 이 구간에 속하는 임시 포트를 활용해 클라이언트에 응답을 전달합니다.) 경로프로그램은 여러가지 형태의 파일을 제공하는데요, 이 파일을 식별하는 규칙이 경로(path)입니다.브라우져는 이걸 통해 "이 파일을 주세요"라고 서버에게 요청할 수 있어요. 서버가 이 파일을 찾아서 보내주면, 브라우져는 그것을 화면에 표시할 겁니다./index.html → "웹사이트 첫 화면을 주세요"/images/logo.jpg → "로고 이미지를 주세요"/css/styles.css → "스타일시트 파일을 주세요"집을 찾기 위해 나라와 도시(도메인과 포트)를 찾았다면, 경로는 특정 건물을 가리키는 셈이지요. 쿼리 문자열과 앵커때로는 서버에 추가적인 정보를 전달할 필요가 있는데, 쿼리 문자열(querystring)이 이 역할을 합니다.위치: 경로 뒤에 '?' 기호와 함께 작성합니다.형식: "키=값"형태로 데이터를 표현합니다. (예: '?query=검색어' 검색결과 페이지 요청)배가 특정 지점에 머물도록 닻을 내리 듯, 앵커(anchor)는 HTML 문서안의 특정 위치를 가리키는 역할을 합니다.위치: 경로 혹은 쿼리 문자열 뒤에 '#' 기호와 함께 작성합니다.id 값 사용: HTML 문서에서 요소에 부여한 id 값을 참조합니다. (예: #post-title)        정리지금까지 HTTP 핵심 요소인 URL에 대해 살펴보았습니다. 이것은 인터넷 상의 자원을 식별하는 주소이자, 브라우져가 서버와 대화하기 위한 출발점입니다.브라우져는 단순히 URL만 전달하는 것이 아니라, 헤더와 본문을 추가해 하나의 요청(Request)를 만듭니다. 이 요청을 받은 서버는 자원을 찾아낸 뒤, 상태 코드, 헤더, 분문을 추가해 응답(Response)로 돌려줍니다. 이렇게 요청과 응답을 수없이 주고 받으며 우리가 매일 사용하는 웹이 움직이는 것이죠.더 깊이 있는 이해를 원하신다면 제가 준비한 강의, 「웹 개발의 핵심, HTTP 완벽 마스터하기!」 1편을 참고해 보시면 도움이 될 것입니다. 웹을 처음 배우시는 분에게는 든든한 길잡이가, 경험자에게는 기초를 재정립하는 기회가 될 것입니다.이 강의에서 다루는 내용1편. HTTP 기본2편. 브라우져3편. AJAX4편. 추가 프로토콜5편. 보안6편. 성능 

웹 개발HTTP네트워크URL

양성빈(Robert)

코틀린 상속 간 주의점

코틀린 넌 왜 나에게 이런 시련을 주는건가.. 연휴기간 동안 코틀린 상속 관련 공부를 진행하다가 재미난 이슈가 있어서 한번 공유드릴려구요!아래의 2개의 클래스가 있습니다. 보시는 바와 같이 Child class가 Parent 클래스를 상속받고 있지요.package me.sungbin.troubleshooting open class Parent( open val number: String = "100" ) { init { println("Parent Call") println(number) } }package me.sungbin.troubleshooting class Child( override val number: String, ): Parent() { init { println("Child Call") } }그리고 아래와 같이 main 함수에서 Child class 생성자를 호출합니다.package me.sungbin.troubleshooting fun main() { Child("300") } 그러면 결과는 어떻게 찍힐까요?저는 처음에 아래와 같이 생각했습니다. 부모 클래스의 생성자가 호출되면서 number값을 출력할 때 오버라이딩 되었으니 자식 클래스의 number값을 호출하지 않을까? 그래서 아래와 같이 생각했었습니다.Parent Class 300 Child Class그런데 실제 결과는 달랐습니다.Parent Class null Child Class오잉? 이상하지 않은가요? 그래서 자바코드로 디컴파일 해보고 공식문서를 찾아본 결과 정답에 대한 솔루션을 알 수 있었습니다.공식문서: 공식 문서 링크왜 그런가 싶더니 코틀린 공식 문서에서 아래와 같이 이야기 하더라구요!파생 클래스의 새 인스턴스를 생성하는 동안 기본 클래스 초기화는 첫 번째 단계로 수행됩니다(기본 클래스 생성자의 인수 평가에 의해서만 선행됨). 즉, 파생 클래스의 초기화 논리가 실행되기 전에 수행됩니다.코틀린의 공식문서의 해당 내용을 번역해보았습니다.즉, 기본 클래스 생성자가 실행될 때 파생 클래스에서 선언되거나 재정의된 속성은 아직 초기화되지 않은 상태입니다. 기본 클래스 초기화 로직에서 이러한 속성을 사용하면 (직접적으로든 다른 재정의된 멤버 구현을 통해 간접적으로든 ) 잘못된 동작이나 런타임 오류가 발생할 수 있습니다. 따라서 기본 클래스를 설계할 때는 생성자, 속성 초기화자 또는 블록에 멤버를 open사용하지 않는 것이 좋습니다.즉, 요약 하자면 아래와 같을 것입니다.자식 생성자를 호출한다 -> 그 전에 부모 생성자를 호출하려고 할 때 먼저 init block을 호출한다. number 값을 출력하려고 보니 재정의되어서 자식 클래스에 접근한다. -> 그런데 자식 클래스 생성자 전이니 해당 값은 알 수 없다 -> 따라서 null로 출력한다. 그런데 저는 여기서 또 의문이 들었습니다. 분명 선언된 것은 non-nullable 타입인데 어떻게 null이 나오는거야? 또한, 신기한 것은 타입을 String -> Int로 변경 시에는 기본 값 0이 나오더라구요! 그래서 또 한번 30분간 연구를 해보았습니다. 그 덕에 조금 답을 얻을 수 있었는데요.초기화 순서를 먼저 보면 좋을 것 같아요.Child("300") 호출 → Parent() 생성자 호출(슈퍼 생성자 호출이 먼저).Parent의 init가 실행되며 println(number) 수행.number는 open 프로퍼티라서 가상 디스패치로 Child.number getter를 타게 됩니다.하지만 이 시점에는 Child.number의 백킹 필드가 아직 할당 전이므로, 원시 타입 Int → JVM 기본값 0, 레퍼런스 타입(예: String) → JVM 기본값 null이 반환된다고 하더라구요.Kotlin의 Non-null 보장도 생성 중(super 생성자 실행 중)에는 예외적으로 깨질 수 있습니다.그래서 값이 다르게 나왔다고 하더라구요!후기해당 과정은 정말 1시간 동안 연구하면서 공식문서를 뒤져보고 gpt한테도 물어보면서 얻은 답변들이였습니다. 그래서 뭔가 재미나면서도 다른 분들께 공유를 드리면 좋을 것 같아서 해당 포스팅을 진행하게 되었습니다. 이렇게 연구하게 된것도 어찌보면 인프런에서 진행하는 '향로' 와 함께하는 추석 완강 챌린지 덕도 큰 것 같습니다. 연휴가 이제 거의 절반을 지난 것 같은데 남은 연휴기간도 화이팅입니다!

백엔드kotlin

Masocampus

[마소캠퍼스 GEN AI 인사이트] 이 바나나, 그냥 바나나 아님. AI임.

디자인 툴의 판도를 바꿀 AI가 등장했어요! 이름도 귀여운 ‘나노 바나나’🍌 정체가 공개되기 전부터 AI 커뮤니티를 술렁이게 한 이 모델은,사실 구글의 Gemini 2.5 Flash Image였답니다.이제는 포토샵 없이도 고퀄 이미지 제작이 가능한 시대예요!2025년 8월, 나노 바나나는 혜성처럼 등장해 엄청난 주목을 받았죠.모두가 궁금해했던 이 모델은 구글의 비밀 병기, Gemini 2.5 Flash Image!AI 이미지 기술의 다음 세대를 열었답니다✨🔹 2025년 8월 LMArena에 첫 등장🔹 압도적인 이미지 품질과 사물 이해력🔹 구글이 직접 8월 25일 정체를 공식 발표출시 전부터 전문가들 사이에서 입소문이 자자했던 이유, 충분하죠?Gemini 2.5는 기존 AI들이 못 해내던 ‘일관성 유지’가 강점이에요. ✔ 캐릭터의 외형이 계속 유지되고✔ “배경 흐리게”, “팔 지워줘” 같은 말로 바로 편집✔ 여러 이미지 융합도 OK✔ 같은 스타일 템플릿도 자동 적용! 이제는 정말 자연스러운 이미지 제작이 가능해졌어요😊성능 면에서도 타 AI들을 압도했어요! 🌟 LMArena 벤치마크 최고 점수🌟 이미지 편집 & Text-to-Image 모두 리더보드 1위🌟 빠르게 이미지 생성까지! 퀄리티와 속도를 모두 잡은 모델이라니, 이건 혁신이죠👏누구나 쉽게 사용할 수 있어요! 👨‍💻 개발자: Gemini API, Google AI Studio에서 사용 가능🏢 기업: Vertex AI를 통해 제공🆓 무료 사용자: 하루 100회 사용 가능💰 유료 사용자: 월 단위로 1000회 이상 사용 가능(1이미지 = 1290 토큰 / 100만 토큰 = $30) 가격도 꽤 현실적이죠?✔ 모든 이미지에 디지털 워터마크(SynthID) 삽입✔ 데이터셋 필터링과 라벨링으로 유해 콘텐츠 최소화✔레드팀 테스트를 통해 콘텐츠 안전성 철저 확인신뢰할 수 있는 AI 이미지 생성 도구로 진화 중이에요!아직은 몇 가지 한계도 있어요:😅 작은 얼굴 표현이나 철자 인식은 미흡🤖 캐릭터 일관성도 간혹 깨짐 하지만 구글은 장문 텍스트 처리, 사실적 묘사 등 꾸준히 개선 중이에요.점점 더 똑똑해지는 ‘나노 바나나’ 기대돼요!활용도도 무궁무진해요!📢 광고 이미지📚 교재용 캐릭터 삽화🎮 게임용 캐릭터 시트🛒 전자상거래용 제품 이미지이미 기업들도 본격적으로 활용을 시작했답니다🔥외형 유지되는 AI? 일관성도 걱정 없어요!마케터에겐 시간 절약 꿀템!실무에 바로 적용 가능한 기술이라니, 이건 안 쓸 수 없겠죠?새로운 시도와 성장은 언제나 도전에서 시작돼요.마소캠퍼스는 여러분이 똑똑하게 일할 수 있도록 도와주는 성장 파트너예요 💡지금 이 순간에도 더 나은 내일을 준비하고 있다면, 마소와 함께 해보세요 😊 📌 관련 강의 <AI 에이전트 입문 치트키, Claude MCP로 끝내는 업무 자동화>AI를 내 업무에 자유자재로 써먹는똑똑한 직장인이 되고 싶다면?>> 강의 바로 가기 

AI 이미지 · 영상나노바나나GeminiFlashImage구글AI생성형AI이미지AIAI디자인툴디지털콘텐츠AI편집AI툴추천AI캐릭터

인공지능과 추천 시스템 강의 노트 - 2025. 9. 13. (2/16)

들어가며타이트해진 출석 체크와 작년 대비 추가된 중간과제와 기말과제 조건들 덕인지 꽤 많은 학생들이 다른 선택들을 하였고, 인원은 58명으로 정해졌다. 이제 조금 기대치가 조절되고 있는 셈이니 내년에도 이 과목을 내가 하고 있을 지는 모르지만, 학과를 위해서는 강의 평가도 좋은 점수가 나와야 할텐데 하는 걱정도 적지 않게 든다.공개된 데이터를 가지고, EDA 를 자유 형식으로 하라는 중간 과제가 서로 낯설어서 질문들이 많다. Kaggle , Dacon 등에서 보이는 ‘내가 봐도 문제 없는 데이터’를 가지고 직장 상사에게 보고하는 형태의 보고서를 쓴다는 생각으로 과제를 정의하고 있다. 데이터의 형식, 문제 정의 등에 대해 피드백을 주고 받을 생각으로, 각자 도메인에서 의미있는 해석들이 있으리라 기대가 된다.구름이 잔뜩 낀, 하지만 매력적인 서울 하늘 준비한 내용들2주) 강의 updateAI 강의 - 1강추천시스템 - 1Google(Playstore)에서 과제 런칭하기 - 1 이번 주에 있었던 일들로는 굵직굵직한 OpenAI 의 한국 행보와 구글 검색의 AI 모드 전면 배치 등이 있었다. 사상 최고를 경신하고 있는 코스피 자체도 관심 있게 챙겨야 하겠다. 나눈 이야기들약간의 역사적인 이야기가 들어 있는 인공지능 이야기와 추천 시스템의 입문에 대해 다루었다. 추천 시스템이라는 단어들도 오해가 많은 영역이라, 이 강의에서는 완성된 사용자 위주의 제품의 시각에서 접근과 그걸 가능하게 하는 방법론에 대해 이야기를 많이 하게 된다. 다음 시간부터는 각 내용들에 대해 요즘 시각에서 익숙한 이야기들을 담게 되겠다.유사 쇼핑몰의 개념으로 구글 플레이스토어 이야기를, 완제품의 시각에서 구글 검색 이야기를 내부자의 관점에서 많이 하게 될 것이라 ice-breaking 으로 구글 플레이스토어 이야기를 꽤 일찍부터 시간을 많이 할애하기로 했다. 지표들에 대해서까지 대략적으로 이야기를 하였는데, 아무래도 바깥에서 이야기하기에 한계들이 있는 영역이라 여러 번 감정 이입을 해 가며 정리를 해야 하겠다. ps.인프런에 올라가 있는 유료 강의들을 원하는 학생들에게는 무료로 제공하자 싶어 본의 아니게 인프런 광고를 조금 하게 되었다. 도움이 필요한 분들께 조금이라도 도움이 되면 하는 바램이다.

대학 교육 기타인공지능금융추천

Depth

인프런 워밍업 클럽 스터디 4기 - CS 전공지식 > 1주차 발자국

 ◼만들면서 쉽게 배우는 컴퓨터 구조Section1) 컴퓨터 구조 개요컴퓨터는 트랜지스터라는 반도체 소자로 만들어지고, 여러 트랜지스터로 NAND 게이트를 만들며, 이로부터 컴퓨터가 구성된다. 프로그램의 동작방식 (2가지)컴파일러전체 코드를 미리 번역해 실행 속도가 빠름컴파일 시 문법 오류 사전 발견 가능인터프리터한 줄씩 번역하며 실행, 실행 중 문법 오류 가능실행 속도는 컴파일러보다 느림 Section2) 컴퓨터 구성 요소CPU컴퓨터의 두뇌 역할을 하는 장치로, 산술연산장치(ALU), 제어장치 등으로 구성된다. 메모리RAM, ROM, 캐시 메모리 등이 있다. 주변 장치입력 장치 (키보드, 마우스 등), 출력 장치 (모니터, 프린터 등) 등이 있다. 8비트, 32비트, 64비트 컴퓨터가 표현할수 있는 데이터 차이8비트: 2^8 = 256개32비트: 약 42억개 (RAM 4GB 한계)64비트: 약 18경개 (RAM 한계없음, 거의 무한대)  Section3) 불 대수불 대수의 등장클로드 섀넌이 0과 1 (false, true)만으로 모든 논리 연산과 계이 가능함을 발견 주요 불 연산NOT: 입력의 반대값 출력AND: 둘 다 1일 때만 1 출력OR: 둘 중 하나 이상 1이면 1 출력NAND: AND의 결과를 반전NOR: OR의 결과를 반전XOR: 입력이 서로 다를 때 1 출력 (입력개수 2개일때), 1의 개수가 홀수이면 1, 아니면 0 (입력개수가 3개이상일때) 불 연산 우선순위 : NOT -> AND -> OR 불 대수의 성질과 법칙항등원 법칙, 교환법칙, 분배법칙, 동일법칙, 이중부정법칙, 흡수법칙, 드모르간 법칙 등이 있다 불 연산을 바탕으로 진리표 작성 가능방정식 -> 진리표 -> 논리회로로 변환 Section4) 비트10진법, 2진법, 16진법10진법은 0~9까지 10개의 숫자 사용2진법은 0과 1 두 가지 숫자만 사용16진법은 0~9, A~F(10~15)를 사용 바이트 저장 순서 방식리틀 엔디안: LSB(Least Significant Byte, 가장 낮은 자리 바이트)를 낮은 주소에 저장빅 엔디안: MSB(Most Significant Byte, 가장 높은 자리 바이트)를 낮은 주소에 저장  오버플로우표현할 수 있는 비트 수를 초과하는 계산 결과 발생 시 결과가 제대로 저장되지 못하는 현상 음수 표현MSB(Most Significant Bit, 최상위 비트)가 0이면 양수, 1이면 음수로 해석 2의 보수법음수를 표현하는 방법음수 = 1의 보수(모든 비트를 반전) + 1  Section5) 컴퓨터의 기초가 되는 하드웨어 만들기 Logisim-evolution 같은 시뮬레이터를 사용해 논리 회로를 직접 설계·실험 가능,설치하려면 JDK 필요, GitHub에서 최신 버전 다운로드 가 기본 논리 게이트NAND 게이트, NOT 게이트, AND 게이트, OR 게이트, XOR 게이트  Mission1)https://inf.run/wLEBH  ◼그림으로 쉽개 배우는 자료구조와 알고리즘Section1) 개요선형 자료구조 : 배열, 연결 리스트, 스택, 큐비선형 자료구조: 트리, 그래프, 힙 P-NP 문제 개념 이해빅오 표기법 (시간 복잡도)결정 문제와 최적화 문제P 문제 (Polynomial time 문제)NP 문제 (Nondeterministic Polynomial time 문제)NP-hard 문제P vs NP 문제   Section2) 트리와 이진트리트리노드(Node)와 간선(Edge)으로 구성된 계층적 자료구조 트리의 구성요소노드, 간선, 루트 노드, 자식 노드, 형제 노드, 리프 노드, 레벨, 높이 이진트리각 노드가 최대 2개의 자식 노드를 갖는 트리포화이진트리와 완전이진트리도 존  Section3) 이진 탐색트리각 노드가 값의 기준점 역할을 하며, 찾고자 하는 값이 현재 노드의 값보다 크면 오른쪽 서브트리를, 작으면 왼쪽 서브트리를 탐색하는 구조  Section4) AVL 트리높이 균형을 유지하는 이진 탐색 트리로, 각 노드의 왼쪽과 오른쪽 서브트리 높이 차이(균형 인수)가 최대 1 이내여야 한다.이 균형 조건을 벗어나면 회전 연산을 통해 트리의 균형을 맞춰 탐색, 삽입, 삭제 수행  🗒회고컴퓨터 구조와 자료구조(알고리즘) 강의를 동시에 완벽히 이해하기엔 시간적으로 무리가 있을 것 같아 컴퓨터 구조 심화 학습에 좀 더 집중해볼 예정이다.강의에서 Logisim-evolution을 활용해 AND, OR, NOT, XOR 등의 게이트를 직접 만들어보는 과정이 인상 깊었다. 회로를 하나하나를 쌓아가며 구조를 이해하는게 재미가 있어 몰입이 잘 되었다.강의를 완강할 즈음에는, 정말 작은 컴퓨터 하나쯤은 스스로 만들어 낼 수 있을 것 같은 기대감이 든다 🏷출처https://inf.run/y1hhdhttps://inf.run/7mNZ2https://inf.run/uHJ1a  

cs발자국4기

Masocampus

[마소캠퍼스 GEN AI 인사이트] 업무 자동화 끝판왕 ✨ 노션 3.0 Agent 총정리

노션이 드디어 3.0으로 업그레이드되었어요! 🚀 이번 업데이트의 핵심은 바로 Agent 기능인데요,어떤 점이 달라졌는지 더 자세히 알아볼까요?2025년 9월, 노션은 완전히 달라졌어요.“내가 일을 시키면 Agent가 대신 처리해준다”는 개념이 핵심이에요. 단순한 입력 보조가 아니라,실제 사람처럼 태스크를 이해하고 진행하는‘AI 동료’가 생긴 셈이죠 🙂그렇다면 Agent에는 어떤 기능이 있을까요? ✔ 최대 20분 동안 스스로 일하기✔ 수백 개 페이지 업무 처리✔ PDF·CSV 파일 이해하고 요약하기✔ 팀별 자동화 가능한 ‘Custom Agent’까지! 업무 효율성이 몇 배는 높아진 셈이죠.이번 Agent는 진짜 똑똑해졌어요 ✨ 구글 드라이브, 슬랙 같은 툴과 연결해 정보 검색도 가능하고,DB 속성 설정이나 뷰 수정,심지어 앱과 웹을 넘어선 인사이트까지 뽑아낼 수 있답니다.아직은 못하는 일도 있어요. 예를 들어, 댓글 읽기·작성, 리마인더 설정,고급 템플릿 생성, AI 회의 노트 시작 같은 건 아직 준비 중이에요. 그래도 지금 모습만으로도 충분히 놀랍죠!보안은 걱정하지 않으셔도 돼요 🔒 삭제한 정보는 완전 삭제,기업 보존 기간 설정 가능,AI 커넥터 데이터도 안전하게 저장!엔터프라이즈에는 Zero Data Retention 정책까지 적용돼서 안심할 수 있어요.Agent는 우리가 자주 쓰는 다양한 툴과 연동돼요. Gmail, Slack, Teams, Google Drive 등 연결만 해두면자동 인덱싱되어 원하는 정보를 금방 찾을 수 있답니다 🙂Agent 시작하기도 간단해요. 1. Agent 버튼 클릭2. 액션 선택 또는 직접 프롬프트 입력3. 결과 확인 후 Undo 가능4. 이름/지시 페이지로 설정까지 완료! 생각보다 훨씬 직관적이라 초보자도 쉽게 쓸 수 있어요.앞으로는 팀 중심의 Custom Agents가 도입될 예정이에요.개인 업무 보조를 넘어서,팀 전체가 Agent를 공유하고 자동화할 수 있는 시대가 곧 찾아온답니다.자주 사용하는 툴들과 연계되어 너무 편해요!반복 업무는 Agent에게, 난 중요한 일만 집중!노션 3.0, 이제는 ‘진짜 업무 파트너’로 거듭났습니다 🙂새로운 시도와 성장은 언제나 도전에서 시작돼요.마소캠퍼스는 여러분이 똑똑하게 일할 수 있도록 도와주는 성장 파트너예요 💡지금 이 순간에도 더 나은 내일을 준비하고 있다면, 마소와 함께 해보세요 😊 📌 관련 영상 <퇴근하고 싶냐? Notion AI로 칼퇴 루틴 완성!>Notion, 기초부터 배워보고 싶다면?딱 1시간으로 끝내는 Notion AI!>> 영상 바로 가기

AI 업무 활용노션3Notion3.0업무자동화NotionAgentAI비서AI생산성향상협업툴추천에이전트기능스마트워크

MontyCoder

[네트워크] 서브넷 마스크란?

일단 IP 주소 구조부터IP 주소 (IPV4) 기준으로 이야기하면, 8비트 4개로 이루어져있다. 각 비트는 점('.')으로 분리되어 표시된다.예를 들어 172.16.34.57 이런식으로 말이다.클래스별 IP 주소 형태IP 주소를 관리하기 위해 클래스라는 개념으로 구분한다. 각 클라스에 따라 네트워크와 호스트의 구성 비트 범위가 달라지게 되어 필요에 맞게 네트워크가 많이 필요하면 특정 클래스, 호스트가 많이 필요하면 다른 클래스를 할당하는 등으로 처리하기로 생각했던 것이다. 클래스 A우선 클래스 A로 이야기하자면, 첫 8비트가 네트워크 구성 비트고, 첫 비트는 0으로 고정된다. 뒤에 24비트는 호스트 구성 비트다. 그래서 클래스 A에 소속된 IP 주소는 0~127으로 알 수 있다. 주소 끝에는 첫 8비트가 네트워크 구성 비트라는걸 알려주기 위해 /8을 뒤에 기재한다. (예시: 10.25.3.7/8) 클래스 B클래스 B로 이야기하자면, 첫 16비트가 네트워크 구성 비트고, 앞 두개의 비트는 10으로 고정된다. 뒤에 16비트는 호스트 구성 비트다. 그래서 클래스 B에 소속된 IP 주소는 128~191으로 알 수 있다. 주소 끝에는 첫 16비트가 네트워크 구성 비트라는걸 알려주기 위해 /16을 뒤에 기재한다. (예시: 172.25.3.7/16)클래스 C클래스 C로 이야기하자면, 첫 24비트가 네트워크 구성 비트고, 앞 세개의 비트는 110으로 고정된다. 뒤에 8비트는 호스트 구성 비트다. 그래서 클래스 C에 소속된 IP 주소는 192~223으로 알 수 있다. 주소 끝에는 첫 24비트가 네트워크 구성 비트라는걸 알려주기 위해 /24을 뒤에 기재한다. (예시: 194.25.3.7/24)클래스 D클래스 D로 이야기하자면, 전체 32비트가 네트워크 구성 비트고, 앞 세개의 비트는 1110으로 고정된다. 그래서 클래스 C에 소속된 IP 주소는 224~239으로 알 수 있다. 주소 끝에는 첫 32비트가 네트워크 구성 비트라는걸 알려주기 위해 /32을 뒤에 기재한다. (예시: 233.25.3.7/32). 호스트 구성 비트가 없기 때문에 멀티캐스트용이다.그래서 서브넷 마스크는?서브넷 마스크는 단순하게 설명하면 어디부터 어디까지 네트워크 구성 비트고, 어디까지 호스트 구성 비트인지 알려주는 형태다. 1을 연달해서 작성하는 곳까지 네트워크 구성 비트고, 뒤에 따라오는 0은 호스트 구성 비트를 뜻한다. 클래스 A의 기본 서브넷 마스크는 255.255.0.0 인것. (1111 1111.1111 1111.0000 0000.000 00000) 서브넷 마스크는 말대로 net의 sub을 해주는 mask, 즉 네트워크를 분리해주는 마스크(가림)인 것이다. 이게 무슨 의미냐면, 현재 주소를 보면 네트워크 구성 비트가 너무 적은 경우가 있는데, 네트워크가 더 필요한 경우 확보를 목적으로 마스크(가림) 처리를 하는것이다. 클래스 A 같은 경우 호스트에 쓰일 수 있는 비트는 2^24 나 있지만 네트워크에 쓰일 수 있는 비트는 고작 2^8 -1개인 것이다 (첫 비트 0은 고정이므로 1개를 뺌). 이런 경우 네트워크를 적절하게 분리해서 쓰는게 효율적인 것이다. 서브넷 마스크와 IP 주소를 AND 연산을 해서 그 결과값을 사용하면 적절한 네트워크 확보가 가능하다. 클래스 B의 한 주소가 있다고 하자. 172.16.34.57/16(1010 1100.0001 0000.0010 0010. 0011 1001). 여기에 이제 네트워크를 더 확보하고 싶어 앞 20비트까지 네트워크 분으로 하고 싶다. 그래서 서브넷 마스크 255.255.240.0(1111 1111.1111 1111.1111 0000.0000 0000)으로 마스킹(가림) 한다. AND 연산을 한 결과는 172.16.32.0/20 (1010 1100.0001 0000.0010 0000. 0000 0000)이게 되어, 2^4만큼 네트워크 구성 비트를 더 확보하게 되는 것이다.  참고 강의그림으로 쉽게 배우는 네트워크https://inf.run/JN7mz

네트워크네트워크CS

sim2

[스터디 모집] AI로 학습 효율 극대화하는 노션 템플릿, 함께 사용하실 분 모집해요!!

안녕하세요! 정해진 시간이나 과제 없이, 각자 편한 시간에 최고의 효율을 내는 '자율 학습' 스터디를 모집합니다.이 스터디는 정해진 시간에 모여 진행하는 방식이 아닙니다. 제가 2년간 직접 사용하며 학점을 2점대에서 4점대로 올렸던 'AI 강의 정리법' 노션 페이지를 개인의 학습 베이스캠프로 삼아, 자신만의 속도와 방식으로 공부를 진행하는 자율 학습 커뮤니티입니다.함께 같은 목표(A+)를 향해 나아가되, 서로를 강제하지 않고 각자의 성장을 응원하는 것을 목표로 합니다! ⭐ 스터디 멤버가 되시면 아래 '자율 학습' 자료를 모두 이용하실 수 있어요!학습의 핵심, 제가 1년간 완성한 'AI 프롬프트 원본'과 상세 가이드개인의 학습 계획에 맞춰 평생 사용 가능한 노션 템플릿추후 추가되는 모든 업데이트 자료 평생 무료 제공스터디 참여비: 5,000원 (초기 참여비이며, 자율 학습에 필요한 템플릿과 모든 업데이트 자료 이용권이 포함된 가격입니다.)관심 있는 분들은 아래 오픈채팅방으로 들어오셔서 간단한 인사 남겨주시면, 제가 스터디 페이지로 직접 초대해 드리겠습니다.[스터디 참여 링크] https://open.kakao.com/o/sflDShSh   

AI 업무 활용학습AI프롬프트대학교강의학점컴퓨터

애완로트와일러개

[K-DEVCON] 9월엔 치맥! (네트워킹 데이)

🍺 K-DEVCON 9월엔 치맥 🍗 퇴근길, 시원한 맥주 한 잔만큼 완벽한 힐링이 있을까요?이번 9월 K-DEVCON 네트워킹은 치맥의 밤으로 강남에서 개최합니다.  맥주 한 모금에 하루의 피로는 잊고, 치킨 한 입에 대화가 술술 풀리는 시간.서로의 아이디어와 경험을 가볍게 나누며, 새로운 인연을 만드는 자리에 여러분을 초대합니다. 📅일시: 9월 18일(목) 19:30 ~ 22:00 (2시간 30분)📍장소: 송송카레 (서울 강남구 역삼로 207, 역삼역 1번 출구에서 도보 약 593m)📌 참여신청 : https://event-us.kr/kdevcon/event/110980 편하게 오셔서 맥주잔 부딪히며 이야기꽃 피워보세요!이번 9월, K-DEVCON과 함께 치맥만큼 즐거운 네트워킹을 경험해보세요 🍻 주최 : K-DEVCONK-DEVCON은 IT 전문가 커뮤니티 그룹으로 다양한 IT 기술을 연구하며 회원간의 소통을 공유하는 모임 입니다. 현재 IT업계에 종사하고 있거나, 종사할 예정이거나, IT를 공부하는 학생 그리고 IT에 관심이 있다면 누구나 함께할 수 있습니다. 기술 세미나, 스터디, 토론 등 다양한 활동을 하고 있으며, 주요 소통 및 이벤트 공유는 오픈챗 및 홈페이지 등을 통해서 공유하고 있습니다.소프트웨어 엔지니어, 데이터 엔지니어, 머신러닝 엔지니어, 시스템 엔지니어, 시큐리티 엔지니어, 데브옵스, SRE, PM, Educator, UI/UX, 스타트업, 대학생 등 다양한 구성원이 활동 중입니다. K-DEVCON에 대한 자세한 소개는 K-DEVCON 홈페이지 (https://k-devcon.com) 에서 확인 가능합니다.K-DEVCON 커뮤니티는 슬랙을 이용하여 소통하고 있습니다. 행사 참여 참고사항1. 건강한 공동체를 위해 구성원들은 K-DEVCON 행동강령을 준수하고, 주의 받은 구성원은 즉시 행동강령을 준수할 것을 요구합니다.2. 행사 당일 행사장 내부에서 사진과 영상 촬영이 진행될 수 있습니다. 촬영된 사진과 영상은 데브콘 행사 마케팅 용도로 사용될 수 있는 점 미리 양해 부탁드립니다.3. 이번 행사는 미성년자는 참여 불가능 합니다.4. 개별 주문은 불가능합니다. 음주사고를 막기 위해 1인 제공 주량을 제한합니다. 기타후원 및 기타 문의: info@k-devcon.com

커리어 · 자기계발 기타K-DEVCON네트워킹IT

Masocampus

[마소캠퍼스 GEN AI 인사이트] AI 국대팀 출범! 누가 뽑혔을까? 👀

한국형 AI 시대가 열리기 시작했어요!K-팝, K-푸드, K-뷰티에 이어 이제는 K-AI까지✨국가 주도의 AI 프로젝트, 과연 어떤 내용일까요? 함께 살펴봐요 :)정부가 AI 주권 확보를 위해 본격적으로 나섰어요.무려 2,000억 원의 예산을 들여, 국내 대표 AI 기업 5곳이 한 팀으로 뭉쳤답니다!이제 AI도 'Made in Korea' 시대가 열리는 걸까요? 😲이 프로젝트의 최종 목표는 두 가지예요.1⃣ 글로벌 AI 모델 성능의 95% 이상 달성2⃣ 누구나 자유롭게 활용할 수 있는 공공 AI 실현모두를 위한 AI, 들어본 적 있으신가요? 이제 현실이 됩니다!총 15개 팀이 치열한 경쟁을 벌였고, 그중 5팀이 최종 선정되었어요.- 네이버 클라우드- SK텔레콤- 업스테이지- NC AI- LG AI연구원이들은 각각 컨소시엄을 구성해 독자적인 AI 모델 개발에 착수했답니다💪각 기업은 자신만의 전략과 목표를 가지고 움직이고 있어요. 네이버는 AI 마켓을, 업스테이지는 산업별 AI 확대를,SK텔레콤은 B2B 서비스 발굴을, NC AI는 200B급 초거대 모델을,LG AI연구원은 K-EXAONE이라는 모델을 개발 중이에요! 같은 AI도 이렇게 다양할 수 있다니, 너무 흥미롭죠? 😊정부는 총 2,378억 원이라는 큰 규모의 예산을 지원합니다!- GPU: 1,500억 원- 데이터: 628억 원- 인재 유치: 250억 원 다만, GPU 지원은 일부 기업에만 해당되는데요,네이버와 SK텔레콤은 이 지원 대상에서 제외되었답니다.KT와 카카오 등 일부 대기업은 이번 AI 국가대표팀에서 제외되었어요.각 기업의 전략, 기술력, 독자 모델 여부 등을 기준으로 평가가 이루어졌기 때문이에요.선정되지 못한 곳도 있지만, 향후 다른 방식으로 참여할 수도 있겠죠? 🙂12월 말에는 1차 평가를 통해 5팀 중 4팀만 살아남게 됩니다.이후에도 6개월마다 성과 평가가 이어지고,전문가와 국민이 참여하는 ‘AI 콘테스트’도 예정되어 있어요. 긴 여정의 시작, 함께 지켜봐 주세요!- 기술 주권 확보- 경제 자립- 한국형 AI 생태계 구축- 모두가 활용 가능한 공공 AI 실현우리가 주도하는 AI, 우리 손으로 만들어가는 미래!‘모두의 AI’는 지금 시작됐어요! 🚀드디어 우리만의 AI가 탄생할 날이 머지 않았어요!이제는 남 따라가지 않고, 우리 기술로 선도할 수 있는 시대가 도래할 거예요~새로운 시도와 성장은 언제나 도전에서 시작돼요.마소캠퍼스는 여러분이 똑똑하게 일할 수 있도록 도와주는 성장 파트너예요 💡지금 이 순간에도 더 나은 내일을 준비하고 있다면, 마소와 함께 해보세요 😊 📌 관련 강의 <AI 에이전트 입문 치트키, Claude MCP로 끝내는 업무 자동화>AI를 내 업무에 자유자재로 써먹는똑똑한 직장인이 되고 싶다면?>> 강의 바로 가기 

AI 업무 활용인공지능AI국가대표AI프로젝트AI산업네이버클라우드SK텔레콤업스테이지LGAI연구원NCAIAI정책

뚜이

향로님의 추석 챌린지 회고

추석 연휴 동안 완강을 목표로 매일 1강을 인증하는 향로님의 챌린지에 참여했습니다.평소에도 블로그나 SNS를 통해 향로님의 글을 보는 것을 좋아했는데, 추석기간 동안 챌린지까지 여시다니!취준생의 입장에서 너무 좋았습니다. 참여하는 동안, 인출을 조금이라도 하고 싶어 미션 인증할 때 제목이나 글에 배운 내용을 넣어 어그로를 끌려고도 했습니다 ㅎㅎ; 챌린지 동안 열린 오픈 카톡방에서 본 다른 분들의 컴퓨터 세팅 이야기, 카공 인증샷 등을 보며 더 재밌게 챌린지를 참여할 수 있었던 것 같습니다.  참여하며 놀랐던 것 중 하나는 향로님이 1,000명이 넘는 참여자 분들의 글에 답변을 달아주시고 있다는 점이였습니다. 그리고 연휴인데도 불구하고 오픈카톡방에서 다양한 분들의 질문에 답변해주시고, 중간 중간 좋은 글과 라이브까지..!  라이브에서 언뜻 들었던 내용은 모든 분에게 한 번씩 닿기 위해서 글에 답변을 단다는 말을 들었던 것 같습니다. 진심이 전달된다는 게 사실 이 때까지 잘 느껴보지 못했던 것 같은데, 인프런이라는 플랫폼과 향로님과 마케팅팀분들이 열어주신 챌린지 덕분에 어떤 활동이라도 시간을 들여 고민을 한다면, 진심을 전달하는 게 가능하다는 걸 느낀 것 같습니다.  [이다의 도시 관찰 일기]라는 책에서, 버스 안에 항상 클래식 FM을 틀어두던 기사분의 이야기가 나왔습니다.각기 다른 목적지를 향해 탄 승객들이지만, 그 음악 덕분에 버스는 잠시 일상의 밖으로 벗어난 또 다른 공간이 되었다고 합니다. 인프런 추석 챌린지에 참여하며 저도 그런 느낌을 받았습니다.다들 다른 길을 걷고 있지만, 같은 클래식 안에서 한 마음으로 달리는 듯한 시간들이었습니다.  또 향로님의 글에서 운동 후 보장된 근육통이라는 표현을 보고, 어떤 것에 도전했을 때 남는 아쉬움과 상처같은 부정적인 감정도 운동 후의 근육통처럼 여긴다면좀 더 쉽게 다음에 시도할 수 있지 않을까라는 생각이 들었습니다.  연휴 동안 목표를 정해놓고 달성하는 것의 즐거움을 느낀 것 같습니다.모두 운동이나 사이드 프로젝트 등 다음 아궁이 불을 찾아 때워서, 다음 챌린지 때 뵈었으면 좋겠습니다.추석 연휴 동안 수고 많으셨습니다!     

커리어 · 자기계발 기타회고챌린지

AWS EC2에서 Docker를 활용해 배포해보기

Ubuntu에서 Docker, Docker Compose 설치하기Ubuntu에서 Docker, Docker Compose 설치하기sudo apt-get update && \ sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common && \ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - && \ sudo apt-key fingerprint 0EBFCD88 && \ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" && \ sudo apt-get update && \ sudo apt-get install -y docker-ce && \ sudo usermod -aG docker ubuntu && \ newgrp docker && \ sudo curl -L "https://github.com/docker/compose/releases/download/2.27.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose && \ sudo chmod +x /usr/local/bin/docker-compose && \ sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose 잘 설치됐는지 확인docker -v # Docker 버전 확인 docker compose version # Docker Compose 버전 확인 AWS ECR(Elastic Container Registry)이 뭘까? 왜 배울까?AWS ECR이 뭘까?필요한 이미지를 다운로드 받을 때 Dockerhub이라는 곳에서 다운받는다고 했었다. Dockerhub에서는 이미지를 저장 및 다운받을 수 있는 저장소 역할을 한다고도 했다. Dockerhub과 동일한 역할을 하는 서비스가 하나 더 있다. 그게 바로 AWS ECR이다. AWS ECR도 이미지를 저장 및 다운받을 수 있는 저장소 역할을 한다. 우리는 이 AWS ECR에 대해 배울 것이다. 왜 Dockerhub 대신에 AWS ECR을 사용하는가?최근에는 AWS 클라우드 환경에서 인프라를 구축하는 일이 많아졌다. AWS ECR을 사용하면 다른 AWS Resource와의 연동이 편하고, AWS 내에서 한 번에 관리할 수 있기에 편하다는 장점이 있다. AWS ECR을 왜 배우는지?Docker를 사용하지 않았을 때 많은 사람들이 사용하는 배포 전략 중 하나는 Github을 활용하는 방법이다. 프로젝트 코드를 Github에 Push 한 뒤에, AWS EC2에 접속해서 해당 코드를 Pull 받아서 실행시키는 방식을 많이 사용한다. 이 방식은 프로젝트 코드 전체를 EC2로 이동시켜야 하며, 프로젝트 코드를 실행시킬 런타임 환경(Node, JDK 등)도 설치되어 있어야만 실행이 된다. Docker의 가장 큰 장점은 이식성이다. Docker만 깔려있으면 어디에서든 내가 원하는 프로젝트를 실행시킬 수 있다는 게 장점이다. 이 때 Github을 활용해 프로젝트 코드 전체를 EC2로 옮겨 Docker 기반으로 실행시켜도 된다. 하지만 프로젝트에서 필요한 코드에 대해서만 Docker 이미지로 빌드해, EC2에서는 그 이미지만 다운받아서 실행시키는 게 훨씬 심플하다. AWS ECR을 배우는 이유는 훨씬 간단하게 프로젝트를 배포하고 실행시키기 위해서이다. [실습] AWS ECR(Elastic Container Registry) 사용해보기[맥(Mac OS)]brew install awscli aws --version # 잘 출력된다면 정상 설치된 상태[윈도우(Windows)]이 링크(https://awscli.amazonaws.com/AWSCLIV2.msi)를 다운받아 설치하기cmd를 실행시켜서 아래 명령어 입력해보기aws --version # 잘 출력된다면 정상 설치된 상태[우분투(Ubuntu)]sudo apt install unzip curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" unzip awscliv2.zip sudo ./aws/install $ aws --version # 잘 출력된다면 정상 설치된 상태 -- IAM 생성하기IAM에서 사용자 생성하기Access Key 발급하기AWS CLI로 액세스 키 등록하기aws configure AWS Access Key ID [None]: <위에서 발급한 Key id> AWS Secret Access Key [None]: <위에서 발급한 Secret Access Key> Default region name [None]: ap-northeast-2 Default output format [None]: -- AWS ECR(Elastic Container Registry) 셋팅하기Docker 이미지를 저장할 수 있는 저장소를 만들어보자. 일반적으로 하나의 리포지토리에는 한 종류의 이미지만 저장하고 관리한다. -- 이미지 빌드해서 AWS ECR에 Push, Pull 해보기Dockerfile 작성하기FROM openjdk:17-jdk ENTRYPOINT ["/bin/bash", "-c", "sleep 500"] 이미지 빌드 및 push 하기 aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin ... docker build --platform linux/amd64 -t hwiro-web-server . docker tag hwiro-web-server:latest ... docker push ...  이미지 pull 받아보기 docker image rm -f [Container ID] # 기존 갖고있던 이미지 지우기 docker pull 002177417362.dkr.ecr.ap-northeast-2.amazonaws.com/instagram-server docker image ls002177417362.dkr.ecr.ap-northeast-2.amazonaws.com/instagram-server : 이 값 자체가 이미지 이름이다. 길어서 어색해보일 뿐이다. [실습] AWS EC2에 Spring Boot 배포하기로컬 환경에서 프로젝트 셋팅spring.io에서 Java-17 버전으로 선택간단한 코드 작성AppController@RestController public class AppController { @GetMapping("/") public String home() { return "Docker, World!"; } }DockerFileFROM openjdk:17-jdk COPY build/libs/*SNAPSHOT.jar app.jar ENTRYPOINT ["java", "-jar", "/app.jar"]Spring Boot 프로젝트 빌드하기 ./gradlew clean build aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin 002177417362.dkr.ecr.ap-northeast-2.amazonaws.com docker build -t instagram-server . docker tag instagram-server:latest 002177417362.dkr.ecr.ap-northeast-2.amazonaws.com/instagram-server:latest docker push 002177417362.dkr.ecr.ap-northeast-2.amazonaws.com/instagram-server:latestAWS EC2에서 AWS CLI 설치 및 액세스 키 등록하기AWS ECR로부터 이미지 다운받아 컨테이너 띄우기aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin 002177417362.dkr.ecr.ap-northeast-2.amazonaws.com docker pull 002177417362.dkr.ecr.ap-northeast-2.amazonaws.com/instagram-server docker run -d -p 8080:8080 002177417362.dkr.ecr.ap-northeast-2.amazonaws.com/instagram-server혹시나 아래와 같은 에러가 발생했다면?이 에러의 원인은 CPU 아키텍처 환경이 다르다는 뜻이다. 조금 더 자세히 설명하자면, 이미지 빌드는 M1과 같은 ARM 기반의 환경에서 진행하고, 이미지 실행은 ARM 기반의 환경이 아닌 곳에서 할 때 위와 같은 에러가 발생한다. 위 에러를 해결하기 위해서는 이미지를 실행시키고자 하는 CPU 아키텍처에 맞춰서 이미지를 빌드해야 한다. 로컬 환경에서 아래와 같이 다시 빌드한 뒤 AWS ECR로 Push하자.  ./gradlew clean build aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin 002177417362.dkr.ecr.ap-northeast-2.amazonaws.com docker build --platform linux/amd64 -t instagram-server . docker tag instagram-server:latest 002177417362.dkr.ecr.ap-northeast-2.amazonaws.com/instagram-server:latest docker push 002177417362.dkr.ecr.ap-northeast-2.amazonaws.com/instagram-server:latest-- AWS EC2의 CPU 아키텍처 확인하는 방법lscpux86_64 = linux/amd64--aws 서버에 배포하기aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin 002177417362.dkr.ecr.ap-northeast-2.amazonaws.com docker pull 002177417362.dkr.ecr.ap-northeast-2.amazonaws.com docker image ls docker run -d -p 8080:8080 [이미지 이름] -- docker compose로 실행해보기compose.ymlservices: instagram-server: image: 002177417362.dkr.ecr.ap-northeast-2.amazonaws.com/instagram-server:latest ports: - 8080:8080docker compose up -d --build # 이미지 업데이트 시 docker compose pull docker compose up -d --build 잘 작동하는지 확인.docker ps docker logs [실습] AWS EC2에 Spring Boot, MySQL, Redis 배포하기compose.yml에 MySQL, Redis 관련 내용 추가하기compose.ymlservices: instagram-server: image: 002177417362.dkr.ecr.ap-northeast-2.amazonaws.com/instagram-server:latest ports: - 8080:8080 depends_on: my-db: condition: service_healthy my-cache-server: condition: service_healthy my-db: image: mysql environment: MYSQL_ROOT_PASSWORD: pwd1234 MYSQL_DATABASE: mydb volumes: - ./mysql_data:/var/lib/mysql ports: - 3306:3306 healthcheck: test: [ "CMD", "mysqladmin", "ping" ] interval: 5s retries: 10 my-cache-server: image: redis ports: - 6379:6379 healthcheck: test: [ "CMD", "redis-cli", "ping" ] interval: 5s retries: 10컨테이너 실행하기docker compose up -d --build # 잘 실행되고 있는 지 확인 docker ps docker compose ps docker compose logs    

AWS EC2에 서버 배포해보기

배포란?다른 사용자들이 인터넷을 통해서 사용할 수 있게 만드는 걸 의미한다. EC2란? / EC2를 왜 배울까? / 현업에서 EC2는 주로 언제 쓸까?--> 컴퓨터를 빌려서 원격으로 접속해 사용하는 서비스 -- EC2(Elastic Compute Cloud)를 왜 배울까?서버를 배포하기 위해서는 컴퓨터가 필요하다. 내가 가진 컴퓨터에서 서버를 배포해 다른 사용자들이 인터넷을 통해 접근할 수 있게 만들 수도 있다. 하지만 내 컴퓨터로 서버를 배포하면 24시간 동안 컴퓨터를 켜놔야 한다. 그리고 인터넷을 통해 내 컴퓨터에 접근할 수 있게 만들다보니 보안적으로도 위험할 수도 있다. 이러한 불편함 때문에 내가 가지고 있는 컴퓨터를 사용하지 않고, AWS EC2라는 컴퓨터를 빌려서 사용하는 것이다. 이 외에도 AWS EC2는 여러 부가기능들(로깅, 오토스케일링, 로드밸런싱 등)을 많이 가지고 있다. -- 현업에서는?현업에서도 실제 서버를 배포할 때 AWS EC2를 아주 많이 사용한다. 백엔드 서버를 배포해야 할 때면 EC2에 서버를 배포해서 사용한다. [실습] 1. 리전(Region) 선택하기AWS EC2를 시작하기 위해서는 우선적으로 리전(Region)을 먼저 선택해야 한다.-- 리전(Region)이란?리전(Region)이란 인프라를 지리적으로 나누어 배포한 각각의 데이터 센터를 의미한다.우린 EC2가 컴퓨터를 빌려서 원격으로 접속해 사용하는 서비스라는 걸 알고 있다. 여기서 EC2를 통해 빌려서 쓸 수 있는 컴퓨터들이 전 세계적으로 다양하게 분포해있다. 이렇게 컴퓨터들이 위치한 위치를 보고 AWS에서는 리전(Region)이라고 한다.애플리케이션의 주된 사용자들의 위치와 지리적으로 가까운 리전(Region)을 선택하는 것이 유리 [실습] 2. EC2 셋팅하기 - 기본 설정이름 및 태그EC2의 이름을 설정하는 곳이다. 이름을 지을 때는 이 컴퓨터가 어떤 역할을 하는 지 알아볼 수 있게 작성한다. Application and OS Images (Amazon Machine Image)Ubuntu 22.04 LTS 선택OS를 선택하는 단계이다. OS(운영체제)란 Mac, Windows 7, Windows 10, Windows 11 같은 것들이 OS이다. 하지만 Windows나 Mac OS는 생각보다 용량도 많이 차지하고 성능도 많이 잡아먹는다. 그래서 서버를 배포할 컴퓨터의 OS는 훨씬 가벼운 Ubuntu를 많이 사용한다. 인스턴스 유형인스턴스란, AWS EC2에서 빌리는 컴퓨터 1대를 의미한다.그럼 인스턴스 유형은 무슨 뜻일까? 컴퓨터 사양을 의미한다. 컴퓨터 사양이 좋으면 좋을수록 많은 수의 요청을 처리할 수 있고, 무거운 서버나 프로그램을 돌릴 수 있다.프리 티어에 해당하는 t2.micro를 사용 키 페어(로그인)키 페어(Key Pair)는 무슨 뜻일까?EC2 컴퓨터에 접근할 때 사용하는 비밀번호라고 생각하면 된다. 말 그대로 열쇠(Key, 키)의 역할을 한다. [실습] 3. EC2 셋팅하기 - 보안그룹 설정네트워크 설정네트워크 설정 칸을 보면 VPC와 Security Groups(보안 그룹)가 보인다. 여기서 VPC라는 개념은 AWS를 입문하는 입장에서는 크게 중요하지 않으니 넘어가자. 나중에 AWS에 어느 정도 익숙해졌을 때 VPC를 학습하도록 하자. VPC를 몰라도 서버를 배포하는 데 아무 문제가 없다. 하지만 Security Groups(보안 그룹)은 서버를 배포할 때 중요한 개념이므로 자세히 알아보자. 보안 그룹(Security Group)이란?보안 그룹(Security Group)이란 AWS 클라우드에서의 네트워크 보안을 의미한다. EC2 인스턴스를 집이라고 생각한다면, 보안 그룹은 집 바깥 쪽에 쳐져있는 울타리와 대문이라고 생각하면 된다. 집에 접근할 때 울타리의 대문에서 접근해도 되는 요청인지 보안 요원이 검사를 하는 것과 비슷하다. EC2 인스턴스 주위에 방화벽 역할을 할 보안 그룹(Security Group)을 만들고 보안 그룹에 규칙을 지정한다. 이 보안 규칙에는 인바운드 트래픽(즉, 외부에서 EC2 인스턴스로 보내는 트래픽)에서 어떤 트래픽만 허용할 지 설정할 수 있고, 아웃바운드 트래픽(즉, EC2 인스턴스에서 외부로 나가는 트래픽)에서 어떤 트래픽만 허용할 지 설정할 수 있다. 보안 그룹을 설정할 때는 허용할 IP 범위와 포트(port)를 설정할 수 있다. 보안 그룹 설정외부에서 EC2로 접근할 포트는 22번 포트와 80번 포트라고 생각해서 이 2가지에 대해 인바운드 보안 그룹 규칙을 추가했다. 왜냐하면 22번 포트는 우리가 EC2에 원격 접속할 때 사용하는 포트이고, 80번 포트에는 백엔드 서버를 띄울 예정이기 때문이다. 그리고 어떤 IP에서든 전부 접근할 수 있게 만들기 위해 소스 유형은 위치 무관으로 설정했다. [실습] 4. EC2 셋팅하기 - 스토리지 구성EC2도 하나의 컴퓨터이다보니 여러 파일들을 저장할 저장 공간이 필요하다. 이 저장 공간을 보고 EBS(Elastic Block Storage)라고 부른다. 즉, EBS란 EC2 안에 부착되어 있는 일종의 하드디스크라고 생각하면 된다. EBS와 같은 저장 공간을 조금 더 포괄적인 용어로 스토리지(Storage), 볼륨(Volume)이라고 부른다. 가성비가 좋은 gp3를 선택해주자. 용량을 30GiB를 설정한 이유는 프리 티어에서 30GiB까지 무료로 제공해주기 때문이다. 이 스토리지의 크기는 추후에 늘릴 수도 있으므로 처음 설정할 때 너무 큰 고민을 할 필요는 없다. [실습] 5. EC2 접속하기생성된 인스턴스 정보 해석하기세부 정보에서 눈여겨 봐야 할 부분은 2가지 밖에 없다. 퍼블릭 IPv4 주소와 인스턴스 상태이다.퍼블릭 IPv4 주소는 EC2 인스턴스가 생성되면서 부여받은 IP 주소이다. EC2 인스턴스에 접근하려면 이 IP 주소로 접근하면 된다.인스턴스 상태는 말그대로 EC2 인스턴스가 실행 중이라는 뜻은 컴퓨터가 켜져있다는 뜻이다.EC2 인스턴스를 중지, 재부팅, 종료도 할 수 있다. 우리가 쓰는 컴퓨터와 아주 유사하다. 재부팅은 말그대로 컴퓨터를 재시작시키는 걸 의미하고, 중지는 컴퓨터를 잠시 꺼놓는 걸 의미한다. 종료는 컴퓨터를 아예 삭제시킨다는 걸 의미한다.EC2 인스턴스를 한 번 종료하면 도중에 취소할 수 없으니 조심해야 한다. 보안(보안 그룹)인스턴스 생성 시 설정한 보안 그룹에 대한 정보가 나온다. 네트워크퍼블릭 IPv4 주소는 생성한 EC2 인스턴스의 IP 주소를 뜻한다. 스토리지인스턴스 생성 시 설정한 스토리지에 대한 정보가 나온다. 모니터링EC2 인스턴스에 관련한 여러가지 정보를 볼 수 있는 창이다. AWS를 처음 입문할 때는 자주 볼 일이 없는 창이지만, 나중에 실제 서버를 운영할 때는 자주 보게되는 창이다. EC2 인스턴스가 정상적으로 작동하고 있는 지, EC2 인스턴스의 성능을 향상시켜주어야 하는 건 아닌 지 아래 지표를 통해 파악할 수 있다. [실습] 6. 탄력적 IP 연결하기EC2 인스턴스를 생성하면 IP를 할당받는다. 하지만 이렇게 할당받은 IP는 임시적인 IP이다. EC2 인스턴스를 잠깐 중지시켰다가 다시 실행시켜보면 IP가 바뀌어있다. EC2 인스턴스를 중지시켰다가 다시 실행시킬 때마다 IP가 바뀌면 굉장히 불편하다. 그래서 중지시켰다가 다시 실행시켜도 바뀌지 않는 고정 IP를 할당받아야 한다. 현업에서도 EC2 인스턴스를 생성하면 탄력적 IP를 대부분 필수적으로 설정한다. [실습] 7. Express 서버를 EC2에 배포하기Ubuntu 환경에서 Node.js 설치하는 법Ubuntu 환경에서 Express 서버를 실행시키려면 Node.js가 설치되어 있어야 한다. 그래서 Ubuntu에 우선 Node.js를 설치해보자.sudo su apt-get update && / apt-get install -y ca-certificates curl gnupg && / mkdir -p /etc/apt/keyrings && / curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg && / NODE_MAJOR=20 && / echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" | sudo tee /etc/apt/sources.list.d/nodesource.list && / apt-get update && / apt-get install nodejs -y 잘 설치됬는지 확인node -v github로 Express 프로젝트 clone하기 git clone https://github.com/JSCODE-EDU/ec2-express-sample cd ec2-express-sample npm i .env파일 직접 만들기.env와 같은 민감한 파일은 Git으로 버전 관리를 하지 않는게 일반적이다. 따라서 .env 파일은 별도로 EC2 인스턴스에 올려주어야 한다. 하지만 .env 파일을 EC2 인스턴스에 올리는 작업보다는, .env 파일을 직접 만드는 게 훨씬 간단하다..envDATABASE_NAME=my_databasepm2 설치해서 서버 실행시키기Node 기반의 서버는 pm2를 활용해서 많이 실행시킨다. 서비스를 운영하는 데 있어서 유용한 기능들을 pm2가 많이 가지고 있기 때문이다. sudo npm i -g pm2 sudo pm2 start app.js잘 작동되는지 확인 pm2 정지하기# pm2로 실행중인 프로젝트에 대한 앱 이름 확인 sudo pm2 list # sudo pm2 stop [앱 이름] sudo pm2 stop app Spring Boot 서버를 EC2에 배포하기Ubuntu 환경에서 JDK 설치하는 법sudo apt update && / sudo apt install openjdk-17-jdk -y잘 설치 됬는지 확인java -versionGithub로부터 Spring Boot 프로젝트 clone 하기git clone https://github.com/JSCODE-EDU/ec2-spring-boot-sample.git cd ec2-spring-boot-sampleapplication.yml 파일 직접 만들기application.yml와 같은 민감한 정보가 포함된 파일은 Git으로 버전 관리를 하지 않는게 일반적이다. 따라서 application.yml 파일은 별도로 EC2 인스턴스에 올려주어야 한다. 하지만 application.yml 파일을 EC2 인스턴스에 올리는 작업보다는, application.yml 파일을 직접 만드는 게 훨씬 간단하다.src/main/resources/application.ymlserver: port: 80서버 실행하기 ./gradlew clean build # 기존 빌드된 파일을 삭제하고 새롭게 JAR로 빌드 cd ~/ec2-spring-boot-sample/build/libs sudo java -jar ec2-spring-boot-sample-0.0.1-SNAPSHOT.jar참고) 백그라운드에서 Spring Boot 실행하기sudo nohup java -jar ec2-spring-boot-sample-0.0.1-SNAPSHOT.jar & 잘 작동되는 지 확인. 비용 나가지 않게 EC2 깔끔하게 종료하기EC2 인스턴스 종료하기탄력적 IP 릴리스하기

Depth

인프런 워밍업 클럽 스터디 2기 - 백엔드 클린코드, 테스트코드 4주차 발자국

 Section7) Mock을 마주하는 자세Test Double의 종류1) Dummy : 아무것도 하지 않는 깡통 객체2) Fake : 단순한 형태로 동일한 기능은 수행하나, 프로덕션에서 쓰기에는 부족한 객체 (ex, FakeRepository)3) Stub : 테스트에서 요청한 것에 대해 미리 준비한 결과를 제공하는 객체, 그 외에는 응답하지 않는다. //상태 검증 (State Verification)4) Spy : Stub이면서 호출된 내용을 기록하여 보여줄 수 있는 객체, 일부는 실제 객체처럼 동작시키고 일부만 Stubbing할 수 있다,5) Mock : 행위에 대한 기대를 명세하고, 그에 따라 동작하도록 만들어진 객체 //행위 검증 (Behavior Verification).BDDMockitoBDDMockito는 Mockito에서 BDD 스타일에 맞추어 모든것의 이름만 바꾼 것이다.일례로 given 구역에 .when()을 쓰면 이질감이 들기 떄문에 BDDMockito가 생긴 것이다..Classicist VS Mockist1) Classicist- 꼭 필요한 경우에만 mocking을 쓰고 왠만하면 진짜 객체로 테스트 하자는 주의이다.2) Mockist- 모든 것을 Mocking 위주로 하여 테스트 하자는 주의이다..Section8) 더 나은 테스트를 작성하기 위한 구체적 조언1) 한 문단에 한 주제!- DisplayName을 한 문장으로 구성할 수 있어야 한다~!2) 완벽하게 제어하기3) 테스트 환경의 독립성을 보장하자- 테스트에서는 팩토리 메서드를 지양하고 Buider나 생성자를 통해 최대한 독립성을 보장해서 given절을 구성하는게 좋다.4) 테스트 간 독립성을 보장하자- 테스트간의 공유자원 사용하지 않기.- 테스트간의 독립성 보장하기~!5) 한 눈에 들어오는 Test Fixture 구성하기- Fixture : 고정룰, 고정되어 있는 물체- Test Fixture : 테스트를 위해 원하는 상태로 고정시킨 일련의 객체6) Test Fixture 클렌징- @Transactional, @rollback 방식과 deleteAllInBatch(), deleteAll() 등을 잘 알고 사용해야 한다.7) @ParameterizedTest8) @DynamicTest9) 테스트 수행도 비용이다. 환경 통합하기- @DataJPATest 보다 @SpringbootTest 사용을 권장한다.- 컨트롤러(통합) 테스트시 @WebMvcTest의 Controllers 옵션을 통해 특정 컨트롤러들만 지정하여 테스트해줌으로써 테스트 수행 비용을 줄여준다.10) private 메서드는 테스트할 필요가 없다.11) 테스트에서만 필요한 메서드 중 생성자 등은 프로덕션 코드에 생성해도 좋다..Section9) AppendIx1) 학습 테스트- 잘 모르는 기능, 라이브러리, 프레임워크를 학습하기 위해 작성하는 테스트- 여러 테스트 케이스를 스스로 정의하고 검증하는 과정을 통해 보다 구체적인 동작과 기능을 학습할 수 있다.- 관련 문서만 읽는 것보다 훨씬 재미있게 학습할 수 있다.2) Spring Rest Docs- 테스트 코드를 통한 API 문서 자동화 도구- API 명세를 문서로 만들고 외부에 제공함으로써 협업을 원활하게 한다.- 장점→ 테스트를 통과해야 문서가 만들어진다 (신뢰도가 높다)→ 프로덕션 코드에 비침투적이다.- 단점→ 코드 양이 많다.→ 설정이 어렵다..Day-15 Mission) 레이어드 아키텍처에서의 테스트 코드 작성강의로 배운 레이어드 아키텍처 관련 내용을 확장시켜 정리할 수 있어 좋았다.과제 Link.Day-18 Mission) Test Double 어노테이션 이해 및 테스트 항목 배치@Mock, @MockBean, @Spy, @SpyBean, @InjectMocks의 차이점을 정리하고 given-when-then 전략으로 테스트 코드 배치 방법을 고민해 볼 수 있어 좋았다.과제 Link..회고오늘로써 인프런 워밍업 클럽 스터디 2기 대장정이 마무리 되었다.클린코드와 테스트코드는 누구나 중요성을 알지만, 혼자서 공부하기 쉽지 않은 부분이다.강의를 완벽하게 이해하지는 못했지만, 강의를 통해 Clean Code와 Test Code에 한 발자국 더 다가갈 수 있었고, 실무에도 점차적으로 적용 해보면서 뜻 깊은 경험을 할 수 있었다.다음에 인프런 스터디 3기가 열린다면 재참여를 고려해 봐야겠다마지막으로 강의와 스터디를 만들어주신 박우빈님과 스터디 관리에 힘써주신 셰리 매니저님께 감사의 마음을 전합니다..출처https://inf.run/jsvaAhttps://inf.run/kHiWM   

백엔드워밍업클럽테스트코드2기depthmy

Docker Compose를 활용해 2개 이상의 컨테이너 관리하기

[실습] MySQL, Redis 컨테이너 동시에 띄워보기Docker Compose로 MySQL, Redis 실행시키기compose.ymlservices: my-db: image: mysql environment: MYSQL_ROOT_PASSWORD: pwd1234 volumes: - ./mysql_data:/var/lib/mysql ports: - 3306:3306 my-cache-server: image: redis ports: - 6379:6379 compose 파일 실행 및 삭제docker compose up -d docker compose ps docker compose down [실습] Spring Boot, MySQL 컨테이너 동시에 띄워보기application.ymlspring: datasource: url: jdbc:mysql://localhost:3306/mydb username: root password: pwd1234 driver-class-name: com.mysql.cj.jdbc.DriverDockerfileFROM openjdk:17-jdk COPY build/libs/*SNAPSHOT.jar /app.jar ENTRYPOINT ["java", "-jar", "/app.jar"]compose.ymlservices: my-server: build: . ports: - 8080:8080 # my-db의 컨테이너가 생성되고 healthy 하다고 판단 될 때, 해당 컨테이너를 생성한다. depends_on: my-db: condition: service_healthy my-db: image: mysql environment: MYSQL_ROOT_PASSWORD: pwd1234 MYSQL_DATABASE: mydb # MySQL 최초 실행 시 mydb라는 데이터베이스를 생성해준다. volumes: - ./mysql_data:/var/lib/mysql ports: - 3306:3306 healthcheck: test: [ "CMD", "mysqladmin", "ping" ] # MySQL이 healthy 한 지 판단할 수 있는 명령어 interval: 5s # 5초 간격으로 체크 retries: 10 # 10번까지 재시도Spring Boot 프로젝트 빌드 및 compose 파일 실행./gradlew clean build docker compose up -d --buildcompose 실행 현황 보기docker compose ps docker logs [Container ID]Spring Boot 컨테이너의 로그를 열어보면 아래와 같이 에러 메시지가 떠있다. 아래 에러 메시지는 DB와 연결이 제대로 이루어지지 않았을 때 발생하는 에러이다.MySQL이 정상적으로 실행이 안 되고 있는 건지 확인하기 위해 DB GUI 툴(ex. Workbench, Datagrip, DBeaver 등)을 활용해 DB 연결을 해보자. MySQL에 연결을 시도해보면 정상적으로 연결이 잘 되는 걸 확인할 수 있다. 컨테이너로 실행시킨 Spring Boot가 MySQL에 연결이 안 되는 이유각각의 컨테이너는 자신만의 네트워크망과 IP 주소를 가지고 있다. 호스트 컴퓨터 입장에서 localhost는 호스트 컴퓨터를 가리키지만, Spring Boot 컨테이너 입장에서 localhost는 Spring Boot 컨테이너를 가리킨다. 그런데 Spring Boot의 코드를 작성할 때 DB 정보를 아래와 같이 입력했었다. Spring Boot가 실행되는 환경인 컨테이너 입장에서 localhost:3306라는 주소는, Spring Boot 컨테이너 내부에 있는 3306번 포트와 연결을 시도하게 된다. 하지만 Spirng Boot가 실행되는 컨테이너 내부의 3306번 포트에는 아무것도 실행되고 있지 않다. 이러한 구조상의 문제 때문에 Spring Boot가 MySQL에 연결이 안 되고 있었던 것이다. application.ymlspring: datasource: url: jdbc:mysql://localhost:3306/mydb username: root password: pwd1234 driver-class-name: com.mysql.cj.jdbc.Driver-- compose.yml에서 정의한 Service 이름으로 서로 통신할 수 있다. 바로 예시로 알아보자. Spring Boot의 DB 정보를 아래와 같이 수정한 뒤 시도해보기application.ymlspring: datasource: url: jdbc:mysql://my-db:3306/mydb username: root password: pwd1234 driver-class-name: com.mysql.cj.jdbc.Driver 이전에 작성했던 compose.yml을 보면 각 컨테이너에 service 이름(my-server, my-db)을 작성했었다. compose.ymlservices: my-server: build: . ports: - 8080:8080 depends_on: my-db: condition: service_healthy my-db: image: mysql environment: MYSQL_ROOT_PASSWORD: pwd1234 MYSQL_DATABASE: mydb volumes: - ./mysql_data:/var/lib/mysql ports: - 3306:3306 healthcheck: test: [ "CMD", "mysqladmin", "ping" ] interval: 5s retries: 10이 service 이름이 컨테이너의 주소를 뜻한다. 해당 컨테이너의 IP 주소와 같은 역할을 한다. 위와 같이 코드를 수정한 뒤에 다시 한 번 컨테이너를 실행시켜보자. ./gradlew clean build docker compose down docker compose up --build -d docker ps # 정상적으로 Spring Boot, MySQL이 실행된 걸 확인할 수 있다.  [실습] Spring Boot, MySQL, Redis 컨테이너 동시에 띄워보기Spring Boot 프로젝트에 Redis 연결 코드 추가하기build.gradle... dependencies { ... implementation 'org.springframework.boot:spring-boot-starter-data-redis' } application.ymlspring: datasource: url: jdbc:mysql://my-db:3306/mydb username: root password: pwd1234 driver-class-name: com.mysql.cj.jdbc.Driver data: redis: host: localhost port: 6379RedisConfig@Configuration public class RedisConfig { @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) { RedisTemplate<String, Object> template = new RedisTemplate<>(); template.setConnectionFactory(connectionFactory); template.setKeySerializer(new StringRedisSerializer()); template.setValueSerializer(new GenericJackson2JsonRedisSerializer()); return template; } }AppController@RestController public class AppController { @Autowired private RedisTemplate<String, Object> redisTemplate; @GetMapping("/") public String home() { redisTemplate.opsForValue().set("abc", "def"); return "Hello, World!"; } }compose.ymlservices: my-server: build: . ports: - 8080:8080 depends_on: my-db: condition: service_healthy my-cache-server: condition: service_healthy my-db: image: mysql environment: MYSQL_ROOT_PASSWORD: pwd1234 MYSQL_DATABASE: mydb volumes: - ./mysql_data:/var/lib/mysql ports: - 3306:3306 healthcheck: test: [ "CMD", "mysqladmin", "ping" ] interval: 5s retries: 10 my-cache-server: image: redis ports: - 6379:6379 healthcheck: test: [ "CMD", "redis-cli", "ping" ] interval: 5s retries: 10Docker 컨테이너로 띄워보기 ./gradlew clean build docker compose down docker compose up --build -d위 명령어를 통해 컨테이너를 띄운 뒤에 localhost:8080으로 요청을 해보면 아래와 같은 에러가 발생한다.connection refused에러가 발생한 이유는 Redis와 연결이 잘 안 됐기 때문이다. 왜 안됐는 지application.yml파일을 확인 application.ymlspring: datasource: url: jdbc:mysql://my-db:3306/mydb username: root password: pwd1234 driver-class-name: com.mysql.cj.jdbc.Driver data: redis: host: my-cache-server port: 6379각 컨테이너는 각자의 네트워크를 가지고 있기 때문에, localhost가 아니라 Redis가 실행되고 있는 컨테이너로 통신을 해야 한다. Redis가 실행되고 있는 컨테이너의 주소는 service 이름으로 표현한다고 했다. compose.yml에서 Redis가 실행되고 있는 컨테이너의 service 이름을 my-cache-server라고 이름 붙였다. 다시 실행 ./gradlew clean build docker compose down docker compose up --build -d 

Depth

인프런 워밍업 클럽 스터디 2기 - 백엔드 클린코드, 테스트코드 3주차 발자국

 3주차부터 Practical Testing (실용적인 테스트 가이드) 강의로 넘어가게 되었다.  Section1) Intro강의에서 학습하게 될 것1) 테스트 코드가 필요한 이유2) 좋은 테스트 코드란?3) 실제 실무에서 진행하는 방식 그대로 테스트를 작성해가면서 API를 설계하고 개발하는 방법4) 정답은 없지만, 오답은 있다! 구체적인 이유에 근거한 상세한 테스트 작성 팁 Section2) 테스트는 왜 필요할까?1) 테스트는 왜 필요할까?- 테스트 코드를 작성하지 않는다면 코드의 변화가 생기는 매 순간마다 발생할 수 있는 모든 Case를 고려해야 한다..2) 테스트 코드가 병목이 된다면?- 테스트코드 자체가 유지보수하기 어려워진다.- 잘못된 검증이 이루어질 가능성이 생긴다..3) 올바른 테스트 코드는?- 자동화 테스트로 비교적 빠른 시간 안에 버그를 발견할수 있고, 수동 테스트에 드는 비용을 크게 절약할 수 있다. Section3) 단위 테스트Junit5로 테스트하기1) 단위 테스트- 작은 (ex, 클래스 or 메서드) 코드 단위를 독립적으로 검증하는 테스트- 검증속도가 빠르고, 안정적이다.2) Junit5- 단위 테스트를 위한 테스트 프레임워크- XUnit - Kent Back, - Sunit (Samltalk), Junit(Java), NUnit(.NET)- Spring-boot-starter-test 라이브러리를 통해 사용 가능하다..3) AssertJ- 테스트코드 작성을 원활하게 돕는 테스트 라이브러리- 풍부한 API, 메서드 체이닝 지원- Spring-boot-starter-test 라이브러리를 통해 사용 가능하다.테스트 케이스 세분화1) 해피 케이스- 요구사항을 그대로 만족하는 케이스- 경계값 테스트 : 범위 (이상, 이하, 초과, 미만), 구간, 날짜 등이 중요.2) 예외 케이스- 경계값 테스트 : 범위 (이상, 이하, 초과, 미만), 구간, 날짜 등이 중요.테스트하기 어려운 영역 분리하기1) 테스트하기 어려운 영역- 관측할때마다 다른 값에 의존하는 코드→ 현재 날짜/시간, 랜덤 값, 전역변수/함수, 사용자 입력 등- 외부 세계에 영향을 주는 코드→ 표준 출력, 메시지 발송, 데이터베이스에 기록하기 등.2) 순수 함수 - 테스트하기 쉬운 코드- 같은 입력에는 항상 같은 결과- 외부 세상과 단절된 형태- 테스트하기 쉬운 코드  Section4) TDDTDD (Test Driven Development)1) TDD- 프로덕션 코드보다 테스트 코드를 먼저 작성하여 테스트가 구현 과정을 주도하도록 하는 방법론.2) TDD의 핵심 가치-기존) 선 기능 구현, 후 테스트 작성의 문제점→ 테스트 자체의 누락 가능성→ 특정 테스트(==해피 케이스) 케이스만 검증할 가능성→ 잘못된 구현을 다소 늦게 발견할 가능성- TDD) 선 테스트 작성, 후 기능 구현→ 복잡도가 낮은(==유연하며 유지보수가 쉬운), 테스트 가능한 코드로 구현할 수 있게 한다.→ 쉽게 발견하기 어려운 엣지(Edge) 케이스를 놓치지 않게 해준다.→ 구현에 대한 빠른 피드백을 받을 수 있다.→ 과감한 리팩토링이 가능해진다.Section5) 테스트는 [문서]다테스트는 [문서]다1) 테스트 == 문서- 프로덕션 기능을 설명하는 테스트 코드 문서- 다양한 테스트 케이스를 통해 프로덕션 코드를 이해하는 시각과 관점을 보완- 어느 한 사람이 과거에 경험했던 고민의 결과물을 팀 차원으로 승격시켜서, 모두의 자산으로 공유.DisplayName을 섬세하게1) DisplayNamed을 섬세하게 적기- 메서드 자체의 관점보다 도메인 정책 관점으로, 도메인 용어를 사용하여 한층 추상화된 내용을 담기- 테스트의 현상(ex, 성공한다… 실패한다 등)을 중점으로 기술하지 말 것.BDD 스타일로 작성하기1) BDD (Behavior Driven Development)- TDD에서 파생된 개발 방법으로- 함수 단위의 테스트에 집중하기보다, 시나리오에 기반한 테스트케이스(TC) 자체에 집중하여 테스트하는 기법- Given / When / Then 방식 사용→ Given : 시나리오 진행에 필요한 모든 준비 과정 (객체, 값, 상태 등)→ When : 시나리오 행동 진행→ Then : 시나리오 진행에 대한 결과 명시, 검증.Mission 12) 단위 테스트 작성studycafe 프로젝트에서 InputHandler, StudyCafePassOrder, StudyCafeSeatPass 클래스에 대한 테스트 코드를 작성하였다.고민했던 점으로는 Scanner를 통해 사용자 입력을 받는 로직을 테스트하기 위해 Mock을 사용할 수 있지만, Mock 대신 InputStream과 System.setIn()을 통해 입력해주는 방식을 선택했다.작은 메서드 단위로 단위 테스트를 진행하니 코드도 복잡해지지 않고 간결하여 테스트 하기가 수월하였다.Github Code. Section6) Spring & JPA 기반 테스트레이어드 아키텍처(Layered Architecture)1) Layered Architecture- Presentation Layer, Business Layer, Persistence Layer로 구분- 아키텍처를 분리하는 이유 : 관심사의 분리.Spring / JPA 훑어보기 & 기본 엔티티 설계1) Library vs Framework- Library : 외부에서 이미 개발된 코드를 가져온다. (내 코드가 주체가 되어 동작)- Framework : 이미 동작하는 환경이 구성되어 있고, 내 코드는 프레임안에서 수동적으로 동작.2) Spring- IoC (inversion of Control) : 객체의 생성과 의존성 관리를 프레임워크에서 대신 수행- DI (Dependency Injection) : 외부에서 객체 간의 의존성 주입을 통해 결합도를 낮춰줌- AOP (Aspect Oriented Programming) : 공통 관심사를 별도의 로직으로 분리해 코드 중복을 줄여주고 모듈화.3) JPA-Java Persistance API- Java 진영의 ORM 기술 표준- 반복적인 CRUD SQL을 생성 및 실행해주고, 여러 부가 기능들을 제공- Spring 진영에서는 JPA를 한번 더 추상화한 Spring Data JPA 제공- 주로 사용되는 어노테이션들→ @Entity, @Id, @Column→ @ManyToOne, @OneToMany, @OneToOne, @ManyToMany. Layer별 테스트1) Persistence Layer- Data Access의 역할- 비즈니스 가공 로직이 포함되어서는 안됨, Data에 대한 CURD에만 집중한 레이어.2) Business Layer- 비즈니스 로직을 구현하는 역할- Persistence Layer와의 상호작용(Data를 읽고 쓰는 행위)를 통해 비즈니스 로직을 전개- 트랜잭션을 보장.3) Presentation Layer- 외부 세계의 요청을 가장 먼저 받는 계층- 파라미터에 대한 최소한의 검증을 수행.회고- 테스트 코드 작성을 의무적으로 작성 하지 않는 환경에서 일을 해왔는데, 스터디를 진행하면서 단위 테스트 코드 작성의 중요성과 필요성을 깨달았다. 모든 예외 케이스를 조기에 발견해서 대처할 순 없겠지만 내가 작성한 코드 범위내에서 테스트가 필요한 영역들을 분리하여 로직이 의도한 대로 동작하는지 검증하는 작업은 백엔드 개발자의 숙명이라는 생각이 들었다.이제 Mock과 테스트 방법론에 대한 강의가 남아있는데, 마지막 주차도 지금처럼 묵묵히 학습해 나갈 것이다.출처https://inf.run/jsvaAhttps://inf.run/kHiWM      

백엔드워밍업클럽테스트코드2기depthmy

채널톡 아이콘