no image
[기술면접]알고리즘 + 자료구조
알고리즘 알고리즘은 어떠한 문제를 해결하기 위한 여러 동작들의 모임을 의미한다. 버블 소트(bubble sort) 버블 소트는 서로 인접한 두 원소를 비교하여 정렬하는 알고리즘이다.(시간 복잡도 O(n^2)) 힙 소트(heap sort) 힙 소트는 주어진 데이터를 힙 자료구조로 만들어 최댓값 또는 최솟값부터 하나씩 꺼내서 정렬하는 알고리즘이다.(시간 복잡도 O(nlog2 n)) 머지 소트(merge sort) 머지 소트는 주어진 배열을 크기가 1인 배열로 분할하고 합병하면서 정렬을 진행하는 분할/정복 알고리즘이다. 퀵 소트(Quick sort) 퀵 소트는 매우 빠른 정렬 속도를 가진 분할 정복 알고리즘 중 하나로 합병 정렬과 달리 리스트를 비 균등하게 분할한다. 피봇을 설정하고 피봇보다 큰 값과 작은 값..
2022.01.23
Dev
no image
[기술면접] SpringFramework
Spring Framework란 스프링 프레임워크는 자바를 위한 오픈소스 애플리케이션 프레임워크로서 자바 기반 엔터 프라이즈 개발을 위해 다양한 서비스를 제공 Spring MVC Spring MVC는 웹 애플리케이션 개발을 위한 MVC패턴 기반의 웹 프레임워크이다. Spring MVC는 애플리케이션 구성요소를 Model, View, Controller로 분리한다. 또한 Spring MVC는 아래와 같은 컴포넌트들로 구성된다. Dispatcher Servlet : 클라이언트의 요청을 먼저 받아들이는 서블릿으로 요청에 맞는 컨트롤러에게 요청을 전달함 Handler Mapping : 해당 요청이 어떤 컨트롤러에게 온 요청인지 검사함 Controller : 클라이언트의 요청을 받아 처리하여 결과를 디스패처 서블..
2022.01.23
Dev
no image
[기술면접]운영체제(Operating System)
코어 (Core) CPU의 기본 계산 단위입니다. 메모리 메모리는 컴퓨터에서 작업을 수행하기 위해 처리 대상이나 결과 등을 저장하기 위한 공간이다. 프로그램을 실행하기 위한 정보들은 메모리에 저장되어 처리된다. 프로세스 (Process) 프로세스란 프로세스란 실행 중인 프로그램을 의미하고 보조저장장치로부터 메모리에 적재되어 CPU의 할당을 받을 수 있는 단위를 말한다. 프로세스의 메모리 구조 프로세스는 기본적으로 실행 코드가 저장되는 text 영역, 전역 변수 등을 수록하는 data 영역, 프로세스 실행 중에 동적으로 할당되는메모리인 heap 영역, 함수의 매개변수, 복귀 주소와 로컬 변수와 같은 임시 자료를 갖는 stack 영역으로 이루어져 있습니다. 운영체제에 프로세스 저장 방식 프로세스는 PCB라는..
2022.01.21
Dev
no image
[기술면접]데이터베이스(Database)
데이터베이스 데이터베이스란 여러 사람이 공유하여 사용할 목적으로 통합되어 관리되는 데이터의 집합을 의미한다. 이러한 데이터베이스를 관리하는 시스템을 DBMS라고 한다. 데이터베이스 특징 독립성 (Independence) : 데이터베이스는 데이터를 사용하는 응용 프로그램과 독립적으로 데이터를 저장 및 관리한다. 무결성(Integrity) : 데이터베이스는 다양한 제약조건 및 기능을 통해 데이터의 무결성을 유지해준다. 보안성(Security) : 데이터베이스는 계정 및 권한 관리를 통해 데이터들의 보안을 유지해준다. 일관성(Consistency) : 데이터베이스는 다양한 제약조건을 통해 데이터를 일관되게 유지해준다. 중복 최소화(Minimum Duplicate) : 데이터베이스는 데이터를 통합해서 관리함으로..
2022.01.12
Dev
no image
[기술면접]네트워크(Network)
쿠키(cookie)와 세션(session) Http는 클라이언트가 요청을 한 후 응답을 받으면 그 연결을 끊어 버리는 특징인 Connectionless와 통신이 끝나면 상태를 유지하지 않는 statless를 해결하기 위해서 쿠키와 세션이 나왔다. 쿠키 쿠키는 클라이언트의 로컬에 저장되는 key-value가 들어 있는 작은 데이터 파일이다. 쿠키에는 유효시간을 지정할 수 있고, 쿠키의 유효시간이 남을 경우 브라우저가 종료되어도 스토리지에 남아있다. 쿠키 동작 방식 클라이언트가 페이지를 요청한다. 서버에서 쿠키를 생성한다. HTTP 헤더에 쿠키를 포함시켜 응답한다. 브라우저에서 쿠키를 저장 쿠키가 존재하면 요청을 할 경우 HTTP 헤더에 쿠키를 함께 보내서 요청한다. ex) 팝업, 장바구니, 자동 로그인 세..
2022.01.11
Dev
no image
[Database]트랜잭션 격리 수준(TransactionIsolationLevel)
트랜잭션 격리 수준(TransactionIsolationLevel) 👉 정의 트랜잭션 격리 수준은 동시에 여러 트랜잭션이 처리될 때, 트랜잭션끼리 얼마나 서로 고립되어 있는지 나타내는 것 트랜잭션 격리 수준은 크게 4가지로 나뉜다. READ UNCOMMITED READ COMMITED REPEATABLE READ SERIALIZBLE 아래로 내려갈수록 트랜잭션 간 고립 정도가 높아지며, 성능이 떨어지는 것이 일반적이다. 데이터베이스는 ACID특징과 같이 트랜잭션이 독립적인 수행을 하도록 Locking을 통해, 트랜잭션이 DB를 다루는 동안 다른 트랜잭션이 관여하지 못하도록 막는 것이 필요하다. 하지만 무조건 Locking으로 동시에 수행되는 수많은 트랜잭션들을 순서대로 처리하는 방식으로 구현하게 되면 데..
2022.01.09
Dev
no image
[Spring] Maven과 Gradle
Spring 프로젝트를 시작할 때 빌드 도구를 Maven과 Gradle 중 하나를 선택해서 진행해야 한다. 예전에 스프링을 처음 배울 때는 Maven을 사용하는 사람들이 꽤 많았다. 그러나 요즘은 대부분이 Gradle을 사용한다. 이 두 종류의 빌드도구를 알아보기 전에 빌드 도구에 대해서 먼저 알아보자. 🛠빌드도구 프로젝트에서 작성한 자바 코드와 프로젝트 내에 필요한 각종 설정 파일들을 JVM이나 WAS가 인식할 수 있도록 패키징 해주는 과정을 빌드 도구라고 한다. 예를 들면 어떤 라이브러리를 사용할 때, 만약 빌드 도구가 없다면 번거롭게 개발자가 모두 다운받아서 사용하여야 한다. 그러나 빌드도구가 있으면 설정 파일에 필요한 라이브러리 종류와 버전들, 종속성 정보를 명시하며 필요한 라이브러리들을 설정 파..
2022.01.06
no image
[Web] REST API 와 HTTP API
공부를 하던 중에 원래는 거의 동일하다고 알고만 있던 REST와 HTTP API가 다르다는 걸 봐서 한번 정리 해볼까 한다. 우선 두개의 API의 개념을 확립하기 위해서는 API에 대해 먼저 알아보자 📡API API는 Application Programming Interface의 약자로 컴퓨터 혹은 컴퓨터 프로그램끼리의 연결, 즉 컴퓨터 혹은 컴퓨터 프로그램끼리 소통을 의미한다.이러한 소통을 어떻게 할 지 문서로 정리하거나 공통의 기준을 정한 것을 API 명세라고 한다. 한 컴퓨터/프로그램이 소통하는 방식이 상대방 컴퓨터/프로그램과 다를 수 있기 때문에, 서로가 공통적으로 이해할 수 있는 기준을 명시한 것이다. REST API와 HTTP API는 웹에서의 소통에 사용되기 때문에 WEB API에 해당한다...
2022.01.04
728x90

알고리즘

알고리즘은 어떠한 문제를 해결하기 위한 여러 동작들의 모임을 의미한다.

 

버블 소트(bubble sort)

  • 버블 소트는 서로 인접한 두 원소를 비교하여 정렬하는 알고리즘이다.(시간 복잡도 O(n^2))

 

힙 소트(heap sort)

  • 힙 소트는 주어진 데이터를 힙 자료구조로 만들어 최댓값 또는 최솟값부터 하나씩 꺼내서 정렬하는 알고리즘이다.(시간 복잡도 O(nlog2 n))

 

머지 소트(merge sort)

  • 머지 소트는 주어진 배열을 크기가 1인 배열로 분할하고 합병하면서 정렬을 진행하는 분할/정복 알고리즘이다.

 

퀵 소트(Quick sort)

  • 퀵 소트는 매우 빠른 정렬 속도를 가진 분할 정복 알고리즘 중 하나로 합병 정렬과 달리 리스트를 비 균등하게 분할한다.
  • 피봇을 설정하고 피봇보다 큰 값과 작은 값으로 분할하여 정렬을 한다.

 

삽입 소트(insertion sort)

  • 삽입 정렬은 두 번째 값부터 시작하여 그 앞에 존재하는 원소들과 비교하여 삽입할 위치를 찾아 삽입하는 정렬 알고리즘이다.
  • 삽입 정렬의 평균 시간 복잡도는 O(n^2)이고, 가장 빠른 경우 O(n)까지 높아질 수 있다.

 

동적 프로그래밍(Dynamic Programming)

동적 프로그래밍은 주어진 문제를 풀기 위해서, 문제를 여러 개의 하위 문제로 나누어 푼 다음, 그것을 결합하여 해결하는 방식이다. 동적 프로그래밍에서는 어떤 부분 문제가 다른 문제를 해결하는 데 사용될 수 있어, 답을 여러 번 계산하는 대신 한 번만 계산하고 그 결과를 재활용하는 메모제이션 기법으로 속도를 향상할 수 있다.

 

동적 프로그래밍의 두 가지 조건

  • Overlapping Subproblem(중복되는 부분 문제) : 주어진 문제는 같은 부분 문제가 여러 번 재사용된다.
  • Optimal Substructure(최적 부분 구조): 새로운 부분 문제의 정답을 다른 부분 문제의 정답으로부터 구할 수 있다.

 

재귀 알고리즘

재귀 알고리즘은 함수 내부에서 함수가 자기 자신을 또다시 호출하여 문제를 해결하는 알고리즘이다. 재귀 알고리즘은 자기가 계속해서 자신을 호출하므로 반복을 중단할 조건이 필요하다.

 

private static int recursiveFactorial(int num) { 
	if(num > 1) { 
    	return recursiveFactorial(num - 1) * num; 
      }
     return 1; 
 } 
     
private static int loopFactorial(int num) { 
     	int answer = 1; 
        for (int i = 2; i <= num; i++) {
        	answer *= i; 
        } 
       return answer;
 }

자료구조 

자료구조는 데이터를 원하는 규칙 또는 목적에 맞게 저장하기 위한 구조이다.

 

  1. Stack
    • 세로로 된 바구니와 같은 구조로 먼저 넣은 값이 마지막으로 나오는 FILO(First In Last Out) 구조이다.
  2. Queue
    • 가로로 된 통과 같은 구조로 먼저 넣은 값이 가장 먼저 나오는 FIFO(First In First Out) 구조이다.
  3. Heap
    • 최댓값 또는 최솟값을 찾아내는 연산을 쉽게 하기 위해 고안된 구조로, 각 노드의 키 값이 자식의 키 값보다 작지 않거나 그 자식의 키 값보다 크지 않은 완전 이진트리이다.
  4. Tree
    • 정점과 간선을 이용해 사이클을 이루지 않도록 구성한 그래프의 특수한 형태로, 계층이 있는 데이터를 표현하기에 적합하다.

우선순위 큐와 내부 구조 및 시간 복잡도

  • 우선순위 큐는 가장 우선순위가 높은 데이터를 먼저 꺼내기 위해 고안된 자료구조이다. 우선순위 큐를 구현하기 위해서는 일반적으로 힙을 사용한다.
  • 힙은 완전 이진트리를 통해서 구현되었기 때문에 우선순위 큐의 시간 복잡도는 O(logn)이다.

해시 테이블과 해시 테이블의 시간 복잡도

  • 해시 테이블은 key-value 형태로 데이터를 저장하는 자료구조 중 하나로 빠른 데이터 검색이 필요할 때 유용하다.
  • 해시 테이블은 Key값에 해시 함수를 적용해 고유한 index를 생성하여 그 index에 저장된 값을 꺼내오는 구조이다.
  • 해시 테이블은 고유한 인덱스 값을 조회하기 때문에 평균적으로 O(1)의 시간 복잡도를 갖는다. 다만, 충돌이 발생한 경우 충돌된 인덱스 값에 대해 연결된 데이터를 조회하여 원하는 값을 조회하기 때문에 O(N)까지 증가할 수 있다.

LinkedList와 ArrayList

ArrayList는 데이터들이 순서대로 늘어선 배열의 형식을 취하고 있지만, LinkedList는 자료의 주소 값으로 서로 연결된 형식을 가지고 있다.

  • ArrayList
    • 원하는 데이터에 무작위로 접근할 수 있다.
    • 리스트의 크기가 제한되어 있으며, 리스트의 크기를 재조정하는 것은 많은 연산이 필요하다.
    • 데이터 추가/삭제를 위해서는 임시 배열을 생성하고 복제하고 있어 시간이 오래 걸린다.
  • LinkedList
    • 리스트의 크기에 영향 없이 데이터를 추가할 수 있다.
    • 데이터를 추가하기 위해 새로운 노드를 생성하여 연결하므로 추가/삭제 연산이 빠르다.
    • 무작위 접근이 불가능하고 , 순차 접근만 가능하다.

 


Reference

https://mangkyu.tistory.com/90

728x90

'Dev' 카테고리의 다른 글

빅데이터 처리  (0) 2022.02.11
[기술면접] JAVA  (0) 2022.01.24
[기술면접] SpringFramework  (0) 2022.01.23
[기술면접]운영체제(Operating System)  (0) 2022.01.21
[기술면접]데이터베이스(Database)  (0) 2022.01.12

[기술면접] SpringFramework

ryudjae
|2022. 1. 23. 02:23
728x90

Spring Framework란 

스프링 프레임워크는 자바를 위한 오픈소스 애플리케이션 프레임워크로서 자바 기반 엔터 프라이즈 개발을 위해 다양한 서비스를 제공

 

Spring MVC

Spring MVC는 웹 애플리케이션 개발을 위한 MVC패턴 기반의 웹 프레임워크이다. Spring MVC는 애플리케이션 구성요소를 Model, View, Controller로 분리한다. 또한 Spring MVC는 아래와 같은 컴포넌트들로 구성된다.

  • Dispatcher Servlet :  클라이언트의 요청을 먼저 받아들이는 서블릿으로 요청에 맞는 컨트롤러에게 요청을 전달함
  • Handler Mapping : 해당 요청이 어떤 컨트롤러에게 온 요청인지 검사함
  • Controller : 클라이언트의 요청을 받아 처리하여 결과를 디스패처 서블릿에게 전달함
  • View Resolver : View의 이름을 통해 알맞은 View를 찾음
  • View : 사용자에게 보여질 UI화면 

Spring MVC 작동원리

https://mangkyu.tistory.com/18

  1. 클라이언트는 URL을 통해 요청을 전송한다.
  2. 디스패처 서블릿은 핸들러 매핑을 통해 해당 요청이 어느 컨트롤러에게 온 요청인지 찾는다.
  3. 디스패처 서블릿은 핸들러 어댑터에게 요청을 전달한다.
  4. 핸들러 어댑터는 해당 컨트롤러에 요청을 전달한다.
  5. 컨트롤러는 비즈니스 로직을 처리한 후에 반환할 뷰의 이름을 반환한다.
  6. 디스패처 서블릿은 뷰 리졸버를 통해 반환할 뷰를 찾는다.
  7. 디스패처 서블릿은 컨트롤러에서 뷰에 전달할 데이터를 추가한다.
  8. 데이터가 추가된 뷰를 반환한다.

Spring MVC 장단점

  • 장점
    • 의존성 주입을 통해 컴포넌트 간의 결합도를 낮출 수 있어 단위 테스트가 용이하다.
    • 제어의 역전을 통해 객체의 라이프 사이클에 관여하지 않고 개발에 집중할 수 있다.
  • 단점
    • XML을 기반으로 하는 프로젝트 설정은 너무나 많은 시간을 필요로 한다.
    • 톰캣과 같은 WAS를 별도로 설치해주어야 한다.

Servlet

서블릿이란 클라이언트의 요청을 처리하고, 그 결과를 반환하는 Servlet 클래스의 구현 규칙을 지킨 자바 웹 프로그래밍 기술이다.

Spring MVC에서 Controller로 이용되며, 사용자의 요청을 받아 처리한 후 결과를 반환한다.

 

Dispatcher Servlet

디스패처 서블릿은 톰캣과 같은 서블릿 컨테이너를 통해 들어오는 모든 요청을 제일 앞에서 받는 컨트롤러이다.

디스패처 서블릿은 공통된 작업을 처리한 후에 적절한 세부 컨트롤러로 작업을 위임해준다. 그리고 각각의 세부 콘트롤러는 처리할 부분을 처리하고 반환할 view를 Dispatcher servlet에 넘기게 된다.

 

Springboot

  • 자동 설정을 도입해서 디스패처 서블릿 등과 같은 설정시간을 줄여준다.
  • 프로젝트의 의존성을 독립적으로 선택하지 않고 spring-boot-starter로 모아두어 외부 도구들을 사용하기 편리하다.
  • 내장 톰캣을  제공하여  별도의 WAS를 필요로 하지 않음

Springboot와 Springframework

스프링 부트와 스프링 프레임워크의 가장 큰 차이는 Auto Configuration이다.

Spring MVC 프로젝트를 스프링 프레임워크 기반으로 구성하면 컴포넌트 스캔, Bean설정 , Dispatcher Servlet 설정, View Resolver, JDBC 설정 등 많은 설정을 해야 하지만 이를 SpringBoot기반으로 구성함으로써 초기 개발 환경 세팅에 걸리는 리소스를 절약할 수 있다.

스프링 부트로 프로젝트를 생성할 시 스프링 부트에서는 내장 서브릿 컨테이너인 톰캣이 자동적으로 설정된다.

 

@Bean,@Configuration,@Component

개발자가 직접 제어가 불가능한 외부 라이브러리 또는 설정을 위한 클래스를 Bean으로 등록할 때,@Bean 어노테이션을 활용한다.

1개 이상의 @Bean을 제공하는 클래스의 경우 반드시 @Configuration을 명시해주어야 한다.

개발자가 직접 개발한 클래스를 Bean으로 등록하고자 하는 경우 @Component 어노테이션을 활용한다.

 

스프링 Bean 주입 방법

@Autowired 어노테이션으로 필드에 주입받을 수도 있고, 생성자를 통해서 주입을 받을 수도 있고, Setter를 통해 주입받을 수 있다.

Bean 주입 시 같은 이름 및 같은 타입의 Bean이 존재한다면 @Primary어노테이션으로 우선순위를 설정할 수 있다.

 

스프링 컨테이너

프레임워크 안에서 인스턴스들의 생명 주기를 관리하며 , 생성된 인스턴스에 추가적인 기능을 제공한다.

내가 작업한 코드 처리 과정이 컨테이너에서 실행된다.

스프링 컨테이너는 스프링 프레임워크의 핵심적인 위치에 존재하며 DI를 통한 애플리케이션을 구성하는 컴포넌트를 관리한다.

 

스프링 컨테이너 종류

BeanFactory : DI의 기본 사항을 제공하는 컨테이너, 빈을 생성하고 분배하는 작업을 한다.

Application Context : bean factory와 유사하지만 더 많은 기능을 제공한다.  미리 빈을 생성해놓아 빈이 필요할 때 즉시 사용할 수 있도록 보장한다.

 

VO, DTO, DAO, BO

VO(Value Object) : 실제 데이터만을 저장하는 클래스

DTO(Data Transfer Object) : 데이터를 주고받기 위해 사용하는 클래스

DAO(Data Access Object) : 데이터베이스에 접근하여 실제 데이터를 조회 또는 조작하는 클래스 , Repository나 Mapper에 해당함

BO(Business Object) : 여러 DAO를 활용해 비즈니스 로직을 처리하는 클래스, Service에 해당함

 

Spring Singleton Pattern

싱글톤 패턴은 1개의 클래스당 1개의 객체만을 생성하여 사용하는 디자인 패턴이다. Spring에서는 스프링 컨테이너가 관리하는 객체인 Bean을 싱글톤 패턴으로 구현하여 제공한다.

Spring에서는 private 생성자나 static 메서드를 사용하지 않고도 해당 객체를 싱글 톤으로 관리하여 객체 지향적으로 개발을 할 수 있다.

 

자바로 싱글톤 패턴을 구현 시 단점

  • private 생성자를 가지고 있어 상속이 불가능하다.
  • 테스트하기 힘들다.
  • 서버 환경에서는 싱글톤이 1개만 생성됨을 보장하지 못한다.

이러한 문제를 스프링 컨테이너를 통해 직접 싱글톤 객체를 생성하고 관리하는데, 다음과 같은 장점이 있다.

static 메서드나 private 생성자를 사용하지 않아 객체지향적 개발을 할 수 있다.

테스트 하기 편리하다.

디자인 패턴

  1. 생성 패턴
    • 팩토리 패턴 : 객체를 생성하기 위한 디자인 패턴
    • 추상 팩토리 패턴 : 객체를 생성하는 팩토리를 생성하기 위한 디자인 패턴
    • 빌더 패턴 :상황에 따라 동적인 인자를 필요로 하는 객체를 생성하기 위한 디자인 패턴
    • 싱글톤 패턴 : 객체를 1개만 생성하여 항상 참조 가능하도록 고안된 디자인 패턴
  2. 구조 패턴
    • 어댑터 패턴 :  호환성이 맞지 않는 두 클래스를 연결하여 사용하기 위한 디자인 패턴
    • 프록시 패턴 : 어떤 객체에 접근하기 위해 프록시 객체를 사용하는 디자인 패턴
    • 퍼사드 패턴 : 어떤 복합적인 기능에 대해 간략화된 인터페이스를 제공하는 디자인 패턴
  3. 행위패턴
    • 전략 패턴 :  상황에 따라 다른 전략을 사용하기 위한 디자인 패턴
    • 옵저버 패턴 : 값을 관찰하여 빠르게 반영하기 위한 디자인 패턴
    • 커맨드 패턴 : 실행될 기능을 캡슐화하여 재사용성이 높은 클래스를 설계하기 위한 디자인 패턴

Spring filter와 Intercepter 차이

필터는 웹 컨테이너에서 관리하고 요청/응답이 조작 가능하다. 필터는 보안 관련 공통 작업을 할 때 사용하고, 모든 요청을 로깅 또는 감사한다.

인터셉터는 스프링 컨테이너에서 관리하고 요청/응답 조작이 불가능하다. 인터셉터는 인증/ 인가 등과 같은 공통 작업을 할 때 사용되고, Controller로 넘겨주는 정보의 가공을 담당한다. 또 API 호출에 대한 로깅 또는 감사를 한다.

 

Ioc Container

  • Ioc Container는 객체의 생성과 관계 설정, 사용, 제거 등의 전체 라이프 사이클을 관리해주는 작업을 하는 컨테이너이다.
  • Ioc Container의 대표적인 명세는 BeanFactory인데 요즘은 이를 상속하는 Application Context를 사용한다.
  • Application Context는 BeanFactory의 기능뿐만 아니라, 메시지 다국화, 이벤트 발행 기능, 리소스 로딩 등의 여러 기능을 제공한다.

Spring Ioc Contaainer의 Bean 등록 방법에는 XML 설정 파일을 통해 Bean 등록, @Annotation을 통해 bean 등록하는 방법이 있다.

하지만 어노테이션 기반의 빈 등록 시에는 컴포넌트 스캔을 필요로 한다. 직접 등록해줄 수 있지만 스프링 부트에서는 컴포넌트 스캔을 자동으로 해준다.

  • @Configuration : 스프링 설정으로 사용하겠다는 의미
  • @EnableAutoConfiguration : 지정해둔 설정 값들을 자동으로 설정하는 기능을 켠다는 의미
  • @ComponentScan,@Componentm@Configuration 붙은 클래스를 Bean으로 등록

컴포넌트 스캔

컴포넌트 스캔은 컴포넌트 대상을 가져와 Bean으로 등록하기 위해 찾는 과정이다.

 

Spring AOP

  • Spring AOP는 핵심적인 관심사항과 공통 관심사항으로 분리시키고 각각을 모듈화 하는 것이다.

 

AOP과정

  • 다이내믹 프록시 객체의 생성 요청
  • 포인트 컷을 통해 부가 기능 대상 여부 확인
  • 어드바이스로 부가 기능 적용
  • 실제 기능 처리

Spring AOP는 프록시를 이용하였으며 자바의 기본 JDK와 스프링 컨테이너 외에는 특별한 기술이나 환경을 필요로 하지 않는다.

하지만 이러한 프록시 방법은 반드시 스프링 컨테이너가 필요하여 부가기능의 처리가 어려운 단점이 있어서 바이트를 조작하는 AOP가 등장하게 된 것이다.

 

Aspect AOP

Spring AOP 대신 다른 AOP 프레임워크 중 하나인 AspectJ는 프록시를 이용하지 않았다. 대신 CGlib라는 바이트 조작 라이브러리를 사용하여 타깃 오브젝트의 바이트를 고쳐서 부가기능을 직업 넣어주는 방법을 사용했다.

우리가 만든 코드에는 부가 기능이 분리되어 있지만 바이트 코드에서는 핵심 기능과 부가 기능이 섞여있는 구조이다.

AspectJ가 프락시를 사용하지 않고 CGlib를 이용한 복잡한 바이트 조작 방법을 사용하는 이유는 2가지가 있다.

  • 바이트 코드를 조작하면 Spring과 같은 컨테이너의 도움이 필요 없다.
  • 프록시 방식보다 훨씬 강력하고 유연한 AOP를 제공할 수 있다.

Spring WebFlux

Spring WebFlux란 Blocking+ 동기 방식으로 동작하는 Spring MVC의 한계점을 극복하기 위해 등장하였다.

기존의 Spring MVC에서는 HTTP 요청 등을 큐에 넣어두고, 멀티스레드 기반으로 동작했다. 하지만 이러한 방식은 응답성이 상대적으로 떨어지기 때문에 비동기적으로 요청을 처리하기 위한 방법이 필요하게 되었고, 리엑티브 프로그래밍을 통해 비동기 데이터의 스트림으로 non_blocking 애플리케이션을 개발하기 위해 등장한 프레임워크이다.

 

728x90

'Dev' 카테고리의 다른 글

[기술면접] JAVA  (0) 2022.01.24
[기술면접]알고리즘 + 자료구조  (0) 2022.01.23
[기술면접]운영체제(Operating System)  (0) 2022.01.21
[기술면접]데이터베이스(Database)  (0) 2022.01.12
[기술면접]네트워크(Network)  (0) 2022.01.11
728x90

코어 (Core)

  • CPU의 기본 계산 단위입니다.

메모리

  • 메모리는 컴퓨터에서 작업을 수행하기 위해 처리 대상이나 결과 등을 저장하기 위한 공간이다.
  • 프로그램을 실행하기 위한 정보들은 메모리에 저장되어 처리된다.

프로세스 (Process)

프로세스란

  • 프로세스란 실행 중인 프로그램을 의미하고 보조저장장치로부터 메모리에 적재되어 CPU의 할당을 받을 수 있는 단위를 말한다.

프로세스의 메모리 구조

  • 프로세스는 기본적으로 실행 코드가 저장되는 text 영역, 전역 변수 등을 수록하는 data 영역, 프로세스 실행 중에 동적으로 할당되는메모리인 heap 영역, 함수의 매개변수, 복귀 주소와 로컬 변수와 같은 임시 자료를 갖는 stack 영역으로 이루어져 있습니다.

운영체제에 프로세스 저장 방식

  • 프로세스는 PCB라는 자료구조를 통해서 저장되어집니다. PCB란 Process Control Block의 줄임말으로 특정 프로세스에 대한 중요한 정보를 저장하고 있는 운영체제의 자료구조이고 이는 PID, Process Status, PC, CPU 레지스터, CPU 스케줄링 정보 등으로 구성되어 집니다.

스레드 (Thread)

  • 스레드는 프로세스의 CPU 이용을 위한 기본 단위로 프로세스의 주소 공간이나 자원등을 공유해 프로세스를 여러 실행 흐름으로 실행시킬 수 있습니다.

스택을 스레드마다 독립적으로 할당하는 이유

  1. 스택은 함수의 인자, 복귀 주소, 지역 변수 등을 저장하기 위해 사용되는 메모리 공간이므로 스택 메모리 공간이 독립적이라는 것은 독립적인 함수 호출이 가능하다는 것이고 이는 독립적인 실행 흐름이 추가되는 것이기 때문에 프로세스를 여러 실행 흐름으로 만들기 위해서는 스레드에 스택을 독립적으로 할당해야 합니다.

PC Register를 스레드마다 독립적으로 할당하는 이유

  • PC 값은 다음에 실행될 명령어의 주소를 나타내므로 프로세스의 개별 실행 흐름인 스레드가 독립적으로 명령어들을 실행하기 위해선 스레드에 PC 레지스터가 독립적으로 할당되어야 합니다

 

멀티 프로세스

멀티 프로세스는 하나의 프로그램을 여러 개의 프로세스로 구성하여 각 프로세스가 1개의 작업을 처리하도록 하는 것 

  • 특징
    • 1개의 프로세스가 죽어도 자식 프로세스 이외의 다른 프로세스들은 계속 실행된다.
    • Context Switching을 위한 오버헤드(캐시 초기화, 인터럽트 등)가 발생한다.
    • 프로세스는 각각 독립적인 메모리를 할당받았기 때문에 통신하는 것이 어렵다.

멀티 스레드

하나의 프로그램을 여러 개의 쓰레드로 구성하여 각 쓰레드가 1개의 작업을 처리하도록 하는 것

멀티 스레드의 장단점

  • 장점
    • 멀티 스레드를 통해 하나의 실행 흐름인 프로세스를 여러 개의 실행 흐름으로 만들 수 있습니다.
    • 이를 통해 프로세스의 처리 능력 향상과 자원의 소모가 줄어드는 것을 기대할 수 있습니다.
  • 단점
    • 하지만 여러 개의 스레드가 동일한 자원을 접근할 경우 경쟁 조건이 발생할 수 있으며 동기화를 신경 써줘야 합니다.
    • 스레드간의 동기화를 위한 동기화 기법들은 매우 다양하며 잘못 사용할 경우 병목 현상을 발생시킬 수 있어 이를 사용하기 위해 많은 자원이 필요하다는 것이 단점입니다.

멀티 스레드와 멀티 프로세스의 차이

  • 멀티 스레드와 멀티 프로세스의 차이는 여러 실행흐름을 프로세스를 통해서 만드느냐 아니면 프로세스 내의 스레드를 통해서 만드느냐의 차이입니다.
  • 이 두가지 기법 다 동시에 여러 작업을 수행한다는 점에서 목적은 같지만, 서로 장단점이 존재하기 때문에 개발 도메인에서 적합한지, 단점이 뭐가 있고, 장점은 뭐가 있는지, 왜 이 기법을 사용해야 하는지에 대해 팀 내에서 깊게 논의 한 후 시스템에 적용해야 한다고 생각합니다.

데드락(DeadLock)

  • 데드락 또는 교착상태란 한정된 자원을 여러 프로세스가 사용하고자 할 떄 발생하는 상황으로, 프로세스가 자원을 얻기 위해 영구적으로 기다리는 상태이다.

세마포어, 뮤텍스 차이

  • 뮤텍스는 Locking 메커니즘으로 락을 걸은 스레드만이 임계 영역을 나갈때 락을 해제할 수 있습니다. 하지만 세마포어는 Signaling 메커니즘으로 락을 걸지 않은 스레드도 signal을 사용해 락을 해제할 수 있다.
  • 세마포어의 카운트를 1로 설정하면 뮤텍스처럼 활용할 수 있다.

CPU의 메모리 I/O 도중 생기는 병목 현상 솔루션

  • 메모리를 계층화하여 변복현상을 해결한다.자주 접근하는 데이터의 경우 캐시에 저장하여 접근 속도를 향상 시킴으로써 부하를 줄이고 있다.

프로세스 스케줄러란

  • 멀티 프로세스 기법을 사용하는 시스템은 프로세스의 실행 순서를 스케줄링 해야만 합니다. 이러한 프로세스의 실행 순서를 스케줄링하는 도구를 프로세스 스케줄러라고 합니다.

프로세스 스케줄러 종류

  • 프로그램이 저장되어 있는 디스크에서 메모리로 프로세스 스케줄링을 담당하는 Job Schduler, CPU와 메모리 사이의 스케줄링을 담당하는 CPU Schecudler, 메모리에서 디스크로 프로세스 스케줄링을 담당하는 Swapper등이 있는걸로 알고 있습니다.

 

CPU 스케줄러란

  • Ready Queue에 있는 프로세스들을 스케줄링하는 스케줄러를 CPU 스케줄러라고 합니다.

 

CPU 스케줄러의 기법 종류 

  • Ready Queue에 들어온 프로세스를 먼저 처리하는 First Come Fist Serve(FCFS) 스케줄링 기법
  • CPU Burst Time이 짧은 프로세스를 먼저 처리하는 Shortest Job First(SJF) 스케줄링 기법
  • SJF 기법 기반으로 새로운 프로세스가 도착할 때마다 새로운 스케줄링이 이루어져 가장 짧은 프로세스를 먼저 처리하는 Shortest Remaining time First(SRT) 기법
  • 프로세스에 우선순위를 부여하여 우선순위가 높은 프로세스를 먼저 처리하는 Priority Schduling 기법,
  • 프로세스에 CPU 할당 시간을 정해 놓아 CPU를 할당하는 방법인 Round Robin 기법

동기와 비동기의 차이

  • 동기는 요청과 동시에 결과가 일어나는 경우를 동기라고 표현하고, 비동기는 요청과 결과가 동시에 일어나지 않는 경우를 비동기라고 표현한다.

block과 non-block의 차이는 무엇인가요?

  • 요청에 대한 응답을 얻기 까지 다른 실행 흐름들이 기다리는 것을 blocking이라고 하고, 다른 실행 흐름이 요청에 대한 응답을 대기하지 않고 자유롭게 CPU나 메모리 등을 이용하는 상황을 non-blocking 이라고 한다.

컨텍스트 스위칭

  • 컨텍스트 스위칭은 인터럽트를 발생시켜 CPU에서 실행중인 프로세스를 중단하고, 다른 프로세스를 처리하기 위한 과정이다.
  • 컨텍스트 스위칭은 현재 실행중인 프로세스의 상태를 먼저 저장하고, 다음 프로세스를 동작시켜 작업을 처리한 후에 이전에 저장된 프로세스의 상태를 다시 복구한다.

인터럽트

  • CPU가 프로세스를 실행하고 있을 때 입출력 하드웨어 등의 장치나 예외 상황이 발생하여 처리가 필요함을 CPU에게 알리는 것이다.

 

프로세스 동기화 (Process Synchronization)

Critical Section란

  • 동일한 자원을 동시에 접근하는 작업을 실행하는 코드 영역을 Critical Section 이라고 합니다.

Critical Section Problem을 해결하기 위한 조건

  1. 첫 번째 특정 프로세스가 Critical Section을 수행하고 있다면 다른 프로세스는 이 Critical Section에 들어오지 못하게 하는 상호 배제(Mutual Exclusion) 조건
  2. 두 번째는 Critical Section에서 실행중인 프로세스가 없고, 별도의 동작이 없는 프로세스들만 Critical Section 진입 후보 프로세스로서 참여할 수 있다는 조건인 Progress
  3. 세 번째는 특정 프로세스가 Ciritcal Section에 진입 신청 후 받아들여지기까지 기간이 한정되어야 함을 나타내는 Bounded Waiting 

Critical Section Problem을 해결하기 위한 기법

  1. 첫 번째는 하드웨어 기반 해결책인 Lock입니다. Critical Section에 진입하기전에 Lock을 얻고, Critical Section에서 빠져 나올 때 Lock을 방출함으로써 프로세스간에 동기화를 유지합니다.
  2. 두 번째는 Semaphores 입니다. 소프트웨어 상에서 Ciritcal Section 문제를 해결하기 위한 동기화 도구이며, 두 개의 프로세스 사이에서 동기화를 유지할 수 있는 이진 세마포와 프로세스 세개 이상의 프로세스 사이에서 동기화를 유지할 수 있는 카운팅 세마포가 있습니다.
  3. 세 번째는 모니터 입니다. 모니터는 고급 언어의 설계 구조물로서, 개발자의 코드를 상호배제 하게끔 만든 추상화된 데이터 형태 입니다.

메모리 관리 전략

Swapping 이란 

Swapping 이란 메모리의 관리를 위해 사용되는 기법입니다. CPU 할당 시간이 끝난 프로세스의 메모리를 보조기억장치(하드디스크)로 내보내고 다른 프로세스를 메모리로 불러들이는 것을 의미합니다. 이러한 과정을 swap (스왑 시킨다)이라 한다. 
주 기억장치(RAM)로 불러오는 과정을 swap-in, 보조 기억장치로 내보내는 과정을 swap-out이라 한다.
swap 에는 큰 디스크 전송시간이 필요하기 때문에 현재에는 메모리 공간이 부족할 때 Swapping이 시작된다.

Swapping을 하면서 발생하는 문제점

  • 대표적으로 단편화(Fragmentation) 문제를 들 수 있습니다. 프로세스들이 메모리에 적재되고 제거되는 일이 반복되다보면 메모리 사이에 사용 하지 못할 만큼의 작은 자유 공간들이 늘어나게 되는데 이를 단편화라고 합니다.
  • 단편화의 종류는 크게 외부 단편화와 내부 단편화로 나눌 수 있습니다. 외부 단편화란 메모리에서 프로세스 사이 사이 남는 공간들을 의미하는 것이고, 내부 단편화란 프로세스가 사용하는 메모리 공간에서 남는 부분을 의미하는 것입니다.

외부 단편화를 해소하기 위한 방법

압축이 있을 것 같습니다. 외부 단편화를 해소하기 위해 프로세스가 사용하는 메모리 공간들을 한쪽으로 몰아, 자유 공간을 확보하는 방법론이지만, 작업효율이 좋지 않아 잘 사용하지 않습니다.

다른 외부 단편화 문제를 해결할 수 있는 방법

대표적인 예로는 메모리 공간이 연속적이어야 한다는 제약을 없애는 페이징 기법을 들 수 있습니다. 
물리 메모리를 Frame이라는 고정 크기로 분리하고, 논리 메모리는 페이지라 불리는 고정 크기의 블록으로 분리하는 기법입니다.
이러한 페이징 기법을 통해 논리 메모리는 물리 메모리에 저장될 때, 연속되어 저장될 필요가 없고 물리 메모리의 남는 프레임에 적절히 배치됨으로 외부 단편화를 해결할 수 있습니다.
즉, 하나의 프로세스가 사용하는 공간을 여러 개의 페이지로 나뉘어서 논리 메모리에서 관리하고, 개별 페이지는 순서에 상관없이 물리 메모리에 있는 프레임에 mapping 되어 저장하는 방법입니다.
하지만 페이지의 크기는 정해져 있기 때문에 내부 단편화는 발생할 수 있다고 생각합니다.

세그멘테이션이란

  • 세그멘테이션은 프로세스를 물리적 크기의 단위가 아닌 논리적 내용의 단위인 세그먼트로 분할하고 메모리를 할당하며 주소를 변환하는 기법이다.
  • 세그먼트들의 크기가 서로 다르기 때문에 메모리를 페이징 기법에서처럼 미리 분할해 둘 수 없고,메모리에 적재될 때 빈 공간을 찾아 할당하는 사용자 관점의 가상 메모리 관리 기법이다.
  • 세그먼트의 단위가 다르기 때문에 메모리에 서로 다른 크기를 가진 여러 세그먼트를 저장할 시 외부 단편화가 생기는 문제점이 존재해 잘 사용하지는 않습니다.

가상 메모리 (Virtual Memory)

  • 가상 메모리란 프로세스 전체가 메모리 내에 올라오지 않더라도 실행이 가능하도록 하는 기법이며, 프로그램이 물리 메모리보다 커도 된다는 주요 장점이 있다.

왜 가상 메모리가 나오게 되었는가?

  • 실행되는 코드의 전부를 물리 메모리에 존재시켜야 했고, 메모리 용량보다 큰 프로그램은 실행시킬 수 없었다. 
  • 또한 멀티 프로세스상에서 여러 프로그램을 동시에 메모리에 올리기에는 용량의 한계와, 페이지 교체등의 성능 이슈가 발생했기 때문에 이를 해결하기 위해 가상 메모리 기법이 나오게 되었습니다.

가상 메모리를 통해서 우리는 어떤 장점을 얻을 수 있는가?

  • 프로그램의 일부분만 메모리에 올릴 수 있게 되었고 이를 통해 물리 메모리 크기에 제약을 받지 않게 되었습니다. 
  • 고로 더 많은 프로그램을 동시에 실행할 수 있게 되었다. 또한 swap에 필요한 입출력이 줄었기 때문에 프로그램들이 빠르게 실행된다는 장점을 가지고 있다.

가상 메모리는 어떻게 동작하는가?

  • 가상 메모리는 실제의 물리 메모리 개념과 사용자의 논리 메모리 개념을 분리한 것으로 정리할 수 있다. 
  • 이로써 작은 메모리를 가지고도 얼마든지 큰 가상 주소 공간을 프로그래머에게 제공할 수 있습니다.
  • 가상 주소 공간이란 한 프로세스가 메모리에 저장되는 논리적인 모습을 가상메모리에 구현한 공간이다.
  • 프로세스가 요구하는 메모리 공간을 가상메모리에서 제공함으로써 현재 직접적으로 필요치 않는 메모리 공간은 실제 물리 메모리에 올리지 않는 것으로 물리 메모리를 절약할 수 있다.
  • 가상 메모리는 시스템 라이브러리가 여러 프로세스들 사이에 공유될 수 있도록 합니다.
  • 프로세스들이 메모리를 공유하는 것을 가능하게 하고, 프로세스들은 공유 메모리를 통해 통신할 수 있다. 
  • 이 또한, 각 프로세스들은 각자 자신의 주소 공간처럼 인식하지만, 실제 물리 메모리는 공유되고 있다.

요구 페이징 (Demand Paging)이란 무엇인가?

  • 프로그램 실행 시작 시에 프로그램 전체를 디스크에서 물리 메모리에 적재하는 대신, 초기에 필요한 것들만 적재하는 전략을 요구 페이징이라 하며 가상 메모리 시스템에서 많이 사용된다. 
  • 요구 페이징을 사용하는 가상 메모리에서는 실행과정에서 필요해질 때 페이지들이 적재된다.

페이지 교체 알고리즘이란

  • 요구 페이징에서 언급된대로 프로그램 실행시에 모든 항목이 물리 메모리에 올라오지 않기 때문에,프로세스의 동작에 필요한 페이지를 요청하는 과정에서 page fault가 발생하게 되면, 원하는 페이지를 보조저장장치에서 가져오게 되는 것을 의미합니다.

페이지 교체 알고리즘의 순서

  1. 디스크에서 필요한 페이지의 위치를 찾는다.
  2. 빈 페이지 프레임을 찾는다.
  3. 페이지 교체 알고리즘을 통해 희생될(victim) 페이지를 고른다.
  4. 희생될 페이지를 디스크에 기록하고, 관련 페이지 테이블을 수정한다.
  5. 새롭게 비워진 페이지 테이블 내 프레임에 새 페이지를 읽어오고, 프레임 테이블을 수정한다.
  6. 사용자 프로세스 재 시작

페이지 교체 알고리즘에는 어떠한 것들이 있는가?

  • FIFO 페이지 교체 : 먼저 물리 메모리에 들어온 페이지 순서대로 페이지 교체 시점에 먼저 나가게 된다.
  • 최적 페이지 교체 : 앞으로 가장 오랫동안 사용되지 않을 페이지를 찾아 교체하는 알고리즘이다.
  • LRU (Least Recently Used) 페이지 교체 : 가장 오랫동안 사용되지 않은 페이지를 선택하여 교체한다. (최적 알고리즘 근사 알고리즘)
  • LFU (Least Frequently Used) 페이지 교체 : 참조 횟수가 가장 적은 페이지를 교체하는 방법이다.
  • MFU (Most Frequently Used) 페이지 교체 : 참조 횟수가 가장 많은 페이지를 교체하는 방법이다.

캐시(Cache)

캐시 메모리란 무엇인가?

캐시 메모리란 속도가 빠른 장치와 느린 장치 간의 속도차에 따른 병목 현상을 줄이기 위한 범용 메모리이다.

캐시 메모리에서 가장 신경 써야 하는 문제

캐시 메모리의 역할을 수행하기 위해서는 CPU가 어떤 데이터를 원할 것인가를 예측할 수 있어야 한다. 
즉, 적중률(hit rate)을 극대화 시켜야 한다.

적중률(hit rate)을 극대화시키기 위해 어떻게 해야 하는가?

적중률을 극대화시키기 위해 데이터 지역성(Locality)의 원리를 사용한다. 
즉, Locality란 기억 장치 내의 정보를 균일하게 Access 하는 것이 아닌 어느 한순간에 특정 부분을 집중적으로 참조하는 특성인 것이다.

지역성은 어떻게 나뉘는가?

데이터 지역성은 대표적으로 시간 지역성(Temporal Locality)과 공간 지역성(Spatial Locality)으로 나뉘고 이는 다음과 같다.

  • 시간 지역성 : 최근에 참조된 주소의 내용은 곧 다음에 다시 참조되는 특성.
  • 공간 지역성 : 대부분의 실제 프로그램이 참조된 주소와 인접한 주소의 내용이 다시 참조되는 특성
728x90
728x90

데이터베이스

데이터베이스란 여러 사람이 공유하여 사용할 목적으로 통합되어 관리되는 데이터의 집합을 의미한다. 이러한 데이터베이스를 관리하는 시스템을 DBMS라고 한다.

 

데이터베이스 특징

  • 독립성 (Independence) : 데이터베이스는 데이터를 사용하는 응용 프로그램과 독립적으로 데이터를 저장 및 관리한다.
  • 무결성(Integrity) : 데이터베이스는 다양한 제약조건 및 기능을 통해 데이터의 무결성을 유지해준다.
  • 보안성(Security) : 데이터베이스는 계정 및 권한 관리를 통해 데이터들의 보안을 유지해준다.
  • 일관성(Consistency) : 데이터베이스는 다양한 제약조건을 통해 데이터를 일관되게 유지해준다.
  • 중복 최소화(Minimum Duplicate) : 데이터베이스는 데이터를 통합해서 관리함으로써 데이터의 중복을 최소화한다.
더보기

무결성 : 데이터의 정확성과 일관성을 유지하고 보증하는 것 

데이터베이스 키 종류

  • 기본키 : 하나의 테이블에서 특정 ROW를 구별할 수 있는 속성을 의미한다.
  • 외래키 : 참조되는 테이블의 기본키와 대응되어 테이블 간에 참조 관계를 표시하는 키입니다.

조인

조인이란 2개 이상의 테이블에서 조건에 맞는 데이터를 추출하기 위해서 사용하는 쿼리문을 의미한다.

 

  • Inner Join : 2개 이상의 테이블에서 교집합만을 추출
  • Left Join : 2개 이상의 테이블에서 FROM문에 해당하는 부분을 추출
  • Right Join : 2개 이상의 테이블에서 FROM 문의 테이블과 JOIN 하는 테이블에 해당하는 부분을 추출
  • Outer Join(Full Join) : 2개 이상의 테이블에서 모든 테이블에 해당하는 부분을 추출

인덱스

인덱스란 추가적인 쓰기 작업과 저장 공간을 활용하여 데이터베이스 테이블의 검색 속도를 향상하기 위한 자료구조이다.

인덱스를 구현하기 위한 자료구조

  • B + Tree
    • DB 인덱스를 위해 자식 노드가 2개 이상인 Binary Tree를 개선시킨 자료구조로서 아래와 같은 특성을 가진다.
    • Leaf노드만 인덱스와 함께 데이터를 가지고 있고, 나머지 노드들은 데이터를 위한 인덱스만을 갖는다
    • Leaf 노드는 LinkedList로 연결되어 있다.
  • Hash Table
    • 해시 테이블은 Key-Value의 형태로 데이터를 저장하는 자료구조로 빠른 데이터 검색이 필요할 때 유용하다.
    • 해시 테이블은 Key값을 이용해 고유한 인덱스를 생성하여 그 인덱스에 저장된 값을 꺼내오는 구조이다.

인덱스를 선정할 때 고려할 점

  • 인덱스를 설정할 때 해당 테이블에서 어떠한 쿼리가 자주 사용되는지 분석해야 한다.
  • 인덱스 설정 시 칼럼에 중복되는 값이 많이 없는 칼럼을 인덱스로 걸어야 한다.

트랜잭션

  • 트랜잭션은 DBMS가 데이터베이스를 다룰 때 사용하는 작업의 단위이다.
  • 데이터베이스에서 데이터를 다룰 때  장애가 일어나는 경우에 데이터를 복구하는 작업의 단위가 된다.
  • 데이터베이스에서 여러 작업이 동시에 같은 데이터를 다룰 때 서로 분리하는 단위가 된다.


트랜잭션 특징 (ACID)

  • 원자성(Atomicity)
    • 트랜잭션에 포함된 작업은 전부 수행되거나 전부 수행되지 않아야 한다. 트랜잭션이 중간에 끊기면 이후에 해당 트랜잭션의 어디서부터 이어 수행해야 되어야 하는지 모르기 때문에 작업이 잘못되면 회복 알고리즘을 이용하여 변경한 내용을 취소한다.
  • 일관성(Consistency)
    •  트랜잭션을 수행하기 전이나 후나 데이터베이스는 항상 일관된 상태를 유지해야 한다.
  • 고립성(Isolation)
    •  수행 중인 트랜잭션에 다른 트랜잭션이 끼어들어 변경 중인 데이터 값을 훼손하지 않아야 한다. 그리고 고립성을 유지하기 위해서는 여러 트랜잭션이 동시에 접근하는 데이터에 대한 제어가 필요하다.
  • 지속성(Durability)
    • 수행을 성공적으로 완료한 트랜잭션은 변경한 데이터를 영구히 저장해야 한다. 트랜잭션의 성공 결과 값은 장애 발생 후에도 변함없이 보관되어야 한다는 것으로 트랜잭션이 정상적으로 완료(Commit)된 경우에는 버퍼의 내용을 하드디스크에 확실히 기록하여야 하며, 부분 완료(Partial Commit)된 경우에는 작업을 취소(Aborted)하여야  한다.

트랜잭션 격리 수준

  • READ uncommitted (Lv.0)
    • 커밋되지 않은 데이터에 접근이 가능한 수준으로, N개의 트랜잭션이 하나의 공유 데이터에 접근해도 전혀 보호되지 않는다 데이터베이스의 일관성을 유지하는 것이 불가능함
    • Dirty Read 발생 : 데이터 정합성 문제가 많이 발생한다.
  • READ committed (Lv.1)
    • SELECT 쿼리가 수행되는 동안 해당 데이터에 Shared Lock이 걸리는 레벨이다.
    • 트랜잭션이 수행하는 동안 다른 트랜잭션이 접근할 수 없어 대기하게 되고, 커밋이 이루어진 트랜잭션만 조회가 가능하다.
    • Non-Repeatable Read 발생
    • 오라클 데이터베이스와 SQL 서버에서 기본으로 사용하는 격리 수준이다.
  • REPEATABLE READ (Lv.2)
    • 트랜잭션이 완료될 때까지 Select 문이 사용되는 모든 데이터에 Shared Lock이 걸린다.
    • 트랜잭션이 범위 내에서 조회한 데이터 내용이 항상 동일함을 보장한다,
    • 다른 클라이언트는 트랜잭션 영역에 해당되는 데이터에 대한 수정이 불가능하다.
    • MYSQL에서 기본으로 사용한다.
    • Non-Repeatable Read 부정합이 발생하지 않고, 자신의 트랜잭션 번호보다 낮은 트랜잭션 번호에서 변경된 것만 보게 된다.
  • SERIALIZBLE (Lv.3)
    • 트랜잭션이 완료될 때까지 조회 쿼리가 사용되는 모든 데이터에 Shared Lock이 걸리는 레벨 가장 엄격한 격리 수준으로 완벽한 읽기 일관성 모드를 제공하고, 다른 사용자는 트랜잭션 영역에 해당되는 데이터에 대한 수정이나 입력이 불가능하다.

트랜잭션 동시성 제어

동시성 제어

  • 다중 사용자 환경을 지원하는 데이터 베이스 시스템에서 여러 트랜잭션들이 성공적으로 동시에 실행될 수 있도록 지원하는 기능
  • 다중 사용자 환경을 지원하는 DB 시스템의 경우 필수적으로 지원해야 하는 병행 제어라고 한다.
  • 트랜잭션의 직렬화 수행 보장

동시성 제어 종류 

  • 락킹(Locking) 
    • 트랜잭션이 데이터에 잠금을 설정하면 다은 트랜잭션은 해당 데이터에 잠금이 해제될 때까지 접근/수정/삭제가 불가능하다.
  • 타임스탬프(Timestamp)
    • 시스템에서 생성하는 고유 번호인 타임스탬프를 트랜잭션에 부여함으로써 트랜잭션 간의 접근 순서를 미리 정한다.
  • 적합성(Vaildation) 검증
    • 먼저 트랜잭션을 수행하고 트랜잭션을 종료할 때 적합성을 검증하여 데이터베이스에 최종 반영한다.

이상현상

  • 삭제 이상 : 튜플 삭제 시 같이 저장된 다른 정보까지 연쇄적으로 삭제되는 현상이다.
  • 삽입 이상 : 튜플 삽입 시 특정 속성에 해당하는 값에 Null 값을 입력해야 하는 현상이다.
  • 수정 이상 : 튜플 수정 시 중복된 데이터의 일부만 수정되어 일어나는 데이터 불일치 현상이다.

정규화

정규화란 데이터베이스에서 이상 현상을 없애고 데이터의 중복을 최소화하기 위해 하나의 테이블을 둘 이상의 테이블로 분리하는 작업을 의미합니다. 

 

정규화 종류

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

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

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

  • BCNF 정규형: BCNF 정규형은 릴레이션 R에서 함수 종속성 X-> Y가 성립할 때 모든 결정자 X가 후보 키인 정규형이다.



DB락

DB락은 여러 개의 트랜잭션 둘이 하나의 데이터로 동시에 접근하려고 할 때 이를 제어해주는 도구이다.

  • 공유락 (Shared Lock) : 트랜잭션이 읽기를 할 때 사용하는 락, 데이터를 읽을 수 있지만 쓸 수 없음
  • 베타 락 (Beta Lock) : 트랜잭션이 읽고 쓰기를 할 때 사용하는 락, 데이터를 읽고 쓸 수 있음

 

RDBMS

2차원의 행과 열로 데이터의 관계를 관리하는 데이터베이스이다.

RDBMS는 관계형 데이터베이스를 생성하고 수정하고 관리할 수 있는 소프트웨어라고 정의할 수 있다.

  • 장점: 스키마에 맞추어 데이터를 관리하기 때문에 데이터의 정합성을 보장할 수 있다.
  • 단점: 시스템이 커질수록 쿼리가 복잡해지고 성능이 저하되며, 수평적 확장이 어렵다.

NoSQL

NoSQL 데이터베이스란 전통적인 관계형 모델에서 벗어나서 다양한 데이터 모델을 사용하여 데이터의 관리와 접근을 지원하는 데이터베이스이다.

NoSQL은 데이터의 스펙이 자주 변경되는 경우나, 읽기 작업이 자주 일어나는 경우, 수많은 양의 데이터를 다루기 위해 수평 확장이 필요한 경우 사용하면 좋다.

  • 장점 : 스키마가 없거나 느슨하게 제공되기 때문에 요구사항 변경에 유연하게 대처할 수 있다.
  • 단점 :  데이터베이스마다 사용하는 데이터의 모델이 다르기 때문에 이를 도입하기 위해서는 해당 데이터베이스를 깊게 공부를 해야 해서 RDBMS보단 많은 학습 비용이 든다.

힌트

힌트란 SQL을 튜닝하기 위한 지시 구문입니다. 옵티마이저가 최적의 계획으로 SQL문을 처리하지 못하는 경우에 개발자가 직접 최적의 실행 계획을 제공하는 것입니다


클러스터링

  • 여러 개의 데이터베이스를 수평적인 구조로 구성하여 Failover 하는 시스템을 구축하는 방식이다.
  • 동일한 DB서버를 두 대를 묶고 active- active 상태로 운영하거나 active-stanby방식으로 운영한다.
  • active- active상태는 두대의 서버가 부하를 분담하기 때문에 cpu, 메모리 자원의 부하도 줄게 되지만 서버 두대가 공유하기 때문에 병목현상이 생길 수 있다.
  • 이러한 단점을 active-stanby 가 보완할 수 있다. 하나의 서버가 장애가 발생기 failover을 통해 두 서버가 상호 전환된다. 이 방식은 장애 없이 운영할 수 있지만 노드들 간의 동기화가 필요하기  때문에 시간이 소요되고 리플리케이션에 비해 성능이 떨어진다.

리플리케이션 

  • 여러 개의 DB를 master-slave 형태로 구축하고, master에 DML(write-only)을 하고 slave에 복제(Read-only)하는 방식이다.
  • 비동기 방식으로 데이터를 동기화하기 때문에 지연시간이 거의 없다.
  • 노드 간의 데이터 동기화가 보장되지 않아 일관성 있는 데이터를 얻지 못할 수 있다.
  • 데이터 양의 많을 경우 데이터를 찾는데 오랜 시간이 걸린다.
  • 마스터 노드 장애 시 복수&대처가 힘들다.

데이터베이스 튜닝

DB 튜닝은 데이터 베이스의 구조나 데이터베이스 자체, 운영체제 등을 조정하여 데이터베이스 시스템의 성능을 향상하는 작업을 의미한다.


REFERENCE

https://velog.io/@gkskaks1004/클러스터링-vs-리플리케이션-vs-샤딩

https://mangkyu.tistory.com/93

https://imbf.github.io/interview/2021/03/01/NAVER-Practical-Interview-Preparation-3.html

https://velog.io/@gkskaks1004/클러스터링-vs-리플리케이션-vs-샤딩

728x90
728x90

쿠키(cookie)와 세션(session)

  • Http는 클라이언트가 요청을 한 후 응답을 받으면 그 연결을 끊어 버리는 특징인 Connectionless와 통신이 끝나면 상태를 유지하지 않는 statless를 해결하기 위해서 쿠키와 세션이 나왔다.

쿠키

  • 쿠키는 클라이언트의 로컬에 저장되는 key-value가 들어 있는 작은 데이터 파일이다. 쿠키에는 유효시간을 지정할 수 있고, 쿠키의 유효시간이 남을 경우 브라우저가 종료되어도 스토리지에 남아있다.

쿠키 동작 방식

  1.  클라이언트가 페이지를 요청한다.
  2. 서버에서 쿠키를 생성한다.
  3. HTTP 헤더에 쿠키를 포함시켜 응답한다.
  4. 브라우저에서 쿠키를 저장
  5. 쿠키가 존재하면 요청을 할 경우 HTTP 헤더에 쿠키를 함께 보내서 요청한다.

ex) 팝업, 장바구니, 자동 로그인

 

세션

  • 세션은 인증과정에서 보통 쿠키를 기반으로 하고 있지만, 클라이언트의 상태 정보를 서버 메모리에 저장하는 기술을 의미한다. 
  • 그러나 서버 메모리에 관리하기 때문에 사용자 수가 많을 경우 성능 저하의 요인이 된다.

세션 동작 방식

  1. 클라이언트가 서버에 접속 시 세션 ID를 발급한다.
  2. 클라이언트는 세션 ID를 쿠키를 이용해 저장한다.
  3. 클라이언트가 서버에 다시 접속 시 이 쿠키를 이용해서 세션 ID값을 서버에 전달

세션 쿠키 방식 장단점

장점

  • 세션 ID는 유의미한 값을 갖지 않기 때문에 HTTP 헤더나 바디에 직접 계정 정보를 담아 전송하는 것보다 보안에 강점이 있다.
  • 세션 ID는 고유의 ID값이기 때문에 서버 메모리에서 바로 검색할 수 있어 성능향상을 기대할 수 있다.

단점

  • 중간에 가로챈 쿠키(세션 ID)를 가지고 해커가 동일한 요청을 보낼 경우 사용자인지 해커인지 구분하기 힘들다.
  • 세션 저장소는 서버의 메모리를 사용하기 때문에 동시 사용자가 많을 수록 서버의 부하가 심하게 걸린다.

OAuth

  • OAuth란 특정 애플리케이션이 다른 애플리캐이션의 정보에 접근할 수 있는 권한을 관리하는 프로토콜이다.

 


OSI 7 Layer

OSI 7 Layer는 네트워크를 계층적인 구조로 표현한 것이다. 네트워크 계층을 7 계층으로 나눈 이유는 네트워크에서 이상이 발생했을 경우 다른 계층의 장비 및 소프트 웨어를 건들지 않고도 이상이 생긴 특정 계층만 고칠 수 있는 유지보수 측면에서의 장점과 새로운 응용 계층 프로토콜을 개발할 경우 표현 계층까지 재사용함으로써 확장성 측면에서의 장점을 가지기 때문에 나눈 것이다.

  1. 물리계층(Physical Layer) : 데이터를 전기 신호로 바꿔주는 계층
  2. 데이터링크 계층 (DataLink Layer) : 데이터의 물리적인 전송과 에러 검출, 흐름 제어를 담당하는 계층
  3. 네트워크 계층 (Network Layer) : 패킷을 목적지까지 가장 빠른 길로 전송하기 위한 계층
  4. 전송 계층 (Transport Layer) : 최종 수신 프로세스로 데이터의 전송을 담당하는 계층
  5. 세션 계층(Session Layer) : 컴퓨터끼리 통신을 하기 위해 세션을 만드는 계층
  6. 표현 계층 (Presentation Layer) : 데이터의 형식을 정의하는 계층
  7. 응용 계층 (Application Layer) : 사용자와 직접 상호작용을 하는 응용프로그램들이 포함된 계층

웹 동작 방식

 

  • 사용자가 브라우저에 URL을 입력
  • 브라우저는 DNS를 통해 서버의 진짜 주소를 찾음
  • HTTP 프로토콜을 사용하여 HTTP 요청 메세지를 생성함
  • TCP/IP 연결을 통해 HTTP요청이 서버로 전송됨
  • 서버는 HTTP 프로토콜을 활용해 HTTP 응답 메세지를 생성함
  • TCP/IP 연결을 통해 요청한 컴퓨터로 전송
  • 도착한 HTTP 응답 메세지는 웹페이지 데이터로 변환되고, 웹 브라우저에 의해 출력되어 사용자가 볼 수 있게 됨

 

HTTP Protocol

HTTP(Hyper Text Transfer protocol)이란 서버/클라이언트 모델을 따라 데이터를 주고받기 위한 프로토콜이다. HTTP는 애플리케이션 레벨의 프로토콜로 TCP/IP 위에서 작동합니다. HTTP는 상태를 가지고 있지 않는 Stateless 프로토콜이며 Method, Path, Version, Headers, Body 등으로 구성된다.

 

HTTP와 HTTPS

HTTP는 평문 데이터를 전송하는 프로토콜이기 때문에, HTTP로 비밀번호나 주민번호 등을 주고받으면 제삼자에 의해 조회될 여지가 있다.

이러한 문제를 해결하기 위해 HTTP에 암호화가 추가된 프로토콜이 HTTPS이다.

HTTPS는 자신이 공개키를 갖는 인증서를 발급하여 보내는 메시지를 공개키로 암호화 하도록 하고 있다. 공개키로 암호화된 메시지는 개인키를 가지고 있어야만 복호화가 가능하기 때문에, 기업을 제외한 누구도 원본 데이터를 얻을 수 없다.

HTTP1 VS HTTP2

HTTP1 은 연결당 하나의 요청/응답을 처리하여 다음과 같은 문제가 있다.

 

  • HOL(Head Of Line) Blocking (특정 응답 지연): 클라이언트의 요청과 서버의 응답이 동기화되어 지연 발생
  • RTT(Round Trip TIme) 증가 (양방향 지연): 패킷 왕복 시간의 지연 발생
  • 헤더 크기의 비대: 쿠키 등과 같은 메타데이터에 의해 헤더가 비대해짐

HTTP2는 다음과 같은 기술로 HTTP1의 성능 문제를 해결하였다.

 

  • Multiplexed Streams: 하나의 커넥션으로 여러 개의 메시지를 동시에 주고받을 수 있음
  • Stream Prioritization: 요청 온 리소스 간의 의존관계를 설정하여 먼저 응답해야 하는 리소스를 우선적으로 반환함
  • Header Compression: 헤더 정보를 HPACK 압축 방식을 이용하여 압축 전송함
  • Server Push: HTML 문서 상에 필요한 리소스를 클라이언트 요청 없이 보내줄 수 있음

DNS

DNS는 Domain Name을 Host IP로 변환해주는 서비스이다. DNS 서버들은 계층 구조로 구현된 분산 데이터베이스로 주요 구성요소로써   Root, Top Level Domain, Authoritative, Local DNS Server가 있다.


TCP와 UDP

  • UDP는 비신뢰적이고 비연결형 서비스를 제공하는 프로토콜이고, TCP는 신뢰적이고 연결형 서비스를 제공하는 프로토콜이다.
  • UDP는 3 way-handShake를 사용하지 않기 때문에 신뢰성이 떨어지지만 속도가 빠르기 때문에 실시간 스트리밍 등에 사용된다.
  • TCP는 신뢰성이 중요한 파일 교환 같은 경우에 쓰인다.

TCP 3 way-handShake

3 way-handShake는 TCP 네트워크 통신을 하는 장치가 서로 연결이 잘되어있는지 확인하는 방법이다. 송신자와 수신자는 총 3번에 걸쳐 데이터를 주고받으며 통신이 가능한 상태임을 확인한다.


GET과 POST

GET은 데이터를 조회하기 위해 사용되는 방식으로 데이터를 헤더에 추가하여 전송하는 방식이다. URL에 데이터가 노출되기 때문에 보안적으로 중요한 데이터를 포함해서는 안된다.

POST는 데이터를 추가 또는 수정하기 위해 사용되는 방식으로 데이터를 바디에 추가하여 전송하는 방식이다. 완전히 안전하다는 것은 아니지만 URL에 데이터가 노출되지 않아 GET보다는 안전하다.


토큰 기반 인증방식

토큰 기반 인증 방식은 인증에 필요한 정보들을 암호화시킨 토큰을 통해서 인증을 하는 방식이다.

토큰 기반 인증 동작 방식

  1. 클라이언트가 로그인한다.
  2. 서버는 클라이언트를 확인하고 Access Token을 발급해 사용자에게 응답해준다.
  3. 사용자는 Access Token을 받아 쿠키와 같은 곳에 저장한 후, 인증이 필요한 요청마다 토큰을 헤더에 실어 보낸다.
  4. 서버는 해당 토큰을 검증하고 적절한 토큰일 경우 사용자에 알맞은 데이터를 보낸다.

토큰 기반 인증 방식 장단점

장점

  • 세션/쿠키와 달리 토큰은 별도의 저장소 관리가 필요 없고 검증만 하면 되기 때문에 추가 저장소가 필요 없다.
  • 페이스북이나 구글에서 지원해주는 다양한 서비스도 토큰 기반으로 진행되기 때문에 관련 기능을 확장하기 용이하다.

단점

  • 토큰의 경우도 세션 ID와 마찬가지로 가로챘을 경우 사용자인지 해커인지 구분하기가 힘들다.(HTTPS를 사용하고, 토큰 유효기간을 짧게 한다.)
  • 토큰의 길이는 세션 ID보다 훨씬 길기 때문에 많은 요청이 발생할수록 오버헤드도 많이 발생한다.

웹 접근성 국제표준 

웹 접근성을 높이기 위해 고안된 웹 표준은 웹에서 표준적으로 사용되는 기술이나 규칙을 의미한다. 웹 표준을 정하기 위하 W3C(World Wide Web Consortium)이 설립되었으며 웹 표준으로 구조 언어인 HTML, 표현 언어인 CSS, 동작 언어인 Script를 지정하였다.


공인 IP와 사설 IP

공인 IP

  • 전 세계에서 유일한 IP로 ISP(Internet Service Provider)가 제공하는 IP주소이다.
  • 외부에 공개되어 있기 때문에 인터넷에 연결된 다른 장비로부터 접근이 가능하다. 그러므로 방화벽 등과 같은 보안설정을 해주어야 한다.

사설 IP

  • 어떤 네트워크 안에서 사용되는 IP 주소
  • IP V4의 부족으로 인해 모든 네트워크가 공인 IP를 사용하는 것이 불가능하기 때문에 네트워크 안에서 라우터를 통해 할당받는 가상의 주소이다.
  • 별도의 설정이 없으면 외부에서 접근이 불가능하다.

JWT

JWT는 Json Web Token의 약자로 Json 포맷을 통해 사용자에 대한 속성을 저장하는 Web Token이다.

 

JWT의 구조는 Header, PayLoad, Signature의 3 부분으로 이루어진다.

  • Header : Signature를 해싱하기 위한 알고리즘이다 토큰의 타입을 지정하는 부분이다.
  • PayLoad : 토큰에서 사용할 정보의 조각들인 Claim으로 구성되어 있다.
    • Payload에 담는 정보의 한 조각을 Claim이라고 부르고, 이는 Key - value의 한 쌍으로 이루어져 있다.
  • Signature : 토큰을 인코딩하거나 유효성 검증을 할 때 사용하는 고유한 암호화 코드이다.

JWT 장단점

장점

  • 토큰 기반의 인증을 위해 토큰 생성이 가장 간단하면서도 만료 기간과 같은 다양한 기능 명세가 존재한다.
  • 자바 단에 JWT token을 생성하고 검증할 수 있는 라이브러리가 잘 형성이 되어있다.

단점

  • JWT 토큰은 상태 정보를 저장하지 않아 한번 발행된 토큰이 임의로 삭제될 수 없기 때문에 적절한 토큰 만료 기간을 넣어줘야 한다.
  • JWT 토큰은 전체적으로 길이기 길기 때문에 많은 요청과 응답이 발생할 경우 성능에 영향을 줄 수 있다.
  • 토큰 기반의 인증과 마찬가지로 토큰을 탈취당했을 경우 올바른 사용자 식별을 하기가 어렵다.

DHCP

DHCP는 Dynamic Host Configuration Protocol의 약자로 호스트의 IP 주소와 각종 TCP/IP 프로토콜의 기본 설정을 클라이언트에게 자동적으로 제공해주는 프로토콜을 말한다.

DHCP에 대한 표준은 RFC문서에 정의되어 있으며, DHCP는 네트워크에 사용되는 IP주소를 DHCP 서버가 중앙 집중식으로 관리하는 클라이언트/서버 모델을 사용하게 된다.

DHCP는 네트워크 안에 컴퓨터에 자동으로 네임 서버 주소, IP주소, 게이트웨이 주소를 할당해주는 것을 의미하고, 해당 클라이언트에게 일정 기간을 임대하는 동적 주소 할당 프로토콜이다.

DHCP 장단점

장점

  • PC의 수가 많거나 PC 자체 변동사항이 많은 경우 IP 설정이 자동으로 되기 때문에 효율적으로 사용 가능하고, IP를 자동으로 할당해주기 때문에 IP 충돌을 막을 수 있다.

단점

  • DHCP 서버에 의존되기 때문에 서버가 다운되면 IP 할당이 제대로 이루어지지 않는다.

NAT

NAT는 Network Address Translation의 약자로 사설 IP를 공인 IP로 변경할 때 필요한 주소 변환 서비스이다.

라우터 등의 장비를 사용하여 다수의 사설 IP를 하나의 공인 IP주소로 변환하는 기술이다. 주로 기업이나 기관에서 내부망을 사용하는 PC에 사설 IP를 제공하고 외부 인터넷 연결 시엔 공인 IP하나를 같이 사용하는 형태로 운영한다.


VPN

VPN은 Virtual Private Network의 약자로 가상사설망을 의미한다. VPN은 두 개 이상의 물리적 네트워크 사이의 인터넷 / 공용 네트워크를 통해 생성된 가상 네트워크로, 사용자/장치가 직접 연결된 하나의 개인 네트워크에 있는 것처럼 데이터를 보내고 받을 수 있도록 확장된 개인 네트워크를 만든다. 따라서 VPN에 연결된 애플리케이션은 동일한 기능을 실행할 수 있고 개인 네트워크에 연결되어 있는 것처럼 관리할 수 있다.


ROUTING

라우팅이란 Internetwork을 통하여 근원지에서 목적지로 데이터가 전달될 수 있도록 하는 기능이다.

라우팅에는 Network Admin이 Router마다 최적의 경로를 인위적으로 등록하는 정적 라우팅과 자동적인 Routing Algorithm에 의해 최적의 경로를 판단하는 동적 라우팅이 있다.

정적 라우팅과 동적 라우팅

정적 라우팅

  • 관리자가 네트워크에 대한 경로 정보를 직접 지정하여 Routing 하는 방법이다.

장점

  • 동적 라우팅 보다 관리자에 의한 라우팅 정보만을 참조하므로 라우터 자체의 부담이 없어 동적 경로 설정보다 속도가 빠르고 안정적이다.

단점

  • 네트워크의 변화가 빈번한 경우, 등록해야 할 네트워크 수가 많을 경우에는 능동적으로 경로 설정을 변경하기 어렵다.

동적 라우팅

  • 대규모 네트워크에 사용하며 인접한 라우터 간에 동일한 Routing Protocol을 설정하여 라우터 간에 변경된 네트워크에 대한 정보를 자동으로 교환하여 Routing 하게 하는 방법이다.

장점

  • 라우터 간에 서로 라우팅 정보를 주고받아 라우팅 테이블을 라우터가 자동으로 작성하기 때문에 네트워크 관리자는 초기 설정만 해주면 된다.
  • 네트워크의 변화에 능동적으로 대처할 수 있다.

단점

  • 라우터의 메모리를 정적 라우팅보다 많이 차지함

HSRP

HSRP는 Cisco 표준 기술로 네트워크 간 2개 이상의 게이트웨이를 사용할 때 한 개의 경로에 문제가 생기면 다른 경로에서 게이트웨이 역할을 해줄 수 있도록 장비-장비 간 Virtual Gateway를 설정하는 기술이다.

Active 라우터와, Standby 라우터가 존재하는데, Active 라우터가 프레임을 처리하고, Standby 라우터는 Active를 감시하여 Active 라우터가 다운되었을 때 Standby 라우터가 그 역할을 이어받게 된다. 

VRRP(게이트웨이 이중화)

VRRP는 게이트웨이가 다운되었을 때 자동으로 다른 Device가 게이트웨이 역할을 할 수 있도록 하는 프로토콜이다.

HSRP는 시스코지만 VRRP는 표준이므로 멀티벤더 환경에서 많이 사용이 된다. Master 라우터와 Backup 라우터로 수분되며, Master 라우터가 주 게이트웨이 역할이며, 장애 발생 시 Backup 라우터가 그 역할을 수행한다. 

STP

Ethernet Frame이 장비들에서 빙빙 도는 것을 Looping(루핑)이라고 한다. 이 Looping을 방지시켜주는 것이 STP(Spanning Tree Protocol)이다.

 

 

GITHUB

https://github.com/ryudongjae/Backend/blob/master/Interview/Network.md

 

GitHub - ryudongjae/Backend: 💻다양한 백앤드 기술 공부💻

💻다양한 백앤드 기술 공부💻. Contribute to ryudongjae/Backend development by creating an account on GitHub.

github.com


REFERENCE

https://imbf.github.io/interview/2021/03/01/NAVER-Practical-Interview-Preparation-3.html

https://gmldbd94.tistory.com/104 

https://mangkyu.tistory.com/91

728x90
728x90

트랜잭션 격리 수준(TransactionIsolationLevel)

👉 정의

트랜잭션 격리 수준은 동시에 여러 트랜잭션이 처리될 때, 트랜잭션끼리 얼마나 서로 고립되어 있는지 나타내는 것 

트랜잭션 격리 수준은 크게 4가지로 나뉜다.

  1. READ UNCOMMITED
  2. READ COMMITED
  3. REPEATABLE READ
  4. SERIALIZBLE

아래로 내려갈수록 트랜잭션 간 고립 정도가 높아지며, 성능이 떨어지는 것이 일반적이다.
데이터베이스는 ACID특징과 같이 트랜잭션이 독립적인 수행을 하도록 Locking을 통해, 트랜잭션이 DB를 다루는 동안 다른 트랜잭션이 관여하지 못하도록 막는 것이 필요하다.
하지만 무조건 Locking으로 동시에 수행되는 수많은 트랜잭션들을 순서대로 처리하는 방식으로 구현하게 되면 데이터베이스의 성능은 떨어지게 된다.
성능을 높이기 위해서는 무작정 Locking의 범위를 줄이기보다 최대한 효율적인 Locking이 필요하다.

우선 Locking에 대해서 간단하게 알아보자

Locking

  • Lock : 트랜잭션마다 처리의 순차 성을 보장하기 위한 방법이다.(동시성 제어)
    • DBMS 마다 Lock을 구현하는 방식이 다르기 때문에 DBMS를 효과적으로 이용하기 위해서 해당 DB의 Lock에 대한 이해가 필요하다.
    • Shared(공유) lock
      • 데이터를 읽을 때 사용되는 lock
      • 공유 락은 공 유락끼리 동시에 접근이 가능하다.
      • 그러나 공유 락이 설정된 데이터에 배 타락을 사용할 수는 없다.
    • Exclusive(배타) lock
      • 데이터를 변경하고자 할 때 사용되며, 트랜잭션이 완료될 때까지 유지된다.
      • Lock이 해제될 때까지 다른 트랜잭션을 해당 리소스에 접근할 수 없다.
      • 해당 락은 트랜잭션이 수행되고 있는 데이터에 대해서는 접근하여 함께 락을 설정할 수 없다.

🔓READ UNCOMMITED (Lv.0)

  • 커밋되지 않은 데이터에 접근이 가능하 수준으로, N개의 트랜잭션이 하나의 공유 데이터에 접근해도 전혀 보호되지 않는다.
  • 데이터베이스의 일관성을 유지하는 것이 불가능함
  • Dirty Read 발생 : 데이터 정합성 문제가 많이 발생한다.

🔓READ COMMITED (Lv.1)

  • SELECT 쿼리가 수행되는 동안 해당 데이터에 Shared Lock이 걸리는 레벨이다.
  • 트랜잭션이 수행하는 동안 다른 트랜잭션이 접근할 수 없어 대기하게 되고, 커밋이 이루어진 트랜잭션만 조회가 가능하다.
  • Non-Repeatable Read 발생
  • 오라클 데이터베이스와 SQL 서버에서 기본으로 사용하는 격리 수준이다.

🔓REPEATABLE READ (Lv.2)

  • 트랜잭샨이 완료될 때까지 Select 문이 사용되는 모든 데이터에 Shared Lock이 걸린다.
  • 트랜잭션이 범위 내에서 조회한 데이터 내용이 항상 동일함을 보장한다.
  • 다른 클라이언트는 트랜잭션 영역에 해당되는 데이터에 대한 수정이 불가능하다.
  • MYSQL에서 기본으로 사용한다.
  • Non-Repeatable Read 부정합이 발생하지 않고, 자신의 트랜잭션 번호보다 낮은 트랜잭션 번호에서 변경된 것만 보게 된다.

🔓SERIALIZBLE (Lv.3)

  • 트랜잭션이 완료될 때까지 조회 쿼리가 사용되는 모든 데이터에 Shared Lock이 걸리는 레벨
  • 가장 엄격한 격리 수준으로 완벽한 읽기 일관성 모드를 제공하고, 다른 사용자는 트랜잭션 영역에 해당되는 데이터에 대한 수정이나 입력이 불가능하다.

격리 수준이 높아질수록 트랜잭션 간 고립 정도가 높아지며, 성능이 저하된다. 일반적으로 온라인 서비스에는 READ-COMMITED  REPEATABLE READ  하나를 사용한다.

낮은 레벨의 격리 수준을 활용할 때 발생하는 현상들

  • Dirty Read
    • 트랜잭션에서 아직 실행이 끝나지 않은 다른 트랜잭션에 의한 변경사항을 볼 수 있다.
  • Non-Repeatable Read
    • 한 트랜잭션에서 같은 쿼리를 2번 수행할 때 그 사이에 다른 트랜잭션 값을 수정하거나 삭제하면서 두 쿼리의 결과가 다르게 나오는 현상
  • Phantom Read
    • 한 트랜잭션 안에서 일정 범위의 데이터를 2번 이상 읽었을 때, 첫 번째 쿼리에서 없던 데이터가 두 번째 쿼리에서 나타나는 현상

 

😸GITHUB

https://github.com/ryudongjae/blog-ex/tree/master/src/main/java/com/blog/blogex

 

GitHub - ryudongjae/blog-ex: 📁블로그 예제 코드

📁블로그 예제 코드 . Contribute to ryudongjae/blog-ex development by creating an account on GitHub.

github.com

 

 

REFERENCE

728x90

'Dev' 카테고리의 다른 글

[기술면접]데이터베이스(Database)  (0) 2022.01.12
[기술면접]네트워크(Network)  (0) 2022.01.11
[프로그래밍] 애자일 소프트웨어 개발  (0) 2021.11.13
[AWS]EC2에 JDK 11설치하기  (0) 2021.10.25
세션 관리 전략  (0) 2021.10.21

[Spring] Maven과 Gradle

ryudjae
|2022. 1. 6. 23:18
728x90

Spring 프로젝트를  시작할 때 빌드 도구를 Maven과 Gradle 중 하나를 선택해서 진행해야 한다. 예전에 스프링을 처음 배울 때는 Maven을 사용하는 사람들이 꽤 많았다. 그러나 요즘은 대부분이 Gradle을 사용한다. 

이 두 종류의 빌드도구를 알아보기 전에 빌드 도구에 대해서 먼저 알아보자.

 

🛠빌드도구

프로젝트에서 작성한 자바 코드와 프로젝트 내에 필요한 각종 설정 파일들을 JVM이나 WAS가 인식할 수 있도록 패키징 해주는 과정을 빌드 도구라고 한다.

예를 들면 어떤 라이브러리를 사용할 때, 만약 빌드 도구가 없다면 번거롭게 개발자가 모두 다운받아서 사용하여야 한다. 그러나 빌드도구가 있으면 설정 파일에 필요한 라이브러리 종류와 버전들, 종속성 정보를 명시하며 필요한 라이브러리들을 설정 파일을 통해 자동으로 다운로드해주고 관리까지 해주는 것이다.

 

⛏Maven

  • Maven은 프로젝트 빌드/관리를 위한 모듈이고, 자바 빌드 도구로서 Apache Ant를 대안으로 나온 것이다.
  • 프로젝트 객체 모델 POM의 개념을 기반으로 Maven은 중앙 정보에서 프로젝트의 빌드, 보고 및 문서를 관리한다.
  • 빌드 중인 프로젝트, 빌드 순서, 다양한 외부 라이브러리 종속성 관계를 pom.xml에 명시한다.
  • Maven은 외부 저장소에서 필요한 라이브러리와 플러그인들을 다운로드 한 다음 , 로컬 시스템의 캐시에 저장한다.

Maven의 설정 파일 Pom.xml 예제

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>

   <groupId>com.example</groupId>
   <artifactId>demo-maven</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <packaging>jar</packaging>

   <name>demo-maven</name>
   <description>Demo project for Spring Boot</description>

   <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>1.5.4.RELEASE</version>
      <relativePath/> <!-- lookup parent from repository -->
   </parent>

   <properties>
      <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
      <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
      <java.version>1.8</java.version>
   </properties>

   <dependencies>
      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter</artifactId>
      </dependency>

   <build>
      <plugins>
         <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
         </plugin>
      </plugins>
   </build>


</project>

 

⛏Gradle

  • Maven과 Ant의 장점을 조합해서 만든 빌드 도구이다.
  • 멀티 프로젝트 빌드를 도울 수 있도록 디자인되었다.
  • Gradle은 프로젝트가 어느 부분이 업데이트되었는지 알기 때문에, 빌드에 점진적으로 추가할 수 있다.

Gradle 설정 파일 build.gradle 예제

buildscript {
    ext {
        springBootVersion = '1.5.4.RELEASE'
    }
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
    }
}

apply plugin: 'java'
apply plugin: 'idea'
apply plugin: 'org.springframework.boot'

version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8

repositories {
    mavenCentral()
}


dependencies {
    compile('org.springframework.boot:spring-boot-starter')
}

 

🪓Maven VS Gradle

우선 둘 중에는 Gradle이 확실히 우세한 것 같다. Gradle에 보면 Maven과 비교 문서가 있다. 뭐 그만큼 자신 있다는 거 아닐까,,,

그럼에도 불구하고 많은 사람들이 Maven에서 넘어오지 못한 이유는 익숙함 때문이 아닌가 싶다

  • Gradle이 더 늦게 출시했기 때문에 사용성 , 성능 부분에서는 비교적 뛰어난 스펙을 가지고 있다.
  • Maven에서 사용하는 XML로 빌드를 정의하기에는 어려움이 많다. 우선 가독성이  떨어지고, 의존관계가 복잡한 프로젝트를 설정하기에는 부적절하다.
  • Gradle은 groovy를 사용하기 때문에, 동적인 빌드는 Groovy 스크립트로 플러그인을 호출하거나 직접 코드를 짜면 된다. 
  • Configuration Injection 방식을 사용해 Maven에서 공통 모듈을 상속해서 사용하는 단점을 커버했다. 
  • 설정 주입 시 프로젝트의 조건을 체크할 수 있어서 프로젝트 별로 주입되는 설정을 다르게 할 수 있다.
  • 설정 파일만 보더라도 Gradle이 직관적으로 보기 편하다.

 

그리고 Gradle이 Maven보다 최대 100배 정도 빠르다.

728x90
728x90

공부를 하던 중에 원래는 거의 동일하다고 알고만 있던 REST와 HTTP API가 다르다는 걸 봐서 한번 정리 해볼까 한다.

 

우선 두개의 API의 개념을 확립하기 위해서는 API에 대해 먼저 알아보자

📡API

API는 Application Programming Interface의 약자로 컴퓨터 혹은 컴퓨터 프로그램끼리의 연결, 즉 컴퓨터 혹은 컴퓨터 프로그램끼리 소통을 의미한다.이러한 소통을 어떻게 할 지 문서로 정리하거나 공통의 기준을 정한 것을 API  명세라고 한다. 

한 컴퓨터/프로그램이 소통하는 방식이 상대방 컴퓨터/프로그램과 다를 수 있기 때문에, 서로가 공통적으로 이해할 수 있는 기준을 명시한 것이다.

REST API와 HTTP API는 웹에서의 소통에 사용되기 때문에 WEB API에 해당한다. WEB API는 웹에서의 통신을 기반으로 하는 API이다. 소통을 하기 위해서는 웹을 통해 소통하는 방식(Method), 어떤 자원(Resource)들에 대해서 소통할 것인가 등에 대한 기준이 추가로 필요하다.

 

📡HTTP API

HTTP(Hypertext Trasnfer Protocol)API는 두 시스템 간의 통신 프로토콜로 Hypertext Transfer Protocol을 사용하는 API이다.HTTP API는 endpoint를 API gateway로 활용하여, HTTP 요청을 통해서 서버에 접근할 수 있도록 만들어준다.

 

📡REST API

REST는 Representational State Transfer의 약자로 클라이언트와 서버 간에 데이터를 공유하기 위한 모범 사례를 정의하는 규칙의 집합이다. 본질적으로 복잡성에 관계없이 CRUD 기능만 사용하도록 요청하는 HTTP 또는 다른 API를 만들 때 사용되는 디자인 스타일이다.

REST한 프로그램이 되려면 CRUD 방식의 메서드, HTTP 메서드 중에 GET,POST,DELETE,PUT 만을 사용한다.

메서드의 일부를 무시하는 것이 직관적이지 않은 것처럼 보일 수 있지만 궁극적으로 복잡한 동작을 간단한 용어로 설명해야 한다.이런식으로 메서드를 제한 했을때 , 인터페이스가 단순해지고 추후 확장도 쉽다는 장점이 생기고, 더 간단한 방법과 다른 RESTAPI와의 더 쉬운 통합으로 이어진다.

다음으로 모든 HTTP API가 REST API는 아니기 때문에, REST API로 간주되기 위해 다음 요구사항을 충족해야 한다.

  • Client-Server
    • REST 애플리케이션에는 애플리케이션 데이터와 상태를 서버가 관리한다. 서버는 사용자 상호작용을 처리하는 클라이언트와 통신한다.
    • 서버와 클라이언트를 분리하면서, 클라이언트와 서버를 독립적으로 관리하고 업데이트가 가능하다.
  • Stateless
    • 클라이언트의 상태는 자체적으로 관리된다.클라이언트가 서버에 보내는 요청은 요청을 실행하기 위한 모든 정보를 포함해야한다.
  • 캐시화 가능
    • 서버는 응답을 캐시 가능 여부로 표시해야 한다. 시스템과 클라이언트는 성능을 향상시키기 위해 편리할 때 응답을 캐시할 수 있다.
    • 또한 캐시할 수 없는 정보를 없애므로 오래된 데이터를 사용하지 않는다.
  • 균일한 인터페이스
    • REST의 가장 잘 알려진 특성이다. REST 서비스는 일관된 네임 스페이스를 사용하여 데이터를 리소스로 제공한다.
  • 계층화된 시스템
    • 구성요소들은 서로의 계츨 너머를 볼 수 없다.각각의 범위가 제한되므로 개발자들이 인증 관현 보안을 강화하거나 성능을 개선하기 위해 로드 밸런서나 프록시를 추가하는 것이 쉽다.

⛏정리 

REST API와 HTTP API는 거의 비슷한 개념으로 사용되고 있는거 같지만 REST API와 HTTP API는 엄밀히 말하면 다르다.

REST API는 HTTP API에 여러가지 제약조건이 추가된 것이다. 그런데 까다로운 제한이 추가되는데도 불구하고 REST API를 사용하는 이유는 애플리케이션을 만들 때 이런 특성들을 혼합하면, 견고한 경계를 가지면서 관심사가 잘 분리된 구조로 만들 수 있다.

클라이언트는 서버에 요청을 했을때만 데이터를 받아 그 데이터를 가공하거나 표시하는데 활용한다. 만약 클라이언트의 상태가 변경된다면 서버에 알린다. REST API에서 데이터가 구현되는 과정은 클라이언트가 알 수 없지만 , 데이터 그 자체를클라이언트에게 숨기지는 않는다.


REFERENCE

728x90

'Dev > Network' 카테고리의 다른 글

HTTP 메서드(GET,POST,PUT,PATCH,DELETE)  (1) 2021.07.12
[Network]HTTP와 HTTPS  (0) 2021.06.21
[Network]HTTP 상태코드  (0) 2021.05.23