Week4 회고

이태성·2022년 4월 4일
0

항해99

목록 보기
4/9

서론

이번주에는 https에 대한 공부를 주로 하였고, 간단한 구현까지 해보는 시간을 가졌다. 그리고 ORM이 무엇인지 SQL과 noSQL의 차이는 무엇이고 장단점은 무엇인지 간략히 정리할 생각이다.
순서는 아래와 같다.

  • SQL
  • noSQL
  • ORM
  • https

본론

1. SQL(Structuerd Query Language)

  • 특징

    • 보통 데이터베이스 그 자체를 의미한다고 알고 있지만, 정확히는 특정유형의 데이터베이스와 상호 작용하는데 사용되는 쿼리 언어이다.
    • 데이터를 사전에 정의한 데이터 스키마에 따라 데이터베이스 테이블에 저장된다.
    • 데이터는 관계를 통하여 연결된 여러개의 테이블에 분산된다.
    • 데이터들을 여러개의 테이블에 나누어서 중복을 피할 수 있다.
      다음과 같이 하나의 테이블에서 중복없이 하나의 테이터만을 관리하기 때문에, 다른 테이블에서 부정확한 데이터를 다룰 위험이 없다.
  • 사용기준

    • 관계를 맺고 있는 데이터가 자주 수정될 어플리케이션일 경우
    • 명확한 스키마가 사용자와 데이터에게 중요한 경우
  • 장점

    • 명확하게 정의된 스키마로 데이터 무결성 보장
    • 데이터를 중복없이 저장가능
    • 한번의 변경으로 여러개의 테이블 데이터를 업데이트 가능하다.
  • 단점

    • 명확하게 정의된 스키마로 인하여 덜 유연한 사용성
    • 프로젝트 규모가 커지게되면 관계성들이 복잡해져서 DB파악을 위한 난이도가 올라갈 수 있음
    • 수평적 확장이 어렵고, 대체로 수직적 확장만 가능하다.
      • 수직적 확장: Scale up 방식으로서, DB서버의 성능을 확장시키는것(성능확장에 한계가 명확하며 비용증가폭이 매우 크다)
      • 수평적 확장: Scale out 방식으로서, DB서버를 여러대 만들어 확장시키는것(각 서버에 걸리는 부하를 균등하게 해주는 로드밸런싱이 필수적으로 동반된다.)

2. noSQL(Not Only Structuerd Query Language)

  • 특징

    • 기본적으로 SQL과 반대되는 접근방식을 따르고 있다.
    • 스키마의 개념이 기본적으로는 없다.(mongoDB의 경우 mongoose와 같은 라이브러리가 스키마를 지원해 주긴 한다.)
    • 데이터의 관계성을 고려하지 않는다.
  • 사용기준

    • 데이터구조가 변경/확장 될 수있는경우
    • 읽기처리를 자주하지만, 데이터 수정처리는 빈번하게 하지 않는 경우(즉, 한번의 수정으로 수십개의 컬렉션을 수정할 필요가 없는 경우)
    • 데이터 베이스를 수평적으로 확장해야하는 경우(즉, 막대한 양의 데이터를 다뤄야 하는 경우)
  • 장점

    • 엄격한 스키마가 전혀 없기때문에 유연하게 접근이 가능하다. 즉, 언제든지 저장된 데이터를 조정하고 새로운 필드를 생성할 수 있다.
    • 데이터는 어플리케이션이 필요로하는 형식으로 저장되어, 읽어오는 속도가 빨라진다.
    • 수직, 수평적 확장이 가능하다.
      • 수직적 확장: Scale up 방식으로서, DB서버의 성능을 확장시키는것(성능확장에 한계가 명확하며 비용증가폭이 매우 크다)
      • 수평적 확장: Scale out 방식으로서, DB서버를 여러대 만들어 확장시키는것(각 서버에 걸리는 부하를 균등하게 해주는 로드밸런싱이 필수적으로 동반된다.)
  • 단점

    • 좋은 유연성은 양날의 검이되어 데이터 구조가 일관되지 않게 저장이 될 우려가 있다.
    • 데이터가 여러 컬렉션(SQL의 테이블)에 중복되어 있으므로, 수정을 해야하는 경우 모든 컬렉션에서 수정작업을 수행해야하는 엄청난 번거로움이 있다.

3. ORM(Object Relational Mapping)

  • 특징

    • 객체 지향적인 코드로 인해 더 직관적이고 비즈니스 로직에 더 집중할 수 있게 도와준다.
      • ORM을 이용하면 SQL Query가 아닌 직관적인 코드(메서드)로 데이터를 조작할 수 있어 개발자가 객체 모델로 프로그래밍하는 데 집중할 수 있도록 도와준다.
      • 선언문, 할당, 종료 같은 부수적인 코드가 없거나 급격히 줄어든다.
      • 각종 객체에 대한 코드를 별도로 작성하기 때문에 코드의 가독성을 올려준다.
      • SQL의 절차적이고 순차적인 접근이 아닌 객체 지향적인 접근으로 인해 생산성이 증가한다.
    • 재사용 및 유지보수의 편리성이 증가한다.
      • ORM은 독립적으로 작성되어있고, 해당 객체들을 재활용 할 수 있다.
      • 매핑정보가 명확하여, ERD(Entity Relationship Diagram)를 보는 것에 대한 의존도를 낮출 수 있다.
        • ERD 예시
    • DBMS에 대한 종속성이 줄어든다.
      • 객체 간의 관계를 바탕으로 SQL을 자동으로 생성하기 때문에 RDBMS의 데이터 구조와 객체지향 모델 사이의 간격을 좁힐 수 있다.
      • 대부분 ORM 솔루션은 DB에 종속적이지 않다.
      • 종속적이지 않다는것은 구현 방법 뿐만아니라 많은 솔루션에서 자료형 타입까지 유효하다.
      • 프로그래머는 Object에 집중함으로 극단적으로 DBMS를 교체하는 거대한 작업에도 비교적 적은 리스크와 시간이 소요된다.
  • 단점

    • 완벽한 ORM 으로만 서비스를 구현하기가 어렵다.
      • 사용하기는 편하지만 설계는 매우 신중하게 해야한다.
      • 프로젝트의 복잡성이 커질경우 난이도 또한 올라갈 수 있다.
      • 잘못 구현된 경우에 속도 저하 및 심각할 경우 일관성이 무너지는 문제점이 생길 수 있다.
      • 일부 자주 사용되는 대형 쿼리는 속도를 위해 SP를 쓰는등 별도의 튜닝이 필요한 경우가 있다.
      • DBMS의 고유 기능을 이용하기 어렵다. (하지만 이건 단점으로만 볼 수 없다 : 특정 DBMS의 고유기능을 이용하면 이식성이 저하된다.)
    • 프로시저가 많은 시스템에선 ORM의 객체 지향적인 장점을 활용하기 어렵다.
      • 이미 프로시저가 많은 시스템에선 다시 객체로 바꿔야하며, 그 과정에서 생산성 저하나 리스크가 많이 발생할 수 있다.
        • 프로시저와 함수의 차이 정리표

4. HTTPS(Hypertext Tranfer Protocol Secure)

  • 정의

    • 월드 와이드 웹 통신 프로토콜인 HTTP의 보안이 강화된 버전이다. HTTPS는 통신의 인증과 암호화를 위해 넷스케이프 커뮤니케이션즈 코퍼레이션이 개발한 넷스케이프 웹 프로토콜이며, 전자 상거래에서 널리 쓰인다.
  • 구현절차 설명방식

    • 소규모 프로젝트시 필요한 약식 절차
    • 회사규모 프로젝트시 필요한 정식 절차 (필자가 해본적이 없어 관련링크만 남기겠다.)
  • 소규모 프로젝트시 필요한 약식 절차(약식이라지만, 처음해보면 큰허들이다..)

    1. HTTP 사이트의 도메인(배포중이여야함)

    2. 웹서버의 SSL 지원여부(node는 'https'라는 라이브러리를 설치하면됨)

    3. SSL 인증서 발급
      3.1. https://manage.sslforfree.com/dashboard 접속 후 도메인 입력하기

      3.2. 90일 무료를 선택(90일이 지나면 3.1부터 다시 똑같은 작업으로 갱신할것)

      3.3 CSR 자동생성

      3.4. 요금은 무료선택!

      3.5. 도메인 인증방식 선택(한마디로 자기 웹서버라는 것을 인증하는것, 필자가 해본 HTTP파일 업로드 방식으로 진행해보자!)
      3.5.1. ~: Download Auth File 클릭
      3.5.2. ~: /.well-known/pki-validation/ 를 Http서버 경로에 3.5.1. 파일을 추가해야 한다.(node에서는 route만드는 작업이라고 생각하면됨.)

      3.5.3. 여기까지 했다면 도메인 인증방식은 끝이고, 다음을 누르면 아래같은 화면이 뜬다.
      이때 빨간 체크표시한 zip파일을 다운로드 해준다.
      (압축을 편한곳에 풀어주면 1. ca_bundle.crt, 2. certificate.crt, 3. private.key 이와같은 파일3개가 있을것이다.)

    4. 기나긴 인증서 발급이 끝났고 서버코드상에서 몇가지만 추가해주면 된다. 4.1.에 명시된 라이브러리들을 npm install <라이브러리이름> 으로 설치해주길 바란다.
      4.1. 필요한 라이브러리
      A. 로컬파일접근을위한 "fs"
      B. http서버 구축을위한 "http"
      C. https서버 구축을 위한 "https"

      4.2. 발급받은 SSL인증서 불러오기

      4.3. http, https 미들웨어 정의 (low를 http 미들웨어로 쓸예정)

      4.4. 포트설정

      4.5. HTTPS 리다이랙션 (http로 들어온 유저들을 https로 리다리렉션 해주기)

      4.6. http, https 서버열기

  • 회사규모 프로젝트시 필요한 절차

    • SSL인증서 발급대행 업체 링크 : https://www.koreassl.com/login
      • CA기관에서 발급받는것보다 비용이 3배까지 차이난다는 지인의 이야기를 들었지만, 지인 역시 밤에 CA기관과 전화통화를 해야하는 수고, CSR작성, 등등 절차가 너무 복잡하고 힘들어서 비용이 더 들어도 다음에는 대행발행업체를 사용하고자 한다고 한다.
        (일절 광고료를 받은게 아닌 가장 깔끔하게 안내가 잘된 사이트인거 같아서 올려드림)
    • 해당링크에서 구매한 인증서를 4.2 과정부터 똑같이하면 되지 않을까 하는 생각이다.(해보게 된다면 포스팅을 수정하겠습니다.)
  • OpenSSL로 발급하기 : https://www.lesstif.com/system-admin/openssl-root-ca-ssl-6979614.html

결론

이번주에는 https를 구축하기위한 ssl인증성 발급과 코드상에서 구현을 주로 연습하다보니 시간이 금방갔다. 보안상의 간단한 원리인 비대칭키 방식은 분량 조절 실패로 다음에 다루기로 하겠다. 다들 이번주도 고생하셨고, 앞으로 조금만더 고생하시길 바랍니다~~~

profile
재밌게 뚫고 나가자

0개의 댓글