목차

    브라우저

    브라우저 렌더링 과정을 알아보기전에 브라우저가 무엇인지 먼저 알아보자. 우선 브라우저는 우리가 흔히 인터넷에 접속할 때 사용하는 Chrome, Safari, Firefox, Internet Explorer 등을 말한다.

    MDN에서는 브라우저에 대해 웹에서 페이지를 찾아서 보여주고, 사용자가 하이퍼링크를 통해 다른 페이지로 이동할 수 있도록 하는 프로그램이라고 설명하고 있다. 여기서 중요하다고 생각하는 부분은 찾아서 보여준다는 것이다.

    브라우저는 유저가 선택한 자원을 서버로 부터 받아와서 유저에게 보여준다. 이 자원은 페이지 외에도 이미지, 비디오 등의 컨텐츠들도 포함된다. 받아온 자원들을 렌더링 과정을 통해 유저에게 보여주게 된다.

    브라우저 렌더링 동작 과정

    렌더링의 기본적인 동작 과정은 다음과 같다.

    1. HTML 파일과 CSS 파일을 파싱해서 각각 Tree를 만든다. (Parsing)
    2. 두 Tree를 결합하여 Rendering Tree를 만든다. (Style)
    3. Rendering Tree에서 각 노드의 위치와 크기를 계산한다. (Layout)
    4. 계산된 값을 이용해 각 노드를 화면상의 실제 픽셀로 변환하고, 레이어를 만든다. (Paint)
    5. 레이어를 합성하여 실제 화면에 나타낸다. (Composite)

    각 단계를 좀 더 자세하게 알아보자.

    Parsing

    브라우저가 페이지를 렌더링하려면 가장 먼저 받아온 HTML 파일을 해석해야한다. Parsing 단계는 HTML 파일을 해석하여 DOM(Document Object Model) Tree를 구성하는 단계이다. 파싱 중 HTML에 CSS가 포함되어 있다면 CSSOM(CSS Object Model) Tree 구성 작업도 함께 진행한다.

    -> 서버에서 받아온 HTML, CSS 파일을 분석하여 DOM Tree와 CSSOM Tree를 구성한다.

    만약 파싱 도중에 자바스크립트 코드를 만나면 ?

    자바스크립트는 렌더링 엔진이 아닌 자바스크립트 엔진이 처리한다. HTML 파서는 script 태그를 만나면 자바스크립트 코드를 실행하기 위해 DOM 생성 프로세스를 중지하고 자바스크립트 엔진으로 제어 권한을 넘긴다. 제어 권한을 넘겨 받은 자바스크립트 엔진은 script 태그 내의 자바스크립트 코드 또는 script 태그의 src 어트리뷰트에 정의된 자바스크립트 파일을 로드하고 파싱하여 실행한다. 자바스크립트의 실행이 완료되면 다시 HTML 파서로 제어 권한을 넘겨서 브라우저가 중지했던 시점부터 DOM 생성을 재개한다.

    이처럼 브라우저는 동기(Synchronous)적으로 HTML, CSS, Javascript을 처리한다. 이것은 script 태그의 위치에 따라 블로킹이 발생하여 DOM의 생성이 지연될 수 있다는 것을 의미한다. 따라서 script 태그의 위치는 중요한 의미를 갖는다. body 요소의 가장 아래에 자바스크립트를 위치시키는 것은 좋은 아이디어이다. 그 이유는 아래와 같다.

    • HTML 요소들이 스크립트 로딩 지연으로 인해 렌더링에 지장 받는 일이 발생하지 않아 페이지 로딩 시간이 단축된다.
    • DOM이 완성되지 않은 상태에서 자바스크립트가 DOM을 조작한다면 에러가 발생한다.

    Style

    Style 단계에서는 Parsing 단계에서 생성된 DOM Tree와 CSSOM Tree를 매칭시켜서 Render Tree를 구성한다. Render Tree는 실제로 화면에 그려질 Tree이다. 예를 들면 Render Tree를 구성할때 visibility: hidden은 요소가 공간을 차지하고, 보이지만 않기 때문에 Render Tree에 포함이 되지만, display: none 의 경우 Render Tree에서 제외된다.

    -> DOM Tree + CSSOM Tree = Render Tree로 구성한다.

    Layout

    Layout 단계에서는 Render Tree를 화면에 어떻게 배치해야 할 것인지 노드의 정확한 위치와 크기를 계산한다. 루트부터 노드를 순회하면서 노드의 정확한 크기와 위치를 계산하고 Render Tree에 반영한다. 만약 크기 값을 %로 지정하였다면, Layout 단계에서 % 값을 계산해서 픽셀 단위로 변환한다.

    Paint

    계산된 값을 이용해 각 노드를 화면상의 실제 픽셀로 변환하고, 레이어를 만든다.Paint 단계에서는 Layout 단계에서 계산된 값을 이용해 Render Tree의 각 노드를 화면상의 실제 픽셀로 변환한다. 이때 픽셀로 변환된 결과는 하나의 레이어가 아니라 여러 개의 레이어로 관리된다. 당연한 말이지만 스타일이 복잡할수록 Paint 시간도 늘어난다. 예를 들어, 단색 배경의 경우 시간과 작업이 적게 필요하지만, 그림자 효과는 시간과 작업이 더 많이 필요하다.

    Composite

    Composite 단계에서는 Paint 단계에서 생성된 레이어를 합성하여 실제 화면에 나타낸다. 우리는 화면에서 웹 페이지를 볼 수 있다.

     

    정리

    1. 주소창에 구글 입력 .
    2. 구글 서버로 찾아간다.
    3. *DNS가 연결해줄 곳을 찾음
    4. 서버에서 HTML 파일을 클라이언트로 보냄.
    5. HTML 파일 파싱 및 DOM Tree 생성
    6. link 태그를 만나 css 파싱 및 CSSOM 트리 생성
    7. DOM , CSSOM 합쳐 Render Tree 생성
      (8. JavaScript를 만나면? HTML파서는 JS 코드를 실행하기 위해 파싱 중단
    8. JS 엔진실행 및 JS코드 파싱)
    9. layout, paint 해준다.
    10. composite

    목차

      Java 컴파일 과정

      - 자바는 OS에 독립적인 특징을 가지고 있다.

      - 이유는 JVM(Java Vitual Machine) 덕분이다.

      더보기
      컴파일 순서 JVM 메모리
       
       
       
      1. 개발자가 자바 소스코드(.java)를 작성한다.
      2. 자바 컴파일러가 자바 소스파일을 컴파일한다. 이때 나오는 파일은 자바 바이트 코드(.class)파일로 아직 컴퓨터(=JVM자바 가상 머신)가 읽을 수 없는 코드이다. (바이트 코드의 각 명령어는 1바이트 크기의 Opcode와 추가 피연산자로 이뤄져있다.)
      3. 컴파일된 바이트 코드(.class)를 JVM의 클래스 로더(Class Loader)에게 전달된다.
        • 클래스 로더 세부 동장
          • 로드 : 클래스 파일을 가져와서 JVM의 메모리에 로드한다.
          • 검증 : 자바 언어 명세 및 JVM 명세에 명시된 대로 구성되어 잇는지 검사
          • 준비 : 클래스가 필요로 하는 메모리를 할당
          • 분석 : 클래스의 상수 풀 내 모든 심볼릭 레퍼런스를 다이렉트 레퍼런스로 변경
          • 초기화 :  클래스 변수들을 적절한 값으로 초기화 
      4. 클래스 로더는 동적로딩(Dynamic Loding)을 통해 필요한 클래스들을 로딩 및 링크하여 런타임 데이터 영역(Runtime Data area), 즉 JVM의 메모리에 올립니다. 
      5. 실행엔진(Exectution Engine)은 JVM메모리에 올라온 바이트 코드를 명령어 단위로 하나씩 가져와서 실행한다.
        1. 인터프리터 방식 : 바이트 코드 명령어를 하나씩 읽어서 해석하고 실행한다. 하나하나의 실행은 빠르나, 전체적인 실행 속도가 느리다.
        2. JIT 컴파일러(Just-In-Time Compiler) 방식 : 인터프리터 단점을 보완하기 위해 도입된 방식으로 바이트 코드 전체를 컴파일하여 바이너리 코드로 변경하고 이후에는 해당 메서드를 더 이상 인터프리팅 하지 않고, 바이너리 코드로 직접 실행하는 방식
      요약
      순서 Input Exe(실행) Output
      1 개발자가 작성한 (.java) 자바 컴파일러가 컴파일 바이트 코드(.class)
      2 바이트 코드(.class) JVM 클래스 로더의 동적로딩 런타임 데이터 영역(=JVM 메모리)에 올린다.
      3 JVM 메모리에 올라온 바이트 코드
      (.class)
      - JVM내에서 인터프리터 or JIT 컴파일러 방식 런타임 시스템 -> 운영체제 ->하드웨어
      [자바 컴파일러]
      1. helloworld.java 작성
      2. javac명령어(java compiler)를 통해 helloworld.java 파일을 helloworld.class파일로 변환 (컴파일러가 수행)
      [자바 인터프리터]
      3. 컴파일러에 의해 변환된 helloworld.class 내의 바이트 코드를 특정 환경의 기계(다른 OS)에서 실행될 수 있도록 변환한다.
      -> 예로 IBM PC에서 작성된 프로그램을 매킨토시에서도 실행할 수 있도록 변환하는 의미이다.
      인터프리터가 하는 일
      자바는 기본적으로 컴파일과 인터프리트를 병행하는 것일까?
      - 인터프리팅은 플랫폼(OS)에 종속되지 않는다.
      물론 컴파일러를 먼저 수행하고 인터프리팅을 하는 과정 때문에 컴파일 과정만 하는 필요한 프로그래밍 언어보다는 속도가 느리다.
      - 자바 바이트 코드는 컴퓨터와 프로그램 사이에 별도의 버퍼역할을 한다.
      자바 인터프리터로 인행 바이러스나 악성 프로그램을 대응 하는 가드 같은 보안 계층에 의해 보호 될 수 있다. 이유는 자바와 자바 바이트 코드의 좋바으로 플랫폼에 독립적이고 안전한 환경을 제공하기 때문이다.
      결론
      컴파일이라는 과정은 결국 인간이 쓴 인간어(java)를 기계어(Machine Language)로 바꾸는 과정이라고 생각합니다. 자바의 컴파일의 특징은 Java Compiler을 거쳐 만들어진 바이트 코드인 (.class)파일을 interpreter를 통해 기계어로 변환하는 과정에서 interpreter를 사용하므로서 OS에 종속되지 않습니다. (보안에도 좋다)

      컴파일러 vs 인터프리터

        컴파일러(번역기) 인터프리터(실행기)
      방식 - 고급 언어로 작성된 프로그램을 목적 프로그램으로 번역 후 링킹 작업을 통해 실행 프로그램을 생성한다. 
      - 자바는 javac로 컴파일하고 java 실행 시 중간언어(클래스 파일)을 한줄씩 자바 인터프리터가 번역하기에 컴파일 언어 이면서 인터프리터 언어이다.

      - 컴파일러는 전체 소스코드를 보고 명령어를 수집하고 재구성한다. 즉 인터프리터 처럼 중간 형태로 변환 시킨 후 실행하지 않고 고레벨 언어를 바로 기계어로 변환한다. 
      - 고급 언어로 작성된 프로그램을 한줄한줄씩 번역에서 OS에서 인식하는 기계어로 번역하는 역할

      - 바이트 코드(.class)를 인터프리터가 한 줄 씩 해석하면서 기계어로 번역한다.
      개발 편의성 코드를 수정하고 실행하려면 컴파일러 다시 실행 코드를 수정하고 즉시 실행 가능
      실행 속도 빠르다, 느리다. 
      보안 코드가 유출되지 않는다. 유출될 수 있다.
      파일 용량 프로그램의 실행 파일 전체를 전송해야 하므로, 용량이 크다.  프로그램의 코드만 전송하면 실행이 되므로, 용량이 작다.
      프로그래밍 언어 C, C++처럼 비교적 저수준에 가까운 언어 Python, Ruby처럼 비교적 고수준에 가까운 언어
      흐름도


      String, StringBuffer, StringBuilder의 차이 및 장단점

      연산이 많지 않을때는 위의 나열된 어떤 클래스를 사용하더라도 이슈가 발생할 가능성이 거의 없다. 하지만 연산횟수가 많아지거나, 멀티쓰레드, Race condition 등의 상황이 자주 발생한다면 각 클래스이 특징을 이해하고 상황에 맞는 적절한 클래스를 사용해야한다.

      String 불변(immautable) 
      String str = "hello"; //String str = new String("hello");
      str = str + " wolrd"; //[hello world]
      String 특징 설명
      - str이 가르키는 곳에 저장된 "hello"에 "world" 문자열을 더해 "hello world"로 변경한 것으로 착각할 수 있다.

      - 하지만 기존 "hello" 값이 들어가있던 String 클래스의 참조변수 str이 "hello world"라는 값을 가지고 있는 새로운 메모리영역을 가리키게 변경었다.

      - 처음 선언했던 "hello"로 값이 할당되어 있던 메모리 영역은 Garage로 남아있다가 GC(gabage colltion)에 의해 사라지게된다.

      - String 클래스는 불변하기 때문에 문자열을 수정하는 시점에 새로운 String 인스턴스가 생성된 것이다. 

      즉 hello + wolrd가 된게 아니라 hello 삭제 -> hello wolrd 생성 개념이다. 이유는 불면 속성 때문이다.

      단점은 문자열 추가, 수정, 삭제가 빈번하게 발생하는 알고리즘에 String 클래스를 사용하면 힙 메모리(Heap)에 많은 가비지가 생성되어 힙메모리가 부족할 수 있다.
      불변 객체(immutable)
      불변 객체는 완전히 생성된 후에도 내부 상태가 일정하게 유지 되는 개체입니다. 즉 객체가 변수에 할당되면 참조를 업데이트 하거나 내부 상태를 어떤 방법으로도 변경할 수 없습니다. 

      왜 String이 불변 객체 일까?(성능, 동기화, 캐싱, 보안)
      1. 성능
      - 자바에서 문자열은 정말 많이 사용된다. 그렇게 때문에 자바에서는 상수 풀이라는 것을 만들었다. 상수 풀이 무엇인가?
      public class Test {
          public static void main(String[] args) {
              String s1 = "Hello World";
              String s2 = "Hello World";
      
              System.out.println(s1 == s2);  // true
          }
      }​
      위의 코드 실행 과정을 분석해보면 문자열 s1에 해당하는 것을 상수 풀에서 검색을 한다. 없다면 상수 풀에 등록하고 해당하는 레퍼런스 값을 반환한다. 
      s2 문자열도 마찬가지로 상수 풀에서 해당 문자열이 있는지 검색한다. s1을 이미 상수 풀에 등록했기 때문에 같은 레퍼런스로 반환한다. 문자열 리터럴을 캐싱하고 재사용하면 문자열 풀의 다른 문자열 변수가 동일한 개체를 참고하기 때문에 힙 공간을 절약할 수 있다. 하지만 조회, 삭제, 수정이 자주 일어나는 환경에선 매우 좋지 못하다.

      만약 String mutable(변화가능)하다면 String pool로 생성하여 공유가 불가능하다.

      StringBuffer/StringBuilder 가변(mutable)
      StringBuffer sb = new StringBuffer("hello");
      sb.append(" world");
      StringBuffer/StringBuilder  
      문자열의 추가, 수정, 삭제가 빈번하게 발생 할 때 사용하면 좋다.
      따라서 .apped(), .delete() 등의 함수를 통해 동일 객체내에서 문자열을 변경하는 것이 가능하다. 
      StringBuffer vs StringBuilder

      둘의 가장 큰 차이점은 동기화의 유무이다. 

      - StringBuffer는 동기화 키워드를 지원(Synchronized)하여 멀티쓰레드 환경에서 안전하다는 점(thread-safe) 입니다. 단점은 느리다.

      참고로 String도 불변성을 가지기 때문에 마찬가지로 멀티쓰레드 환경에서의 안전성(thread-safe)를 가지고 있다.

      Synchronized란?
      - 공유 데이터에 lock을 걸어 작업중이던 쓰레드가 마칠때까지 다른 쓰레드에게 제어권이 넘어가지 않게 보호한다.
      - lock이 풀리면 다른 쓰레드도 접근가능해진다.

      - 반대로 StringBuilder는 동기화를 지원하지 않기 때문에 멀티쓰레드 환경에서 사용하는 것은 적합하지 않지만 동기화를 고려하지 않는 만큼 단일쓰레드에서의 성능은 StringBuffer 보다 뛰어납니다. +


      Java의 접근 제어자의 종류와 특징

      접근 제어자 같은 클래스의 멤버 같은 패키지의 멤버 자식 클래스의 멤버 그 외의 영역
      public O O O O
      protected O O O X
      defualt O O X X
      private O X X X
      접근범위

      public -> protected -> defalut -> private


      캡슐화와 은닉화

      캡슐화란?
      • 캡슐화(영어:encapsulation)는 객체 지향 프로그래밍에서 다음 2가지 측면이 있다.
        • 객체의 속성(data fields)과 행위(메서드, methods)를 하나로 묶고,
        • 실제 구현 내용 일부를 외부에 감추어 은닉한다.

      객체의 속성과 행위를 하나로 묶으면 응집도가 높아져서 좋다는건 직관적으로 알겠는데 왜 외부에 감추는 은닉화를 하는 것일까?

      은닉화는 크게 2가지로 나뉜다.

      • 필드 데이터의 은닉화
      private String accountName; //계좌이름(은닉화)
      private String accountNumber; //계좌이름(은닉화)
      private int balance; //계좌잔액(은닉화)

      필드 데이터의 접근제어자를 private으로 선언함으로써 필드데이터 조작을 막을 수 있다.

      • 기능(메서드)의 은닉화
      public int getBalance(CountryCode countryCode) {
      	switch(contryCode) {
          	case KR:
              	return balance;
              case EN:
              	return balance / 1000;
              default:
              	return 0;
      	}
      }

      사용자 입장에서 getBalance()만 호출되면(내부로직을 모르고) 나라별 환율에 맞는 잔액을 알 수 있다.

      1) 국가가 추가되는 경우

      2) 환율이 변동하는 경우를 신경쓸 필요가 없다.

      추후에 변경사항이 생기더라도 Account 클래스 내부만 수정하면 된다.

      결론
      캡슐화를 하게 되면 내부에 데이터를 어떻게 저장하는지, 데이터를 어떻게 처리하는지 또는 특정 기능을 어떻게 제공하는지에 대한 내용은 드러내지 않는다. 단지, 객체가 어떤 기능을 제공하는지만 공유한다.

      객체지향 5대 원칙 : SOLID (클린코드 저자 : 로버트 마틴)

      1. 단일 책임 원칙 (Single responsibility priciple, SRP) : S

      class가 제공하는 모든 서비스는 하나의 책임을 수행하는데 집중해야 한다는 원칙.

      2. 개방 폐쇄 원칙 (Open/Closed Principle, OCP) : O

      모듈 함수 등의 소프트웨어 개체는 쉽게 확장이 가능하여 재사용을 할 수 있도록 해야한다.

      또한, 기존의 구성요소는 수정이 일어나지 않아야 한다.

      여기에서 중요한 개념은 추상화와 다형성이다. 객체 지향에서 다형성이란 여러 가지 형태를 가질 수 있는 능력이다.

      3. 리스코프 치환 원칙(Liskov Subsititutions Principle, LSP) : L

      리스코프 치환 코드는 상속에 대한 개념이다. 부모 class가 들어갈 자리에 자식 class를 넣어도 잘 구동 되어야 한다는 원칙이다. (부모 자동차.class, 자식 스포츠카.class) 그렇지 않으면 돌연변이 코드를 만든다.

      4. 인터페이스 분리 원칙 (Interface Segregation Principle, ISP) : I

      클라이언트는 자신이 사용하지 않는 메소드에 의존 관계를 맺으면 안된다라는 원칙이다.

      5. 의존관계 역전 원칙(Dependency Inversion Principle, DIP) : D

      상위 모듈은 하위 모듈에 종속되어서는 안된다. 둘 다 추상화에 의존해야 한다.

      추상화는 세부사항에 의존하지 않는다. 세부사항은 추상화에 의해 달라져야 한다.

       

      더보기

      JVM 메모리 구조

      자바 프로그램 실행 단계 설명
      JVM에서 읽어 들인 다음에 OS 간에 프로그램을 실행할 수 있도록 만드는 것이다.
      JVM 메모리 구조  
      JVM의 구조
      1) Garbage Collecotor
      2) Execution Engine
      3) Class Loader 
      4) Runtime Data Area 
      (1) Class Loader

      JVM 내로 클래스 파일을 로드하고, 링크를 통해 배치하는 작업을 수행하는 모듈입니다. 런타임 시에 동적으로 클래스를 로드합니다. 

      (2) Execution Engine

      - 클래스 로더를 통해 JVM 내의 Runtime Data Area에 배치된 바이트 코트들을 명령어 단위로 읽어서 실행한다. 

      - 최초 JVM이 나왔을 당시에는 인터프리터 방식이었기 때문에 속도가 느리다는 단점이 있었지만 JIT 컴파일러 방식을 통해 이 점을 보완하였습니다. 

      - JIT는 바이트 코드를 어셈블러 같은 네이티브 코드로 바꿈으로써 실행이 빠르지만 역시 변환하는 비용이 발생한다.

      - 같은 이유로 JVM은 모든 코드를 JIT 컴파일러 방식으로 실행하지 않고, 인터프리터 방식을 사용하다가 일정한 기준이 넘어가면 JIT 컴파일러 방식으로 실행한다.

      (3) Garbage Collector

      Garbage Collector(GC)는 힙 메모리 영역에 생성된 객체들 중에서 참조되지 않은 객체들을 탐색 후 제거하는 역할을 한다. 이때, GC가 역할을 하는 시간은 언제인지 정확히 알 수 없다.

      (4) Runtime Data Area

      JVM 메모리 영역으로 자바 애플리케이션을 실행 할 때 사용되는 데이터들을 적재하는 영역입니다. 이 영역은 크게 Method Area, Heap Area, Stack Area, PC Register, Native Method Stack 으로 나눌 수 있다. 

      Runtime Data Area 영역 설명 
      (1) Method Area : 모든 쓰레드가 공유하는 메모리 영역이다. 메소드 영역은 클래스, 인터페이스, 메소드, 필드, static 변수 등의 바이트 코드를 보관한다.
      (2) Heap Area : 모든 쓰레드가 공유하며, new 키워드로 생성된 객체와 배열이 생성되는 영역이다. 또한, 메소드 영역에 로드된 클래스만 생성이 가능하고 GC가 참조되지 않은 메모리를 확인하고 제거하는 영역이다. 
      (3) Stack area : 메소드 호출 시마다 각각의 스택 프레임(그 메서드만을 위한 공간)이 생성 그 메서드 안에서 사용되는 값을 저장하고, 호출된 연신 시 임시로 저장하며 메서드 수행이 끝나면 프레임별로 삭제(후입선출)
      (4)PC Register : 쓰레드가 시작될 때 생성되며, 생성될 때마다 생성되는 공간으로 쓰레드마다 하나씩 존재합니다. 쓰레드가 어떤 부분을 무슨 명령으로 실행해야할 지에 대한 기록을 하는 부분으로 현재 수행중인 JVM 명령의 주소를 갖는다.
      (5) Native method stack
      자바 외 언어로 작성된 네이티브 코드를 위한 메모리 영역이다.

      인터페이스(Interface)와 추상 클래스(abstract class)

      추상 클래스(abstract class)

      클래스를 설계도라 하면, 추상 클래스는 미완성 설계도에 비유할 수 있다. 

      추상 메서드

      선언부만 작성하고 구현부는 작성하지 않은 채 남겨 둔 것이며 추상 메서드는 상속받는 클래스에 따라 달라질 수 있다.

      추상 클래스 규칙
      • 추상 클래스는 키워드 abstract를 붙여 표현한다.
      • 클래스를 abstract로 지정하면, new를 통해 객체를 직접 생성할 수 없다.
      • abstract로 선언한 메소드를 자식 클래스에서 반드시 구현해야한다. (오버라이딩)
      Example
      더보기
      public abstract class Player {
          boolean pause;
          int currentPos;
      
          public Player(){
              this.pause = false;
              this.currentPos = 0;
          }
      
          // 지정된 위치에서 재생을 시작하는 기능 수행되도록 작성
          abstract void play(int pos);
          // 재생을 즉시 멈추는 기능을 수행하도록 작성
          abstract void stop();
      
          void pause(){
              if(pause){
                  pause = false;
                  play(currentPos);
              }else {
                  pause = true;
                  stop();
              }
          }
      
      }

      Player 추상 클래스는 VCR 이나 Audio 등 재생이 가능한 기기의 부모 클래스이다.

      이제 Player 추상 클래스는 상속받는 CDPlayer 클래스를 만들어보자.

      더보기
      public class CDPlayer extends Player{
          @Override
          void play(int pos) {
              //구현 생략
          }
      
          @Override
          void stop() {
              //구현 생략
          }
          //CDP 클래스에 추가로 정의된 멤버
          int currentTrack;
      
          void nextTrack(){
              currentTrack++;
              //...
          }
      
          void preTrack(){
              if(currentTrack>1){
                  currentTrack--;
              }
          }
      }

      부모 클래스의 추상메서드를 CDPlayer에 맞게 오버라이딩해주고, CDPlayer만의 새룬 멤버들을 추가해줬다.

       

      인터페이스(Interface)

      인터페이스는 일종의 추상 클래스로, 추상 메서드를 갖지만 추상 클래스보다 추상화 정도가 높아 일반 메서드, 멤버 변수를 구성원으로 가질 수 없다. 추상 클래스를 미완성 설계도라 하면, 인터페이스는 구현된 것이 아무 것도 없는 밑그림만 그려진 기본 설계도 이다.

      인터페이스 규칙
      • 추상 클래스 처럼 불완전한 것이기 때문에 그 자체만으로 사용되기 보다, 다른 클래스를 작성하는데 도움을 줄 목적으로 작성된다.
      • 일반 메서드 또는 멤버 변수를 구성원으로 가질 수 없다.
      • 모든 멤버 변수는 public static final 이어야 하며, 이를 생략할 수 있다.
      • 모든 메서드는 public abstract 이어야 하며, 이를 생략할 수 있다.
      public static final의 사용 목적?

      인터페이스 변수는 아무 인스턴스도 존재하지 않는 시점이기 때문에 스스로 초기화 될 권한이 없다. 때문에 public static final를 사용해 구현 객체의 같은 상태를 보장한다. 

      인터페이스의 다중 상속

      인터페이스는 인터페이스로부터만 상속받을 수 있으며, 클래스와 달리 다중상속을 받는 것이 가능하다.

      더보기
      import sun.tools.jconsole.Plotter;
      
      public interface Movable {
      
          void move(int x, int y);
      }
      
      interface Attackalbe{
          void attck(Plotter.Unit u);
      }
      
      interface Fightable extends Movable, Attackalbe{
          
      }
        추상클래스 인터페이스
      공통점 가지고 있는 추상 메서드를 구현하도록 강제한다. 또 인스턴스화가 불가능하다. 
      사용 의도 - 이를 상속할 각 객체들의 공통점을 찾아 추상화시켜 놓은 것으로,
      - 상속 관계를 타고 올라갔을 때 같은 부모 클래스를 상속하며 부모 클래스가 가진 기능들을 구현해야할 경우 사용한다.
      - 상속 관계를 올라갔을 때 다른 조상 클래스를 상속하더라도, 같은 기능이 필요할 경우 사용한다. 
      적절한 케이스 - 관련성이 높은 클래스 간에 코드를 공유하고 싶은 경우
      - 추상 클래스를 상속 받을 클래스들이 공통으로 가지는 메소드와 필드가 많거나 public이외의 접근자(protected, private) 선언이 필요한 경우
      - non-static, non-final 필드 선언이 필요한 경우
      - 서로 관련성이 없는 클래스들이 인터페이스를 구현하게 되는 경우
      - 특정 데이터 타입의 행동을 명시하고 싶은데, 그 행동이 구현되는지 신경쓰지 않는 경우
      - 다중상속을 허용하고 싶은 경우
      차이점!!! 1. 사용의도 차이점
      - 추상클래스는 IS -A "~이다". 인터페이스는 HAS -S "~을 할 수 있는" 
      자바의 특성상 한개의 클래스만 상속이 가능하여 해당 클라스의 구분을 추상 클래스 상속을 통해 해결하고, 할 수 있는 기능들을인터페이스로 구현합니다.

      2. 공통된 기능 사용 여부
      만약 모든 클래스가 인터페이스를 기본 틀을 구성한다면, 공통으로 필요한 기능들도 모든 클래스에서 오버라이딩 하여 재정의 해야하는 번거로움이 있습니다. 공통된 기능이 필요하다면 추상클래스를 이용해서 일반 메서드를 작성하여 자식 클래스에서 사용할 수 있도록 하면된다. 
      만약 각각 다른 추상클래스를 상속하는데 공통된 기능이 필요하하다면, 해당 기능을 인터페이스로 작성해서 구현한다. 
      ex) 추상클래스 : 홍길동은 생명체를 상속받는다. 참새는 생명체를 상속받는다. 생명체는 숨쉬기는 기능이있다. (공통)
      인터페이스 : 홍길동은 talkable 인터페이스를 다중 상속한다. 참새는 flyable을 상속받는다. 각각 공통된 기능이 아니므로 interface를 implements한다.

       


      Call by Value와 Call by reference in Java

      말 그대로 '값에 의한 호출' 이냐, '참조에 의한 호출' 이냐 라고 할 수 있다.

      - Call by value는 메서드 호출 시에 사용되는 인자의 메모리에 저장되어 있는 값(value)을 복사하여 보낸다. 주소 값을 보낸 게 아니어서 메서드 밖에선 값이 안 변한다.

      - Call by reference는 메서드 호출 시에 사용되는 인자가, 값이 아닌 주소(Address)를 넘겨줌으로써, 주소를 참조(Referece) 하여 데이터를 변경할 수 있습니다.
      더보기
      //callByValue
      Class CallByValue{
      
      public static void swap(int x, int y) {
          int temp = x;
          x = y;
          y = temp;
      
      }
      
      public static void main(String[] args) {
          int a = 10;
          int b = 20;
          System.out.println("swap() 호출 전 : a = " + a + ", b = " + b);
          swap(a, b);
          System.out.println("swap() 호출 후 : a = " + a + ", b = " + b);
      
          }
      }
      결과 : 
      호출 전  : a=10 b= 20
      호출 후  : a=10 b= 20
      //=================================================================================
      //callByReference
      Class CallByReference{
      	int value;
      CallByReference(int value) {
      	this.value = value;
      }
      
      public static void swap(CallByReference x, CallByReference y) {
          int temp = x.value;
          x.value = y.value;
          y.value = temp;
      }
      public static void main(String[] args) {
          CallByReference a = new CallByReference(10);
          CallByReference b = new CallByReference(20);
          System.out.println("swap() 호출 전 : a = " + a.value + ", b = " + b.value);
          swap(a, b);
          System.out.println("swap() 호출 전 : a = " + a.value + ", b = " + b.value);
      
          }
      
      }
      결과 : 
      호출 전  : a=10 b= 20
      호출 후  : a=20 b= 10

      그렇다면 Java는 call by value 일까? call by reference 일까?

      사실 자바는 Call by value이냐, Call by reference이냐 로 의견이 분분합니다.
      메모리에 저장 된 주소를 보내는 것도 물리적 관점에서 보면 값으로 볼 수 있기 때문인데요, 이 문제에 대해서도 한번 생각해 보신다면 좋을 것 같습니다.
      결론은 메모리에 저장된 주소(값)을 보내는 것이므로 자바는 Call by value 이다.
      참고 : http://wonwoo.ml/index.php/post/1679

      결론, Java는 항상 call by value이다. 

      - 자바는 객체의 주소를 가져오는 방법이 없다. 만약 call by reference를 지원한다면 주소를 가져오는 방법을 지원해야 한다. 맞네..C처럼 레퍼런스를 써서 가져오든, 포인터를 써서 가져오던지 해야하는데 그게 없다.

      참고

      https://velog.io/@ahnick/Java-Call-by-Value-Call-by-Reference


      new String();과 String str = "";의 차이점

      아래의 코드에서 객체의 수는 ?

      - name1은 heap 메모리에 개별 객체가 만들어지고, name2, name3은 String 상수 풀에 만들어진 하나의 객체를 참조한다. 따라서 총 2개의 String 객체가 생성된다.

      public class StringEx {
      	public static void main(String args[]){
          	String name1 = new String("nroo");
              String name2 = "nroo";
              String neme3 = "nroo";
         }
       }
      ""(쌍따옴표) 리터럴을 이용하면, 기존에 존재하던 것을 재사용한다. 객체에 생선되는 것이 아닌, 상수풀을 참조한다. 따라서 더 효율적이다.
      더보기
      👀 String Pool이란?
      Java Heap Memory 내에 문자열 리터럴을 저장한 공간.(HashMap으로 구현)
      한번 생성된 문자열 리터럴은 변경될 수 없다.문자열 리터럴은 클래스가 메모리에 로드될 때 자동적으로 미리 생성된다.

      리터럴로 문자열을 생성하면(내부적으로 String.intern() 호출)
      String Pool에 같은 값이 있는지 찾는다.같은 값이 있으면 그 참조값이 반환된다.같은 값이 없으면 String Pool에 문자열이 등록된 후 해당 참조값이 반환된다.
      String 객체 생성 설명
      위의 두가지 방식은 String 객체를 생성한다는 사실은 같지만, JVM이 관리하는 메모리 구조상에서 명백히 다르다. 아래의 그림은 두가지 방법으로 String 객체를 생성했을 때, JVM 메모리상에 어떻게 존재하는지에 대한 이해를 돕는 그림이다. 



      Java Garbage Collector  동작원리

      1. JVM에서 GC의 스케줄링을 담당하여 Java 개발자에게 메모리 관리의 부담을 덜어준다.
      2. GC는 background에서 데몬 쓰레드로 돌며 더이상 사용되지 않는 객체들을 메모리에서 제거하여 효율적인 메모리 사용을 돕는다
      3. 객체는 힙 영역 저장되고 스택 영역에 이를 가리키는 주소값이 저장되는데 참조되지 않는(자신을 가리키는 포인터가 없는) 객체를 메모리에서 제거한다.

      DNS의 작동원리

      DNS 흐름도 설명
      1. LocalDNS에 질의
      웹 브라우저에 ww.naver.com을 입력하면 먼저 Local DNS에게 "ww.naver.com"이라는 hostname에 대한 IP 주소를 질의 하여 Local DNS에 없으면 다른 DNS name 서버 정보를 받음 (Root DNS 정보 전달 받음)

      2. Root DNS에 질의

      3. Root DNS 서버로 부터 "com 도메인"을 관리하는 TLD(Top-Level-Domain) 이름 서버 정보 전달 받음

      4. TLD에 질의

      5. TLD에서 관리하는 DNS 정보 전달

      6. naver.com 도메인을 관리하는 DNS 서버에 호스트네임에 대한 IP 주소 질의

      7. from 도메인관리 DNS 서버 to Local DNS
      naver.com 도메인을 관리하는 DNS 서버으로 부터 Local DNS 서버에게 응 naver.com에 대한 IP 주소는 222.122.195.6 응답

      8. Local DNS는 naver.com에 대한 IP 주소를 캐싱하고 IP 주소 정보 전달
      1. DNS Query (from Web Browser to Local DNS) : "제가 원하는 웹 사이트의 IP 주소를 알고 계신가요?" Local DNS 서버에게 전달


      2. DNS Query (from Local DNS to Root DNS) : "제가 원하는 웹 사이트의 IP 주소를 알고 계신가요?" Root DNS서버에게 전달


      3. DNS Response (from Root DNS to Local DNS) : "저는 모르지만 , Com 도메인을 관리하는 네임서버의 이름과 IP 주소를 알려드릴 테니 거기에 물어보세요"


      4. DNS Query (from Local DNS to com NS) : “ 안녕하세요. www. naver. com의 IP 주소를 알고 계신가요?"


      5. DNS Response (from com NS to Local DNS) : "저는 모르지만 , Com 도메인을 관리하는 네임서버의 이름과 IP 주소를 알려드릴 테니 거기에 물어보세요"


      6. DNS Query (from Local DNS to naver. com NS) : “ 안녕하세요. www. Naver .com의 IP 주소를 알고 계신가요?"


      7. DNS Response (from naver .com NS to Local DNS) : "저는 모르지만 해당 웹은 www. g.naver. com이라는 이름으로 통해요. g.naver .com 도메인을 관리하는 네임서버의 이름과 IP 주소를 알려드릴테니 거기에 물어보세요"


      8. DNS Query (from Local DNS to g.naver. com NS) : “ 안녕하세요. www. g.naver. com의 IP 주소를 알고 계신가요?"


      9. DNS Response (from g.naver .com NS to Local DNS) : " 네 www. g.naver .com의 IP 주소는 222.222.222.22와 333.333.333.33입니다"


      10. DNS Response (from Local DNS to Web Browser) : "네 www. naver .com의 IP 주소는 222.222.222.22와 333.333.333.33입니다"

      우아한 테크코드 DNS 설명

      DNS탄생 설명
      *DNS는 결국 IP주소를 얻어오는 과정이라고 볼 수 있다.

      [가정 : idea]
      1) User가 dnstest.kr이라는 주소를 알고 있고 자신의 host(sudo vi ~etc/hosts)에 해당 아이피주소를 입력해놨다.
      2) 그렇다면 hosts파일을 통해서 IP주소를 얻어와 해당 주소로 3.34.244.232로 접속 가능하다. 
      but 개인이 모든 아이피 값을 hosts에 입력하여 관리할 수 가없다.
      *DNS 서버가 그래서 생겼다.

      개인User가 hosts값을 모를 때 DNS 서버에 요청하여 IP값을 받아온다.
      public DNS서버는 보통 통신사이다. 
      if(통신사가 IP를 알고있다)
      - 바로 내려준다. 트리형으로 알아간다.
      else if (통신사가 IP알지 못한다.)
      권한이 없을 때(통신사가 IP알지 못할 때) 
      - Root domain부터 순서대로 질의를 해서 알아간다. (트리형)
      - 왜 분산해서 트리형으로 조회하나? 서버과부하 방지하기위해
      트리형으로 질의를 통해 알아가는 과정

       


      쿠키 / 세션 / 캐시 비교

        특징 원리 장점
      쿠키 사용자의 브라우저에 저장되고, 통신할 때 HTTP 헤더에 포함되는 텍스트 데이터 파일
      이름, 값 만료기간(지정 가능), 경로 정보가 있고 키와 값으로 구성되어 있다
      해당 사용자의 컴퓨터를 사용한다면 누구나 쿠키에 입력된 값을 쉽게 확인 가능 -> 보안성이 낮다!

      (1) 최초 통신에서는 쿠키값이 없으므로, 일단 클라이언트는 Request 를 한다.
      (2) 서버에서 클라이언트가 보낸 Request Header에 쿠키가 없음을 판별. 
          통신 상태(UserID, Password, 조작상태, 방문횟수 등)를 저장한 쿠키를 Response한다.
      (3) 클라이언트의 브라우저가 받은 쿠키를 생성/보존한다
      (4) 두번째 연결부턴, HTTP Header에 쿠키를 실어서 서버에 Request 한다

      - 클라이언트는 총 300개의 쿠키를 저장할 수 있음
      - 하나의 도메인 당 20개의 쿠키를 가질 수 있음 -> 20개가 넘으면 가장 적게 사용되는 것부터 삭제됨
      - 하나의 쿠키는 4KB (4096byte) 저장 가능



      자동 로그인 유지, 위시 리스트 저장, 팝업 보지 않기


      세션  
      서버'에 저장되는 쿠키. 클라이언트와 서버의 통신 상태. 주로 중요한 데이터를 저장 시 사용
      브라우저를 종료할 때까지 유지 됨
      사용자 로컬이 아닌 서버에 직접 저장되므로, 세션 내의 데이터를 탈취하는 것은 어려움 -> 보안성이 비교적 높음



      (1) 클라이언트가 서버에 접속 시, 세션 ID를 발급한다.
      (2) 서버에서는 클라이언트로 발급해준 세션 ID를 쿠키를 이용해서 저장
      (3) 클라이언트는 다시 페이지에 접속할 때, 쿠키에 저장된 세션 ID를 서버에 전달
      (4) 서버는 Request Header에 쿠키 정보(세션 ID)로 클라이언트를 판별



      로그인 정보 유지
      캐시 리소스 파일들의 임시 저장소. 같은 웹 페이지에 접속할 때 사용자의 PC에서 로드하므로 서버를 거치지 않아도 된다.
      이전에 사용되었던 데이터는 다시 사용될 가능성이 높다 -> 그래서 다시 사용될 확률이 있는 데이터들을 빠르게 접근 가능한 저장소에 저장한다.
      => 페이지 로딩 속도를 개선함 
      이미지, 비디오 오디오, CSS/JS 등...



      (1) 캐시 히트(Cache Hit)
      CPU가 참조하려는 메모리가 캐시에 존재하고 있는 경우

      (2) 캐시 미스(Cache Miss)
      <-> 캐시 히트와 반대로, 메모리에 캐시가 존재하지 않는 경우



       
        방식 내용
      Local 캐시

      - 서버마다 캐시를 따로 저장한다.
      - 로컬 서버의 리소스를 사용한다.
      - 서버 내에서 작동하기 때문에 빠르다.
      - 다른 서버의 캐시를 참조하기 어렵다.
      Global 캐시
      - 여러 서버에서 캐시 서버를 참조합니다.
      - 네트워크 트래픽을 사용해야 해서 로컬 캐시보다는 느립니다.
      - 서버간 데이터 공유가 쉽습니다. 
      - Redis 서버를 사용
      LocalCache & GlobalCache

      ORM이란?

      ORM(Object Relational Mapping) 즉, 객체-관계 매핑의 줄임말이다. 객체-관계 매핑을 풀어서 설명하자면 OOP에서 쓰이는 객체와 RDB(Relational DataBase)에서 쓰이는 데이터인 테이블 자동으로 매핑(연결) 하는 것을 의미한다. 
      하지만 기존부터 호환가능성을 두고 만들어 진 것이 아니기 때문에 불일치가 발생한다. 이를 ORM을 통해 객체 간의 관계를 바탕으로 SQL문을 자동으로 생성하여 불일치를 해결한다.
      즉, 객체 관계 매핑, 객체와 RDB를 별개로 설계하고 ORM이 매핑 해주는 역할이며, ORM은 SQL문이 아닌 RDB에 데이터 그 자체와 매핑하기 때문에 SQL을 직접 잘성할 필요가 없다. 이로인해 어떤 RDB를 사용하던 상관 없다.
      MyBatis
      마이바티스는 데이터베이스 레코드에 원시타입과 Map 인터페이스 그리고 자바 POJO를 설정하여 매핑하기 위해 XML과 어노테이션을 사용할 수 있다 즉, MyBatis는 자바에서 SQL Mapper를 지원해주는 FrameWork이다.
      즉, SQL 작성을 직접 하여 객체와 매핑시켜준다.
      SQL Mapper
      SQL문을 이용하여 RDB에 접근, 데이터를 오브젝트(객체)화 시켜준다.
      개발자가 작성한 SQL문으로 해당되는 ROW를 읽어 온 후 결과 값을 오브젝화 시켜 사용가능하게 만들어준다.
      즉, RDB에 따라 SQL문법이 다르기 때문에 특정 RDB(작성한 SQL)에 종속적이다.

      JPA의 장/단점

      장점

      • RDB에 상관없이 사용가능 -> 재사용성 유지보수 용이
      • CRUD 기본적인 제공과 페이징 처리 등 상당 부분이 구현되어 있음
      • 테이블 생성, 변경 엔티티 관리가 편하다.
      • 쿼리에 집중할 필요가 없다.

      단점

      • 어렵다.
        • 단방향, 양방향, 임베디드 관계 등 이해해야할 내용이 많으며, 연관관계 이해 없이 잘못 코딩 했을 시 성능상의 문제와 동작이 원하는 대로 되지 않는다.
          • ex) Board 엔티티에 List형태로 Reply 엔티티가 있을 시, 단방향 연관관계인 경우 하나의 Reply가 변경되어도 모두 삭제되고 전부 Insert되는 경우
          • ex) 하나의 Board 조회 시 Reply를 Join이 아닌 여러개의 select 문으로 하나하나 읽어오는 문제(N+1) 

      MyBatis의 장/단점

      장점

      • JPA비해 직관적이며 쉽다.
        • SQL 쿼리를 그대로 사용하기에 Join, 튜닝 등을 좀 더 수월하게 작성 가능하다.
      • SQL의 세부적인 내용 변경 시 좀 더 간편하다.
      • 동적 쿼리 사용 시 JPA보다 간편하게 구현 가능하다.

      단점

      • 데이터 베이스 설정 변경 시 수정할 부분이 너무 많다.
      • Mapper 작성부터 인터페이스 설계까지 JPA보다 많은 설계와 로직이 필요하다.
      • 특정 DB에 종속적이다.
      ORM 프레임워크

      - JPA/Hibernate

      JPA(Java Persitence API)는 자바의 ORM 기술 표준으로 인터페이스의 모음이다. 이러한 JPA 표준 명세를 구현한 구현체가 바로 Hibernate이다. 

      사용 예제
      프레임 워크 예제
      iBatis
      Java

      Hibernate
      JPA Interface : 인터페이스
      ↓ 상속
      Hibernate, EcipseLink, DataNucleus 등 : 구현체


      JPA ex) 기존쿼리 : SELECT * FROM MEMBER; 이를 ORM을 사용하면 Member테이블과 매핑된 객체가 member라고 할 때, member.findAll()이라는 메서드 호출로 데이터 조회가 가능하다.
      만약 Mybatis 였다면 신규 컬럼이 추가 되면 DTO(Vo, Domain), DAO 개발 수정 작업이 매무 반복되어 일어난다. (쿼리 수정, 모델 수정 등...) 

      출처: https://goddaehee.tistory.com/209 [갓대희의 작은공간]

      JPA와 MyBatis의 차이

       


      REST API 

       

      REST / REST API / RESTful API 개념

      REST의 정의 REST API란 REST를 기반으로 만들어진 API를 의미합니다. REST란 무엇일까? REST(Representational State Transfer)의 약자로 자원을 이름으로 구분하여 해당 자원의 상태를 주고받는 모든 것이라는..

      wantairpod.tistory.com


      웹 사이트가 브라우저에 뜨는 과정

      • 사용자가 URL을 입력한다.
      • 만약 브라우저에 캐싱된 URL이면 DNS 서버에 요청을 보내지 않는다.
      • 캐싱되어 있지 않으면, 로컬에 저장되어있는 hosts 파일 중 참조할 수 있는 도메인이 있는 확인 한다.
      • 만약 hosts에 없다면, DNS에 시스템에 따라 (역tree) 형식, root-server-tld서버-authoriative 서버에 각각 요청을 해서 ip 주소를 알아낸다.
      • ip 주소를 받았다면 MAC 주소를 알아낸다. (로컬이면 바로알아내고, 아니면 gateway를 통해 밖에 MAC주소를 검색한다.
      • MAC 주소를 받았다면, TCP 통신을 통해 소켓을 열고(3 ways handshake) OSI 7계층을 통해 클라이언트에서 서버까지 데이터를 전달하고 세션을 연결 한다.
        • http 요청 메시지를 TCP 프로토콜을 사용해 인터넷을 거쳐 ip 주소(목적지)의 컴퓨터로 전송
        • 도착한 http 요청 메시지로 http 응답 메시지를 만들어 TCP 프로토콜을 사용해 원래 컴퓨터(출발지)로 전송한다.
        • 도착한 http 응답 메시지는 http 프로토콜을 사용해 웹 페이지 데이터로 변환
        • 변환된 웹페이지의 데이터는 웹 브라우저에 의해 출력된다.

      웹 사이트가 브라우저에 뜨는 과정 참고 이미지 

      Spring 에서 URL 요청이 왔을 때 실행 동작

      1. 클라이언트가 Request 요청을 하면, DispatcherServlet이 요청을 가로챈다. 
        • 이때 모든 요청을 가로채는 것은 아니고 web.xml에 등록된 내용만 가로챈다.
      2. DispathcerServelt이 가로챈 요청을 HandlerMapping에게 보내 해당 요청을 처리할 수 있는 Contoller를 찾는다.
      3. 로직 정리 : (Controller->Service->DAO->DB->DAO->Service->Controller)
      4. 로직 처리 후 ViewResolver를 통해 view 화면을 찾는다.

      참고

      https://data-make.tistory.com/714

       


      Check Exception & unCheck Exception 의 차이

      Exception은 Checked Exception과 unchecked Exception으로 구분할 수 있는데, 간단하게 RuntimeException을 상속하지 않는 클래스는 Checked Exception, 반대로 상속한 클래스는 unchecked Exception 으로 분류할 수 있다. 

      가장 중요한 부분은 처리여부이다. RuntimeException을 상속한 클래스를 조금 특별하게 취급한다. 명시적으로 예외처리를 하지 않아도 된다. 

      Spring에서 어떤 exception에서 롤백처리를 하나?

      unchecked Exception의 경우 롤백처리를 하며 스프링의 @transactional 옵션에 rollback가 있는데 디폴트 값이 runtimeException, error이다. 즉 디폴트 값이 runtimeException이므로 롤백된다.

      참고

      https://velog.io/@kdhyo/JavaTransactional-Annotation-%EC%95%8C%EA%B3%A0-%EC%93%B0%EC%9E%90-26her30h

      예외처리 방법

      예외를 처리하는 방법에는 예외 복구, 예외 처리 회피, 예외 전환 방법이 있다.

      요약

        Checked Exception UnChecked Exception
      처리 여부 반드시 예외 처리해야한다. 명시적으로 하지 않아도 된다.
      예외 처리를 강제하지 않는다.
      말 그래도 runtime(실행)_
      RuntimeException 상속X 상속O
      예시 FileNotFoundException,
      ClassNotFoundException
      ArrayIndexOutOfBoundsException,
      NullPointerException
      RollBack 여부 Roll-Back 하지 않고 트랜잭션이 commit까지 완료 Roll-Back 된다.

      SPA 란?

      SPA(Single Page Application) 

      단일 페이지 어플리케이션(SPA)는 현재 웹개발의 트랜드이다. 

      • 기존 웹 서비스는 요청시마다 서버로부터 리소스들과 데이터를 해석하고 화면에 렌더링하는 방식이다. SPA 형태는 브라우저에 최초에 한번 페이지 전체가 로드하고, 이후부터는 특정 부분만 Ajax를 통해 데이터를 바인딩하는 방식이다. 

      전통적인 페이지 vs 단일 페이지 어플리케이션 비교

      자바스크립트의 발전

      초기의 SPA개념 : Backbone.js, Angular.js 라이브러리

      지금은 템플릿 개념을 지나 컴포넌트 개념 : React.js, Vue.js

      SPA 구현을 쉽게 말하면 jsp파일 없이 index.html파일 하나에 js, css등 리소스 파일들과 모듈들을 로드해서 페이지 이동 없이 특정영역만 새로 모듈을 호출하고 데이터를 바인딩하는 개념이다. 물론 이와 같이 개발하기 위해서는 ES6, Node.js, npm 그리고 webpack 같은 번들러 등 개념을 한번 정도는 잡고 접근해야 할게 많다. 

      단일 페이지 응용 프로그램 및 사용자 경험

      사용자 측면에서 일정한 전체 페이지 새로 고침 혹은 웹사이트에서 정보를 얻기 위해 앞뒤로 왔다갔다 하는 것은 과도한 네트워크 트래픽을 유도하고 편이성 마저 떨어집니다. HTML 버전의 데이터는 모든 여는 태그와 닫는 태그로 인해 일반 JSON 객체와 비교할 때 훨씬 더 크기가 더 크며, 비슷한 페이지를 계속로드하는 경우에는 많은 HTML이 중복됩니다. 또한 두 번째 큰 장점 인 적은 페이지 전체 재로드로 인한 사용자 경험 향상과 더 적은 대역폭이 필요하기 때문에 전반적인 성능 향상이 있습니다.

      참고 사이트

      https://www.reimaginer.me/entry/spa-and-spa-routing


      브라우저 렌더링 과정

      1. 브라우저는 HTML, CSS, JS, 이미지 등 렌더링에 필요한 리소스를 서버에 요청하고 응답을 받습니다.
      2. 브라우저 렌더링 엔진은 서버로부터 응답받은 HTML과 CSS를 파싱하여 DOM과 CSSOM를 생성하고, 이 둘을 결합하여 렌더트리를 생성한다.
      3. 브라우저 자바스크립트 에진은 서버로부터 받은 js를 파싱하여 AST를 생성하고 바이트 코드로 변환하여 실행한다. 자바스크립트가 DOM API를 통해 DOM이나 CSSOM을 변경한다면, 변경된 DOM과 CSSOM은 다시 렌더트리로 결합됩니다.
      4. 결합된 렌더트리를 기반으로 HTML 요소의 레이아웃을 계산하고 브라우저에 HTML요소를 페인팅한다. 

      참고

      https://devcecy.com/%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80%EB%8A%94-%EC%96%B4%EB%96%BB%EA%B2%8C-%EB%A0%8C%EB%8D%94%EB%A7%81-%EB%90%A0%EA%B9%8C/


      탐색 & 정렬 알고리즘

      탐색

      • 이진탐색
        • 정렬되어 있는 배열이라는 전제 조건이 있음
        • 원하는 값(x)를 찾을 때, 배열의 가운데 값(m)을 기준으로 크고 작음을 비교해 탐색하는 것
        • m이 x보다 크면, 배열의 오른쪽을 뚝 잘라 왼쪽에서 다시 가운데 값을 정의(m1)하고 비교, 반복
        • 탐색하는 배열이 반씩 줄어들기 때문에 시간복잡도 측면에서 유리
      • 완전탐색
        • 가능한 모든 경우의 수를 다 구해서 값을 찾는 것
        • 결과 값이 가장 확실하지만 그만큼 시간이 가장 오래 걸림
      • 탐욕(greedy) 알고리즘
        • 최적해를 찾는 근사적 방법
      • DFS/BFS(깊이, 너비우선탐색)
        • 다음 레벨로 이동하면서 탐색하기 때문에 못 찾으면 백트래킹을 해야 하기 때문에 현재 노드의 위치를 스택에 저장해야함
        • BFS는 같은 레벨에 대한 탐색을 모두 마치고 다음 레벨로 이동
      • 최단거리(다익스트라)
      • 동적계획법

      정렬

      • 힙정렬(NlogN)
        • 힙을 이용해 최대, 최소값을 찾는 정렬 방법
        • 완전 이진트리 기반
        • 최대값을 구할 경우, 배열을 최대힙으로 만들어주면 루트 노드는 가장 큰 값을 갖게 된다.
      • 선택정렬(O(N^2))
        • 배열의 첫 번째 위치에서 시작해 나열된 값 중 최소값을 구해 앞으로 이동
      • 버블정렬(O(N^2))
        • 배열의 첫번째 위치에서 인접한 값과 비교해 큰 값을 오른쪽으로 이동
        • n-1번째까지 한바퀴 돌게 되면 최대값은 배열의 맨 마지막으로 가게 되어있음
      • 삽입정렬(N~N^2)
        • 배열이 어느정도 정렬된 상태에서 사용된다.
      • 합병(병합)정렬(NlogN)
        • 배열의 가장 최소단위가 1이 될 때까지 분리하고 다시 합치면서 값을 비교하며 정렬함
        • 분할하면서 추가적 배열이 필요하게되고, 메모리가 소요되어 공간복잡도 효율은 떨어짐
      • 퀵 정렬(NlogN)
        • 기준값에 의한 분할을 통해서 구현하는 정렬법으로써, 분할 과정에서 logN 이라는 시간이 걸리게되고 전체적으로 보게되면 NlogN으로써 실행시간이 준수한 편이다.

      자주 출몰 하는 퀵 정렬, 병합 정렬, 힙 정렬

        퀵정렬(Quick Sort) 병합정렬(merge sort) 힙 정렬(heap sort)
      특징 불안정, 제자리, 피벗 있는 분할+정복 안정, 제자리, 원본크기 메모리 필요 불안정, 제자리, 트리
      평균 NlogN NlogN NlogN
      최악 N^2 NlogN NlogN
      최대 NlogN NlogN NlogN
      최선 NlogN NlogN NlogN
      공간복잡도 n n n

      퀵 정렬(Quick Sort)

      • 구동방식
        • 퀵 정렬(Quick Sort)은 기준값(Pivot) 중심으로 자료를 왼쪽 부분집합과 오른쪽 부분집합으로 분할한다. 
        • 왼쪽 부분집합으로 기준값보다 작은 원소를 이동시키고, 오른쪽 부분집합으로 기준값보다 큰 원소를 이동시킨다. 
        • 퀵 정렬은 분할과 정복(Divide and Conquer)라는 작업을 반복하여 수행한다.
      • 시간복잡도
        • 위의 표 참고
      • 활용케이스
        • 메모리가 부족하고(병합정렬 사용 불가)
        • 배열이 이미 정렬/역정렬 되어있을 경우가 아닐 때(최악)
        • 동일한 요소의 자리가 바뀌어도 상관이 없는 경우(not stable 하므로)

      힙 정렬(Heap Sort)

      • 구동방식
        • 모든 노드가 힙 속성(각 노드의 값이 자신의 자식노드 값 보다 큰 이진트리)을 만족하도록 재귀적으로 트리 구조를 만들어 정렬을 완성
        • 시간복잡도
          • 위의 표 참고
        • 활용케이스
          • 메모리가 부족하고(병합정렬 사용 불가)
          • 배열이 이미 정렬/역정렬 되어 있을 경우(퀵 정렬 사용 불가)
          • 같은 원소의 원래 위착 바뀌어도 상관없는 경우(힙정렬은 불완전 정렬이므로)
          • 단순히 속도만 가지고 비교하면 퀵 정렬이 평균적으로 더 빠르다.

      병합정렬(Merge Sort)

      • 구동방식
        • 리스트를 잘게 쪼갠 뒤 둘씩 크기를 비교해 정렬하고 분리된 리스트를 재귀적으로 합쳐서 정렬을 완성, 분할된 리스트를 저장해둘 공간이 필요해 메모리 소모량이 매우 크다.
      • 시간 복잡도
        • 위의 표 참고
      • 활용케이스
        • 배열이 이미 정렬되어있고, 메모리가 충분한 경우
        • 퀵 정렬과 달리 pivot이 없으므로 성능이 저하 없이 항상 NlogN이다.
        • 병합 정렬은 순차적인 비교를 통해 정렬하므로 LinkedList의 정렬에 효율적이다.
        • 병합 정렬은 추가 메모를 요구하므로, 메모리 효율이 중요한 경우 퀵정렬이 나을 것이다.

      참고

      https://yabmoons.tistory.com/250


       

      안드로이드의 4대 컴포넌트에 대해서 설명해보세요.

      안드로이드의 4대 컴포넌트로는 액티비티, 서비스, 브로드케스트리시버, 콘텐트  프로바이더

      엑티비티 안드로이드에서 화면을 관리하고 사용자의 다양한 이벤트 처리하는데 사용

      서비스는 화면에서 보이지 않지만 특정한 기능을 백그라운드에서 처리

      브로드캐스트 서버는 안드로이드에서 발생하는 특정 브로드캐스트 메세지를 처리하기 위한 컴포넌트

       

       

      [Android] 안드로이드 Context란?

       

      안드로이드의 엑티비티와 엑티비티의 수명주기에 대해서 설명해보세요.

      2020/11/28 - [개인공부/*기술면접 대비] - [안드로이드] 생명주기 (LifeCycle)

       

      [안드로이드] 생명주기 (LifeCycle)

      OnCreate() 생성자랑 비슷하며 액티비가 처음 생성됨 OnStart() 시작되기 직전상태 OnCreate()와 OnResume()사이의 순서 OnResume() OnStart()와 비슷하지만 이제 액티비가 뜨고 동작하기 완전 직전 상태 OnPause..

      wantairpod.tistory.com

       

      안드로이드의 메니페이스 파일에 대해서 설명해보세요.

      매니페이스 파일은 앱의 이름, 버전, 구성요소, 권한 등 앱의 실행에서 꼭 필요한 정보가 저장 되어 있는 파일

      xml파일로 프로젝트의 최상위에 존재

      태그 구성으로 가장위는 manifest 태그가 존재하고 패키지명, 버전 등이 기제됩니다.

      application 태그에는 앱 아이콘, 앱 이름등의 정보가 저장됩니다.

      activity태그에는 액티비티 클래스명과 액티비티 이름을 정의합니다.

      acitivty 하위에는 intent-filter 태그를 이용하여 액티비티에 대한 인텐트 작업시 필요한 action과 category를 정의

       

       

      RxJava란 ?

      일단 RxJava는 Reactive Programming을 기반으로 한 언어이다.

      즉 Reactive Extension의 JVM버전이다.

      비동기 데이터 처리를 효율적으로 할 수 있는 장점이 있다.

      반응형 프로그래밍

      for if while과 같은 것이 아니라 sql 쿼리 같은 선언형으로 구성됩니다.

      또 함수를 단지 호출하는 대상이 아니라 변수로도, 혹은 인자로도 넘길 수 있습니다.

      이러한 함수형 언어의 도구들을 자유롭게 활용해야 합니다. (java8의 람다표현식)

      1) 반응형 프고르맹은 명령형 프로그래밍의 반대말이다.

      명령형 프로그래밍이란... 우리가 지금까지 해온 C/C++, Java라고 생각하면 됩니다. 변수, for, while, if등의 제어문을 사용합니다.

      그 반대로 반응형 프로그래밍이란 선언형(declarative) 프로그래밍입니다. 대표적인 예로 SQL이 있습니다.

      반응형 프로그래밍은 선언형 프로그래밍을 지향합니다.

       

      2) 반응형 프로그램밍은 함수형 프로그래밍을 활용한다.

      함수형 언어는 함수를 단지 호출하는 대상이 아닌 변수로도 할 수 있고 인자로도 넘길 수 있고 마음대로 할 수 있다.

      반응형 프로그래밍은 함수형 언어 도구들을 자유자재로 활용해야 합니다. 예를 들어 Java8에 도입된 람다 표현식은 반드시 알아야한다.

       

      3) 반응형 프로그래밍은 함수형 프로그래밍 언어의 도구들을 가지고 데이터 흐름을 Composable 하게 구현하는 것입니다.

       

       

      Java/Kotlin 차이

      Java의 특징

      • 멀티 플랫폼
        • 크로스 플랫폼이라고도 불리는데 JVM(Java Virtual Machine)만 설치되어 있으면 어떤 운영체제에서도 애플리케이션을 작동시킬 수 있습니다.
      • 메모리 관리
        • 자바는 포인터 개념이 없고 자동으로 메모리를 관리합니다.
        • Garbage Collector 가 사용하지 않는 자원을 자동으로 반환해줍니다.
        • 프로그래밍이 편해집니다.
      • OOP (Object Oriented Programing)
        • 부품들을 조립해서 하나의 제품을 만드는 것과 같은 원리입니다.
        • 객체(Object)라는 단위로 나누고 객체들끼리 상호작용하는 방식입니다.
      • 멀티 스레드
        • Thread 클래스와 Runnable 인터페이스를 이용하여 멀티 스레드를 구현합니다.
      • 동적 로딩
        • 필요한 시점에 구현한 클래스를 로딩할 수 있습니다.

      코틀린 특징

      개발자의 편의성, 간결하고 효율적인 코드 작성, 객체지향 프로그래밍과 함수형 프로그래밍의 장점을 절묘하게 조화시킨 언어
       

      코틀린은 jvm의 바이트 코드로 실행되고 자바와 100% 호환되므로 뿌리부터 완전히 다른 새로운 개념의 언어는 아닙니다. 따라서 모든 특징을 설명하기보단 자바와 비교해가며 특징을 보도록 하겠습니다.

      • Type Inference
        • 할당되는 리터럴 값을 알아서 추론해줍니다.
      • OOP 와 FP (Functional Programing)
        • 객체지향 프로그래밍, 함수형 프로그래밍을 모두 지원합니다.
        • 코틀린에서 함수는 일급 객체입니다.
        • 고차 함수로 사용이 가능합니다.
      • 모든 타입이 클래스 타입
        • 기본형 타입마저 클래스로 존재합니다. (Nullable 위해)
      • Nullable
        • Null 할당이 가능한 타입을 선언할 수 있습니다.
        • NPE 예외를 컴파일 시점에서 미리 방지할 수 있습니다.

      안드로이드 개발에서 차이

      안드로이드를 개발할 땐 객체지향 언어처럼 클래스 내에서 로직을 작성해야 합니다.

      여전히 자바와 코틀린을 동시에 지원하므로 자바의 형식에 맞춰서 코틀린을 사용해야 합니다.

      하지만 자바로 작성했을 때보다는 코틀린 코드의 양이 훨씬 줄어들고 간결해지므로 개발자의 편의성이 훨씬 좋습니다.

       

      일례로 Java에선 변수에 대한 get/set 함수를 만들어주고 생성자를 만들어 변수를 초기화하는 작업을 수행해야함.(수 십줄) 하지만 코틀린은 data class를 만들어 정의해주면 코드량이 엄청나게 간결해진다. (5줄이내) 아무래도 나중에 나온 언어다 보니 Java의 좋은 점+a 라고 생각하면된다.

       

      함수형 프로그래밍

      함수형 프로그래밍은 이름처럼 함수를 기반으로 돌아가는 프로그램(=JavaScript)

      함수형 프로그래밍은 몇 가지 원칙이 있습니다.

      • 입출력이 순수해야합니다. (순수함수)
        • 하나 이상의 인자를 받고, 받은 인자를 처리하여 반드시 결과물을 돌려주어야 한다.
        •  
      • 부작용(부산물)이 없어야합니다.
      • 함수와 데이터를 중점으로 생각합니다.
      •  
      //보통의 반복문 생성
      var sum = 0;
      for (var i = 1; i <= 10; i++) 
      {
        sum += i;
      }
      
      //함수형 프로그래밍
      function add(sum, count) 
      {
        sum += count;
        if (count > 0) 
        {
          return add(sum, count - 1);
        } else 
        {
          return sum;
        }
      }
      add(0, 10); // 55

      JSP / JavaScript / JQuery / Java 차이점

        설명
      JSP - 서버언어 JSP(Java Server Pages)의 약자로 HTML 내에 직접 자바 코드를 삽입하여 웹 서버에서 동적으로 웹 페이지를 생성하여 웹브루아저에게 돌려주는 서버 측 웹 프로그래밍중 하나이다. Java EE 스펙 중 일부로 웹 어플리케이션 서버(WAS)에서 동작한다.
      JavaScript - 클라이 언트 언어 Front-end 개발 언어로, 정적인 웹 문서에 동작을 부여하는 스크립트 언어(소스 코드를 컴파일하지 않고도 실행할 수 있는 프로그래밍 언어를 의미한다)이다. javaScript도 웹 브라우저에서 바로 실행되며, JSP와 다르게 클라이언트 측 스크립트 언어이다.
      JQuery 브라우저 호환성이 있는 HTML 속 자바 스크립트 라이브러리(Library)이다. 클라이언트 사이드 스크립트 언어를 단순화 할 수 있도록 설계 되어있다.
      즉, 정리하자면 JSP는 서버에서 자원(코드)들을 사용하는 것이고, Java Script는 클라이언트에서 자원(코드)를 사용한다. JQuery는 Java Script의 라이브러로 생성된 언어이고, Java를 이용하여 HTML 문서를 출력하게 되는데 이것을 서블릿이라고 하며 이 서블릿은 Java로 간편하게 하기 위해 나온것이 JSP이다. 라고 정리하자.

       


       

      [Servlet, JSP]

      기능의 차이는 없고 역할의 차이만 있다.(하는 일은 동일)

      Servlet

      • Container가 이해할 수 있게 구성된 순수 자바 코드로만 이루어진 것 (Html in Java : 자바 코드안에 html 코드)
      • 웹 개발을 위해 만든 표준
      • Java 코드 안에 HTML 코드
      • Data Processing(Controller)에 좋다.
      • 즉 DB와의 통신, Business Logic 호출, 데이터를 읽고 확인하는 작업에 유용하다.
      • Servlet이 수정된 이후 java 코드를 컴파일(.class 파일 생성)한 후 동적인 페이지를 처리하기 때문에 전체 코드를 업데이트하고 다시 컴파일하는 재배포하는 작업이 필요하다.

      JSP(Java Server Page) :

      • html기반에 java코드를 블록화하여 삽입한 것(Java in Html : HTML 코드안에 JAVA 코드)
      • HTML 코드안에 Java 코드
      • Servlet를 보완하고 기술을 확장한 스크립트 방식 표준

       

       

      [JDBC]

      Java Data Base Connection의 약자로 JAVA 언어를 통해 데이터 베이스에 접근할 수 있는 프로그래밍 의미.

       

      [Get/Post 방식]

      Get 방식

      Post 방식

       

      [JSP]

      JavaScript

      • 클라이언트 언어
      • 웹 브라우저 (사용자의 컴퓨터)에서 실행되는 스크립트 언어
      • 자바스크립트 파일은 .js 확장자를 가지며, 자바스크립트 문법에 따라 작성 됨
      • 프로그래밍 언어 중 하나 라고 생각하면 된다.

      JSP(Java Sever Page)

      • 서버 언어(JavaScript 처럼 언어의 종류를 나타내는 것은 아니다.)
      • JSP는 서버에서 실행되고, 그 결과가 웹브라우저(사용자 컴퓨터)로 전송된다.
      • JSP는 웹 서버에서 실행되는 .JSP파일
        • JSP 파일에는 html태그와 javascript 함수도 사용이 가능하다. 추가로 자바 문법도 사용가능하다.

      [Maven]

      빌드

      • 작성한 소스코드 (Java), 프로젝트에서 쓰인 각각의 파일 및 자원(.xml, .jpg, .jar, .properties)을 JVM이나 톰캣(=WAS)가 인식할 수 있는 구조로 패키징 하는 과정 및 결과물이라고 할 수 있다.

      빌드도구

      • 빌드도구란 프로젝트 생성, 테스트 빌드, 배포 등의 작업을 위한 전용 프로그램
        • 빠른기간동안 계속해서 늘어나는 라이브러리 추가, 프로젝트 진행하며 라이브러리의 버전 동기화의 어려움을 해소하고자 등장
      • 초기의 java 빌드도구는 Ant-> 최근 Maven -> Gralde이 많이 쓰인다.

      Maven

      • Maven은 자바용 프로젝트 관리도구로 Apache Ant의 대안으로 만들어졌다.
      • Maven은 Ant와 마찬가지로 프로젝트의 전체적인 라이프 사이클을 관리하는 도구 이며, 많은 편리함과 이점이 있어 널리 사용되고 있다.
      • Maven은 특정문서 (pom.xml)에 정의해 놓으면 내가 사용할 라이브러리 뿐만 아니라 해당 라이브러리가 작동하는데 필요한 다른 라이브러리들까지 관리하여 네트워크를 통해서 자동으로 다운받아 준다.
      • 간단한 설정을 통한 배포 관리가 가능하다.

       

      [브라우저]

      • 우리가 사용하는 브라우저는 사용자가 요청한 자원(URI 주소)을 받아와서 표시해준다. 주로 HTML 파일을 받아와 해석하여 보여주지만, 이미지, PDF 등 여러가지 파일 역시 지원한다.
      • 브라우저는 사용자가 요청하여 받아온 HTML파일을 파싱하여 DOM 트리를 그리고, CSS 파일을 파싱하여 이를 결합한 후 렌더링을 하는 작업을 우리의 화면에 그려주게 된다.

      [HTML]

      • HTML(HyperText Markup Language)은 웹 페이지를 위한 언어로, 특정 영역이 어떤 성질을 갖는지 미리 정해진 규칙에 따라 구조화된 요소들로 이루어진 마크업 언어이다.
        마크업 언어는 태그(<>)를 이용하여 데이터 구조를 명명하는 언어이므로, 태그 안에 담기는 요소들에 따라 영역의 성질이 달라지게 되고 각 영역들이 모여 구조화된 문서를 만든다.
      • HTML 요소들은 W3C라는 웹 표준기구에서 정한 가이드라인을 기반으로 정해져왔기 때문에 서로 다른 브라우저에서는 표준에 맞게 해석하여 동일 페이지를 사용자에게 보여줄 수 있다.
      • HTML은 인간이 이해하고 구분할 수 있는 언어로 만들어져 있고, 기계는 이렇게 규약된 언어를 해석할 수 없다. 때문에, 파싱이라는 작업을 거쳐 브라우저가 해석할 수 있는 언어와 구조로 변환하는 작업이 필요하다.
        (각 브라우저마다 파서가 다르기 때문에 같은 HTML문서라도 다른 파싱 결과값을 가질 수 있다.)

      [DOM]

      첫째, 브라우저는 html태그를 파싱 하여 돔 트리를 구성한다.

      동시에 브라우저는 스타일시트에서 css를 파싱 하여 스타일 규칙들을 만들어낸다.

      둘째, 위에서 언급한 돔 트리와 스타일 규칙 두 가지가 합쳐져서 렌더 트리를 만들어낸다.

      DOM은 원본 HTML 문서의 객체 기반 표현 방식입니다. 둘은 서로 비슷하지만, DOM이 갖고 있는 근본적인 차이는 단순 텍스트로 구성된 HTML 문서의 내용과 구조가 객체 모델로 변환되어 다양한 프로그램에서 사용될 수 있다는 점입니다.

      • DOM이란 웹페이지의 HTML을 계층화시켜 트리구조로 만든 객체 모델이다.
      • javascript는 이 model로 웹 페이지에 접근하고, 페이지를 수정 할 수 있습니다.
      • DOM은 HTML인 웹페이지와 스크립팅언어(JavaScript)를 서로 잇는 역할이다.

      • 이렇게 파싱된 HTML 언어는 트리구조를 갖는 객체로 표현되는데, 이를 DOM(Document Object Model)이라고 한다.
      • DOM은 문서에 접근할 수 있는 API로, node와 property, method를 갖는 객체로 이루어져 스크립트나 CSS와 같은 언어들이 DOM 구조에 접근 하여 커스텀 할 수 있게 만들어주는 연결 부분 역할을 갖는다.
      • 때문에 DOM을 이용하여 텍스트값을 변경할 수 있고 스타일링 및 노드 구조까지도 바꿀 수 있다.

       

      [DOM과 HTML의 차이]

      DOM은 HTML 문서로부터 생성되지만 항상 동일하지 않습니다. DOM이 원본 HTML 소스와 다를 수 있는 두 가지 케이스가 있습니다.

      • 작성된 HTML 문서가 유효하지 않을 때

      올바르게 교정되므로 HTML!=DOM

      • 자바스크립트에 의해 DOM이 수정될 때

      javascript로 DOM을 업데이트

      이 코드는 DOM을 업데이트합니다. 하지만 HTML 문서의 내용을 변경하진 않습니다.

      • W3C의 DOM 스펙에선, 문서의 의미는 HTML에만 국한된것이 아니라고 한다. XML 역시 DOM을 사용하여 데이터를 관리할 수 있으며, DOM은 다양한 환경과 어플리케이션에서 사용할 수 있는 API라고 설명한다.
      • HTML은 단순히 규칙에 따라 정해진 태그, 속성값으로 이루어진 언어이며,
        DOM은 브라우저가 HTML 파싱한 후 생성되는 객체 모델로, document에 접근가능한 API이다.

      요약정리

      DOM은 HTML 문서에 대한 인터페이스입니다.
      • 첫째로 뷰 포트에 무엇을 렌더링 할지 결정하기 위해 사용되며,
      • 둘째로는 페이지의 콘텐츠 및 구조, 그리고 스타일이 자바스크립트 프로그램에 의해 수정되기 위해 사용됩니다.
      • DOM은 원본 HTML 문서 형태와 비슷하지만 몇 가지 차이점이 있습니다.
        • 항상 유효한 HTML 형식입니다.
        • 자바스크립트에 수정될 수 있는 동적 모델이어야 합니다.
      • Javascript가 getElementbyid()를 같은 함수를 이용하여 HTML문서의 각 요소(li, head같은 태그들)들을 접근하고 사용할 수 있도록 하는 객체 모델입니다.

      [가상 돔(Vitual DOM)]

      가상돔(Virtual DOM)은 실제 DOM 문서를 추상화한 개념으로, 변화가 많은 View를 실제 DOM에서 직접 처리하는 방식이 아닌 Virtual Dom과 메모리에서 미리 처리하고 저장한 후 실제 DOM과 동기화 하는 프로그래밍 개념입니다.

       

      가상 돔이 생긴 원인

      기존에는 화면의 변경사항을 돔을 직접 조작하여 브라우저에 반영하였다. 하지만, 이 방법의 가장 큰 단점은 돔 트리가 수정될 때마다 렌더 트리가 계속해서 실시간으로 갱신된다는 점이었다. 즉, 화면에서 10개의 수정사항이 발생하면 수정할 때마다 새로운 랜더 트리가 10번 수정되면서 새롭게 만들어지게 되는 것이다.

      효과

      가상 돔을 활용하면 이러한 불필요한 렌더링 횟수를 줄일 수 있다. 가상 돔을 활용한 대표적인 프런트 앤드 프레임워크가 리액트, 뷰, 앵귤러이다. 이러한 프레임워크들은 화면에 변화가 있을 때마다 실시간으로 돔 트리를 수정하지 않고 변경사항이 모두 반영된 가상 돔을 만들어낸다. 그 후 가상 돔을 이용해 한 번만 돔수정을 하게 되고 이는 한 번만 렌더 트리를 만들어내게 된다. 결과적으로 브라우저는 한번만 렌더링을 하게 됨으로써 불필요한 렌더링 횟수를 줄일 수 있게 되는 것이다.

      [CRS vs SSR]

      1. User는 google.com을 Server에게 요청한다.
      2. Server는 HTML을 보내준다.
      3. 브라우저는 HTML을 랜더링하여 띄운다.

      jQuery (=powerFul함)

      jQuery (=powerFul함) jQueryTable

      Server Side에서 Json 포맷으로 전달하면 jQuery는 테이블로 변환한다.

      즉, CSR은 HTML에서 jQuery를 이용하여 랜더링하는 것 SSR은 Server에서 HTML주는 것

       

       

      MVC

      M : 데이터관련, 수정,삭제,저장 등 주방장

      V : 보여지는 것 -> HTML, CSS 직원(접시에담음)

      C : 제어연결(프로그래밍) : JS 서빙

       

      MVC 프레임워크란

      이미 MVC 골격을 미리 짜놓은 것

       

      라이브러리 vs 프레임워크

      라이브러리는 가져다 쓰는 것 (재료)

      프레임워크는 기본 틀로 삼아서 그 위에 뭘 덧붙여 만드는 것

       

      SPA(Single Page Application)

      "jQuery이용하여 특정데이터말고 전체 화면을 랜더링하고 싶다"라는 needs가 생김

      왜 SPA가 등장 했는가

      강력한 MVC 웹 프레임워크(=Spring, C# .NET Framework)들이 등장하고 발전하면서 편리하고 빠르게 웹 사이트를 개발할 수 있게 됐다. 

      기존 MVC 웹 프레임워크의 문제점

      1. 오래된 웹 사이트 경우 좋아요 하나를 눌렀는데 모든 창이 다시 랜더링 되는 경우, 해결책으로 ajax가 나와서 특정 부분만 변경가능해짐 단 일일이 프로그래밍해야되는 불편함이 생김  
      2. 웹 브라우저 뿐만 아니라 모바일로도 웹을 구현해야하는 일이 생김 

      웹, 웹앱, 안드로이드용 앱, IOS용 앱

       

      • 백앤드 개발자는 그냥 DB에서 데이터만 전송하면 프로트앤드 단에서 알아서 상위의 4개의 상황에 맡게 랜더링을 실행하는 기술을 구현한다. 그것이 SPA 프레임워크이다. 
      • 서버에서 데이터만 보내줘도 알아서 브라우저에서 알아서 HTML, CSS, JS로 랜더링해낸다.
        • 즉 기존의 서버에서 프로그래밍 하던 것이 클라이언트의 브라우저에서 돌아가는 개념이다. 
        • 따라서 서버 개발자는 서버에만 집중할 수 있다.
      • 정적 : 편의점 (=서버에서 이미 깔아놓는 느낌)
      • 동적 : 음식점 (=서버에서 손질을 해서 완성품을 주는느낌)
      • SPA : 종업원(=서버)이 재료를 가져다 주면 손님(=클라)이 직접 불판에서 구워먹는 고기집

       

      • React : 프레임워크 보다는 라이브러리에 가깝다는 느낌, 막강한 라이브러리
      • Angular : 구글에서 만들었고 약간 어렵지만 단단하다라는 느낌, TypeScript 사용
      • Vue.js : 아주 쉽게 접할 수 있다는 특징

       

      TypeScript

      컴파일 언어, 정적 타입 언어이다. JS는 인터프리터 언어지만, TypeScript는 컴파일 언어로 코드 수준에서 미리 타입을 체크하여 오류를 체크한다.
      쉽게 말해
      TypeScript = JavaScript + type
      JS의 var와 같은 자료형 대신 string, number 같은 자료형을 지정함으로써 안정성을 확보한다. 
      type이 생김으로서 
      1) 안정성이 확보된다.
      2) type에 대한 예외처리를 하지않아도 된다.
      Angular에서 사용하는 것으로 알고있습니다.

      컴파일러와 인터프리터

      컴파일러는 고급 언어로 작성된 프로그램 전체를 목적 프로그램으로 번역한 후, 링킹 작업을 통해 컴퓨터에서 실행 가능한 프로그램으로 생성한다. C/C++, 등 

      인터프리터
      BASIC, LISP, APL 프로그램이 직접 실행됨, 고급언어로 작성된 프로그램을 한줄 단위로 받아들여 번역하고 번역과 동시에 프로그램을 한줄 단위로 즉시 실행시키는 프로그램.

      CSR방식

      SSR의 경우 Btn을 이전페이지 누를 때 마다 HTML 모두 생성해서 Client로 보낸다. (=비효율적)

      CSR의 경우 이전의 받아던 파란색 btn은 keep 해주고 새로운 data를 Server에서 가져온다.(=효율적)

      단점

      • 첫 로딩이 느리다.

      처음에 ini할 때 js파일을 다 가져와야함으로 첫로딩이 느리다.

      • 페이지 캐싱이 잘 안된다.

      '개인공부 > *기술면접 대비' 카테고리의 다른 글

      서버개발자 CS단골 질문 모음  (0) 2022.01.20
      [기술면접] Java_안드로이드(모바일) with Kotlin  (0) 2020.12.07
      Java  (0) 2020.11.30
      c++ java 차이  (0) 2020.11.30
      데이터베이스  (0) 2020.11.30

      7. 개발 언어(Java 위주)


      [ C언어 포인터란? ]

      포인터는 어떤 변수의 주소값을 저장하는 변수입니다. 포인터의 선언은 변수명 앞에 *을 붙이면 가능하고, 어떤 변수의 주소값을 얻기 위해서는 &를 붙이면 됩니다.

      #include <stdio.h>
      
      int main() {
          int* p = NULL;
          int num = 10;
          
          p = &num;
          printf("포인터 p의 값: %d \n", p);
          printf("num의 주소: %d \n", &num);
      	
          return 0;
      }

       

      [ Java의 장점과 단점 ]

      • 장점
        • JVM 위에서 동작하기 때문에 운영체제에 독립적이다.
        • 가비지컬렉터가 메모리를 관리해주기 때문에 편리하다.
      • 단점
        • JVM 위에서 동작하기 때문에 실행 속도가 상대적으로 느리다.
        • 다중 상속이나 타입에 업격하는 등 제약이 있는 것이 많다.

       

      [ 오버라이딩(Overriding)과 오버로딩(Overloading) ]

       

      • 오버라이딩(Overriding): 상위 클래스가 가지고 있는 메소드를 하위 클래스에서 재정의하여 사용하는 기술
      • 오버로딩(Overloading): 매개변수의 유형과 개수를 변경하면서 같은 이름의 메소드를 여러 개 사용하는 기술
      public class Person {
          public void print() {
          	System.out.println("나는 사람입니다");
          }
      }
      
      public class Student extends Person {
          // Overriding
          public void print() {
          	System.out.println("나는 학생입니다.");
          }
          
          // Overloading
          public void print(String name) {
          	System.out.println(name + "는 학생입니다");
          }
      }

       

       

      [ 클래스(Class), 객체(Object), 인스턴스(Instance)의 개념 ]

       

      • 클래스(Class): 객체를 만들어내기 위한 설계도 혹은 틀
      • 객체(Object): 설계도(클래스)를 기반으로 선언된 대상, 클래스의 인스턴스라고도 부름
      • 인스턴스(Instance): 객체에 메모리가 할당되어 실제로 활용되는 실체
      // 클래스
      public class Person {
          private String name;
      }
      
      public class Main {
      
          public static void main(String[] args) {
              // 객체 = 클래스의 인스턴스
              Person person;
              
              // 인스턴스
              person = new Person();
          }
          
      }

       

       

      [ 싱글톤 패턴(Singleton Pattern) 구현 및 사용 이유 ]

      public class Person {
      
          private static Person instance;
          
          public static Person getInstance() {
              if(instance == null){
                  instance = new Person();
              }
              return instance;
          }
      }

       

      싱글톤 패턴은 단 하나의 인스턴스를 생성하여 사용하는 디자인패턴입니다. 싱글톤패턴은 아래의 경우에 사용합니다.

      • 해당 인스턴스가 절대적으로 1개만 존재한다는 것을 보증하고 싶은 경우
      • 동일한 인스턴스를 자주 생성해주어야 하는 경우(메모리 낭비의 방지)

      하지만 이러한 싱글톤 패턴은 객체 지향 설계의 원칙에 적합하지 않으며, LifeCycle 제어가 힘들고, 멀티스레드 환경에서 여러 개의 객체가 생성되는 문제가 발생할 수 있습니다. 그러한 이유로 멀티스레드 환경이라면 static 앞에 synchronized 키워드를 붙여 동기화 작업을 추가해주어야 합니다.(당연히 성능이 저하됩니다).

       

      [ 추상클래스와 인터페이스의 차이 ]

       

      • 추상클래스
        • 단일 상속만이 가능하다.
        • 모든 접근 제어자를 사용할 수 있다.
        • 변수와 상수를 선언할 수 있다.
        • 추상 메소드와 일반 메소드를 선언할 수 있다.
      • 인터페이스
        • 다중 구현이 가능하다.
        • public 접근 제어자만 사용할 수 있다.
        • 상수만 선언할 수 있다.
        • 추상메소드만 선언할 수 있다.

       

       

      [ Java의 List, Set, Map 차이 ]

      • List
        • 데이터를 순차적으로 저장한다.
        • 데이터의 중복을 허용한다. 
        • 데이터로 null을 허용한다.
      • Set
        • 순서없이 Key로만 데이터를 저장한다.
        • Key의 중복을 허용하지 않는다.
        • Key로 null을 허용하지 않는다.
      • Map
        • 순서없이 Key, Value로 데이터를 저장한다.
        • Value는 중복을 허용하지만 Key의 중복을 허용하지 않는다.
        • Key로 null을 허용하지 않는다.

       

      [ Java의 Vector와 ArrayList 차이 ]

      • Vector
        • 동기화를 지원한다.
        • 속도가 느리지만 병렬 상황에서 안전하다.
        • 크기가 증가하는 경우, 2배 증가함(10 -> 20)
      • ArrayList
        • 동기화를 지원하지 않는다.
        • 속도는 빠르지만 병렬 상황에서 안전하지 않다.
        • 크기가 증가하는 경우, 1.5배 증가함(10 -> 15)

       

       

      [ synchornized란? ]

      Java에서 지원하는 synchronized 키워드는 여러 쓰레드가 하나의 자원을 이용하고자 할 때, 한 스레드가 해당 자원을 사용중인 경우, 데이터에 접근할 수 없도록 막는 키워드입니다. synchronized 키워드를 이용하면 병렬 상황에서 자원의 접근을 안전하게 하지만, 자원을 이용하지 않는 쓰레드는 락에 의한 병목현상이 발생하게 됩니다.

      • 메소드 synchronized: 한 시점에 하나의 쓰레드만이 해당 메소드를 실행할 수 있다.
      • 변수 synchronized: 한시점에 하나의 쓰레드만이 해당 변수를 참조할 수 있다.

       

       

      [ Java8 ]

      Java8에서는 함수형 프로그래밍을 위한 stream API와 Lambda, 함수형 인터페이스 등과 Null-safe한 작업을 위한 Optional API, Date와 Time API 등이 추가되었습니다.

       

       

      [ Stream API의 장점과 단점 ]

       

      • 장점
        • 코드를 간결하게 작성하여 가독성을 높일 수 있다.
        • 병렬스트림과 같은 기술을 이용하면 처리 속도를 많이 높일 수 있다.
      • 단점
        • 잘못 사용하면 기존의 Java 방식보다 오히려 성능이 떨어질 수 있다.
        • 코드들이 추상화되어 있어 실수가 발생할 수 있다.

       

       

      [ 람다(Lambda)와 람다(Lambda)의 사용법 ]

      람다는 불필요한 코드를 줄이고, 가독성을 높이기 위한 익명 함수로써, 함수의 이름과 반환타입 없이 손쉽게 함수를 선언할 수 있습니다. 람다는 아래와 같이 괄호와 화살표로 표현할 수 있으며, 람다의 반환값은 함수형 인터페이스이므로, 이를 이용해주어야 합니다.

      @FunctionalInterface
      interface MyFunctionalInterface {
          String test();
      }
      
      public class Lambda {
      
          public static void main(String[] args) throws Throwable {
              String str = "This is My String";
              
              // Labmda Expression
              MyFunctionalInterface fi = () -> str.replaceAll("\\s+", "");
              System.out.println(fi.test());
          }
      
      }

       

      Java8의 Stream API를 이용하면서 람다를 사용해 본 경험이 있습니다.

      public static String quiz2() {
          String result = Stream.of("TONY", "a", "hULK", "B", "america", "X", "nebula", "Korea")
                  .filter(w -> w.length() > 1)
                  .map(String::toUpperCase)
                  .map(w -> w.substring(0, 1))
                  .collect(Collectors.joining(" "));
                  
          return result;
      }

       

       

      [ Java의 동작 과정 ]

      1. Java 소스 파일을 javac로 컴파일하여 class파일(Java 바이트 코드)을 생성함
      2. 클래스로더가 컴파일된 Java 바이트 코드를 런타임 데이터 영역(Runtime Data Areas)로 로드함
      3. 실행 엔진(Execution Engine)이 자바 바이트코드를 실행함

       

       

      [ JVM의 구조 ]

      JVM의 구조 중 메모리 구조는 다음과 같이 구성됩니다.

      • Method Area(메소드 영역): 클래스 변수의 이름, 타입, 접근 제어자 등과 같은 클래스와 관련된 정보를 저장한다. 그 외에도 static 변수, 인터페이스 등이 저장된다.
      • Heap Area(힙 영역): new를 통해 생성된 객체와 배열의 인스턴스를 저장하는 곳이다. 가비지 컬렉터는 힙 영역을 청소하며 메모리를 확보한다.
      • Stack Area(스택 영역): 메소드가 실행되면 스택 영역에 메소드에 대한 영역이 1개 생긴다. 이 영역에 지역변수, 매개변수, 리턴값 등이 저장된다.
      • PC register(PC 레지스터): 현재 쓰레드가 실행되는 부분의 주소와 명령을 저장한다.(CPU의 레지스터와 다르다.)
      • Native Method Stack(네이티브 메소드 스택): 자바 외의 언어(C, C++ 등)로 작성된 코드를 위한 메모리 영역이다. JNI를 통해 사용된다.

       

       

      [ 가비지 컬렉터(Garbage Collector)란? ]

      '더이상 참조되지 않는 메모리'인 가비지를 청소해주는 JVM의 실행 엔진의 한 요소입니다. JVM은 new와 같은 연산에 의해 새롭게 생성된 객체들 중에서 더이상 참조되지 않는 객체를 정리해줍니다. 가비지 컬렉터는 Heap 영역을 위주로 탐색하며 메모리를 정리해줍니다.

       

      [ 다형성과 캡슐화 ]

      다형성(Polymorphism)

      객체지향 기법에서 메시지에 의해 객체가 연산을 수행하게 될 때 하나의 메세지에 대해 객체가 가지고 있는 고유한 방법으로 응답할 수 있는 능력

      캡슐화(encapsulation)

      서로 관련성이 많은 데이터와 이에 관련된 함수 등을 한 묶음으로 처리하는 기법

       

      • [ JSON & XML ]
      • JSON은 종료 태그를 사용하지 않습니다.
      • JSON의 구문이 XML의 구문보다 더 짧습니다.
      • JSON 데이터가 XML 데이터보다 더 빨리 읽고 쓸 수있다.
      • XML은 배열을 사용할 수 없지만, JSON은 배열을 사용할 수 있습니다.
      • XML은 XML파서로 파싱되며, JSON은 자바스트립트 표준 함수인 eval()함수로 파싱됩니다.

       

       

       C++와 JAVA을 비교하는 것은 대학에서 프로그래밍 언어를 배울 때, 얼핏 배우고 지나갔던 내용이었다. 비슷한 성격(객체지향)을 띄는 언어이지만, 차이점도 극명한 언어이기도하다. 

       

      나름의 기준으로 3가지 기준으로 차이점들을 정리해봤다. 아, 그리고 여기에 작성되는 것들이 JAVA와 C++ 차이점의 전부는 아니라는 점 꼭 알아뒀으면 좋겠다. 그리고 나름대로 중요한 것만 뽑았지만... 아닐 수도 있다..

       

       

       

       

       

       

      1. 상속

       대학 수업에서 교수가 학생에게 C++과 JAVA의 차이점을 묻는다면, 높은 확률로 학생은 상속에 관련된 차이점을 대답할 것이다. 그정도로 상속에 있어 두 언어의 차이점은 극명한데, JAVA가 C++보다 단순한 상속 체계를 지원한다. 

       

       첫째로, C++은 다중 상속을 지원하고 JAVA는 그렇지 않다. 여기서 '다중 상속'이라 함은, 하나의 클래스가 두개 이상의 클래스를 상속하는 것을 지칭한다. 다중상속을 지원하는 언어에서는 다이아몬드 문제(Diamond Problem)이 발생하는데, C++에서는 다이아몬드 문제를 회피할 수 있는 기능을 제공한다. 물론 JAVA에서는 애초에 발생할 일이 없다.



       둘째로, C++는 friend 키워드를 지원하고 JAVA는 그렇지 않다. 특정 class에 friend 키워드를 붙여서 클래스 혹은 함수를 선언해 놓으면, 명명된 클래스와 함수는 그 class의 private, protected area에 접근할 수있다. 하지만 이 방법은 객체의 은닉성을 파괴하므로 정말 특수한 경우가 아니면 사용을 지양한다.

       

       셋째로, JAVA는 Interface를 지원하고 C++는 그렇지 않다. 다중상속이 지원되지 않는 JAVA는 Interface를 통해 다중상속을 어느정도 흉내낼 수 있다. JAVA에서는 하나의 Class가 여러개의 Interface를 Implement할 수 있다. Interface는 상수와 추상메소드로만 구성되어 있으므로 여러개의 Interface를 implement하더라도, 다이아몬드 문제를 발생시키지 않는다.

       

      ※ 요약

       

      1. C++은 다중 상속을 지원하나, JAVA는 지원하지 않는다.

       

      2. C++는 friend 키워드를 지원하나, JAVA는 지원하지 않는다. friend 키워드는 은닉성 이슈로 사용을 자제한다.

       

      3. JAVA는 다중상속을 지원하지 않는 대신 Interface를 지원한다. C++는 지원하지 않는다.



       

       

      6. 데이터베이스


      [ 인덱스(index)란? ]

      인덱스란 추가적인 쓰기 작업과 저장 공간을 활용하여 데이터베이스 테이블의 검색 속도를 향상시키기 위한 자료구조이다. 만약 우리가 책에서 원하는 내용을 찾는다고 하면, 책의 모든 페이지를 찾아 보는것은 오랜 시간이 걸린다. 그렇기 때문에 책의 저자들은 책의 맨 앞 또는 맨 뒤에 색인을 추가하는데, 데이터베이스의 index는 책의 색인과 같다.

      데이터베이스에서도 테이블의 모든 데이터를 검색하면 시간이 오래 걸리기 때문에 데이터와 데이터의 위치를 포함한 자료구조를 생성하여 빠르게 조회할 수 있도록 돕고 있다.

      만약 Index를 적용하지 않은 컬럼을 조회한다면, 전체를 탐색하는 Full Scan이 수행된다. Full Scan은 전체를 비교하여 탐색하기 때문에 처리 속도가 떨어진다.

       

       

      [ 인덱스의 자료구조 ]

      • 해시 테이블
        • 컬럼의 값으로 생성된 해시를 기반으로 인덱스를 구현한다.
        • 시간복잡도가 O(1)이라 검색이 매우 빠르다.
        • 부등호(<, >)와 같은 연속적인 데이터를 위한 순차 검색이 불가능하다.
      • B+Tree
        • 자식 노드가 2개 이상인 B-Tree를 개선시킨 자료구조이다.
        • BTree의 리프노드들을 LinkedList로 연결하여 순차 검색을 용이하게 하였다.
        • 해시 테이블보다 나쁜 O(log2nlog2n) 의 시간복잡도를 갖지만 해시테이블보다 흔하게 사용된다.

       

      [ 클러스터링 vs 리플리케이션 ]

      • 리플리케이션
        • 여러 개의 DB를 권한에 따라 수직적인 구조(Master-Slave)로 구축하는 방식이다.
        • 비동기 방식으로 노드들 간의 데이터를 동기화한다.
        • 장점: 비동기 방식으로 데이터가 동기화되어 지연 시간이 거의 없다.
        • 단점: 노드들 간의 데이터가 동기화되지 않아 일관성있는 데이터를 얻지 못할 수 있다.
      • 클러스터링
        • 여러 개의 DB를 수평적인 구조로 구축하여 Fail Over한 시스템을 구축하는 방식이다.
        • 동기 방식으로 노드들 간의 데이터를 동기화한다.
        • 장점: 1개의 노드가 죽어도 다른 노드가 살아 있어 시스템을 장애없이 운영할 수 있다.
        • 단점: 여러 노드들 간의 데이터를 동기화하는 시간이 필요하므로 Replciation에 비해 쓰기 성능이 떨어진다.

       

       

      [ DB 정규화 ]

      1. 제1정규형: 모든 속성 값이 원자 값을 갖도록 분해한다.

      2. 제2정규형: 제1정규형을 만족하고, 기본키가 아닌 속성이 기본키에 완전 함수 종속이도록 분해한다.
        (여기서 완전 함수 종속이란 기본키의 부분집합이 다른 값을 결정하지 않는 것을 의미한다.)

      3. 제3정규형: 제2정규형을 만족하고, 기본키가 아닌 속성이 기본키에 직접 종속(비이행적 종속)하도록 분해한다.
        (여기서 이행적 종속이란 A->B->C가 성립하는 것으로, 이를 A,B와 B,C로 분해하는 것이 제3정규형이다.)

      4. BCNF 정규형: 제3정규형을 만족하고, 함수 종속성 X->Y가 성립할 때 모든 결정자 X가 후보키가 되도록 분해한다.

       

       

      [ 트랜잭션(Transaction)이란? ]

      하나 이상의 쿼리를 처리할 때 동일한 Connection 객체를 공유하여 에러가 발생한 경우 모든 과정을 되돌리기 위한 방법입니다.

       

       

      [ 힌트(Hint)란? ]

      힌트란 SQL을 튜닝하기 위한 지시구문입니다. 옵티마이저가 최적의 계획으로 SQL문을 처리하지 못하는 경우에 개발자가 직접 최적의 실행 계획을 제공하는 것입니다. 힌트는 아래와 같이 SELECT 다음에 작성할 수 있으며, INDEX, PARALLEL 등 다양한 힌트절이 있습니다.

      # 사용가능한 힌트절: PARALLE, INDEX, FULL ...
      SELECT /*+ [힌트절] */ 

       

       

      [ 데이터베이스 튜닝과 방법 ]

      DB 튜닝은 테이터베이스의 구조나 데이터베이스 자체, 운영체제 등을 조정하여 데이터베이스 시스템의 성능을 향상시키는 작업을 의미합니다. 튜닝은 DB 설계 튜닝 -> DBMS 튜닝 > SQL 튜닝의 단계로 진행할 수 있습니다.

       

       

      • OnCreate()
        • 생성자랑 비슷하며 액티비가 처음 생성됨
      • OnStart()
        • 시작되기 직전상태 OnCreate()와 OnResume()사이의 순서
      • OnResume()
        • OnStart()와 비슷하지만 이제 액티비가 뜨고 동작하기 완전 직전 상태 
      • OnPause()
        • 실행상태인 이후 액티비를(현재화면) 다가리지는 않는 예를들어 중간 크기의 다이얼로그 같은 화면이 떳을 때
      • OnStop()
        • 액티비티가 완전히 이제 뒤로가서 안보일 때
          • 다시 킬수도있는데 그런 경우 OnRestart()를 거쳐 OnStrart() 생명주기로 다시 넘어간다. OnStop()은 액티비티가 소멸된 상태가 아니다.
      • OnDestory()
        • 액티비를 더 이상 쓰지 않을 때 종료 다시 실행 시키면 OnCreate()

       

      요약

      • 실행(Running상태)
        • OnCreate()->OnStart()->OnResume()
      • 종료(=PAUSED상태)
        • 일부 가려짐
          • OnPause()
          • 퍼즈상태에서 다시 화면 돌아가면
            • OnPause()->OnResume()
        • 전체 가려짐
          • OnStop()
          • 스탑상태에서 다시 화면 돌아가면
            • OnRestart()->OnStart()->OnResume() 
        • 아예 종료 시
          • OnPause()-> OnStop() -> OnDestroy() 하여 엑티비티 소멸

       

      + Recent posts