웹 프로그래밍

    DNS의 개념 (feat. Route53 왜 쓰는가)

    일반적으로 DNS를 사용하는 것과 Route53 쓰는게 뭐가 다른건지 궁금했다. 그전에 DNS의 개념부터 명확히 하고가려한다. (참고 -wjd489898.log) https://velog.io/@wjd489898/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-DNS [네트워크] DNS 웹 사이트의 IP 주소와 도메인 주소를 이어주는 환경/시스템사람이 읽을 수 있는 도메인 이름(예: www.amazon.com)을 머신이 읽을 수 있는 IP 주소(예: 192.0.2.44)로 변환브라우저에서 Nesite.com 검색. DNS velog.io 1. DNS(Domain Name System) 와 네임서버의 개념 DNS는 범국제적 단위로 웹사이트의 IP주소와 도메인 주소를 이어주는 환경/시스템이..

    Server Error (500)

    조졌다 서버가 터졌다 디비 모델을 바꾸다가 실수로 디폴트값을 없애면 이미 남아있는 이미 웹페이지에 등록되어 있는 데이터베이스들이 있을 텐데 거기서 깨지는 경우가 몇가지 있다. 그런경우 뜨게 된다면 500 서버에러가 뜨게 될것이다. 라고 누가 말하고 갔는데 그 경우인 것 같다. 500 서버에러의 큰 이유 2가지) 1. 로컬에서 그 환경을 확인해봐라. 그럼 똑같이 깨질 확률이 일단 높다. django에서 나타나는 에러페이지를 디버그를 꺼놨기 때문에 보이지는 않지만 그걸 나타내는게 500에러인데 생각해보니까 전에 오커넥트 디플로이할때 500에러를 만난적이 있다. 해당 경우가 이 경우였는데 이건 로컬에서 테스트하고 올린건데 음 -> 일단 그 이미지를 날려라. 그 이미지에 버그가 있다는거니까 날리고 이미지 버전을..

    Docker Error (file not found or excluded by .dockerignore)

    docker image를 빌드하는 중 이와 같은 에러를 만났다. Ubuntu 18.04 x64 를 사용하고 있으며 Github private repository에서의 RSA key 인증을 테스트하는 중 발생하였다. 해당 문제에 대해 정리한다. 빌드 명령: docker build -t django_web:1 . 경로에 Dockerfile은 존재하는 상태이다. /proc/57119/fd/7 을 찾을수없거나 .dockerignore때문이라는데 dockerignore는 안쓰고 1. 경로문제거나 2. 모르겠다, 우선 무슨 파일인지 확인해보고자한다. /proc : 일종의 가상 파일시스템으로 동작 중인 프로세스의 상태정보, 하드웨어 정보, 시스템 정보 등을 알 수 있다. 그렇단다. /proc/[PID]/fd(file..

    HTTPS/SSL 적용 (Let's encrypt)

    let's encrypt로 인증서를 발급하고 만료가 3개월이기 때문에 이에 맞춰 갱신 자동화까지 시도해보도록한다. * Application:Docker on Ubuntu 20.04 x64 * url : oconnect.kr > /var/log/letsencrypt/renew.log (분 시 일 월 요일) => 매월 1일 4시 1분에 갱신하고싶음. 1 4 1 * *

    Real-time Django with Channels

    필요해서 정리해본다. Django3는 asynchronous view 나 middleware를 지원하지 않는다. 하지만 Django Channels를 사용하면 연결과 소켓을 비동기적으로 처리하는 것이 가능하다. https://channels.readthedocs.io/en/latest/index.html#django-channels Django Channels — Channels 3.0.3 documentation Channels is a project that takes Django and extends its abilities beyond HTTP - to handle WebSockets, chat protocols, IoT protocols, and more. It’s built on a Pytho..

    AWS 요금정리

    EC2를 사용할 때 가장 흔하게 t2.micro 프리티어를 사용한다. cpu 성능을 제공하는 방식이 조금 특별하다. 일반적으로 CPU 성능이 정해져있어서 24시간 같은 성능을 제공할 것이라 생각하지만, T계열 인스턴스들은 기본 성능을 제공하다가, 유저들이 몰리거나 하는 등 기준 이상의 성능이 필요할 경우 버스트 기능이 동작하게 된다. 물론, 공짜는 아니고 인스턴스 사양마다 제공되는 크레딧이 다르고 그 크레딧이 남아있는 동안 버스트 기능을 사용할 수 있다. 기준 이하 성능 사용을 지속할 경우 크레딧이 쌓이고(한계치 있음), 그 이상의 성능을 사용할 경우 크레딧을 소모시킨다. 크레딧이 다 소모되면, 기준 이상의 성능을 발휘하지 못하고 성능은 급격히 떨어지게 된다. 평소에는 CPU사용률 저조하다가 특정 시간대..

    Django form에 대한 정리

    HTML HTML에서 은 웹사이트를 사용하는 사용자가 데이터를 입력할 수 있도록 하고 서버로 데이터를 보내는 역할을 제공한다. 폼은 2가지 정보를 담고 있어야한다. 1) 서버로 보낼때 어디로 보낼지 2) HTTP 방법 명시. 데이터를 보낼때 HTTP 방법은 POST방식으로 보내기 되어 POST를 입력해준다. 예를 들어 아래를 보면 submit이 트리거가 되어 사용자가 Log in 버튼을 누르면 데이터가 전송이 되는 것이다. DJANGO 폼을 핸들링한다는 것은 사용자를 위해 수많은 타입의 데이터 항목들을 필요로하고 화면에 보여야하며 이런 값들은 다시 서버로 보내진다. 이후에도 값에 대한 유효성겁증을 필요로 하며 검증 이후 데이터를 처리하는 로직도 필요하다. 장고 폼은 이런 작업에 대한 단순화와 자동화를 제..

    Django Transaction

    트랜잭션(Transaction)이란 데이터베이스의 상태를 변환시키려는 작업의 단위를 의미한다. 트랜잭션의 목적은 데이터베이스 완전성(integrity)의 유지에 있다. 데이터베이스를 저장하고 수정하는 여러작업을 하나의 쿼리로 처리할 수 없기 때문에 여러개의 쿼리로 나누어 실행하는데, 그 결과의 원자성을 보장하기 위해 동일한 DB connection 객체를 이용하는 기술이라 볼 수 있다. 즉 하나의 실행단위로, 존재하는 중간 과정들에 대해서 모두 성공하면 데이터베이스의 상태가 변하게 되고, 중간에 실패하면 기존에 작업들 모두 RollBack된다. Transaction의 4가지 특성 (ACID) 원자성 (Atomicity) 모두 실패하거나, 모두 완성되거나 둘 중 하나의 상태만 존재한다. 100개 명령어로 ..

    GET과 POST 정리

    현재 이해하고 있는 내용과는 별개로 뭘 언제써야하는지는 계속 확 와닿지를 않는다. 간단하게 알고있는 부분은 아래와 같다. GET과 POST는 HTTP 프로토콜을 이용해 서버에 데이터를 전달할때 사용하는 방식이다. GET은 주소뒤 ? 뒤에 값이 붙어 전달되고 POST는 body안에 보내진다 GET은 URL뒤에 값이 붙는거기때문에 길이제한이 있지만 POST는 그렇지않아 많은 데이터를 보내기 적합하다. 주소뒤에 붙어서 가는건 GET, form이용해서 submit하는건 POST 하지만 여기서 고민하고자하는것은 그래서 언제 GET쓰고 언제 POST쓰는가? 이다. 사실 글을 작성하는 정도면 POST, 그럭저럭해보이면 대충 GET을 쓰면 되겠다 싶었다. 하지만 용도구분없이 혼용하는 일이 잦아지기전에 구분해두려한다. ..

    Django Model - OneToOneField

    * OneToOneField와 ForeignKey의 차이 OneToOneField와 ForeignKey(model, unique=True)는 개념적으로 같다. 둘의 차이는 역관계(reverse relationship)에 있다. One-to-one 모델의 역참조는 하나의 객체(single object) 를 반환하지만, ForeignKey의 역참조는 QuerySet 을 반환한다. OneToOneField 언제쓰나? 예를 들어 1명의 유저는 하나의 프로필만을 가져야한다고 강제한다면 사용할 수 있다. ()첫번째 테이블이 User, 두번째 테이블은 Profile. 두번째 테이블은 반드시 첫번째 테이블과 한번만 매칭된다. class Profile(models.Model): user = models.OneToOneF..