본문 바로가기
  • 달려가보자고~!
개발공부/Java/Spring

주요 키워드

by 도전왕 2023. 8. 9.

📘1. 객체지향 프로그래밍(OOP)에 대해 설명해주세요. 알고있는 원칙이나 키워드를 언급해주세요

OOP란?

  • Object Oriented Programming, 객체 지향 프로그래밍
  • 객체 지향 프로그래밍은 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 객체들의 상호작용으로 프로그램을 구성하는 방법. 객체들은 메세지를 주고받으며 데이터를 처리.

OOP의 특성
1. 캡슐화
  - 객체의 속성(fields)과 행위(methods)를 하나로 묶고, 외부로부터 데이터를 보호하는
     것을 말함.
  - 접근제어자를 통해 캡슐화 할 수 있음.
2. 상속화
  - 자손 클래스는 조상 클래스의 모든 멤버를 상속받음.
  - 조상 클래스를 재사용해서 새로운 클래스를 작성할 수 있게 됨
3. 추상화
  - 여러 클래스의 공통적인 특성들을 뽑아서(변수, 메서드) 추상클래스로 묶는 것
  - 추상화된 코드는 구체화된 코드보다 유연함. 즉, 변경에 유리.
4. 다형성
  - 조상타입 참조변수로 자손타입 객체를 다루는 것.
  - 결합도(Coupling)를 낮출 수 있음
  - 대표적인 예 : 오버로딩, 오버라이딩
→ 상속과 다형성으로 인해 코드의 재사용성, 유지보수, 중복된 코드의 제거 측면에서 좋음

OOP의 원칙
SOLID 원칙은 소프트웨어를 설계함에 있어 이해하기 쉽고, 유연하고, 유지보수가 편하도록 도와주는 5가지의 원칙

  1. SRP(Single Responsibility Principle)
    단일 책임 원칙. 모든 클래스는 단 한 가지의 책임을 부여받아, 수정할 이유가 단 한 가지여야 함
  2. OCP(Open-Closed Principle)
    개방 폐쇄 원칙. 소프트웨어의 구성요소가 확장에 대해서는 유연해야 하지만 수정에 대해서는 폐쇄적이어야 함을 의미. 새 기능이 필요할 때 기존에 작성하고 테스트했던 코드를 수정하지 않고 추가할 수 있어야 한다는 것.
  3. LSP(Liskov Substitution Principle)
    리스코프 치환 원칙. 상위 타입은 항상 하위 타입으로 대체할 수 있어야 함.
  4. ISP(Interface Segregation Principle)
    인터페이스 분리 원칙. 필요하지 않는 요소를 구현하도록 강요하거나 사용하지 않는 요소에 의존하도록 만들면 안 된다는 것을 의미
  5. DIP(Dependency Inversion Principle)
    의존성 역전 원칙은 상위 모듈이 하위 모듈에 종속성을 가져서는 안 되며, 양쪽 모두 추상화에 의존해야 함을 의미. DIP를 통해 결합도를 낮출 수 있음.

OOP의 장점
1. 재사용성이 높음
2. 유지보수에 용이
3. 대형 프로젝트에 적합
    클래스 단위로 모듈화시켜 개발할 수 있으므로 여러 사람이 개발에 참여하는 대형
    프로젝트에 적합함

OOP의 단점
1. 설계에 많은 시간이 소요됨

자바의정석 정리본 chapter.7 

참고사이트


📘2. REST API란 무엇인가요? (모두가 답변) 프로젝트에 REST API를 사용한 이유가 무엇인가요? (프로젝트에 REST API를 사용하셨을 경우에만 추가 답변), REST API 말고 다른 비교할만한 것을 알고 있나요?

REST API란?

  • (REST API는 Representaional State Transfer API의 약자. REST API는 HTTP의 확장인 셈)
  • URI로 정보의 자원을 표현하고, 자원에 대한 행위를 HTTP Method(GET, POST, PUT, PATCH, DELETE)로 표현하는 방법.
  • REST API는 REST 규약을 준수하는 API를 의미. 이 REST 제약 조건을 잘 준수함을 RESTful 하다고 표현함.
  • REST API에서 리소스는 다양한 형태로 표현될 수 있음. 가장 많이 사용되는 형태는 JSON이고, XML, TEXT, RSS 등의 표현이 존재함.

REST API 규칙

  • URL Rules 관련
      -슬래시 구분자 /는 계층 관계를 나타내는 데 사용
      -마지막에 /는 포함하지 않음
      --(dash)는 URI 가독성을 높이는데 사용
      -_(underbar) 대신 -(dash)를 사용
      -소문자를 사용
      -리소스 간의 관계를 표현하는 방법
        ex)  GET : /users/{userid}/devices (일반적으로 소유 ‘has’의 관계를 표현할 때)
      -파일 확장자는 URI에 포함시키지 않음
      -행위(method)는 URL에 포함하지 않는다 (동사사용 x)
      -컨트롤 자원을 의미하는 URL 예외적으로 동사를 허용
      -컬렉션은 복수명사 권장
  • HTTP 응답 상태코드 관련
      -의미에 맞는 HTTP status를 리턴해야함. 단순히 200번대, 400번대보다는 상세할수록
       좋음
      -성공 응답은 2XX로 응답
      -실패 응답은 4XX로 응답
      -5XX 에러는 절대 사용자에게 나타내지 말기!

PATCH와 PUT의 차이점 💡
PUT은 리소스의 모든 정보를 업데이트. 즉, 새로운 리소스로 대체.
PATCH는 리소스의 일부분만을 업데이트.

rest API의 장점
1. 주소와 메서드를 통해 어떤 요청인 지 알 수 있으므로, 서버와 프론트와의 작업이 수월해짐.
2. HTTP Method를 통해 endpoint를 줄일 수 있음

REST API의 단점
1. 메소드 형태가 제한적
2. 공식화 된 API 디자인 가이드가 존재하지 않음

API 아키텍처

  • gRPC
  • SOAP
  • REST
  • GraphQL
    → REST API의 단점을 해결하고자 나온 것이 GraphQL, gRPC

GraphQL의 장단점

  1. HTTP 요청의 횟수를 줄일 수 있음.
    RESTful은 각 Resource 종류 별로 요청을 해야하나, GraphQL 은 원하는 정보를 하나의 Query 에 모두 담아 요청하는 것이 가능
  2. HTTP 응답의 Size 를 줄일 수 있다.
    RESTful은 응답의 형태가 정해져있고, 따라서 필요한 정보만 부분적으로 요청하는 것이 힘듦.
    반면 GraphQL은 원하는 대로 정보를 요청하는 것이 가능.
  3. 그러나 File 전송 등 Text 만으로 하기 힘든 내용들을 처리하기 복잡

+a 💡
무상태성은 HTTP의 특성이지 REST API의 특성이 아님!
API는 아키텍처 X. 규약일 뿐

참고 사이트


📘3. DI(Dependency Injection)에 대한 설명과 해당 기술의 장점에 대해 설명해주세요.

DI(Dependency Injection). 의존성 주입이란?

  • 객체를 직접 생성하는 것이 아니라 외부에서 생성한 후 주입 시켜주는 방식. DI를 통해서 모듈 간의 결합도가 낮아지고 유연성이 높아짐.
  • (추가설명 : 인터페이스를 사이에 둬서 클래스 레벨에서는 의존관계가 고정되지 않도록 하고 런타임 시에 관계를 동적으로 주입)

IoC(Inversion of Control). 제어의 역전이란?

  • 일반적인 경우
    한 클래스가 다른 클래스를 직접 참조하고 생성함
  • 제어의 역전의 경우
    -  개발자가 직접 의존성을 제어하던 것을 IoC Container(매개체)에게 제어권을 일임하여
        제어의 주체가 더이상 개발자가 아니고 IoC Container가 되는 것을 제어의 역전이라 함.
    -  IoC Container가 개발자에게서 일임받은 제어권을 사용하여 의존성을 관리하고,
        인스턴스를 생성하여 주입해주고, 나중에는 메모리를 해제해주는 역할까지 함.
        스프링과 같은 프레임워크가 IoC를 포함하고 있음.
    -  정리해서, 사용처에서 직접 생성하는 것이 아니라, 필요할 때 IoC Container가
        의존성이 있는 모듈을 주입해주는 방식. 이 과정에서 의존하는 모듈의 생성과 해제,
        주입 등의 일련의 제어 과정을 IoC Container 기능을 포함하는 프레임워크에 줌으로써
        제어의 역전이 일어나는 것.

DI, IoC의 장점
  1.  의존성 감소
       -변화에 강함
       -재사용성 좋아짐
       -유지보수 용이
  2.  코드양 감소
  3.  테스트 용이

DI의 3가지 방법
  1.  Field Injection(필드 주입)
      → final 선언 불가 → 불변성 보장 x
  2.  Setter Injection(수정자 주입)
  3.  Constructor Injection(생성자 주입)
      → Spring framework reference에서 권장하는 방법은 생성자를 통한 주입
      생성자를 사용하는 방법이 좋은 이유는 필수적으로 사용해야하는 참조변수 없이는
      인스턴스를 만들지 못하도록 강제할 수 있기 때문. → NullPointerException 방지
      또한 객체의 불변성을 보장해줌.

Spring 없이 DI를 한다면?

  • 한 클래스에서 직접 객체를 생성해야 함 (위의 그림에서 왼쪽의 케이스)

프로젝트에서 사용했던 DI 방법은?

  • 생성자 주입 방법.
  • Lombok의 @RequiredArgsConstructor을 사용하면, final이 붙은 필드에 대한 생성자를 자동으로 생성해줌

참고사이트


📘4. DB에서 인덱스를 잘 사용하면 어떤 장점이 있을까요?

인덱스의 장점

  • 인덱스는 데이터베이스 테이블에 대한 검색 속도를 높여줌.
  • 특정 컬럼에 인덱스를 생성하면, 별도의 메모리 공간에 데이터의 물리적 주소가 오름차순으로 함께 저장됨.
    검색시 인덱스에 저장되어 있는 데이터의 물리적 주소로 가서 데이터를 가져오는 식으로 동작을 하기 때문에 검색 속도를 향상시켜 줌.

인덱스를 쓰지 않아도 되는 경우

  • 검색 작업이 필요없는 컬럼들은 인덱스 만들어 둘 필요 없음.

모든 컬럼에 인덱스를 걸지 않는 이유
아래의 두가지 이유로 인덱스는 필요한 곳에만 걸어야 함

  • 인덱스는 DB의 10퍼센트 내외의 공간이 필요.
  • 기존 테이블에 있던 데이터를 삽입, 수정, 삭제 시 인덱스에도 똑같이 반영해줘야 하기 때문에, 삽입, 수정, 삭제 시 약간의 성능하락이 있음(인덱스의 단점)

인덱스 자료구조

  • B+tree를 많이 사용
  • B-tree란?
    B-tree는 Binary search tree와 유사하지만, 한 노드 당 자식 노드가 2개 이상 가능
  • B+tree란?
    노드끼리 연결되어 있어서 범위검색이 매우 쉬워짐
  • +a
    primary key로 설정된 컬럼은 자동으로 정렬이 되어 있기 때문에 index 생성 필요없음. clustered index라고 부름.

📘5. MSA(Microservice Architecture)란?

  • 어플리케이션의 핵심 기능을 MicroService(MS)로 세분화하여 독립적으로 구축하고 배포할 수 있게하는 방식
    (쇼핑몰 사이트에서 검색기능, 추천 기능, 장바구니 기능 하나하나가 MS가 될 수 있음)
  • 독립된 각각의 서비스는 API를 통해 데이터를 주고받으며, 하나의 큰 서비스를 구성.
  • 모놀리식 방식 : 전체 애플리케이션의 소스 코드를 하나의 배포 유닛으로 내장시키는 방식
    단점 : 기존 애플리케이션에 최소한의 변경 사항이 있어도 대규모 업데이트를 해야 하거나, 일부 어플리케이션의 업데이트로 오류가 발생한 경우 전체를 오프라인으로 전환하고 문제를 해결하는 등 다운타임이 발생하게 됨
  • 모놀리식 아키텍처의 단점을 보완한 것이 MSA인 것.

MSA의 장점

  • 분산형 개발 가능
  • 개별 서비스가 독립적으로 작동하므로 다른 서비스에 부정적인 영향을 주지 않음으로써 배포에 따른 우려 사항들이 적어짐(손쉬운 배포)
  • 다른 서비스들과 유연하게 결합하며(언어의 제약 X), 향후 확장 및 새로운 기능 통합 등에 대비할 수 있음(높은 확장성)
  • 개발자들이 각각의 서비스를 파악하고 개선하기에 용이해짐(편리한 액세스)

MSA의 단점

  • 큰 프로젝트에는 많은 서비스들이 존재하므로, 모든 서비스를 모니터링 하는 오버헤드가 증가함
  • 서비스에서 다른 서비스를 호출하므로 서비스에 장애가 발생한 경우 경로 및 장애 추적이 힘들 수 있음
  • 서비스별로 로그가 생성되기 때문에 중앙 로그 모니터링은 존재하지 않음
  • 각 서비스는 API를 통해 통신하므로 네트워크 통신에 의한 오버헤드가 발생

참고사이트


📘6. 제네릭에 대해서 설명하고, 컬렉션 클래스에서 왜 제네릭을 사용하는 지 설명해주세요.

  • 제네릭은 (다양한 타입의 객체들을 다루는) 메서드나 컬렉션 클래스에 객체의 데이터타입을 미리 명시해줌으로써 컴파일 시 타입 체크(compile-time type check)를 해주는 것

제네릭의 장점
  1.  객체의 타입을 컴파일 시에 체크하기 때문에 객체의 타입 안정성을 높이고,
  2.  타입체크와 형변환을 생략할 수 있으므로 코드가 간결해짐

    ex1)

   ArrayList<Tv> tvList = new ArrayList<Tv>();    // Tv 객체만 저장할 수 있는 ArrayList를 생성

   tvList.add(new Tv());                // OK
   tvList.add(new Audio());             // 컴파일 에러. Tv외 다른 타입은 저장 불가

    ex2)



    💡
    타입의 안정성을 높인다는 것은 의도하지 않는 타입의 객체를 저장하는 것을 막고,
    저장된 객체를 꺼내올 때 원래의 타입과 다른 타입으로 형변환되어 발생할 수 있는
    오류를 줄여준다는 뜻

  

   3.  런타임 에러를 컴파일 에러의 영역으로 바꿀 수 있음 ← ClassCastException 런타임
         에러를 컴파일 과정에서 제거가 가능해짐

    ex)

   ArrayList list = new ArrayList();

   list.add(10);
   list.add(20);
   list.add("30");                    // String을 추가

   Integer i = (Integer)list.get(2);  // 컴파일은 되나, 런타임 에러(ClassCastException) 발생 → 컴파일러의 한계

   System.out.println(list);

       위의 코드에서 아래와 같이 제네릭을 사용하면, 타입 체크가 강화됨

   ArrayList<Integer> list =  new ArrayList<Integer>();

   list.add(10);
   list.add(20);
   list.add("30");     // 제네릭스 덕분에 타입체크가 강화되어 빨간줄 뜸

   System.out.println(list);

      → ClassCastException 런타임 에러를 컴파일 에러로 끌고온 것!

프로젝트에서 제네릭을 사용해본 경험

  • 컨트롤러 단에서 공통 응답 DTO를 ResponseEntity<>로 감싸서 내보냄.
  • HashMap 사용시 타입 지정

참고


📘7. List, Set, Map, HashMap의 차이에 대해서 설명해주세요

List인터페이스

  • List인터페이스는 중복을 허용하면서 저장순서가 유지되는 컬렉션을 구현하는데 사용됨
  • (ArrayList, LinkedList가 중요)

Set인터페이스

  • Set인터페이스는 중복을 허용하지 않고, 저장 순서가 유지되지 않는 클래스를 구현하는 데 사용됨.
  • (인덱스가 따로 존재하지 않기 때문에 iterator를 사용)
  • (Set은 집합과 같다고 보면 됨)
  • (HashSet과 TreeSet이 중요)

Map인터페이스

  • Map인터페이스는 키(key)와 값(value)을 하나의 쌍으로 묶어서 저장하는 컬렉션 클래스를 구현하는데 사용됨.
  • 저장순서 유지 X. (인덱스가 따로 존재하지 않기 때문에 iterator를 사용)
  • 키(key)는 중복될 수 없지만 값(value)은 중복을 허용
       values()은 반환타입이 Collection이고, keySet()은 반환타입이 Set인데
           Map인터페이스에서 값(value)은 중복을 허용하기 때문에 Collection타입으로 반환하고,
           키(key)는 중복을 허용하지 않기 때문에 Set타입으로 반환.
      → 기존에 저장된 데이터와 중복된 키와 값을 저장하면 기존의 값은 없어지고 마지막에
          저장된 값이 남게됨.
  • (Map이란 개념은 어떤 두 값을 연결한다는 의미에서 붙여진 이름)

HashMap

  • Map인터페이스를 구현한 대표적인 컬렉션 클래스
  • Hashtable(동기화o)은 구버전이고, HashMap(동기화x)이 새로운 버전
  • 순서를 유지하려면 LinkedHashMap클래스를 사용하면 됨
  • 해싱(hashing)기법으로 데이터를 저장하기 때문에 많은 양의 데이터를 검색하는데 있어서 뛰어난 성능을 보임

+a
TreeMap

  • 범위 검색과 정렬에 유리한 컬렉션 클래스
    (이진 탐색 트리(Red-Black Tree)를 기반으로 키와 값을 저장)
  • Map이 필요할 때 주로 HashMap을 사용하고, 정렬이나 범위검색이 필요한 경우에 TreeMap을 사용
  • 다수의 데이터에서 개별적인 검색은 TreeMap보다 HashMap이 빠름
  • HashMap보다 데이터 추가, 삭제에 시간이 더 걸림
  • (TreeSet과 매우 유사. TreeSet은 TreeMap을 이용해서 구현되어 있음)

+a
LinkedHashMap

  • 입력된 순서를 보장

+a
Hashtable

  • 동기화가 보장되어 병렬 프로그래밍이 가능 → HashMap 보다 처리속도가 느림

💡 Vector vs ArrayList, Hashtable vs HashMap

  • Vector와 Hashtable과 같은 구버전의 클래스들은 자체적으로 동기화 처리가 되어있는데, 멀티쓰레드 프로그래밍이 아닌 경우에는 불필요한 기능이 되어 성능을 떨어뜨리는 요인이 됨.
  • 그렇기에 새로 추가된 ArrayList와 HashMap과 같은 컬렉션은 동기화를 자체적으로 처리하지 않고 필요한 경우에만 아래의 java.util.Colections 클래스의 동기화 메서드를 이용해서 동기화 처리가 가능하도록 변경됨
   static Collection synchronizedCollection(Collection c)
   static List       synchronizedList(List list)
   static Set        synchronizedSet(Set s)
   static Map        synchronizedMap(Map m)
   static SortedSet  synchronizedSortedSet(SortedSet s)
   static SortedMap  synchronizedSortedMap(SortedSet m)
  
   👉사용 방법
   List syncList = Collections.synchronizedList(new ArrayList(...));

💡HashMap + SynchronizedMap의 대안 : ConcurrentHashMap

  • JAVA 1.5 부터는 ConcurrentUtil 이라는 인터페이스를 기본으로 제공.
    멀티 쓰레드 환경에서는 SynchronizedMap 보다는 ConcurrentUtil이 제공하는 ConcurrentHashMap 클래스를 사용하는 추세. (HashMap + SynchronizedMap의 대안)
  • ConcurrentHashMap은 SynchronizedMap으로 감싸진 HashMap이나 HashTable보다 더 빠른 속도를 보이면서도 쓰레드 간의 동기화를 보장. 이게 가능한 이유는 ConcurrentHashMap은 동기화 시, Map 전체에 동기화 락을 걸지 않고, Map을 여러 조각으로 쪼개어 부분부분 락을 거는 형태로 구현되어 있기 때문입니다. 그러한 이유로 특히 (멀티 쓰레드 환경에서) 쓰레드 간의 경쟁이 심한 경우, 훨씬 더 좋은 성능을 보임.

참고 사이트


📘8.Parameter와 Argument의 차이에 대해 설명해주세요.

parameter란?

  • 매개변수. 메서드 선언부에서 정의하는 변수

argument란?

  • 인수. 메서드가 호출될 때 메서드의 입력 값

Java에서 Parameter에 값을 전달하는 방식은?

  • call by value(값복사)
    원시타입 → 복사된 값 그 자체를 넘겨줌
    참조타입 → 복사된 주소값을 넘겨줌

📘9.프로세스와 스레드의 차이에 대해 설명해 주세요

프로세스란?

  • 프로그램이 실행된 것

스레드란?

  • 스레드는 한 프로세스 내에서 나뉘어진 하나 이상의 실행 단위

한 어플리케이션에 대한 작업을 동시에 하기 위해서는 2가지 처리방식(1. 멀티 프로세스, 2. 멀티 스레드)이 있음

  • 멀티 프로세스는 독립적인 메모리를 가지고 있지만, 멀티 스레드는 자원을 공유. 각각의 장단점이 있음
  • 동시에 실행이 되는 것처럼 보이기 위해 실행 단위는 시분할로 cpu를 점유하며 context switching을 함

1.  multi-process

  • (부모 프로세스가 fork()를 해서 자식 프로세스를 여러 개를 만들 수 있음. 자식 프로세스는 부모 프로세스와 별개의 메모리 영역을 확보하게 됨)
  • (IPC를 사용한 통신)
  • 각 프로세스는 독립적
    → 자원 소모적, 개별 메모리 차지
    → context switching 비용이 큼
    → 동기화 작업이 필요하지 않음(별개의 메모리 영역을 사용하기 때문)

2.  multi-thread

  • thread끼리 긴밀하게 연결되어 있음
  • 공유된 자원을 사용 (쓰레드끼리는 코드, 데이터, 힙 영역을 공통으로 사용하고 stack 부분만 따로 씀. 공유되는 자원이 있기 때문에 스위칭이 일어날 때 캐싱 적중률이 올라가게 됨.)
    → 통신 비용 절감
    → 메모리가 효율적임
    → context switching 비용이 적음
    → 공유 자원 관리를 해야함(동기화 필요)

single core vs multi core

  • 멀티코어는 하드웨어 측면에서 실행 단위를 병렬적으로 처리할 수 있도록 여러 프로세서가 있는 것single coremulti core
    concurrency 동시성 parallelism 병렬처리
    하나의 코어에서 하나 이상의 프로세스(혹은 쓰레드)가 번갈아가면서 진행되지만 동시에 진행되는 것처럼 보이는 것 둘 이상의 코어에서 동시에 하나 이상의 프로세스(혹은 스레드)가 한꺼번에 진행되는 것

동시성이란?

  • 한 순간에 여러가지 일이 일어나는 것이 아니라,
    짧은 전환으로 여러가지 일을 동시에 처리하는 것처럼 보이는 것

코어란?

  • 코어란 중앙 처리 장치 중에서도 가장 핵심이 되는 부품. CPU 내부의 '다이'라고 불리는 사각형의 블록 내부에 위치.
  • 기본 연산과 계산 작업 역할을 수행. 연산은 pc가 정보를 다루고 처리하는 그 자체이므로, 'pc의 성능 = 코어의 성능'

시분할이란?

  • 시분할 시스템(Time Sharing System)

참고 사이트


📘10. @SpringBootTest와 @WebMvcTest의 차이점을 설명해 주세요.

@SpringBootTest

  • 프로젝트에 있는 스프링 빈을 모두 등록해서 테스트에 필요한 의존성을 추가해줌.
  • 장점
    1.  프로젝트에 있는 모든 스프링 빈을 등록하므로, 테스트에 필요한 객체를 주입받아서 쉽게 사용 가능.
    2.  실제 환경과 가장 유사하게 테스트가 가능.
  • 단점
    1.  모든 스프링 빈을 등록할 때 프로젝트의 전체 컨텍스트를 로드해서 빈을 주입하기 때문에 속도가 느림.
    2.  테스트 단위가 크기 때문에 디버깅이 어려울 수 있음.

@WebMvcTest

  • MVC를 위한 테스트. 컨트롤러가 예상대로 작동되는지 테스트하기 위해 사용됨.
  • Web Layer만 로드하며, 특정 항목들만 스캔하도록 제한하여 빠르고 가벼운 테스트가 가능
  • 장점
    1.  Web Application 관련 빈만 로드하기 때문에, 속도가 @SpringBootTest보다 빠름
    2.  통합테스트에서 테스트가 어려운 작은 단위 테스트들을 진행할 수 있음.
  • 단점
    1.  실제 환경에서는 다른 오류가 발생할 수 있음.

참고 사이트


📘11. 트랜잭션이 무엇인지 설명해 주세요.

트랜잭션이란?

  • 트랜잭션이란, 데이터베이스의 상태를 변화시키기 위해서 수행하는 작업의 단위를 뜻함.
  • 데이터베이스의 상태를 변화시킨다는 것은 SQL(SELECT, INSERT, DELETE, UPDATE)을 이용하여 데이터베이스를 접근 하는 것을 의미.
    (이때, 작업의 단위는 여러 SQL문이 합쳐진 것일 수 있음)

트랜잭션의 특징
1. 원자성 (Atomicity)
    트랜잭션이 데이터베이스에 모두 반영되던가, 아니면 전혀 반영되지 않아야 함
2. 일관성 (Consistency)
    트랜잭션이 진행되는 동안에 데이터베이스가 변경 되더라도 업데이트된 데이터베이스로
    트랜잭션이 진행되는것이 아니라, 처음에 트랜잭션을 진행 하기 위해 참조한
    데이터베이스로 진행되어 작업 처리 결과가 항상 일관성이 있어야 함.
3. 독립성 (Isolation)
    독립성은 둘 이상의 트랜잭션이 동시에 실행되고 있을 경우 어떤 하나의 트랜잭션이라도,
    다른 트랜잭션의 연산에 끼어들 수 없다는 점을 말함.
    하나의 특정 트랜잭션이 완료될때까지, 다른 트랜잭션이 특정 트랜잭션의 결과를 참조할 수
    없음.
4. 지속성 (Durability)
    트랜잭션이 성공적으로 완료되었을 경우, 결과는 영구적으로 반영되어야 함.

Commit 연산

  • Commit이란 하나의 트랜잭션이 성공적으로 끝났고, 데이터베이스가 일관성있는 상태에 있을 때, 하나의 트랜잭션이 끝났다라는 것을 알려주기위해 사용하는 연산.
    이 연산을 사용하면 수행했던 트랜잭션이 로그에 저장됨.

Rollback 연산

  • Rollback이란 하나의 트랜잭션 처리가 비정상적으로 종료되어 트랜잭션의 원자성이 깨진경우, 트랜잭션을 처음부터 다시 시작하거나 연산된 결과를 다시 취소시킴.

참고 사이트


📘12. TCP와 UDP의 공통점과 차이점을 설명해보세요.

  • TCP와 UDP는 네트워크의 계층들 중 전송 계층에서 사용하는 프로토콜.

전송계층이란?

  • 송신자와 수신자를 연결하는 통신서비스를 제공하는 계층으로. 데이터의 전달을 담당.
  • OSI 7layer와 TCP/IP 4layer의 사진

TCP란?

  • Transmission Control Protocol의 약자.
    -인터넷상에서 데이터를 메세지의 형태로 보내기 위해 IP와 함께 사용하는 프로토콜

TCP 특징

  • 연결 지향 방식.
  • 3-way handshaking과정을 통해 연결을 설정하고 4-way handshaking을 통해 해제.
  • 흐름 제어 및 혼잡 제어.
  • 높은 신뢰성을 보장.
  • UDP보다 속도가 느림.
  • 전이중(Full-Duplex), 점대점(Point to Point) 방식.

TCP 서버의 특징

  • 서버소켓은 연결만을 담당.
  • 연결과정에서 반환된 클라이언트 소켓은 데이터의 송수신에 사용됨
  • 서버와 클라이언트는 1대1로 연결됨.
  • 스트림 전송으로 전송 데이터의 크기가 무제한.
  • 패킷에 대한 응답을 해야하기 때문에(시간 지연, CPU 소모) 성능이 낮음.
  • Streaming 서비스에 불리하다.(손실된 경우 재전송 요청을 하므로)

TCP 연결방식 - 3 way handshake방식

  • Client에서 Server에 연결 요청을 하기위해 SYN 데이터를 보냄.
  • Server에서 해당 포트는 LISTEN 상태에서 SYN 데이터를 받고 SYN_RCV로 상태가 변경됨.
  • 그리고 요청을 정상적으로 받았다는 대답(ACK)와 Client도 포트를 열어달라는 SYN을 같이 보냄.
  • Client에서는 SYN+ACK 를 받고 ESTABLISHED로 상태를 변경하고 서버에 ACK를 전송.
  • ACK를 받은 서버는 상태가 ESTABLSHED로 변경됨

→ 위와 같이 3번의 통신이 정상적으로 이루어지면, 서로의 포트가 ESTABLISHED 되면서 연결됨

UDP란?

  • User Datagram Protocol의 약자.
  • 데이터를 데이터그램 단위로 처리하는 프로토콜
  • UDP는 비연결형 서비스이기 때문에, 연결을 설정하고 해제하는 과정이 존재하지 않음. 서로 다른 경로로 독립적으로 처리함에도 패킷에 순서를 부여하여 재조립을 하거나 흐름 제어 또는 혼잡 제어와 같은 기능도 처리하지 않기에 TCP보다 속도가 빠르며 네트워크 부하가 적다는 장점이 있지만 신뢰성있는 데이터의 전송을 보장하지는 못함. 그렇기 때문에 신뢰성보다는 연속성이 중요한 서비스 예를 들면 실시간 서비스(streaming)에 자주 사용됨.

UDP 특징

  • 비연결형 서비스로 데이터그램 방식을 제공함
  • 정보를 주고 받을 때 정보를 보내거나 받는다는 신호절차를 거치지 않음.
  • UDP헤더의 CheckSum 필드를 통해 최소한의 오류만 검출.
  • 신뢰성이 낮음
  • TCP보다 속도가 빠름

UDP 서버의 특징

  • UDP에는 연결 자체가 없어서(connect 함수 불필요) 서버 소켓과 클라이언트 소켓의 구분이 없음.
  • 소켓 대신 IP를 기반으로 데이터를 전송.
  • 서버와 클라이언트는 1대1, 1대N, N대M 등으로 연결될 수 있음.
  • 데이터그램(메세지) 단위로 전송되며 그 크기는 65535바이트로, 크기가 초과하면 잘라서 보냄.
  • 흐름제어(flow control)가 없어서 패킷이 제대로 전송되었는지, 오류가 없는지 확인할 수 없음.
  • 파일 전송과 같은 신뢰성이 필요한 서비스보다 성능이 중요시 되는 경우에 사용됨.

💡패킷(packet)이란?
인터넷 내에서 데이터를 보내기 위한 경로배정(라우팅)을 효율적으로 하기 위해서 데이터를 여러 개의 조각들로 나누어 전송을 하는데 이때, 이 조각을 패킷이라 함.

참고 사이트


📘13. 웹 서버와 WAS의 차이는?

정적 웹과 동적 웹

  • 정적 웹 : 안의 내용이 바뀔 일이 없는 웹 페이지를 고정된 HTML, CSS, 자바스크립트로 제공
  • 동적 웹 : 데이터베이스에 있는 데이터나 변수들에 따라 내용이 바뀌는 웹 페이지.

웹서버의 역할
1. 서버의 특정 디렉토리에 파일들(HTML, CSS, 자바스크립트, 이미지, 기타 여러 데이터들)을 저장해두고, 이 폴더를 외부에서 접근 가능하도록 개방해서 서버에 지정된 웹사이트 주소로 접속하면 이것들을 받아갈 수 있도록 정적 웹을 제공하는 것이 웹서버의 기본적인 역할 중 하나.
2. 가벼운 동적 웹 제공도 가능
3. 보안기능

대표적인 웹서버

  • 아파치
  • NginX
  • IIS(윈소두 서버에서 쓰이는 거라 생소)

WAS의 역할

  • WAS(Web Application Server). 와스라고 하기도 함.
  • 동적사이트를 전문적으로 처리해줌.
    (WAS는 언어 진영마다 정의가 조금씩 다름)

대표적인 WAS
  자바 바이트코드로 컴파일되는 언어들에 쓰이는 걸로 아래 세 개가 있음

  • 톰캣
  • Jetty
  • Undertow 등이 있음

톰캣이란?

  • 자바에서 쓰이는 WAS 중 하나로, 동적사이트를 전문적으로 처리해 줌.
  • 스프링 부트에 톰캣이 내장.
  • 톰캣 사용방법 : 요즘에는 반대로 스프링을 톰캣이 들어있는 jar 파일로 빌드해서 배포함.
  • 톰캣 여러개 두는 이유 : 지속성을 위해. 스프링으로 만든 웹 등의 서비스에 새 기능을 추가해서 동적 부분까지 업데이트 해줘야 하는 경우에는 돌던 서비스를 종료하고 다시 실행을 해줘야 함.
    이때 짧은 찰나지만 그동안에 사용자가 해당 서비스에 접근하면 다시 켜지고 있는 중이라 오류가 뜨게 됨. 톰캣이나 이런 걸 여럿을 두고 서비스를 돌리게 되면
    이것들을 순서대로 차례차례 업데이트를 해서 하나가 재부팅되는 동안에는 웹 서버가 다른 톰캣들로 요청들을 분산해줘서 사용자의 입장에서 서비스를 끊김없이 이용할 수 있도록 함.

웹 서버를(아파치, NginX) 앞단에 두고 WAS를 뒷단에 두는 이유
1.  어떤 웹 프레임워크이든 앞단에 웹서버를 두는 게 보안 측면에서 이유가 큼
     reverse proxy 기능 : 서버 내부적으로 파일들이 어느 폴더에 위치해있는지,
     서비스가 몇 번 포트로 돌고 있는 지 등 서버의 정보를 감춰줌
2.  웹서버의 reverse proxy의 기능 중 하나인 로드 밸런싱
     로드밸런싱이란? 톰캣 등의 인스턴스를 여럿 돌려서 작업을 분산하는 것이 성능
     측면에서 나은데, 다수의 인스턴스로 서비스를 돌릴 때 이를 웹서버로 밸런싱 하는 것.
3.  reverse proxy의 캐싱.
     웹서버가 reverse proxy로써 제공하는 이 캐시는 서버 단에서의 캐시.
     서버로 찾아오는 유저들이 자주, 반복적으로 찾을 만한 리소스들을 캐싱하는 것.
     → 사용자 입장에서 빨라짐.
4.  웹서버가 수많은 모듈들을 사용해서 뒷단 WAS들이 정상 동작하는지 주기적으로 헬스
     체크를 하는 등 서비스를 안정적이고 안전하게 돌리기 위한 다양한 기능들을 제공함

💡 forward proxy란?
  서버에 방문하는 사람들의 주소를 감추는 것

💡 forward proxy의 캐싱이란?
  forward proxy의 캐싱 기능은 사용자 관점에서 한번 받아온 이미지 등 정적 파일을
  사용자와 서버 사이에 있는 프록시 서버에서 캐싱하여, 다음 요청 때 서버까지 가지
  않고 받아오는 것.

아파치와 NginX의 작동방식의 차이
  아파치와 NginX은 작동방식에 있어 근본적인 차이가 있음.

  • 아파치는 MPM, 즉 멀티 프로세스 모듈 방식으로 처리. 컨텍스트 스위칭 방식이기 때문에 컴퓨터 자원을 많이 소모.
    mpm_prefork. 즉, 유저마다 프로세스를 두는 방식.
  • NginX의 event driven 방식으로 처리를 하기 때문에 컴퓨터에 부담이 덜함.
    mpm_worker. 즉, 한 프로세스에서 유저마다 스레드를 생성
    (아파치도 보완을 위해 이벤트 방식을 추가함)

  -  성능과 가벼움을 중요시하는 서비스 → NginX
  -  다양하고 검증된 기능들을 필요로 하는 서비스 → 오랜 기간 안정성을 갖춰온 아파치

추가 질문
1. EC2의 디렉토리 용량이 차게 된다면?
   -  ec2의 EBS(디스크) 증설
   -  s3에 올려두는 방법

💡EC2의 EBS (Elastic Block Storage)란?
  EC2 인스턴스가 연산에 관한 (CPU,메모리 등) 처리를 한다고 하면, 데이터를 저장하는
  역할(SSD, HDD)은 EBS가 한다고 보면 됨.
  즉, EBS는 클라우드에서 사용하는 가상 하드디스크(HDD)라고 말할 수 있음.
  EBS는 AWS 클라우드의 EC2 인스턴스에 사용할 영구 블록 스토리지 볼륨을 제공.
  단 몇분 내에 사용량을 많게 또는 적게 변경할 수 있으며, 프로비저닝(빌리는 행위)한
  부분에 대해서만 저렴한 비용을 지불 할 수 있음.

참고 사이트


📘14. Stack과 Queue 그리고 Array와 Linked List 자료구조에 대해 말씀해주시고 차이점에 대해 설명해주세요.

스택과 큐

  • 스택은 Last In First Out (LIFO)의 구조로, 마지막에 저장한 데이터를 가장 먼저 꺼내는 구조.
    ArrayList와 같은 배열기반의 컬렉션 클래스가 적합
  • 는 First In First Out (FIFO)의 구조로, 처음에 저장한 데이터를 가장 먼저 꺼내는 구조.
    데이터의 추가/삭제가 쉬운 LinkedList로 구현하는것이 적합

ArrayList vs LinkedList의 비교

  • ArrayList : 배열 기반(연속) → 배열을 다시 만들경우 성능 떨어지므로, 이를
                    고려해서 배열을 크게 만들다보면 비효율적으로 메모리를 사용하게 됨
  • LinkedList : 연결 기반(불연속) → 노드를 순회해서 데이터를 찾기 때문에,
                    데이터가 많을수록 접근성이 떨어짐
  1. 순차적으로(끝에서부터) 데이터를 추가/삭제 → ArrayList가 빠름
  2. 비순차적으로(중간에) 데이터를 추가/삭제 → LinkedList가 빠름
  3. 접근시간(access time) → 인덱스가 있는 ArrayList가 빠름
    (인덱스가 n인 데이터의 주소 = 배열의 주소 + n*데이터 타입의 크기)

  → 다루고자 하는 데이터의 개수가 변하지 않는 경우라면, ArrayList가 최상의 선택
  → 데이터 개수의 변경이 잦다면 LinkedList를 사용하는 것이 더 나은 선택이 될 것

Stack과 Queue의 활용

추가질문
1. ArrayList에서 하는 복사는? 얕은 복사(shallow copy, 객체의 주소값을 복사)
   이유는 원본에 영향을 끼쳐도 상관없고, 메모리를 절약할 수 있고 빠르기 때문이라고 생각.
2. Queue의 문제점은?
   HTTP 통신시 요청 처리 한정적. 스프링 부트가 요청들을 처리하지 못하고 쌓아놓는다면,
   리퀘스트가 버려지는 상황 발생 → 서버다운도 가능 (TCP 연결에서 요청에 ACK 안오면
   계속 요청보냄)
3. Queue의 다른 형태는?
  -  Circular Queue(원형 큐)란?
     선형 큐(Queue)는, 이미 사용한 영역인 front의 앞부분에 대해서 다시 활용을
     못하기 때문에 메모리를 낭비한다는 단점이 있음.
     큐가 다 찼을 경우 데이터들을 앞쪽으로 이동시켜 사용하는 방법이 있지만 남아있는
     모든 데이터를 다 이동시켜야 한다는 불편한 작업을 수행해야 하기 때문에 효율적이지
     않음. 이런 문제를 해결하고자 나온 큐가 바로 원형 큐.
     - 장점 : 선형 큐와 비교하였을 때, 메모리 낭비가 발생하지 않음.
     - 단점 : 똑같은 배열이기에 크기가 정해져있음.
  - Priority Queue(우선순위 큐)
     우선순위 큐는 들어간 순서에 상관없이 데이터의 우선순위에 따라서 우선순위가 높은
     데이터부터 꺼내도록 만들어진 큐.
     이진 트리의 일종인 힙으로 구현.
4. stack은 vector을 상속받는다고 함. vector의 동기화 이슈 때문에 stack은 사용하지 않도록 권고되는 추세라고 들음

참고 사이트


📘15.절차지향 / 객체지향 / 함수형 프로그래밍이란 무엇이고 차이점은 무엇인가? (1번 질문과 겹치는 내용)

절차지향 프로그래밍 (Procedural Programming)

  • 진행되는 순서대로 프로그래밍을 하는 방법
  • 장점
    -  코드의 가독성이 좋음.
    -  컴퓨터의 처리구조와 비슷해 실행 속도가 빠름.
  • 단점
    -  각각의 코드가 순서에 따라 연결 되어있어, 유지보수 및 분석이 어려움.

객체지향 프로그래밍 (OOP, Object Oriented Programming)

  • 절차 지향적 프로그래밍에서 벗어나 여러 개의 독립된 객체들의 상호작용으로 프로그램을 구성하는 방법. 객체들은 메세지를 주고받으며 데이터를 처리.
  • 절차형 프로그래밍이 갖고 있는 부족함을 객체지향 프로그래밍이 보완해주는 역할.
  • OOP의 특성 (1번 내용 참고하기!!)
      1. 캡슐화
      2. 상속화
      3. 추상화
      4.  다형성
      → 상속과 다형성으로 인해 코드의 재사용성, 유지보수, 중복된 코드의 제거 측면에서 좋음
  • OOP의 원칙 : SOLID 원칙 (1번 내용 참고하기!!)
      1. SRP(Single Responsibility Principle) - 단일 책임 원칙
      2. OCP(Open-Closed Principle) - 개방 폐쇄 원칙
      3. LSP(Liskov Substitution Principle) - 리스코프 치환 원칙
      4. ISP(Interface Segregation Principle) - 인터페이스 분리 원칙
      5. DIP(Dependency Inversion Principle) - 의존성 역전 원칙
  • 장점
    -  재사용성이 높음
    -  유지보수에 용이 (캡슐화를 통해 주변 영향이 적기 때문에)
    -  대형 프로젝트에 적합 (클래스 단위로 모듈화시켜 개발할 수 있으므로 여러 사람이
       개발에 참여하는 대형 프로젝트에 적합함)
  • 단점
    -  설계에 많은 시간이 소요됨

함수형 프로그래밍

  • '순수 함수'를 사용한 프로그래밍.
    실행 순서를 지정할 필요가 없기 때문에 비절차형 언어라고도 함.
  • 프로세서의 발전 속도가 사용자의 필요에 뒤쳐지면서 멀티코어를 이용한 멀티 프로세싱이 중요해진 오늘날 함수형 프로그래밍은 주목받고 있음
    (함수형 방식으로 짜인 함수 즉, 순수 함수들은 인풋만 똑같으면 절대 다른 요인에 의한 변수가 없기 때문)
  • 함수형 언어에는 스칼라(Scala), 하스켈(Haskell), 클로저(Clojure) 등이 있음
    (스칼라가 대표적)
  • 장점
    -  함수의 동작부가 간결해지기 때문에, 객체지향 프로그래밍에 비해 코드 이해도와
       가독성이 좋아짐.
    -  테스트가 쉬움.
  • 단점
    -  외부 데이터 혹은 내부 데이터의 상태를 조작할 수 없음.

💡 순수 함수란?
  동일한 입력값을 넣었을 때 항상 동일한 리턴값을 반환하며 외부에 영향을 받지 않는
  함수. 외부에 영향을 받지않고, 함수의 실행이 프로그램에 영향을 주지 않음.
  비상태 불변성 유지.(전달된 데이터를 변경하는 것이 아니라 새로운 버전, 새로운
  오브젝트를 만들어서 결과값으로 전달해야함!)
→ 여러가지 동시다발적인 멀티쓰레딩 환경에서도 안정적으로 동작할 수 있음!

💡 펌웨어(firmware)란?
  하드웨어화된 소프트웨어. 변경할 필요가 없는 소프트웨어를 롬(ROM) 등에 기입하여
  사용하는 것으로, 처리의 고속화와 회로의 단순화를 위함.

추가 질문
1. 자바에서 함수형 프로그래밍 사용?
   람다와 스트림을 사용하면 요새 유행하는 함수형 프로그래밍 스타일로 자바 코드를
   작성할 수 있음
2. 공간복잡도가 중요한 곳은?
   임베디드, 펌웨어 등 하드웨어 환경이 매우 한정되어 있는 경우, 메모리도 한정적이므로
   공간복잡도가 상당히 중요해짐.

참고 사이트


📘16. 알고리즘에서 ‘시간복잡도‘와 ‘공간복잡도’란 무엇인가? 그리고 이것들은 왜 중요한가?

-  시간복잡도와 공간복잡도는 알고리즘의 성능을 판단하는 척도.
-  처리해야하는 데이터의 양이 적은 경우에는 차이가 미미하나,
    데이터의 양이 많아지면 알고리즘 간의 효율성 차이가 커지기 때문에 중요.

  • 시간 복잡도(Time Complexity)
    시간 복잡도는 알고리즘의 절대적인 실행 시간을 나타내는 것이 아닌 알고리즘을 수행하는 데 연산들이 몇 번 이루어지는 지를 숫자로 표기한 것.
  • 공간 복잡도(Space Complexity)
    프로그램을 실행시킨 후 완료하는 데 필요로 하는 자원 공간의 양

  → 시간 복잡도와 공간 복잡도는 보통 반비례. 요새는 하드웨어의 발전으로 연산속도가
      빨라져 시간 복잡도를 좀 더 중요시하는 경향.
  → 복잡도를 표현하는 방법으로는 세 가지가 있는데, 최악의 경우를 고려한 Big-O 표기법을
      가장 많이 사용.

Big-O 표기법이란?

  • 가장 높은 차수항에서 계수를 무시하여 표기하는 방식.

Big-O 표기법을 많이 사용하는 이유

  • 평균을 나타내는 세타 표기법이 가장 이상적이고 정확하지만, 도출하기가 상대적으로 어려워서 알고리즘의 최악의 경우를 판단하면 평균과 가까운 성능으로 예측이 가능하기 때문에 Big-O 표기법을 많이 사용.

점근 표기법의 세가지 방법

  • 최상 : 오메가 표기법 (Big-Ω Notation)
  • 평균 : 세타 표기법 (Big-θ Notation)
  • 최악 : 빅오 표기법 (Big-O Notation)

참고 사이트


📘17. 오버로딩과 오버라이딩의 차이점은 무엇인가요?

override, overload 둘 다 자바의 다형성을 구현하기 위함

  • override란?
    -부모클래스의 메서드를 자신에 맞게 재정의(덮어씀)하는 것을 말함.
    -선언부는 못 바꾸고, 내용(구현부)만 변경 가능
    -추상클래스를 상속 받을 때 추상메서드를 오버라이딩해서 구현
  • overload란?
    - 자바는 다양한 방법으로 객체를 생성할 수 있도록 생성자 오버로딩을 제공함.
      생성자 오버로딩이란 매개변수를 달리하는 생성자를 여러개 선언하는 것을 말함.
    - 외부에서 제공되는 다양한 데이터들을 이용하여 객체를 초기화하려면 생성자도
       다양화될 필요가 있음.
    - 생성자가 오버로딩 되어있을 경우, new 연산자로 생성자를 호출할 때 제공되는
       매개값의 타입과 수에 의해 호출될 생성자가 결정됨.

참고

  • 자바의 정석 유튜브 & 책
  • 혼자 공부하는 자바 책

📘18.RDB와 NoSQL은 무엇인가요? 차이점 또는 장단점 위주로 설명해주세요.

RDB(Relation Database)란?

  • 관계형 모델을 기반으로 하는 데이터 베이스

RDB특징

  • 상호 관련성을 가진 테이블 집합으로 구성
  • 테이블 사이의 관계는 외래키로 표현
  • 테이블은 행과 열로 구성
  • 스키마 변경이 어려움(여러 부작용이 있을 수 있기 때문)
  • scale up은 가능하나, scale out은 어려움
  • ACID 성질을 가짐.

💡 ACID란?
-  ACID는 데이터베이스 내에서 일어나는 하나의 트랜잭션(transaction)의 안전성을
   보장하기 위해 필요한 성질
-  ACID는 주식거래, 금융업에서 중점적으로 사용됨. => 주식거래, 금융업에서는 관계형
    데이터베이스를 이용.
-  관계형 데이터베이스를 사용하면 데이터베이스와 상호 작용하는 방식을 정확하게
    규정할 수 있기 때문에, 데이터베이스에서 데이터를 처리할 때 발생할 수 있는
    예외적인 상황을 줄이고, 데이터베이스의 무결성을 보호할 수 있음.

  • Atomicity(원자성)
    한 트랜잭션의 연산들이 모두 성공하거나, 반대로 전부 실패되는 성질
  • Consistency(일관성)
    일관성은 데이터베이스의 상태가 일관되어야 한다는 성질.
  • Isolation(격리성, 고립성)
    모든 트랜잭션은 다른 트랜잭션으로부터 독립되어야 함.
  • Durability(지속성)
    하나의 트랜잭션이 성공적으로 수행되었다면, 해당 트랜잭션에 대한 로그가 남아야하는 성질을 말함.
    만약 런타임 오류나 시스템 오류가 발생하더라도, 해당 기록은 영구적이어야 함.

💡 scale up 과 scale out
  데이터가 많아져 성능이 떨어지는 상황에서 scale up은 서버의 하드웨어 성능을
  높여 문제를 해결하는것. 비용 많이 듬.
  scale out은 서버의 개수는 늘려서 해결하는 것, scale up이 비해 비용이 적게 듬

RDBMS(Relational DataBase Management System)란?

  • RDB를 관리하는 소프트웨어 ex) MySQL

SQL(Structured Query Language)이란?

  • RDBMS에서 RDB를 관리하거나 필요한 데이터를 조회할 때 사용하는 언어

NoSQL(Not only SQL)이란?

  • 관계형 모델이 아닌 데이터 모델을 통칭.

NoSQL(Not only SQL) 특징

  • 다양한 방식으로 데이터를 표현
  • 테이블 사이에 특별히 명시된 제약이나 규칙이 없음
  • 스키마가 고정적이지 않고, 매우 유연
  • scale out 용이
  • 연산이 빠르고 빅데이터 & 실시간 연산에 적합 (조인 안해도 되기 때문에 조금 더 빠름)
  • 다양한 데이터 모델이 존재
    ex)
    -  Document model : 레코드 하나를 다큐먼트 형식으로 표현. 자유로운 스키마 구조 가짐.
                                         ex) Mongo DB
    -  Key - value model : 하나의 키에 값을 맵핑하는 해시 구조의 데이터 모델. 그렇기에
                                          빠르게 데이터에 접근 가능. 데이터를 저장하기 전에 데이터를
                                          어떻게 가져올 지 생각해야 함.
                                          ex) Cassandra, Redis
    -  Graph model : 데이터를 정점과 간선으로 표현. 데이터 사이의 유기적인 관게를 표현
                                  하기에 적함.
                                  ex) Neoj
    -  etc..

RDB과 NoSQL의 차이

  • RDB는 관계형으로 데이터 저장, NoSQL은 그렇지 않음.
  • RDB 스키마는 정적이지만, NoSQL은 유연한 스키마 구조를 가짐.
  • RDB는 Scale-Up에 유리하고, NoSQL은 Scale-Out에 유리
  • RDB는 복잡한 쿼리와 Join연산이 가능. NoSQL은 구조화된 쿼리 언어가 없는 경우도 많고, 일반적으로 Join이 없음.
  • RDB는 트랙잭션 처리에 용이하고, NoSQL은 그러한 것도 있고 아닌 것도 있음. NoSQL은 대신 분석 처리에 용이.

  → 처음 시작 단계의 프로젝트에서는 RDB 권장.
      데이터 간의 관계가 복잡해지고 데이터 양이 많아지는 경우 생기는 문제를 해결하기
      위해서 나온 것이 NoSQL이기 때문에, 소프트웨어 커지면서 RDB로 해결할 수 없는
      문제들 생기면 NoSQL 도입하면 됨
  → RDB 사용하다가
      - 서비스 중에 스키마 자주 변경 시 → 도큐먼트 DB 도입
      - 많은 양의 데이터를 빠르게 가져와야 할 시 → key-value DB 도입
      - 데이터 사이의 관계가 복잡해시면 → graph DB 도입을 고려하면 됨

추가 질문
1. 은행에서는 어떤 DB 사용할지?
    RDB. 데이터의 정확성을 확보하기 위해. 트랜잭션 기능이 있기 때문에 RDB는 롤백이 가능.
    NoSQL같은 경우에는 SQL을 사용하지 않는 모든 DB를 통칭하는 것이기 때문에 ACID의
    기능이 있는 것과 아닌 것이 있어 일반화하기 어려움. (Redis는 트랜잭션이 가능)

참고


📘19. 병렬 프로그래밍에 대해 설명해주세요.

병렬 프로그래밍이란?

  • 병렬 프로그래밍이란 서로 독립된 여러개의 작업을 여러개의 프로세스를 이용하여 동시에 처리하게 만드는 프로그래밍 기법.
  • 하드웨어가 발전하면서 CPU 코어 개수는 점점 늘어나고 여러 작업을 동시에 처리할 수 있는 능력이 대폭 향상됨.
  • 이를 잘 활용하기 위해서는 프로그래밍 레벨에서, 여러개의 스레드를 직접 만들어서 관리하고 동기화와 리소스관리까지 해야 함.

참고

댓글