데브코스 백엔드 3기 15일차

이제 주말!!이니까
이번주 밀린 화요일 TIL 내용도 함께 쓸거라 길 예정


MySQL의 scale-out

MySQL은 기본적으로 1대의 서버만 돌아가는 소프트웨어
-> 기본적인 scale-out과는 조금 다름

  • Master있고 이걸 다수의 서버에 복사 -> 다수의 Slave(read-only)
    • 여전히 MySQL 자체가 핸들할 수 있는 데이터크기는 한대의 서버로 처리할 수 있는 최대의 양
    • 여전히 쓰기작업은 결국 Master에
    • 그래도 적어도 읽기에 대해서는 read-only의 slave에 복제를 하면 Select에 대해서는 더 큰 용량



클라우드

클라우드컴퓨팅업체에서 컴퓨팅자원(하드, 소프트웨어)을 네트워크 통해 서비스형태로 제공


  • MySQL쓰려면 MySQL 서버가 돌아가는 컴퓨터 사야함 초기비용(돈, 시간) 많이 필요
    -> 업체에서 컴퓨터 여러대 사서 OS도 깔아두고 MySQL도 버전별로 다 사두고 나한테 빌려줌
    -> MySQL 서버의 hostname, portnumber, access하는데 필요한 admin 정보 통해서 access
    => 시간단축 / 글로벌확장 용이 / 필요한만큼 실시간 할당 -> 사용한만큼 지불 -> 반환


EC2(Elastic Cloud Compute)
AWS의 서버 호스팅 서비스

S3(Simple Storage Service)
대용량 클라우드 스토리지 서비스
데이터 저장관리 -> 계층적구조

DataBase Service

RDS(Relational Database Service)

  • MySQL / MariaDB
  • Oracle



Docker

22

MySQL설치 시 OS, OS버전, 이미 깔려있는 다른 프로그램에 따라 다양한 변수 존재
-> MySQL + MySQL 실행에 필요한 기타 소프트웨어 = 하나의 패키지
=> 해당 프로그램의 개발과 사용을 도와주는 오픈소스 플랫폼


  1. Docker 받아서 실행 = Docker Engine
  2. 패키지를 파일시스템 형태로 = Docker Image
    1) 파일형태이기 때문에 공유가능
    2) 공유소 = Docker Registry(대표적 : Docker Hub)
  3. Docker Image를 싱행시킴 = Docker Container(응용 프로그램)


=> 내 운영체제 상에 있는 다른 소프트웨어들과 충돌이 안남


  • Virtual Machine과 흡사하긴 하지만 Docker는 가상화 개념과는 조금 다름
  • root계정 알아야(패스워드 찾아야) MySQL shell 실행가능
  • Docker Engine위의 App위의 Container가돌기 때문에
    Contianer안에서 도는 프로그램과 통신하기 위해서 Docker command(docker exec) 사용

    111



Transaction

  • 테이블내용을 변경하는 SQL들을 연달아 실행 시,
    다수의 SQL을 사용하더라도 마치 하나의 SQL처럼
    다같이 성공 or 실패한다면 트랜잭션 사용필수
    (SELECT는 트랜잭션 사용필요x)


  • autocommit
    • true(default)
      • 바로바로 테이블에 들어감
      • Begin해줘야 rollback
    • false(=0)
      • 추가, 수정, 삭제 시 내가 commit을 명시적으로 해주지않으면 테이블 안바뀜
      • 자바와 사용 시 connection -> Resultset에서 추가된 것처럼 보이지만 commit을 안하고 connection.close()-> 테이블 안바뀌어 있음



View

자주 사용하는 SQL쿼리(SELECT문)에 이름을 주고 마치 하나의 테이블처럼 사용
= 이름이 있는 쿼리가 View로 테이블베이스단에 저장됨
(실제 피지컬하게 존재x -> Virtual Table이라고 부르기도함)
=> View 사용될 때마다 Select가 실행됨


  • View 생성
CREATE OR REPLACE VIEW 뷰이름 AS SELECT ~
  • 사용
SELECT * FROM 뷰이름



고급기능

  • Stored Procedure
    • MySQL 서버단에 저장되는 SQL쿼리들
  • Explain SQL
    • 쿼리가 어떻게 수행되는지 내부를 보여주는 SQL명령
      -> 이를 바탕으로 느리게 동작하는 쿼리의 최적화 가능해짐
      -> 보통 문제가 되는 테이블에 인덱스를 붙임
  • Index
    • primary key, foreign key 지정된 애들은 이미 기본적으로 Index 가짐 -> 속도 빠름
    • 특정 컬럼을 많이 쓴다 -> pk, fk 아닌경우 속도 느릴 수 -> Index 붙임


  • Index는 꼭 필요한 경우만 쓰자
    • 너무많은 인덱스 -> 인덱스로딩으로 인한 오버헤드 -> 시스템이 전체적으로 느려질 수
    • Insert/Update 명령의 경우 -> Index도 바뀌어야 하기 때문에 느림



디자인패턴 스터디

오늘은 Prototype Pattern

  • 정리
    • 객체생성의 비용이 비싼경우에 사용
    • clone()



2번째 RBF

  • Lombok의 동작원리
    • compile할 때 lombok이 코드추가
      • compiler가 parse해서 AST로 바꿔주면 AST전후에 코드 추가해서 AST 수정

제목 없음

참고)
AST(Abstract Syntax Tree)
프로그램 코드(소스)의 구조를 표현하는 프로퍼티이며, 컴파일러의 구문 분석 결과물


  • delete from & truncate 차이
    • delete
      • 데이터만 삭제
      • 속도 느림
      • 로그 남김
    • truncate
      • rollback 불가
      • 테이블을 최소 생성된 초기 상태로 만듬
      • 속도 빠름


  • if-else / switch 동작원리 차이
    • if는 하나하나 맞는지 다 체크해봄, 안맞고 안맞고를 다 실행해봄
    • switch : byte code로 변환 시 테이블 생성되어서 바로 어디로 갈지
      -> 조건 3개이상이면 switch가 빠름 그이하는 비슷
    • 참고) switch int만 가능(byte code에서 지원x)
      => 자바7 이상부터는 String, Enum 등 가능, 어떻게?
      • hashCode 사용(산기해있음 -> lookupswitch)


    • 원리를 알기위해 byte code를 뜯어본 ㅌㅅ이
      정말 신기해
      byte code 보는법은 build하고 show byteccode 검색(shift*2)


  • MySQL join종류
    • inner, outer, left, right



추가로 더 찾아보기로 한 것들

  • MySQL의 Like연산자 최적화 방법
  • System.gc()
  • Virtual Machine과 Contatiner의 차이점

22



일기(회고)

  • 드디어 자바계산기 과제 PR!
    오늘 model 만들어봤는데 이러한 방향이 맞는건지 너무 궁금스,,
    얼른 피드백이 또 오면 좋겠다


  • 피어리뷰 진행함


  • 벌써 한주 마무리
    자바계산기과제, SQL문제, 디자인패턴 조사 모든 과제완료
    (계산기는 계속 더 다듬어야하지만 첫 PR에 의미를 두는ㅎ)
    뿌듯하면서도 할게 진짜 많고 시간은 없고 잠은 오고(잠시 징징타임)
    그래도 벌써 2주 끝
    내일은 짬을 내서 힐링타임을 가져야g
    담주부터는 스프링!


  • 오늘의 게더
    • 컨셉은 power렌저
    • 세상 정신없는 방

    1028-1


  • 프리팀 2주가 끝났다..!ㅠ
    아쉽다~ㅠ

    흑구팀노션


업데이트: