java 특징

  1. 운영체제에 독립적
    • OS위의 JVM(Java Virtual Machine) 이라는 가상머신 위에서 자바가 실행되기 때문입니다.
    • JVM을 사용하기 때문에 많은 메모리를 사용하고 실행속도 또한 빠르지 않은 단점이 있다.
  2. 객체 지향 언어
    • 객체 지향 개념의 특징인 캡슐화, 상속, 다형성이 잘 적용된 언어
  3. 자동 메모리 관리
    • 자바로 작성된 프로그램이 실행되면, 가비지컬렉터가 자동적으로 메모리를 관리해준다.
    • 가비지 컬렉터: 시스템에서 더이상 사용하지 않는 동적 할당된 메모리 블럭을 찾아 자동으로 다시 사용 가능한 자원으로 회수하는 것으로 시스템에서 가비지컬렉션을 수행하는 부분을 가비지 컬렉터라 부른다.
  4. 네트워크와 분산처리를 지원
    • 다양한 네트워크 프로그래밍 라이브러리(Java API)를 통해 비교적 짧은 시간에 네트워크 관련 프로그램을 쉽게 개발할 수 있도록 지원한다.
  5. 멀티쓰레드를 지원
    • 일반적으로 멀티쓰레드(multi-thread)의 지원은 사용되는 운영체제에 따라 구현방법도 상이하고 처리 방식도 다르다.
    • 자바에서 개발되는 멀티쓰레드 프로그램은 시스템과는 관계없이 구현가능하며, 관련되 라이브러리(Java API)가 제공되므로 구현이 쉽다.
  6. 동적 로딩을 지원한다.
    • 자바는 동적 로딩을 지원하기 때문에 실행 시에 모든 클래스가 로딩되지 않고 필요한 시점에 클래스를 로딩하여 사용할 수 있다.
    • 일부 클래스가 변경되어도 전체 어플리케이션을 다시 컴파일하지 않아도 된다.
  7. 기본 자료형을 제외한 모든 요소들이 객체로 표현

Java EE와 SE 차이

  • Java SE란 Java Platform Standard Edition의 약자로 데스크톱, 서버, 임베디드를 위한 표준 자바 플랫폼을 말합니다.

    • 안드로이드를 개발할 때 보통 Java SE로 개발을 합니다.
  • Java EE란 Java Platform EnterPrise Edition의 약자로 자바를 이용한 서버측 개발을 위한 플랫폼입니다.

    • SE에 서버측을 위한 기능을 추가하여 SE의 모든 기능을 이용 할 수 있습니다.

JVM

  • 정리가 잘 되어있는 블로그
  • 자바의 메모리 영역
    • 메서드 영역 : static 변수, 전역변수, 코드에서 사용되는 Class 정보 등이 올라간다. 코드에서 사용되는 class들을 로더로 읽어 클래스별로 런타임 필드데이터, 메서드 데이터 등을 분류해 저장한다.
    • 스택(Stack) : 지역변수, 함수(메서드) 등이 할당되는 LIFO(Last In First Out) 방식의 메모리
    • 힙(Heap) : new 연산자를 통한 동적 할당된 객체들이 저장되며, Garbage 컬렉션에 의해 메모리가 관리되어 진다.

java에서 바이트코드

  • 자바에서 코드를 컴파일하면 바이트코드 즉 (.class)형태로 출력이 되는데 이 Class형태는 JVM에 의해 런타임시완벽한 기계코드로 변경되어 실행됩니다.
  • 바이트 코드를 완전한 기계코드로 변환하는 과정에서 일반적인 컴파일 언어보다 속도가 많이 느리다는 단점이 있습니다.

객체지향 프로그래밍

  • 객체지향이란

    • 시스템을 상호작용하는 자율적인 객체들의 공동체로 바라보고, 객체를 이용해 시스템을 분할하는 방법이다.
    • 자율적인 객체란 상태와 행위를 함께 지니며 스스로 자기 자신을 책임지는 객체를 의미한다.
    • 객체는 시스템의 행위를 구현하기 위해 다른 객체와 협력한다. 각 객체는 협력 내에서 정해진 역할을 수행하며 역할은 관련된 책임의 집합이다.
    • 객체는 다른 객체와 협력하기 위해 메시지를 전송하고, 메시지를 수신한 객체는 메시지를 처리하는데 적합한 메서드를 자율적으로 선택한다.
  • 장점

    • 코드 재사용이 용이
      • 남이 만든 클래스를 가져와서 이용할 수 있고 상속을 통해 확장해서 사용할 수 있음.
    • 유지보수가 쉬움
      • 절차 지향 프로그래밍에서는 코드를 수정해야할 때 일일이 찾아 수정해야하는 반면 객체 지향 프로그래밍에서는 수정해야 할 부분이 클래스 내부에 멤버 변수혹은 메서드로 있기 때문에 해당 부분만 수정하면 됨.
    • 대형 프로젝트에 적합
      • 클래스단위로 모듈화시켜서 개발할 수 있으므로 대형 프로젝트처럼 여러명, 여러회사에서 개발이 필요할 시 업무 분담하기 쉽다.
    • 신뢰성이 높은 프로그래밍을 가능하게 한다.
      • 제어자와 메서드를 이용해서 데이터를 보호하고 올바른 값을 유지하도록 하며, 코드의 중복을 제거하여 코드의 불일치로 인한 오동작을 방지할 수 있다.
  • 단점

    • 처리속도가 상대적으로 느림
    • 객체가 많으면 용량이 커질 수 있음
    • 설계시 많은 시간과 노력이 필요

객체지향 언어의 특징

  • 추상화 (모델링)
    • 어떤 양상, 세부 사항, 구조를 좀 더 명확하게 이해하기 위해 특정 절차나 물체를 의도적으로 생략하거나 감춤으로써 복잡도를 극복하는 방법
    • 불필요한 정보는 숨기고 중요한 정보만을 표현함으로써 공통의 속성이나 기능을 묶어 이름을 붙이는 것이다. (= 객체지향 관점에서 클래스를 정의하는 것.)
    • 복잡성을 다루기 위한 추상화의 두 차원
      1. 구체적인 사물들 간의 공통점은 취하고 차이점은 버리는 일반화를 통해 단순하게 만드는 것
      2. 중요한 부분을 강조하기 위해 불필요한 세부 사항을 제거함으로써 단순하게 만드는 것
  • 캡슐화 (정보은닉)
    • 객체의 필드(속성), 메소드를 하나로 묶고, 실제 구현 내용을 외부에 감추는 것을 말한다.
    • 외부 객체는 객체 내부의 구조를 얻지 못하며 객체가 노출해서 제공하는 필드와 메소드만 이용할 수 있다.
    • 필드와 메소드를 캡슐화하여 보호하는 이유는 외부의 잘못된 사용으로 인해 객체가 손상되지 않도록 하는데 있다.
    • 자바 언어는 캡슐화된 멤버를 노출시킬 것인지 숨길 것인지를 결정하기 위해 접근 제한자(Access Modifier)를 사용한다.
  • 상속과 인터페이스 (계층성)
    • 기존 클래스의 변수와 메소드를 그대로 가지면서 추가적인 기능도 가지는 클래스를 새로 만드는 것입니다. 복잡한 문제를 나누어서 공통 부분부터 구현하기 위해 사용합니다.
    • 자식(하위,파생) 클래스가 부모(상위) 클래스의 멤버를 물려받는 것
    • 자식이 부모를 선택해서 물려 받는 것
    • 상속 대상: 부모의 필드와 메소드
    • 장점
      • 부모 클래스를 재사용해서 자식 클래스를 빨리 개발할 수 있다.
      • 반복된 코드의 중복을 줄여준다.
      • 유지 보수의 편리성을 제공해 준다.
      • 객체의 다형성을 구현할 수 있다.
  • 다형성 (사용편의성, 모듈화)
  • 동적 바인딩
    • 실행 시간(runtime)에 성격이 결정되는 것

추상클래스와 추상메서드

  • 추상클래스
    • 클래스가 설계도라면 추상클래스는 ‘미완성 설계도’
    • 추상메서드(미완성 메서드)를 포함하고 있는 클래스
    • 일반메서드가 추상메서드를 호출 할 수 없다.
    • 완성된 설계도가 아니므로 인스턴스를 생성할 수 없다.
    • 다른 클래스를 작성하는데 도움을 줄 목적으로 작성된다.
  • 추상메서드
    • 선언부만 있고 구현부(몸통, body)가 없는 메서드
    • 꼭 필요하지만 자손마다 다르게 구현될 것으로 예상되는 경우에 사용된다.
    • 추상클래스를 상속받는 자손클래스에서 추상메서드의 구현부를 완성해야한다.

인터페이스

  • 정의한 메소드를 구현하지 않아도 되고 인터페이스를 상속받는 클래스에서 인터페이스에 정의된 메소드를 구현하면 된다.
  • 인터페이스의 특성
    • 인터페이스의 사용법만 알고 있으면 대상의 내부 구조나 동작 방법을 몰라도 상호작용이 가능하다.
    • 인터페이스가 변경되지 않고 단순히 내부 구성이나 작동 방식이 변경되는 것은 인터페이스 사용자에게 아무런 영향도 미치지 않는다.
    • 인터페이스가 동일하기만 하다면 어떤 대상과도 상호작용할 수 있다.
  • 일종의 추상클래스. 추상클래스(미완성 설계도)보다 추상화 정도가 높다
  • 실제 구현된 것이 전혀 없는 기본 설계도.
  • 추상메서드와 상수만을 멤버로 가질 수 있다.
  • 인스턴스를 생성할 수 없고, 클래스 작성에 도움을 줄 목적으로 사용된다.
  • 미리 정해진 규칙에 맞게 구현하도록 표준을 제시하는데 사용된다.
  • https://m.blog.naver.com/heartflow89/220969525191([JAVA/자바] 인터페이스(interface) 구성멤버, 구현, 상속)

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

  • 인터페이스와 추상 클래스는 존재 목적이 다르다.
  • 추상 클래스는 그 추상 클래스를 상속받아서 기능을 이용하고, 확장시키는 데 있고, 다중 상속의 모호성 때문에 하나만 상속받을 수 있다.
  • 인터페이스는 함수의 껍데기만 있는데, 그 이유는 그 함수의 구현을 강제하기 위함이다. 구현을 강제함으로써 구현 객체의 같은 동작을 보장할 수 있다.

extends와 implements의 차이

  • extends
    • 클래스를 확장하는 것이다.
    • 일반 클래스와 abstract 클래스 상속에 사용된다.
    • class가 class를 상속받을 때, interface가 interface를 상속 받을 때 사용
    • 특징: 클래스 한 개만 상속 받을 수 있고 부모 클래스의 기능을 사용한다.
  • implements
    • 인터페이스를 구현하는 것이다.
    • interface 상속에 사용된다.
    • class가 interface 내용을 구현할 때 사용
    • 특징: 여러개 사용 가능하고, 설계 목적으로 구현 가능하다. implements한 클래스는 implements의 내용을 다 사용해야 한다.

클래스와 객체

  • 클래스의 정의
    • 어떤 문제를 해결하기 위한 데이터를 만들기기 위해 추상화를 거쳐 집단에 속하는 속성과 행위를 변수와 메서드로 정의한 것
  • 클래스의 용도
    • 클래스는 객체를 생성하는데 사용된다.
  • 객체의 정의
    • 클래스에서 정의한 것을 토대로 실제 메모리상에 할당된 것으로 실제 프로그램에서 사용되는 데이터

getter, setter 를 사용하는 이유

  • 메서드를 통해서 접근하기 때문에, 메서드 안에서 매개변수같이 어떤 올바르지 않은 입력에 대해 사전에 처리할 수 있게 제한하거나 조절할 수 있기 때문

오버로딩과 오버라이딩

  • 오버로딩: 하나의 클래스에 같은 이름의 메서드를 여러 개 정의하는 것
  • 오버라이딩: 조상클래스로부터 상속받은 메서드의 내용을 상속받는 클래스에 맞게 변경하는 것

제어자

  • 클래스나 멤버변수와 메서드에 주로 사용되며 하나의 대상에 대해서 여러 제어자를 조합하여 사용하는 것이 가능하다.

  • 접근 제어자는 한 번에 네 가지 중 하나만 선택해서 사용할 수 있다.

  • static (클래스의, 공통적인)

    • 클래스가 로딩될 때, 메모리 공간을 할당하는데 처음 설정된 메모리 공간이 변하지 않음을 의미
    • 객체를 아무리 많이 만들어도 해당 변수는 하나만 존재(객체와 무관한 키워드)
    • 멤버변수:
      • 모든 인스턴스에 공통적으로 상용되는 클래스변수가 된다.
      • 클래스변수는 인스턴스를 생성하지 않고도 사용가능하다.
      • 클래스가 메모리에 로드될 때 생성된다.
    • 메서드:
      • 인스턴스를 생성하지 않고도 호출이 가능한 static 메서드가 된다.
      • static 메서드 내에서는 인스턴스 멤버들을 직접 사용할 수 없다.
  • final (마지막의, 변경될 수 없는)

    • 클래스:
      • 변경될 수 없는 클래스, 확장될 수 없는 클래스가 된다.
      • final로 지정된 클래스는 다른 클래스의 조상이 될 수 없다.
    • 메서드:
      • 변경될 수 없는 메소드, final로 지정된 메서드는 오버라이딩을 통해 재정의 될 수 없다.
    • 멤버변수, 지역변수:
      • 변수 앞에 final이 붙으면, 값을 변경할 수 없는 상수가 된다.
  • abstract (추상의, 미완성의)

    • 멤버변수:
      • 클래스 내에 추상메서드가 선언되어 있음을 의미한다.
    • 메서드:
      • 선언부만 작성하고 구현부는 작성하지 않은 추상메서드임을 알린다.
  • 접근 제어자

    • private: 같은 클래스 내에서만 접근이 가능하다.
    • default: 같은 패키지 내에서만 접근이 가능하다.
    • protected: 같은 패키지 내에서, 그리고 다른 패키지의 자손 클래스에서 접근이 가능하다.
    • public: 접근 제한이 전혀 없다.

제네릭

  • 제네릭 타입을 이용해서 컴파일 과정에서 타입 체크를 할 수 있다.
  • 제네릭은 클래스와 인터페이스, 메소드를 정의할 때 타입 파라미터로 사용한다.
  • 장점
    1. 컴파일할 때 타입을 체크해서 에러를 사전에 잡을 수 있다.
    2. 컴파일러가 타입캐스팅을 해주기 때문에 개발자가 편리하다.
    3. 타입만 다르고 코드의 내용이 대부분 일치할 때, 코드의 재사용성이 좋아진다.

Call by Reference, Call by Value

  • Call by Reference
    • 매개 변수의 원래 주소에 값을 저장하는 방식. 클래스 객체를 인수로 전달한 경우
  • Call by Value
    • 인수로 기본 데이터형을 사용. 주어진 값을 복사하여 처리하는 방식. 메서드 내의 처리 결과는 메서드 밖의 변수에 영향을 미치지 않는다.

컬렉션 프레임워크

  • 다수의 데이터를 쉽게 처리할 수 있는 표준화된 방법을 제공하는 클래스들
  • List
    • 순서가 있는 데이터의 집합, 데이터의 중복을 허용한다.
    • 구현클래스 : ArrayList, LinkedList, Stack, Vector 등
  • Set
    • 순서를 유지하지 않는 데이터의 집합, 데이터의 중복을 허용하지 않는다.
    • 구현클래스 : HashSet, TreeSet 등
  • Map
    • 키(Key)와 값(Value)의 쌍(pair)으로 이루어진 데이터의 집합
    • 순서는 유지되지 않으며, 키는 중복을 허용하지 않고, 값은 중복을 허용한다.
    • 구현클래스 : HashMap, TreeMap, Properties 등
  • 컬렉션(collection) 클래스에서 제네릭을 사용하는 이유
    • 컬렉션 클래스에서 제네릭을 사용하면 컴파일러는 특정 타입만 포함 될 수 있도록 컬렉션을 제한합니다.
    • 컬렉션 클래스에 저장하는 인스턴스 타입을 제한하여 런타임에 발생할 수 있는 잠재적인 모든 예외를 컴파일타임에 잡아낼 수 있도록 도와줍니다.

동기화

  • 멀티쓰레드 프로그래밍에서는 하나의 객체를 여러 쓰레드가 동시에 접근할 수 있기 때문에 데이터의 일관성(consistency)을 유지하기 위해서는 동기화가 필요하다.
  • Vector와 Hashtable과 같은 구버전(JDK1.2 이전)의 클래스들은 자체적으로 동기화 처리가 되어 있는데, 멀티쓰레드 프로그래밍이 아닌 경우에는 불필요한 기능이 되어 성능을 떨어뜨리는 요인이 된다. 그래서 새로 추가된 ArrayList와 HashMap과 같은 컬렉션은 동기화를 자체적으로 처리하지 않고 필요한 경우에만 java.util.Collections 클래스의 동기화 메서드를 이용해서 동기화 처리가 가능하도록 변경하였다.

디자인 패턴

  • 디자인 패턴
    • 디자인패턴이라 여러 프로그래머들의 경험과 지혜를 모아서 공통적인 소프트웨어 디자인 문제를 해결하는데 도움이 될수 있게 만들어 놓은 것
  • 가장 대표적인 디자인패턴으로는 싱글톤이 존재. 싱글톤이란 전체 프로그램에서 단 1개의 객체를 생성하고 공유하는데 사용하는 패턴이다. 주로 Android에서 소켓 객체를 사용할 때 사용한다.
  • [http://jeong-pro.tistory.com/98?category=793347](몇가지 디자인 패턴에 대해 설명한 블로그)

싱글톤 디자인 패턴

  • 클래스 인스턴스가 하나만 만들어지도록 하고, 그 인스턴스에 대한 전역 접근을 제공한다.

UML이란

  • Unified Modeling Language의 약자로 ‘객체 모델링 언어’ 또는 ‘통합 모델링 언어’를 뜻한다.
  • 시스템 설계, 요구분석, 시스템 구현 등의 과정에서 사용되는 모델링 언어로 표기법의 표준화를 목적으로 한다.
  • 시스템에 대해 동일한 의미를 공유할 수 있게 하여 언어를 가시화 시킬 수 있고 시스템 구조와 모든 상세 내역에 대해 문서화하여 모델링하는 기능들을 제공하며, 다양한 모델링 도구로서의 다이어그램들로 이루어져 있다.

String, StringBuilder, StringBuffer의 차이

  • String 객체
    • immutable 합니다. 즉 한번 생성이 되면 변경이 불가능 합니다.
    • 예를 들면 String 2개를 연결하는 작업을 할 때에 새로운 String을 객체를 이용하여 문자열을 참조하게 됩니다.
  • StringBuffer
    • 멀티쓰레드 환경에서 동기화를 보장한다.
  • StringBuilder
    • 멀티쓰레드 환경에서 동기화를 보장하지 않는다.
  • name = name + “홍”; 구문이 실행될 때 실제로는 스트링 버퍼를 새로 생성해서 name이 가리키는 “길동”을 만들어주고 스트링 버퍼의 append 함수를 이용하여 “홍” 를 붙여준다. 그렇게 완성된 스트링 버퍼값을 메모리에 올리고 name은 다시 이 값을 참조하게 된다. 스트링 버퍼는 char타입의 배열로 되어 있어서 한글자 한글자를 append할 수 있다. 그 와중에 생겨난 메모리 안의 “길동” 이라는 값과 “홍”라는 값은 가비지 컬렉터가 가지고 있다가 버립니다.

DAO와 DTO

  • DAO: Data Access Object의 약자로 간단히 데이터베이스의 데이터에 접근을 위한 객체이다. 데이터베이스에 접근을 하기위한 로직과 비즈니스 로직을 분리하기 위해서 사용한다. DB를 사용해 데이터를 조회하거나 조작하는 기능을 전담하도록 만든 오브젝트를 말한다.

  • DTO: Data Transfer Object의 약자로 VO(Value Object)로 바꾸어 말할 수 있는데 계층간 데이터 교환을 위한 JavaBean을 말합니다. 여기서 말하는 계층이란 Controller, View, Business Layer, Persistent Layer를 말하며 각 계층간 데이터 교환을 위한 객체를 DTO 또는 VO라고 부릅니다. 그런데 VO는 동일한 개념이지만 read only 속성을 가집니다.

ArrayList와 LinkedList

  • 순차적으로 추가/삭제하는 경우에는 ArrayList가 LinkedList보다 빠르다

  • 중간 데이터를 추가/삭제하는 경우에는 LinkedList가 ArrayList보다 빠르다.

Iterator

  • 컬렉션 클래스에 저장된 요소들을 나열하는 방법을 제공한다. 컬렉션 클래스의 iterator()를 호출해서 Iterator를 구현한 객체를 얻는다.
  • Boolean hasNext()
    • 읽어 올 요소가 남아있는지 확인하다. 있으면 ture, 없으면 false를 반환한다.
  • Object next()
    • 다음 요소를 읽어 온다. next()를 호출하기 전에 hasNext()를 호출해서 읽어 올 요소가 있는지 확인하는 것이 안전하다.
  • void remove()
    • next()로 읽어 온 요소를 삭제한다. next()를 호출한 다음에 remove()를 호출해야한다.(선택적인 기능)

Stack과 Queue

  • 순차적으로 데이터를 추가하고 삭제하는 스택(Stack)에는 ArrayList와 같은 배열기반의 컬렉션 클래스가 적합하지만, 큐는 데이터를 꺼낼 때 항상 첫 번째 저장된 데이터를 삭제하므로, ArrayList와 같은 배열기반의 컬렉션 클래스를 사용한다면 데이터를 꺼낼 때마다 빈 공간을 채우기 위해 데이터의 복사가 발생하므로 비효율적이다.
  • 큐(Queue)는 ArrayList보다 데이터의 추가/삭제가 쉬운 LinkedList로 구현하는 것이 더 적합하다.
  • Linear Queue(선형큐)는 메모리 재사용이 불가능 이러한 문제점을 보완하여 Circular Queue(원형 큐)가 나옴

프로세스와 스레드

  • Process(프로세스) - 운영체제에서 실행중인 하나의 프로그램(하나 이상의 쓰레드를 포함한다.)
  • Thread(쓰레드) - 프로세스내에서 동시에 실행되는 독립적인 실행 단위를 말함, 장점으로는 자원을 많이 사용하지 않고 구현이 쉬우며 범용성이 높다
  • Thread 장점
    • 빠른 프로세스 생성
    • 적은 메모리 사용
    • 쉬운 정보 공유
  • Thread 단점
    • 교착상태에 빠질 수 있다.
      • 교착상태 : 다중프로그래밍 체제에서 하나 또는 그 이상의 프로세스가 수행 할 수 없는 어떤 특정시간을 기다리고 있는 상태.
  • Thread와 Process 차이
    • 여러 분야에서 '과정' 또는 '처리'라는 뜻으로 사용되는 용어로 컴퓨터 분야에서는 "실행중인 프로그램" 이라는 뜻으로 쓰인다.
    • 이 프로세스 내에서 실행되는 각각의 일을 스레드라고 한다. 프로세스 내에서 실행되는 세부 작업 단위로 여러 개의 스레드가 하나의 프로세스를 이루게 되는 것이다.
  • 자바에서 쓰레드를 구현하기 위한 2가지 방법
    • lang 패키지내에 구현되어있는 Thread 클래스를 상속받거나 Runnable 인터페이스를 상속받아 run 메소드를 재정의하여 구현합니다.

스트림

  • 자바에서 입출력을 수행하려면, 즉 어느 한쪽에서 다른 쪽으로 데이터를 전달하려면, 두 대상을 연결하고 데이터를 전송할 수 있는 무엇가가 필요한데 이것을 스트림(stream)이라고 정의했다.
  • 스트림은 단방향통신만 가능하기 때문에 하나의 스트림으로 입력과 출력을 동시에 처리할 수 없다. 그래서 입력과 출력을 동시에 수행하려면 입력을 위한 입력스트림(input stream)과 출력을 위한 출력스트림(output stream), 모두 2개의 스트림이 필요하다.

직렬화

  • 직렬화(serialization)란 객체를 데이터 스트림으로 만드는 것을 뜻한다.
  • 객체에 저장된 데이터를 스트림에 쓰기(write)위해 연속적인(serial) 데이터로 변환하는 것을 말한다. 반대로 스트림으로부터 데이터를 읽어서 객체를 만드는 것을 역직렬화(deserialization)라고 한다. ( 객체의 인스턴스 변수들의 값을 일렬로 나열하는 것 )
참고
  • 객체는 클래스에 정의된 인스터스 변수의 집합이다. 객체에는 클래스변수나 메서드가 포함되지 않는다. 객체는 오직 인스턴스 변수들로만 구성되어 있다.

Servlet

  • Servlet
    • Servlet은 웹에서 Java 프로그래밍을 구현하기 위해서 탄생했다. (웹 개발을 위해 만든 표준)
    • Java로 구현된 CGI(Common Gatway Interface)라고 말한다.
    • HTTP Protocal 서비스를 지원하는 javax.servlet.http.HttpServlet 클래스를 상속하여 개발하며, Servlet은 Container에 의해서 실행되고 관리된다.
    • HTML 변경 시 Servlet을 재컴파일 해야하는 단점이 있다. (코드 수정 -> 컴파일 -> 클래스 파일)
  • Servlet Container
    • HTTP 요청을 받아서 Servlet을 실행시키고, 그 결과를 사용자 브라우저에게 전달해주는 기능을 제공하는 컴포넌트이다.
    • Servlet을 실행하고, 생명주기를 관리하는 역할을 한다.
    • Servlet과 웹 서버(Apache, ngin 등)가 서버 통신을 할 수 있는 방법을 제공한다.
    • 멀티쓰레드를 지원하여 클라이언트의 다중 요청을 자동적으로 처리해준다.
    • 대표적인 Container에는 Tomcat, JBoss 등이 있다.

Servlet 실행 순서

  1. 사용자가 URL을 클릭하면 HTTP Request를 Servlet Container에 보낸다.
  2. Servlet Container는 HttpServletRequest, HttpServletResponse 두 객체를 생성한다.
  3. 사용자가 요청한 URL을 분석하여 어느 서블릿에 대한 요청인지 찾는다. (DD를 참조하여 분석)
  4. 컨테이너는 서블릿 service() 메소드를 호출하며, POST, GET여부에 따라 doGet() 또는 doPost()가 호출된다.
  5. doGet() or doPost() 메소드는 동적인 페이지를 생성한 후 HttpServletResponse 객체에 응답을 보낸다.
  6. 응답이 완료되면 HttpServletRequest, HttpServletResponse 두 객체를 소멸시킨다.

*DD (배포서술자, Deployment Descriptor) = web.xml

JSP

  • JSP(JavaServer Pages)는 자바 언어를 기반으로 하는 스크립트 언어로서 자바가 제공하는 기능을 그대로 사용할 수 있다. 또한 ASP, PHP처럼 스크립트 기반으로 개발되어 서버 페이지를 휠씬 쉽게 작성할 수 있으며 서블릿과 함께 구동함으로써 서블릿의 기능을 그대로 사용할 수 있으며, 자바빈즈(JavaBeans), EJB같은 기술로 보다 강력한 객체 지향적 지원이 가능하게 되었다. 또한 JSTL을 지원하게 되면서 웹 프로그램의 가독성이 좋아지고 유지 및 보수가 휠씬 쉬워지는 장점이 있다.

GET과 POST 방식

  • GET

    • 단순하게 서버 상에 존재하는 간단한 페이지를 요청하거나 게시판 글 목록 페이지에서 해당 페이지에 대한 목록 출력을 요청할 때 페이지 번호와 같이 간단한 파라미터를 전송하는 경우 사용된다. 클라이언트에서 서버로 데이터를 전달할 때, 주소 뒤에 “이름”과 “값”이 결한된 스트링 형태로 전송한다.
    • 전송 속도는 빠르지만 보안성이 낮고 길이 제한이 있음
  • POST

    • 단순하게 특정한 페이지를 요청하는 것이 아니라 특정 페이지로 많은 야의 파라미터를 전송하여 파라미터에 관한 처리를 할 때 POST 방식으로 요청을 전송한다. 회원 가입 요청, 게시판 글쓰기 요청, 자료실 업로드 등을 처리할 때 사용하는 방식이 모두 POST 방식에 해당한다. 클라이언트에서 서버로 데이터를 전달할 때, html의form 태그를 사용하여 method 속성을 POST로 지정하여야 한다.
    • 전송 속도는 느리지만 보안성이 높고 길이 제한이 없음)

세션과 쿠키

  • 쿠키와 세션을 사용하는 이유
    • HTTP 프로토콜의 특징이자 약점을 보완하기 위해서 사용한다.
  • 세션
    • 세션이란 서버 측의 컨테이너에서 관리되는 정보이다.
    • 세션의 정보는 컨테이너에 접속해서 종료되기까지(브라우저를 종료할 때까지) 유지되며, 접속 시간에 제한을 두어 일정 시간 응답이 없다면 정보는 더 이상 유지되지 않게 설정이 가능하다.
    • 이것은 정보가 서버 측에서 저장된다는 면에서 보안적으로 유리하다. 쿠키 같이 클라이언트에 정보가 저장될 경우 데이터가 노출되어 보안적으로 심각한 문제가 발생할 수 있다.
    • 보안이 필요한 정보를 공유하기 위해서는 서버 측에서 관리될 수 있는 세션을 이용하는 것이 좋다.
    • 클라이언트와 서버의 관계(상태)를 유지하기 위한 기능을 제공
  • 쿠키
    • 쿠키란 클라이언트 측에서 관리되는 정보를 의미한다.
    • 세션과 비교해 보면 세션은 서버 측에서 관리되지만 쿠키는 클라이언트 정보가 저장된다. 또한 쿠키의 정보는 세션과 달리 브라우저를 종료한다고 해도 생존 기간이 지정되면 생존 기간 동안 데이터가 사라지지 않는다.
    • 쿠키는 하드디스크에 파일로 저장되기 때문에, 그 파일이 남아있는 한 항상 유지된다.
    • 하지만 쿠키는 클라이언트에서 관리되기 때문에 보안적으로 매우 취약한 면을 가지고 있다. 하드디스크에 있는 쿠키 파일을 수정할 염려가 있기 때문이다. 이렇기 때문에 보안이 필요한 정보는 쿠키를 사용하지 않고 세션을 사용한다.
    • 클라이언트의 정보를 쿠키 단위로 클라이언트 시스템에 저장하는 기능을 제공

REST 란?

  • REST는 분산 시스템 설계를 위한 아키텍처 스타일이다. 아키텍처 스타일이라는건 쉽게 말하면 제약 조건의 집합이라고 보면 된다.
  • 사용하는 이유
    1. 위에서 말한 것과 같이 분산 시스템을 위해서다.
    2. WEB브라우저 외의 클라이언트를 위해서다. (멀티 플랫폼)
  • 장점
    • 메세지를 단순하게 표현할 수 있고 WEB의 원칙인 확장에 유연하다. (멀티플랫폼)
    • 별도의 장비나 프로토콜이 필요없이 기존의 HTTP 인프라를 이용할 수 있다. (사용이 용이함)
    • server, client를 완전히 독립적으로 구현할 수 있다.
  • 단점
    • 표준, 스키마가 없다. 결국은 API 문서가 만들어지는 이유다.
    • 행위에 대한 메소드가 제한적이다. (GET, POST, PUT, DELETE, HEAD, ...)

Web Server와 WAS의 차이

  • Web Server
    • 클라이언트가 서버에 페이지 요청을 하면 요청을 받아 정적 컨텐츠(.html, .png, .css등)를 제공하는 서버
  • WAS
    • 동적 컨텐츠를 제공하기 위해 만들어진 애플리케이션 서버 (DB조회, 로직처리가 요구되는 컨텐츠)
    • WAS는 정적,동적 처리 둘다 가능하지만 정적처리를 WAS가 하게되면 부하가 많이 걸려서 좋지 않음
    • 톰캣(WAS)에는 아파치(웹서버)의 기능(웹서비스데몬, Httpd)를 포함하고 있다.
  • WAS, Web Server를 따로 두고 쓰는 이유가 성능때문이라고 하는 건 잘못됨
    • 톰캣5.5 이상부터는 httpd의 native모듈을 사용해서 정적파일을 처리하는 기능을 제공하는데 이것이 순수 아파치 Httpd만 사용하는 것과 비교해서 성능이 전혀 떨어지지 않기 때문이다.
    • 그럼에도 톰캣앞에 아파치를 두는 이유는 하나의 서버에서 php애플리케이션과 java애플리케이션을 함께 사용하거나, httpd 서버를 간단한 로드밸런싱을 위해서 사용해야 할 때 필요하기 때문.

MVC 란?

MVC(Model – View – Controller)는 소프트웨어 공학에서 어플리케이션을 구성하는 패턴(Pattern) 중 하나이다.

디자이너, 개발자 영역이 분리됨으로써 분업화가 쉬워지며, 유지보수가 용이합니다.

  • Model : 응용프로그램에서 데이터를 처리하는 부분을 말한다. 데이터베이스를 연결하고 데이터를 추출하거나 저장, 삭제, 수정 등의 작업을 수행하는 역할을 한다.
  • View : 화면에 표시되는 부분이다. 추출한 데이터나 일반적인 텍스트 데이터를 표시하거나 입력 폼 또는 사용자와의 상호작용을 위한 인터페이스를 표시하는 영역이다.
  • Controller : 어플리케이션에서 각 요소들의 연결 관계를 설정하고 데이터와 시각적인 부분의 연결 등을 관리한다. 대개 URL로부터 입력되는 정보로부터 어떤 데이터와 뷰를 연결할 지 등을 제어한다.

Spring MVC 구조의 처리 과정

프레임워크

  • 특정 형태의 소프트웨어 문제를 해결하기 위해 상호 협력하는 클래스 프레임과 인터페이스 프레임의 집합
  • 특정 개념들의 추상화를 제공하는 여러 클래스나 컴포넌트로 구성되며, 컴포턴트들은 재사용이 가능하다.
  • 스켈레톤 코드라고도 불리는데, 특정한 틀을 만들어놓고 거기에 살을 붙여 놓음으로써 프로그램을 만들어 작업 시간을 줄여주는 것이다.
    • 장점 : 개발 시간을 줄일 수 있고, 오류로부터 자유로울 수 있다.
    • 단점 : 프레임워크에 너무 의존하면 개발 능력이 떨어져서 프레임워크 없이 개발하는 것이 불가능해질 수 있다.

Spring 특징

  1. 경량 컨테이너로서 자바 객체를 직접 관리
    • 각각의 객체 생성, 소멸과 같은 라이프 사이클을 관리하며 스프링으로부터 필요한 객체를 얻어올 수 있다.
  2. 스프링은 POJO(Plain Old Java Object) 방식의 프레임워크
    • 일반적인 J2EE 프레임워크에 비해 구현을 위해 특정한 인터페이스를 구현하거나 상속을 받을 필요가 없어 기존에
    • 존재하는 라이브러리 등을 지원하기에 용이하고 객체가 가볍다.
  3. 스프링은 제어의 역행(IoC : Inversion of Control)을 지원
    • 컨트롤의 제어권이 사용자가 아니라 프레임워크에 있어서 필요에 따라 스프링에서 사용자의 코드를 호출한다.
  4. 스프링은 의존성 주입(DI : Dependency Injection)을 지원
    • 각각의 계층이나 서비스들 간에 의존성이 존재할 경우 프레임워크가 서로 연결시켜준다.
  5. 스프링은 관점 지향 프로그래밍(AOP : Aspect-Oriented Programming)을 지원
    • 트랜잭션이나 로깅, 보안과 같이 여러 모듈에서 공통적으로 사용하는 기능의 경우 해당 기능을 분리하여 관리할 수 있다.
  6. 스프링은 영속성(dao,영속객체,persistence)과 관련된 다양한 서비스를 지원
    • 객체관계매핑(ORM – Object Relational mapping) DB와 객체지향프로그래밍 언어간의 호환되지 않는 데이터를 변환하는 프로그래밍 기법
    • iBatis나 Hibernate 등 이미 완성도가 높은 데이터베이스 처리 라이브러리와 연결할 수 있는 인터페이스를 제공한다.
  7. 스프링은 확장성이 높음
    • 스프링 프레임워크에 통합하기 위해 간단하게 기존 라이브러리를 감싸는 정도로 스프링에서 사용이 가능하기 때문에 수많은 라이브러리가
    • 이미 스프링에서 지원되고 있고 스프링에서 사용되는 라이브러리를 별도로 분리하기도 용이하다.

제어의 역행(IoC)

  • ‘제어의 역전’ 또는 ‘역제어’라는 뜻으로 객체에 대한 제어권이 바꿘 것을 의미한다.
  • 기존의 개발자들이 New 연산자, 인터페이스 호출, 팩토리 호출방식으로 객체의 인스턴스를 생성함으로 인스턴스 생성 방법에 대한 제어권을 개발자들이 가지고 있었다.
  • IoC란 인스턴스 생성의 제어를 개발자 본인이 아닌 다른 누군가에게 해주는 컨테이너이다.
  • 어떤 모듈이 제어를 가진다는 것은 ‘어떤 모듈을 사용할 것인지’, ‘모듈의 함수는 언제 호출할 것인지’ 등을 스스로 결정한다는 것을 의미한다.
  • 즉, IoC란 인스턴스의 생성부터 소멸까지의 인스턴스 생명주기 관리를 개발자가 아닌 컨테이너가 대신 해준다는 뜻이다.

의존성 주입(DI)

  • DI란 모듈 간의 의존성을 모듈의 외부(컨테이너)에서 주입시켜주는 기능으로 IoC의 한 종류이다.
  • 런 타임시 사용하게 될 각 모듈 간의 의존 관계를 컨테이너가 빈 설정 정보를 바탕으로 자동적으로 연결해 주는 것을 의미한다.

관점지향 프로그래밍(AOP)

  • 특정 기능이 있는 클래스 안에는 본질적인(핵심적인) 처리만 기술하고, 본질적이지 않은(추가 기능, 부가 기능)기능을 따로 구현하는 개발 방법이다.
  • 트랜잭션이나 로깅, 보안 인증과 같이 여러 모듈에서 공통적으로 사용하는 기능의 경우 해당 기능을 분리하여 관리한다.
  • 기존의 프로그래밍에서는 각 객체별로 처리했던 것을 각 관점별로 외부에서 접근을 하는 것이 AOP의 핵심이다.

Java에서 DB 연결하는 방법

  • DBC를 사용하는 방법
    • 오라클(각 다른 DB)에서 제공하는 DB 커넥션 클래스를 이용해서 DB에 접속하는 방법입니다. 사용자가 직접 소스에 아이디와 비밀번호 IP등을 입력하여 커넥션 객체를 생성하고 그것(커넥션객체)을 이용하여 DB를 제어합니다.
  • 커넥션 풀을 사용하는 방법
    • 사용자(프로그래머)가 소스에서 직접 DB에 연결하는 것이 아니라 연결은 WAS(Weblogic나 제우스, 톰켓 등을 말합니다)가 하고 사용자는 WAS가 연결한 커넥션을 이용하는 방법입니다.
    • Connection Pool: WAS가 스타트 하면서 동시에 오라클에 커넥션 객체를 미리 생성합니다. 프로그래머는 그 객체를 그냥 가져다 쓰는 겁니다.
  • 쓰레드 풀
    • 프로그램 성능저하를 방지하기 위해
      • 매번 발생되는 작업을 병렬처리하기 위해 스레드를 생성/수거하는데 따른 부담은 프로그램 전체적인 퍼포먼스 저하시킨다. 따라서 스레드풀을 만들어 놓는다.
    • 다수의 사용자 요청을 처리하기 위해
      • 서비스적인 측면으로 바라볼 때
      • 특히 대규모 프로젝트에서 중요하다. 다수의 사용자의 요청을 수용하고, 빠르게 처리하고 대응하기 위해 스레드풀을 사용한다.
    • 너무 많이 만들면 메모리 낭비가 발생할 수 있고 노는 스레드가 발생될 수 있다.

메모리에 저장되는 영역


  • Code 영역 : 함수, 제어문, 상수 등등 함수에 대한 기계어 코드가 들어감
  • Data 영역 : 초기값 있는 전역변수, 배열, static으로 선언된 변수가 들어감
  • Bss 영역 : 초기값 없는 전역변수, 배열, static으로 선언된 변수가 들어감
  • Compile time에 크기가 결정되고 이후로 변동되지 않는다.

  • Heap 영역 : 동적할당(malloc)으로 할당된 변수가 들어감. 프로그래머 영역.
  • Stack 영역 : 지역변수, 블록내에서 할당된 변수가 들어감. 블록을 벗어나면 사라짐
  • Run time에 Bss와 Heap사이를 기준으로 해서 Heap은 아래로 순차적으로 메모리를 사용하고 Stack은 위쪽으로 순차적으로 메모리를 사용한다

OSI 7 계층

  • 데이터가 목적지를 잃지않고 원하는 곳에 전달되기 위해 단계들을 세분화 한 것이 OSI 7계층이다. 즉, 모든 단계에서 해당되는 일만 처리 후 단계들을 거쳐나간다.
  • 통신 접속에서 완료까지의 과정을 7단계로 정의한 국제 통신 표준 규약으로 다음과 같이 분류된다.
  • 응용계층 :
    • 사용자가 네트워크에 접근할 수 있도록 서비스를 제공한다.
  • 표현계층 :
    • 세션 계층 간의 주고받는 인터페이스를 일관성 있게 제공한다.
    • 데이터를 구분짓는 단계. 암호화, 압축화를 수행함
    • 시스템에 맞는 방식으로 데이터를 구분지어 재구성함
  • 세션계층 :
    • 통신 시스템 사용자간의 연결을 유지 및 설정한다.
    • 양 끝단의 응용 프로세스가 통신을 관리하기 위한 방법을 제공하는 단계
    • 통신 경로 확립이나 단절, 전달방식을 정하고 TCP/IP 세션을 만들고 없애는 책임을 가짐
  • 전송계층 :
    • 두 호스트 시스템으로부터 발생하는 데이터의 흐름을 제공한다.
    • 데이터 전송 방식을 결정하고, 포트번호를 구분하는 단계
    • TCP, UDP 결정
    • 포트번호는 아파트의 호수라고 생각하면 됨. 각 아파트 마다 비슷한 기능을 하는 것들끼리 모여 살고있다. 그 것을 분류해주는 것이 포트번호. (예) HTTP, FTP, Talnet, SSH)
    • 전송단위는 세그먼트
    • L4 스위치
  • 네트워크계층 :
    • 논리적 주소를 구분하고, 목적지까지의 최적의 경로를 정해주는 단계
    • IP 가 이 단계에 있음.
    • 여러개의 노드를 거칠때마다 경로를 찾아준다.
    • ARP, RARP, ICMP 가 있음.
    • ARP는 IP는 알지만 MAC을 모를 때 알아오는 프로토콜.
    • RARP는 MAC은 알지만 IP를 모를 때 알아오는 프로토콜
    • ICMP는 연결확인을 하는 프로토콜 (Ping)
    • 통신단위는 패킷, 데이터그램
    • L3스위치 외에도 라우터가 있다.
  • 데이터링크계층 :
    • 물리적 주소를 구분하고 데이터의 전송 형태를 결정하는 단계
    • MAC 주소를 통하여 통신
    • MAC 주소란, 랜카드가 만들어 질 때부터 부여받은 주소 (물리적 주소)
    • 통신단위는 프레임
    • L2스위치 외에도 브릿지가 있다.
  • 물리계층 :
    • 데이터를 비트로 변환, 비트를 전기적 신호로 변환하여 실제 전송
    • 전송단위는 비트
    • 허브, 리피터, 케이블, 커넥터가 있다.

TCP/IP 프로토콜 스택 4계층

  • APPLICATION 계층
    • 이러한 서버와 클라이언트를 만드는 과정에서 프로그램의 성격에 따라 데이터 송수신에 대한 약속(규칙)들이 정해지기 마련인데, 이를 가리켜 Aplication 프로토콜이라한다.
  • TCP/UDP(전송) 계층
    • 데이터의 실제 송수신을 담당한다.
    • UDP는 TCP에 비해 상대적으로 간단하며, TCP는 신뢰성 있는 데이터의 전송을 담당한다. 그런데 TCP가 데이터를 보낼 때 기반이 되는 프로토콜이 IP이다.
    • 앞서 말했듯이 IP 계층은 문제가 발생한다면 해결해주지 않는 신뢰되지 않은 프로토콜이다. 그 문제를 해결해 주는 것이 TCP.
    • 데이터가 순서에 맞게 올바르게 전송이 갔는지 확인을 해주며 대화를 주고받는다.
    • 확인절차를 걸쳐서 신뢰성 없는 IP에 신뢰성을 부여한 프로토콜이라 생각하면 됨.
  • IP 계층
    • 경로검색을 해주는 계층.
    • IP 자체는 비연결지향적이며 신뢰할 수 없는 프로토콜이다.
    • 데이터를 전송할 때마다 거쳐야 할 경로를 선택해주지만, 그 경로는 일정치 않다. 특히 데이터 전송 도중에 경로상에 문제가 발생하면 다른 경로를 선택해 주는데, 이 과정에서 데이터가 손실되거나 오류가 발생하는 등의 문제가 발생한다고 해서 이를 해결해주지 않는다.
    • 즉, 오류발생에 대한 대비가 되어있지 않은 프로토콜이다.
  • LINK 계층
    • 물리적인 영역의 표준화에 대한 결과.
    • 가장 기본이 되는 영역으로 LAN, WAN, MAN과 같은 네트워크 표준과 관련된 프로토콜을 정의하는 영역.

TCP

  • TCP 서버의 함수호출 순서 : socket() 소켓생성 -> bind() 소켓 주소할당 -> listen() 연결요청 대기상태 -> accept() 연결허용 -> read()/write() 데이터 송수신 -> close() 연결종료
  • TCP 클라이언트의 함수호출 순서 : socket() 소켓생성 -> connect() 연결요청 -> read()/write() 데이터 송수신 -> close() 연결종료
  • 서버와 클라이언트의 차이점은 ‘연결요청’이라는 과정이다. 이는 클라이언트 소켓을 생성한 후에 서버로 연결을 요청하는 과정. 서버는 listen()를 호출한 이후부터 연결요청 대기 큐를 만들어 놓는다. 따라서 그 이후부터 클라이언트는 연결요청을 할 수 있다. 이 때, 서버가 바로 accept()를 호출할 수 있는데 이때는, 연결되기 전까지 호출된 위치에서 블로킹 상태에 놓이게 된다.
  • 3-way handshaking : TCP 소켓은 연결설정 과정에서 총 세번의 대화를 주고 받는다.

UDP

  • UDP는 TCP의 대안이며, IP와 함께 쓰일 때에는 UDP/IP라고 표현하기도 한다.
  • TCP와 마찬가지로 실제 데이터 단위를 받기위해 IP를 사용한다. 그러나 TCP와 달리, 메세지를 패킷으로 나누고, 반대편에서 재조립하는 등의 서비스를 제공하지 않는다. 즉, 여러 컴퓨터를 거치지 않고 데이터를 주고 받을 컴퓨터끼리 직접 연결하고자 할때 UDP를 사용한다.
  • UDP를 사용해서 목적지(IP)로 메세지를 보낼 수 있고, 컴퓨터를 거쳐서 목적지까지 도달할 수도 있다. 허나 도착하지 않을 수도 있다. 정보를 받는 컴퓨터에서는 포트를 열어두고 패킷이 올 때까지 기다리며 데이터가 온다면 모두 다 받아들인다. 패킷이 도착했을 때 출발지에 대한 정보(IP, PORT)를 알 수 있다.
  • 2UDP는 이러한 특성 때문에 안정적이지 않은 프로토콜이다. 하지만 TCP에 비해서 속도가 빠른편이기에 데이터의 유실이 일어나도 큰 상관이 없는 스트리밍이나 화면전송에 사용된다.

TCP와 UDP의 차이점을 설명해보세요.

  • TCP와 UDP는 프로토콜로 프로토콜은 컴퓨터 네트워킹을 하는데 있어서 서로 약속하는 통신 규약입니다.
  • TCP와 UDP는 전송계층의 프로토콜로 IP계층에서 알려준 정보 경로를 바탕으로 데이터의 실제 송수신을 담당한다.(*물데네전세표응)
  • TCP와 UDP의 차이점은 연결(Connection), 신뢰도(Unrliable)에 있습니다.
  • TCP
    • 먼저 TCP는 3-way Handshaking을 통해 Connection을 형성 한 뒤에 정보의 송수신이 이루어집니다.
    • 또 세그먼트가 유실될경우 재전송을 통해 복구해주며 순서가 바뀌더라도 순서 번호를 이용하여제대로 맞추어 전달합니다.
  • UDP
    • UDP 값은 경우 연결 설정 없이 바로 전송이 가능하며 전송한 데이터그램이 유실 될 수 있고 순서가 바뀌어 도착 할 수도 있습니다. 게임서버와 같은 경우 중요하지 않은 게임 데이터에 대해서는 눈감아 줄 수 있기 때문에 UDP를 사용합니다.

HTTP 통신과 Socket 통신 차이

  • HTTP
    • Client가 요청을 보내는 경우에만 Server가 응답하는 단방향 통신이다.
    • Server로부터 응답을 받은 후에는 연결이 바로 종료된다.
    • 실시간 연결이 아니고, 필요한 경우에만 Server로 요청을 보내는 상황에 유용하다.
    • 일반적으로 모바일 어플리케이션은 필요한 경우에만 Server로 정보를 요청하는 경우가 많은데, 이러한 Web Server로 Http 통신을 주로 사용하며 비용 및 유지보수 등 대부분의 방면에서 좋다.
  • 소켓
    • Server와 Client가 계속 연결을 유지하는 양방향 통신이다.
    • Server와 Client가 실시간으로 데이터를 주고받는 상황이 필요한 경우에 사용된다.
    • 실시간 동영상 Streaming이나 온라인 게임 등과 같은 경우에 자주 사용된다.

DB에서 Index를 사용하는 이유

  • 인덱스(Index):
    • 인덱스란 테이블의 값을 빠르게 엑세스 하도록 하는 데이터베이스 객체이다.
    • 데이터를 논리적으로 정렬하여 검색과 정렬 작업의 속도를 높이기 위해 사용된다.
    • B* 트리를 사용하며 논리적으로도 물리적으로도 테이블과는 독립적이다.
    • 언제든지 생성,삭제가 가능하지만 수정은 안된다. 다른 인덱스에 영향을 주지 않는 독립적인 객체.
  • 예를 들면, 책에서 가장 빨리 내용을 찾는 방법은 책의 뒤편의 색인을 보는 것.
  • 기본키에 대해서는 항상 DBMS가 내부적으로 정렬된 목록을 관리하기에 특정 행을 가져올 때 빠르게 처리된다. 하지만, 다른 열의 내용을 검색하거나 정렬시에는 하나하나 대조를 해보기 때문에 시간이 오래걸린다. (이를 인덱스로 정의해두면 검색속도가 향상된다.)
  • 단점: 인덱스를 사용하면 데이터를 가져오는 작업의 성능은 향상시킬 수 있지만 데이터 삽입, 변경 등이 일어날 때 매번 인덱스가 변경되기 때문에 성능이 떨어질 수 있다.
  • 사용대상 : 데이터 필터링과 정렬에 사용되므로, 데이터를 특정한 순서로 자주 정렬한다면 인덱스를 사용하기에 적합
  • [http://jeong-pro.tistory.com/114?category=793347](좀 더 자세한 내용에 대한 블로그)

NoSQL이란

  • NoSQL 데이터베이스는 관계형 데이터베이스(RDB)보다 덜 제한적인 일관성 모델을 이용하는 데이터의 저장 및 검색을 위한 매커니즘을 제공한다.
  • 단순 검색 및 추가 작업을 위한 매우 최적화된 키-값 저장 공간을 사용한다.
  • 빅데이터 시대에 따라 많은 양의 데이터를 효율적으로 처리하기 위해 등장하였다. (분산처리, 빠른쓰기 및 데이터의 안정성)
  • 분산형 구조를 통해 여러 대의 서버에 분산해 저장하고, 분산시에는 데이터를 상호 복제에 특정 서버에 장애가 발생했을 때에도 데이터 유실이나 서비스 중지가 없는 형태의 구조를 갖고 있다.

NoSQL이 기존 RDBMS와 다른 점

  • 스키마가 없다. 즉 데이터 관계와 정해진 규격(table-column의 정의)이 없다.
  • 관계 정의가 없으니 Join이 불가능하다. (하지만 reference와 같은 기능으로 비슷하게 구현은 가능.)
  • 트랜잭션을 지원하지 않는다.
  • 분산처리(수평적 확장)의 기능을 쉽게 제공한다.
  • 대부분의 NoSQL DB는 분산처리기능을 목적으로 나왔기 때문에 분산처리 기능을 자체 프레임워크에 포함하고 있다.

참고

자바 개발자 면접 예상 질문
스레드 풀
객체지향 프로그래밍의 캡슐화, 상속, 다형성
자바 extends, implements 차이
http 통신과 socket 통신 차이

+ 따끈한 최근 게시물