내가 받아봤던 개발자 면접질문과 기본 지식 정리

rvlwldev·2023년 6월 7일
0

경력이 있어서 그런지 기술 관련 내용을 엄청 안물어봄
그래도 지나가는 말이나 언급되었던 내용과 관련내용을 정리해봄
주로 커뮤니케이션과 퇴사 후 구직단계 사이의 공백을 주로 물어봄

DB

데이터 무결성

데이터의 정확성, 일관성, 유효성을 유지하는 것
정확성은 데이터의 누락, 중복이 없다는 것
일관성은 원인과 결과가 같은, 같은 Input이 같은 Output을 보장되어 변하지 않는 것
유효성은 의미가 없는 데이터나 유효한 범위에 속한 데이터를 의미

개체 무결성(Entity integrity)

기본키(Primary Key) 제약, 각 ROW는 기본키를 가져야 한다.

테이블은 기본키를 지정하고 그에 따른 무결성 원칙을 지켜야 하는 조건
테이블의 ROW가 유일하게 식별되고, 중복 데이터를 방지

기본키는 Unique하며 Null이 들어갈 수 없는 조건

아래 키 무결성(Key integrity)을 포함하는 개념

키 무결성(Key integrity)

레코드에 데이터는 하나의 식별할 수 있는 Key의 존재 조건
기본키를 구성하는 컬럼의 값은 다른 행에서 중복되면 안되는 제약

참조 무결성(Referential integrity)

외래키(Foreign Key) 제약, 외래키는 Null이거나 참조하는 테이블의 PK를 데이터로 가지며 관계를 맺는다.

외래키로 테이블 사이의 관계가 일관되어야 하며 참조하는 테이블의 무결성을 지켜야 한다.
(참조하는 테이블에 존재하지 않는 PK는 가질 수 없다는 뜻)

도메인 무결성(Domain integrity)

필드의 무결성이라고도 할 수 있다.
데이터가 NULL이 아닐 때, 정해진 포멧을 지켜야 하는 제약
(숫자 컬럼에는 숫자 데이터, 문자 컬럼에는 문자 데이터 ... )

Null 무결성(Null integrity)

데이터 컬럼에 Null을 허용 여부의 조건
Null이 허용되지 않는다면, 필수적으로 해당 컬럼에 데이터를 가져야한다.

고유 무결성(Unique integrity)

레코드에 존재하는 데이터가 유일해야 하는 조건
모든 ROW는 유일해야한다. (즉, 중복이 있으면 안된다.)

관계 무결성(Relationship integrity)

테이블의 어느 한 레코드의 삽입 가능 여부 또는 한 테이블과 다른 테이블의 레코드들 사이의 관계에 대한 적절성 여부를 지정한 조건

1:1, 1:N 등의 관계에서 주체가 되는 테이블과 그 반대의 테이블로 관계가 성립되어야 하는 제약

이외에도 동시성 제어 무결성, 보안 무결성 등이 있다.

정규화(Normalization)

테이블은 데이터 무결성을 따르는 구조로 일관성과 정확성을 보장하고, 중복을 최소화해서 성능과 효율성을 고려하여 설계하는 과정

1정규화 (1NF)

테이블의 각 컬럼은 원자값(Atomic value)을 가져야 한다.
또한 중복된 데이터를 포함하지 않아야 한다.
때문에 테이블은 하나 이상의 열로 구성된다.

원자값이란 이름 처럼 더 이상 나눠질 수 없는 값
예시로 이름을 더 이상 나눌 수 없지만 주소는 나라, 우편번호 등으로 나눠짐

2정규화 (2NF)

테이블의 모든 컬럼은 기본키에 완전함수종속(Fully functional dependent)되어야 한다. 이를 위해 부분 종속성(Partial dependency)을 제거하고 기본 키를 기준으로 테이블을 분해한다.

쉽게 말해서
완전함수종속은 키가 바뀌면 해당 키의 존재하는 다른 컬럼의 데이터도 변경
부분종속성은 키가 바뀌어도 다른 컬럼이 바뀌지 않는 데이터

2NF는 이 부분종속성을 제거하기 위해 테이블을 분리하는 정규화 과정

3정규화 (3NF)

테이블의 모든 열이 기본키에 대해 이행적 함수 종속(Transitive functional dependency)을 갖지 않아야 합니다.
이를 위해 이행 종속성(Transitive dependency)을 제거하고 테이블을 분리한다.

이행적함수종속은 위 완전함수종속이 연속된 형태
예를 들어 A가 B에 종속하고, B가 C에 종속한다면, A는 C에 대해 이행적으로 종속된 것.

이행종속성은 위 예시에서 A가 C에 대해서 이행적을 종속되지 않는 것

정규화 예시

학생과 성적테이블이 존재한다.

학생테이블

컬럼 타입
SEQ INTEGER (PK)
학생명 String

성적테이블

컬럼 타입
성적SEQ INTEGER (PK)
학생SEQ INTEGER (FK)
국어성적 INTEGER
수학성적 INTEGER
영어성적 INTEGER

위 테이블을 정규화한다면, 어떻게 할 것인가.

과목테이블을 추가한다.

컬럼 타입
과목코드 INTEGER (PK)
과목명 String

그리고 성적테이블을 아래와 같이 수정한다.

컬럼 타입
성적SEQ INTEGER (PK)
학생SEQ INTEGER (FK)
과목코드 INTEGER (FK)
성적 INTEGER

위와 같이 수정하면 과목이 추가되어도 JPA, SQL 문이 수정될 일이 적다.

-- 응시과목이 2개 이상인 학생의 각 성적 통계 예시

SELECT Student.학생명	  AS 이름
     , Grade.과목명
  	 , AVG(Grade.성적) AS 평균
  FROM 학생 Student
 INNER JOIN 성적 Grade
    ON Student.SEQ = Grade.학생SEQ
 INNER JOIN 과목 Subject
    ON Grade.과목코드 = Subject.과목코드
-- WHERE 필요없음
 GROUP BY Student.학생명
  		, Subject.과목코드
HAVING COUNT(Student.SEQ) > 1

이 설명을 어설프게 했다.
이래서 말을 잘해야한다.

INDEX 동작 방식

B-TREE 인덱싱
데이터를 정렬된 상태로 유지하며 효율적인 검색, 삽입 및 삭제 작업을 수행할 수 있도록 지원한다.
주로 범위 검색(range search)에 뛰어난 성능을 발휘한다.
대용량의 데이터를 효율적으로 처리할 수 있다.
또한 데이터의 변경 작업에 대해서도 효율적으로 처리할 수 있어 실시간으로 데이터를 업데이트하는 환경에 적합하다.
균형 트리 형태, 다단계 인덱싱, 분할과 병합, 다중 키 등을 지원한다.

MySQL

해시 인덱스 (InnoDB 스토리지 엔진 한정)

MySQL은 해시 인덱스를 메모리 기반 테이블에 대한 인덱싱에 사용할 수 있다.
해시 인덱스는 동등 비교에 기반한 빠른 검색을 제공하며 같은 해시값이 나오는 충돌 가능성을 대비해서 체이닝 기법을 사용한다.

그러므로 MySQL에서의 쿼리의 성능을 최적화 하기 위해서 BETWEEN, > , <
등의 연산자는 지양해야 한다.
= 연산자로 레코드의 범위를 줄이는 것이 성능개선에 효율적일 것이다.

MSSQL

ColumnStore 인덱스 (2012버전부터 지원)

컬럼 단위로 데이터를 저장하여 압축 및 저장/조회 쿼리 성능을 향상시킨다.
(수정/삭제에는 거의 영향이 없다. 오히려 더 느려질 수 있다.)

대량의 데이터를 조회하는 쿼리를 여러 번 반복할 경우,
MSSQL은 이전에 수행한 쿼리 결과를 컬럼 단위로 캐시하고 컬럼스토어 인덱스를 활용하여 다음 쿼리 수행 시 점진적으로 빨라진다.

실제 과거 프로젝트에서 정렬 + 연산/집계함수가 들어간 대규모의 조회쿼리 작성 시,
HAVING, WHERE 등으로 범위를 최대한 줄이며 최적화 하고,
다른테이블과의 참조가 없는 컬럼에 따로 인덱스를 지정해 줘서 ColumnStore 인덱스 사용을 유도했다.
이로 인해 연산/집계함수 결과 컬럼이 캐시되도록 유도되어 수 차례 조회쿼리 수행 시 점차 빨라지게 개선한 경험이 있다.

ORACLE

비트맵 인덱스

대량의 데이터에 대한 비트맵 기반의 효율적인 질의를 지원한다.

값의 존재 여부를 비트 벡터(Bit Vector)로 표현하여 인덱싱하는 방식
등호(Equality) 비교에 효과적이며, AND, OR, NOT과 같은 비트 연산을 활용하여 빠른 집합 연산이 가능하다.

함수 기반 인덱스

컬럼 값의 특정 함수를 적용하여 인덱싱하는 방식

여러 문자열 변환 함수, 날짜 변환 등의 조회쿼리 결과를 인덱스로 저장하여 검색 성능을 향상시킨다. 잦은 업데이트가 이루어 지는 로직에서는 성능에 악영향을 미칠 수 있다.

실제로 여러 SELECT 절에 여러 함수로 조회되는 쿼리를 티베로로 Migration 할때 WHERE 문으로 최대한 범위를 좁혀 개선한 경험이 있다.

옵티마이저의 인덱스 결정에 영향을 주는 힌트 주석 예시)

SELECT /*+ INDEX(table_name index_name) */ column1, column2
  FROM table_name
 WHERE column3 = 'value';

기타 (DUAL 의 존재)

DUAL은 시스템 내장 테이블로서 사용되는 특별한 테이블이다.
실제 데이터를 저장하지 않고, 단일 행 하나를 가진다.
SELECT 문과 같은 쿼리에서 임시로 사용된다.
스칼라 서브쿼리에서 조인을 회피하거나 메모리 접근을 최소화할 때 사용될 수 있다.

DB 필수 개념

트랜잭션

데이터가 일관적으로 처리되기 위한 하나의 논리적 작업단위

  • 원자성 : 하나의 트랜잭션의 데이터 처리는 모두 수행되거나 아무것도 수행되지 않아야 한다.
  • 일관성 : 트랜잭션 이전과 이후에 DB는 미리 정의된 일관성 규칙이 적용되어야 한다.
  • 격리성 : 다른 트랜잭션으로부터 격리되어야 한다. 동시에 실행 중인 여러 트랜잭션은 서로 간섭 없이 독립적으로 수행되어야 한다.
  • 지속성 : 트랜잭션이 성공적으로 완료되면, 그 결과는 영구적으로 저장되어 데이터의 지속성이 보장되어야 한다.

ISOLATION 레벨 (격리수준)

트랜잭션들이 동시에 실행될 때 어떻게 상호작용하는지를 제어하는 설정

READ UNCOMMITTED (미커밋된 읽기)

가장 낮은 격리수준
트랜잭션이 수행 중인 다른 트랜잭션에서 변경 중인 데이터를 읽을 수 있다.
이로 인해 Dirty Read(더티 리드)라는 현상이 발생할 수 있다.

Dirty Read는 하나의 트랜잭션이 다른 트랜잭션에서 아직 커밋되지 않은 데이터를 읽는 현상을 의미한다.

READ COMMITTED (커밋된 읽기)

각 트랜잭션이 커밋된 데이터만 읽을 수 있도록 설정한다.
Dirty Read는 발생하지 않는다.

하지만 Non-Repeatable Read(반복 불가능한 읽기)라는 현상이 발생할 수 있다.

Non-Repeatable Read는 하나의 트랜잭션이 같은 쿼리를 여러 번 실행할 때, 각 실행마다 다른 결과를 반환하는 현상을 의미한다.

REPEATABLE READ (반복 가능한 읽기)

한 트랜잭션이 읽은 데이터를 다른 트랜잭션에서 변경하지 못하도록 설정한다.

따라서 Non-Repeatable Read는 발생하지 않는다.

하지만 Phantom Read(유령 읽기)라는 현상이 발생할 수 있다.

Phantom Read는 하나의 트랜잭션이 동일한 쿼리를 여러 번 실행할 때,
각 실행마다 결과 집합에 새로운 레코드가 추가되거나 삭제되는 현상을 의미한다.

SERIALIZABLE (직렬화):

가장 높은 격리 수준
모든 트랜잭션을 직렬화하여 동시에 실행되는 것처럼 처리한다.
따라서 Dirty Read, Non-Repeatable Read, Phantom Read 모두 발생하지 않습니다.

하지만 동시성을 제한하고 처리 속도를 늦출 수 있다.

팬텀리드가 일어나는 경우
1. 트랜잭션 A가 WHERE 절을 포함하는 범위 쿼리를 실행한다.
2. 트랜잭션 B가 트랜잭션 A가 실행 중인 동안 데이터를 삽입, 갱신 또는 삭제한다.
3. 트랜잭션 A가 동일한 쿼리를 다시 실행하면 트랜잭션 B에 의해 변경된 새로운 데이터가 표시되어 일관성을 잃는다.

과거 프로젝트에서 팬텀리드를 해결한 방법

SELECT COUNT(1) AS RESULT
  FROM sys.dm_tran_locks
 WHERE resource_type = 'OBJECT'
   AND resource_database_id = DB_ID('데이터베이스이름')
   AND resource_description = '스키마이름.테이블명'

결과값이 1 이상이라면 특정 프로시저의 실행하지 않고
일괄{?}업무 결과가 반영중 입니다. 라는 예외처리로 메세지를 띄웠다.

옵티마이저 (Optimizer)

DB에서 쿼리의 실행 계획을 생성하고 최적화하는 역할을 담당한다.
옵티마이저는 쿼리를 실행하기 전에 데이터베이스의 스키마, 인덱스, 통계 정보 등을 분석하여 최적의 실행 계획을 결정한다.
MySQL, MSSQL, Oracle은 각각 자체적인 옵티마이저를 가지고 있다.

Spring & Java

Interface & Abstract 차이

둘다 추상화를 통해 다형성을 구현하는 데 사용되는 개념이지만
가장 큰 차이점은 사용의도이다.
추상 클래스는 '~이다.' , 인터페이스는 '~할 수 있다'

Abstract Class

클래스 간의 상속 관계를 표현하고 공통된 코드를 재사용

일반적인 클래스와 마찬가지로 필드, 생성자, 메소드를 포함할 수 있다.
상속계층구조로 표현된다.
자식클래스는 하나의 부모클래스만 상속 받을 수 있다.

공통된 특성을 추상화하여 코드 재사용성을 높인다.
부모클래스에 선언된 추상메소드를 구현해야 한다.

Interface

클래스 간의 관계를 느슨하게 형성하고 다형성을 구현하기 위해 사용

필드를 가질 수 없고, 추상 메서드와 디폴트 메서드, 정적 메서드를 선언할 수 있다.
모든 메서드는 기본적으로 추상 메서드이며, 구현클래스에서 반드시 구현해야한다.

다른 클래스들의 공통된 기능을 정의하여 관계를 형성한다.
이로써 다형성을 구현한다.

하나의 클래스가 여러개의 클래스를 구현할 수 있다.
때문에 다른 인터페이스들의 기능을 조합할 수 있다.

Spring AOP 설명

Aspect Oriented Programming의 약자로 관점 지향 프로그래밍이라고 불린다.

관점 지향은 쉽게 말해 어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으로 나누어서 보고 그 관점을 기준으로 각각 모듈화하겠다는 것이다.
여기서 모듈화란 어떤 공통된 로직이나 기능을 하나의 단위로 묶는 것을 말한다.

취지

소스 코드상에서 다른 부분에 계속 반복해서 쓰는 코드들을 발견할 수 있는 데 이것을
흩어진 관심사 (Crosscutting Concerns) 라고 부른다.

흩어진 관심사를 Aspect로 모듈화하고 핵심적인 비즈니스 로직에서 분리하여 재사용하겠다는 것이 AOP의 취지이다.

사용되는 용어와 설명

  • Aspect
    위에서 설명한 흩어진 관심사를 모듈화 한 것. 주로 부가기능을 모듈화함.
  • Target
    Aspect를 적용하는 곳 (클래스, 메서드 ... )
  • Advice
    실질적으로 어떤 일을 해야할 지에 대한 것, 실질적인 부가기능을 담은 구현체
  • JointPoint
    Advice가 적용될 위치, 끼어들 수 있는 지점. 메서드 진입 지점, 생성자 호출 시점, 필드에서 값을 꺼내올 때 등 다양한 시점에 적용가능
  • PointCut
    JointPoint의 상세한 스펙을 정의한 것. 'A란 메서드의 진입 시점에 호출할 것'과 같이 더욱 구체적으로 Advice가 실행될 지점을 정할 수 있음

DTO, DAO, VO 차이점

DTO

DTO는 계층간(Controller, View, Business Layer) 데이터 교환을 위한 자바 빈즈(Java Beans)를 의미한다.
DTO는 로직을 가지지 않는 데이터 객체이고 getter/setter메소드만 가진 클래스를 의미한다.
DTO(Data Transfer Object)는 데이터 전송(이동) 객체라는 의미를 가지고 있다.
DTO는 주로 비동기 처리를 할 때 사용한다.

DAO

DAO는 DB의 data에 접근하기 위한 객체로 직접 DB에 접근하여 데이터를 삽입, 삭제, 조회 등 조작할 수 있는 기능을 수행한다.

보통 DB 커넥션 라이브러리 등이 커넥션풀까지 제공되고 있기 때문에 DAO를 별도로 만드는 경우는 드물다.

VO

VO는 Read-Only속성을 값 오브젝트
VO의 핵심 역할은 equals()와 hashcode() 를 오버라이딩 하는 것이다.
VO 내부에 선언된 속성(필드)의 모든 값들이 VO 객체마다 값이 같아야, 똑같은 객체라고 판별한다.

Stream 의 forEach 와 map 의 다른점?

둘다 스트림 객체의 내부 값을 변경할 수 있다는 공통점이 있다.

그런데 이 둘의 차이점은?

map은 스트림의 값 자체를 변경하기 위한 함수이다.
forEach는 값을 꺼내서 그 값으로 작업을 하는 것이다.

forEach는 일반적인 for-loop 보다 오버헤드가 많이 발생하며 처리순서를 보장하지 않는다.
스트림 내부의 값 각각이 stream() 메서드로 생성되고 한번의 반복이 끝나면 버려지기 때문이다.

때문에 forEach는 지양해야 한다.

JPA

Setter를 지양하는 이유

@Setter는 사용 의도/목적이 분명치 않다. (Update인지 Create인지)

모든 영역에서 접근할 수 있어서 무분별한 변경으로 객체의 일관성을 보장하기 어렵다.
(때문에 빌더패턴을 권장)

Setter을 무작정 사용한다면 해당 엔티티의 값들이 언제 어디서 변해야 하는지 코드상으로 명확하게 구분할 수가 없어 유지보수의 복잡성을 증가시킬 수 있디.

Dirty Checking

CS/개발론

Hash 란?

Hash는 해시 함수(hash function)를 통해 생성되는 값이다.
이 값은 해시값(hash value) 또는 해시코드(hash code)라고도 불린다.

해시 함수는 입력값에 대해서 고유한 해시값을 생성하는 특징이 있다.
같은 입력에 대해서는 항상 같은 해시 값을 반환한다, 약간의 변화에도 완전히 다른 해시 값이 생성된다.
때문에 해시 함수는 데이터의 무결성 검증, 암호화, 데이터베이스 검색 및 저장, 압축 등 다양한 분야에서 활용된다.

프로그래밍 언어에서
해쉬는 보통 Key-Value로 이루어진 해시테이블(hash table)을 구현하는 데 사용된다.
키에 해쉬값을 대입한뒤 배열의 인덱스로 바로 사용하여 특정 위치에 값을 저장하거나 검색한다.
이 인덱스로 인해 Key에 바로 접근할 수 있으며 빠른 탐색/수정/삭제가 가능하게 한다.
대표적으로 자바의 HashMap, HashSet 등의 자료구조가 있다.

충돌이 나면 체이닝 알고리즘을 사용하여 같은 공간에 2개의 값을 저장하고, 그 중 하나의 값을 찾아야 된다면 같은 공간에 접근해 해당 값을 찾는 식으로 동작한다.

OOP SOLID 원칙

좋은 설계를 위해 지향하는 원칙들이며 코드는 유연하고, 확장할 수 있고, 유지보수가 용이하고, 재사용할 수 있어야한다.
(클린코드 책의 저자인 로버트 C. 마틴이 세운 원칙)

단일 책임 원칙 SRP

Single Responsibility Principle
단일의 클래스나 모듈은 하나의 책임만을 가져야 한다.
클래스가 변경되는 이유는 단 하나뿐이어야 한다.
이를 통해 클래스의 응집도를 높이고 변화에 대한 영향을 최소화한다.

개방-폐쇄 원칙 OCP

Open/Closed Principle
클래스, 모듈, 함수 등은 확장에는 OPEN, 변경에는 CLOSED.
새로운 기능이 추가되거나 변경이 필요할 때 기존 코드를 수정하지 않고 확장을 통해 변경을 처리할 수 있어야 한다.

리스코프 치환 원칙 LSP

Liskov’s Substitution Principle
부모 객체는 자식 객체로 치환되도 기능의 일관성을 유지해야 한다.
서브 클래스는 슈퍼 클래스로 사용될 때 어떠한 기능도 손상시키거나 무효화해서는 안 됩니다.

인터페이스 분리 원칙 ISP

Interface Segregation Principle
클라이언트는 자신이 사용하지 않는 메서드에 의존하지 않아야 한다.
한 클래스가 필요로 하는 인터페이스만 구현하도록 분리해서
클라이언트가 불필요한 의존성을 가지지 않도록 해야한다.

의존성 역전 법칙 DIP

Dependency Inversion Principle
추상화된 것은 구체적인 것(구현된 것)에 의존해서는 안된다.
부모는 자식에게 의존하면 안된다. 양쪽 모두 추상화된 것에 의존해야 한다.
이를 통해 모듈 간의 결합도를 낮추고 유연성을 확보해야 한다.

함수형 프로그래밍

반응형 프로그래밍

비동기적인 데이터 흐름과 변경에 대응하는 프로그래밍 패러다임

옵저버블(Observable)과 옵서버(Observer)

옵저버블은 데이터 스트림을 나타내는 객체이며 데이터의 생산자
옵서버는 옵저버블로부터 데이터를 받아 처리하는 객체로, 데이터의 소비자
옵저버는 옵저버블의 변화에 대응하여 알림을 받고, 필요한 작업을 수행한다.

비동기 작업을 처리하기 위해 콜백(callback) 함수, 프로미스(Promise), 비동기 제너레이터(Async/Await) 등을 사용하여 비동기 코드를 효율적으로 작성하고 데이터 흐름을 관리한다.

자바에서는 퓨처(Future)객체, 콜백(Callback)타입, 리액티브 스트림(Reactive Streams) 등으로 구현할 수 있다.

WebFlux라는 모듈을 사용한다면 Publisher-Subscriber 패턴을 사용하여 데이터를 비동기적으로 처리한다.

HTTP 메서드

https://velog.io/@cv_/HTTP-Method-알아보기

가비지컬렉션(GC)

SCOPE

변수 또는 식별자(identifier)가 유효한 범위를 의미한다.
작은 스코프부터 큰 스코프로 범위를 탐색한다.

스크립트함수에대한것

JS 같은 스크립트 언어에서 코드를 모듈화하고 재사용하기 위해 사용되는 기능
스크립트 언어는 주로 프로그래밍 언어보다는 간단한 작업이나 스크립트를 실행하기 위해 사용
사실 이걸 왜 물어보는지 싶었다.

세션 & 쿠키

사용자 식별과 상태 관리를 위한 메커니즘

  • 세션은 서버 측에, 쿠키는 클라이언트 측에서 상태 정보를 관리
  • 세션은 서버에 데이터를 저장하고 클라이언트에 전달,
    쿠키는 클라이언트에 데이터를 저장하고 서버로 전송
  • 세션은 서버 측에 데이터를 저장하기 때문에 보안이 더 우수
    쿠키는 클라이언트 측에 저장되므로 상대적으로 보안에 취약
  • 세션은 더 많은 데이터를 저장할 수 있지만, 쿠키는 크기가 제한적입니다.
  • 세션은 브라우저를 종료하거나 세션이 만료되면 종료되지만
    쿠키는 설정된 만료일까지 유지될 수 있습니다.

REST API

기타

파이썬으로 핑퐁게임을 구현할 때,
Stackoverflow (1000번의 재귀 제한)을 뚫고
pingpong(30000) 을 구현하는 방법에 대한 의견을 서술

DevOps

도커 사용경험
학습내용 : https://velog.io/@cv_/Docker-간단하게-알아보기

쿠버네티스 사용경험

AWS로 파이프라인 구축 경험

AWS 파이프라인이란?
애플리케이션 개발 및 배포 과정을 자동화하기 위한 서비스 (CI/CD 자동화)

1. 소스 스테이지(Source Stage)

소스 스테이지는 코드를 저장하고 있는 소스 코드 형상 관리 도구(Git, AWS CodeCommit 등)와 연결되어 코드 변경 사항을 감지합니다.
변경 사항이 발생하면 자동으로 빌드 단계로 이동합니다.

2. 빌드 스테이지(Build Stage):

빌드 스테이지에서는 소스 코드를 컴파일하고 테스트하며, 필요한 빌드 아티팩트를 생성합니다.
이 단계에서는 품질 테스트, 정적 코드 분석, 문서 생성 등의 작업을 수행할 수 있습니다.

3. 배포 스테이지(Deploy Stage):

배포 스테이지에서는 빌드된 아티팩트를 프로덕션 환경으로 배포합니다.
이 단계에서는 AWS 서비스를 활용하여 애플리케이션을 구성하고 프로비저닝합니다.
예를 들어, AWS Elastic Beanstalk, AWS Lambda, Amazon EC2 등을 사용하여 애플리케이션을 배포할 수 있습니다.

4. 테스트 스테이지(Test Stage):

테스트 스테이지에서는 배포된 애플리케이션을 테스트합니다.
이 단계에서는 자동화된 테스트, 성능 테스트, 사용자 인터페이스(UI) 테스트 등을 수행하여 애플리케이션의 품질을 검증합니다.

5. 프로덕션 스테이지(Production Stage):

프로덕션 스테이지는 배포 및 테스트를 마친 애플리케이션을 실제 운영 환경에 배포하는 단계입니다.
이 단계에서는 사용자가 실제로 애플리케이션을 사용하고, 모니터링 및 로깅을 통해 애플리케이션의 성능과 안정성을 지속적으로 관찰합니다.

기타 AWS 기능들 정리필요

Jenkins (오픈소스)

젠킨스(Jenkins)는 지속적 통합(Continuous Integration, CI) 및 지속적 배포(Continuous Deployment, CD)를 지원하는 자동화 도구입니다. 소프트웨어 개발 프로세스에서 젠킨스는 소스 코드의 통합, 빌드, 테스트, 배포 등을 자동화하여 개발자들이 더 빠르고 신뢰할 수 있는 방식으로 소프트웨어를 개발하고 배포할 수 있도록 돕습니다.

젠킨스는 다음과 같은 기능을 제공합니다:

1. 지속적 통합(CI)

젠킨스는 코드 저장소(Git, SVN 등)와 연동하여 소스 코드의 변경 사항을 감지하고 자동으로 빌드 프로세스를 실행합니다. 이를 통해 여러 개발자가 작업한 코드를 통합하고 충돌이나 빌드 오류를 사전에 감지할 수 있습니다.

2. 자동화된 빌드

젠킨스는 소스 코드를 가져와 컴파일, 패키징, 테스트 등의 빌드 작업을 자동화합니다. 이를 통해 일관된 빌드 프로세스를 유지하고 개발자들이 더 빠르게 소프트웨어를 빌드할 수 있습니다.

3. 자동화된 테스트

젠킨스는 다양한 유형의 테스트를 자동화하여 코드 변경에 따른 잠재적인 문제를 탐지합니다. 단위 테스트, 통합 테스트, 성능 테스트 등을 자동으로 실행하여 소프트웨어 품질을 향상시킵니다.

4. 지속적 배포(CD)

젠킨스는 빌드된 소프트웨어를 자동으로 배포하고 필요한 환경에 적용하는 작업을 자동화합니다. 배포 파이프라인을 구축하여 스테이징 환경, 프로덕션 환경 등으로의 배포 과정을 자동화할 수 있습니다.

알림 및 보고

젠킨스는 빌드 및 배포 상태에 대한 알림을 제공하며, 다양한 보고서를 생성하여 개발자들이 소프트웨어 개발 프로세스의 상태를 파악할 수 있습니다.

젠킨스는 확장 가능한 플러그인 아키텍처를 가지고 있어 다양한 개발 도구, 테스트 도구, 배포 도구와 통합할 수 있습니다. 이를 통해 개발자들은 자신들이 선호하는 도구를 사용하여 개발 및 배포 프로세스를 자동화할 수 있습니다.

젠킨스는 오픈 소스 프로젝트로 시작되었으며, 현재는 많은 개발자와 기업에서 널리 사용되고 있습니다.

기본적인 리눅스 명령어들

그냥 아는대로 아래 내용 대답

  • GREP
  • touch
  • cat
  • find
  • head 등

Domain

DNS 서버 관련 질문

DNS Server : 도메인 이름과 IP 주소 간의 매핑을 관리하는 서버

BIND(Berkeley Internet Name Domain)와 같은 DNS 서버 소프트웨어가 필요하다.

DNS 존 설정

DNS 존은 도메인 이름과 IP 주소 간의 매핑 정보를 포함하는 공간.
DNS 서버 소프트웨어의 설정 파일을 편집하여 DNS 존을 생성하고 도메인 이름과 해당하는 IP 주소를 매핑한다.

DNS 레코드 설정

DNS 존 내에서 각 도메인 이름에 대한 레코드를 설정.
이 레코드는 도메인 이름과 IP 주소 매핑을 정의하는
A 레코드, MX 레코드, CNAME 레코드 등으로 구성된다.

이후에 서버를 구성하고 실행시킨다.

CDN / Cache / Media

CDN (Content Delivery Network)

전 세계에 분산된 서버 네트워크
CDN은 웹/앱 등의 콘텐츠를 사용자에게 가까운 위치에서 제공하여 로딩 속도를 향상시키고 전송 대역폭을 줄인다.
다시 말해, CDN은 가장 가까운 서버에서 해당 콘텐츠를 전송하여 빠른 속도와 효율적인 네트워크 전송을 제공한다.
CDN은 정적 파일(이미지, CSS, JavaScript 등)과 동적 컨텐츠(동영상, 게임, 소셜 미디어 등)를 제공하는 데 사용된다.

실시간 전송 애플리케이션

WebSocket 모듈

메세지 큐

RabbitMQ, Apache Kafka 등이 있습니다. 자바와 스프링 부트에서는 메시지 큐 시스템을 통해 실시간 데이터를 처리하고 전송할 수 있습니다.

대용량 데이터 시스템 아키텍처에서는?

MSA

Communication & 문제해결능력

의사소통이 힘들때 어떻게 해결했나

어떻게 어떤 기능을 구현했나 (이전프로젝트 업무관련)

자신의 장단점 (성격 등)

지원동기

profile
ㅇ0ㅇ

0개의 댓글