군만두의 IT 개발 일지

패스트캠퍼스 백엔드 개발 부트캠프 8기 그룹스터디 - 교착 상태, DB 이상현상, 제네릭, HTTP & 암호화 본문

개발일지/패스트캠퍼스

패스트캠퍼스 백엔드 개발 부트캠프 8기 그룹스터디 - 교착 상태, DB 이상현상, 제네릭, HTTP & 암호화

mandus 2024. 3. 10. 20:09

목차

    ⭐ 요약


    • 패스트캠퍼스 백엔드 개발 부트캠프 8기에서 면접 대비를 위한 그룹스터디를 진행한다.
    • 각 팀원이 관심 CS 분야를 선택하여 노션에 정리하고 발표하는 방식으로 운영한다.
    • 이번 회차에서는 교착 상태(Deadlock), DB 이상현상 및 함수 종속성, 제네릭(Generic), HTTP 메서드 및 암호화를 학습했다.

    ⭐ 그룹스터디 진행 방식


    매 회차마다 팀원들이 각자 관심 있는 CS 분야를 하나씩 선택하여 『면접을 위한 CS 전공지식 노트』를 기반으로 추가 자료를 찾아 노션에 정리한 뒤, 스터디 시간에 발표하고 서로 피드백을 주고받는 방식으로 진행한다. 이번 회차에서 다룬 주제는 아래와 같다.

    발표 주제 분야
    교착 상태(Deadlock) 운영체제
    DB 이상현상 및 함수 종속성 데이터베이스
    제네릭(Generic) Java
    HTTP 메서드 및 암호화 네트워크

    ⭐ 학습 내용


    1. 교착 상태(Deadlock) - 운영체제

     

    1-1. 교착 상태란?

     

    한정된 자원을 여러 프로세스가 사용하려 할 때, 각 프로세스가 서로 상대방의 자원을 기다리면서 무한정 멈춰있는 상태이다. 도로에 차가 꽉 막혀 어떤 차도 지나가지 못하는 상황에 비유할 수 있다.

     

    교착 상태를 표현하는 가장 유명한 예시는 식사하는 철학자 문제이다. 철학자(프로세스/스레드)는 양쪽 포크(자원)를 모두 들어야 식사(CPU 할당)를 할 수 있다. 그런데 모든 철학자가 동시에 왼쪽 포크를 들면, 아무도 오른쪽 포크를 들지 못해 영원히 기다리는 교착 상태가 발생한다. 이는 뮤텍스 락을 잘못 사용하면 두 프로세스가 영원히 바쁜 대기 상태에 빠질 수 있다는 동기화 문제와도 연결된다.

     

    1-2. 교착 상태 발생 조건 (4가지 모두 만족해야 발생)

    조건 설명
    상호 배제 한 자원을 한 프로세스만 사용함
    점유와 대기 자원을 점유한 채로 다른 자원을 기다림
    비선점 어떤 프로세스도 다른 프로세스의 자원을 강제로 빼앗지 못함
    원형 대기 프로세스들이 요청·할당받은 자원이 원형 구조를 이룸

     

    1-3. 교착 상태 해결 방법

    • 예방: 위 4가지 조건 중 하나라도 만족하지 않도록 자원을 할당한다. 다만 상호 배제를 없애면 레이스 컨디션이, 점유와 대기를 없애면 기아 현상이 발생하는 등 현실적인 한계가 있다.
    • 회피: 교착 상태가 발생할 것 같으면 자원 할당을 멈추는 방식이다. 대표적으로 은행원 알고리즘이 있으며, 자원 할당 후에도 안정 상태가 유지되는지 사전에 검사한다.
    • 검출 후 회복: 교착 상태가 발생하면 그때 해결한다. 다른 프로세스의 자원을 선점하거나, 교착 상태의 프로세스를 하나씩 또는 한꺼번에 강제 종료하는 방법을 사용한다.


    2. DB 이상현상 및 함수 종속성 - 데이터베이스

     

    2-1. 이상현상(Anomaly)이란?

     

    정규화를 수행하지 않으면 데이터 중복이 발생하고 무결성이 저하되는 현상이다. 이상현상은 삽입, 삭제, 갱신 세 가지로 나뉜다.

    이상현상 설명 예시
    삽입 이상 데이터 삽입 시 불필요한 데이터도 함께 삽입해야 하거나, 특정 데이터가 없어 삽입이 불가능한 문제 학생이 없는 신설 학과는 테이블에 삽입 불가
    삭제 이상 튜플 삭제 시 필요한 데이터까지 함께 삭제되는 데이터 손실 문제 학생을 삭제하면 해당 학과 정보까지 소멸
    갱신 이상 중복 튜플 중 일부만 변경되어 데이터 불일치가 발생하는 문제 학과장 개명 시 100개 레코드를 모두 수정해야 함

     

    2-2. 함수 종속성(Functional Dependency)

     

    X → Y일 때 "X가 Y를 함수적으로 결정한다"고 한다. 함수 종속성의 종류는 아래와 같다.

    종류 설명
    완전 함수 종속 종속자가 기본키 전체에만 종속되고 기본키의 일부에는 종속되지 않음
    부분 함수 종속 종속자가 기본키의 일부 속성에만 종속됨
    이행적 함수 종속 X→Y, Y→Z이면 X→Z가 성립함
    결정자 함수 종속 함수 종속의 결정자가 후보키가 아닌 경우
    다중값 종속 한 릴레이션에서 둘 이상의 독립적인 다중값 속성이 존재하는 경우
    조인 종속 둘로 나눌 때는 원래의 릴레이션으로 복원이 불가능하나, 셋 이상으로 분리 시 복원이 가능한 특수한 경우

     

     


    3. 제네릭(Generic) — Java ← 내가 발표한 주제

     

    3-1. 제네릭이란?

     

    제네릭(Generic)은 데이터 타입을 일반화하는 것을 의미한다. 클래스나 메서드 내부에서 사용할 객체의 타입을 컴파일 시점에 지정할 수 있어, 잘못된 타입으로 인한 오류를 사전에 방지할 수 있다.

     

    3-2. 주요 타입 변수

    타입 변수 의미 주요 사용처
    <T> Type 가장 범용적으로 사용
    <E> Element List, Set 등 컬렉션 요소
    <K> Key Map의 키
    <V> Value Map의 값
    <N> Number Integer, Double 등 숫자 타입

     

    3-3. 제네릭 클래스 예시

    // 제네릭 클래스 선언
    class MyArray<T> {
        private T element;
    
        public void setElement(T element) {
            this.element = element;
        }
    
        public T getElement() {
            return this.element;
        }
    }
    
    // 인스턴스 생성 시 실제 타입을 지정한다.
    MyArray<Integer> myIntegerArray = new MyArray<>();
    MyArray<String> myStringArray = new MyArray<>();

     

    3-4. 제네릭 메서드 예시

    public class Util {
        // 반환 타입 앞에 <T>를 명시한다.
        public static <T> void printArray(T[] array) {
            for (T element : array) {
                System.out.println(element);
            }
        }
    }
    
    // 다양한 타입의 배열을 동일한 메서드로 처리한다.
    Integer[] intArray = {1, 2, 3};
    String[] stringArray = {"Hello", "World"};
    
    Util.printArray(intArray);
    Util.printArray(stringArray);

     

    3-5. Object 타입과 제네릭 비교

    // Object 타입 사용 시: 타입 캐스팅이 반드시 필요하다.
    List items = new ArrayList();
    items.add("Hello");
    String item = (String) items.get(0); // 강제 형변환 필요
    
    // 제네릭 사용 시: 타입 캐스팅이 불필요하고, 잘못된 타입 추가 시 컴파일 에러가 발생한다.
    List<String> items = new ArrayList<>();
    items.add("Hello");
    // items.add(1); // 컴파일 에러
    String item = items.get(0); // 형변환 불필요

     

    3-6. 제네릭의 장점 정리

    • 타입 안정성 향상: 컴파일 시점에 타입을 체크하여 런타임 오류를 사전에 예방한다.
    • 타입 변환 감소: 불필요한 타입 캐스팅이 없어져 코드가 간결하고 명확해진다.
    • 코드 재사용성 증가: 하나의 제네릭 클래스·메서드로 다양한 타입을 처리할 수 있다.

     


    4. HTTP 메서드 및 암호화 — 네트워크

     

    4-1. HTTP 요청 메서드

     

    HTTP 메서드는 클라이언트가 서버에 실행을 요구하는 명령이다. 주요 메서드는 아래와 같다.

    메서드 역할 서버 데이터 변경
    GET 서버에 존재하는 데이터를 요청. Request Body를 사용하지 않는 것이 일반적 X
    POST 서버에 데이터를 생성. Request Body에 데이터를 담아 전송 O
    PUT 서버의 데이터를 수정하거나, 존재하지 않으면 새로 생성 O
    PATCH 서버의 데이터를 일부만 수정 O
    DELETE 서버의 데이터를 삭제 O

     

    4-2. HTTP 주요 상태 코드

    코드 이름 의미
    200 OK 요청이 성공적으로 처리됨
    400 Bad Request 요청 메시지에 문법 오류 존재
    401 Unauthorized 권한이 존재하지 않음
    403 Forbidden 서비스 요청이 거부됨
    404 Not Found 요청한 문서를 찾을 수 없음
    500 Internal Server Error 서버 내부 오류 발생

     

    4-3. 암호화

     

    암호화는 크게 양방향 암호화단방향 암호화로 구분된다.

    종류 특징 장점 단점
    대칭키 암호화 암호화·복호화에 동일한 키를 사용함 속도가 빠름 키 배송 과정에서 노출 위험 존재
    비대칭키 암호화 공개키·비밀키로 암호화·복호화를 각각 수행함 키 배송 문제 없이 안전성이 높음 대칭키 방식보다 느림
    단방향 암호화 암호화만 가능하며 복호화는 불가능함. 해시 알고리즘을 주로 사용함 복호화 불가로 보안성이 높음 Rainbow Table 등 무차별 대입 공격에 취약함

     

    단방향 암호화의 Rainbow Table 공격을 방어하기 위해 Bcrypt를 사용한다. Bcrypt는 솔팅(해시 시 랜덤 데이터를 추가)과 키 스트레칭(해시를 반복 적용)을 조합하여 무차별 대입 공격의 난이도를 크게 높인다.

    ⭐ 예상 면접 질문 정리


    • 교착 상태란 무엇이며, 발생 조건 4가지를 설명해 주세요. 상호 배제, 점유와 대기, 비선점, 원형 대기가 모두 충족될 때 발생한다.
    • 제네릭을 사용하는 이유는 무엇인가요? 컴파일 시점에 타입을 체크하여 런타임 오류를 방지하고, 타입 캐스팅 없이 코드를 재사용할 수 있기 때문이다.
    • GET과 POST의 차이를 설명해 주세요. GET은 서버 데이터를 조회하며 Request Body를 사용하지 않고, POST는 서버에 데이터를 생성하며 Request Body에 데이터를 담아 전송한다.
    • 단방향 암호화의 취약점과 해결 방법은 무엇인가요? Rainbow Table 공격에 취약하며, 솔팅과 키 스트레칭을 적용한 Bcrypt 방식으로 보완할 수 있다.

    ⭐ 후기


    • 직접 한 주제를 맡아 정리하고 발표하는 방식이 단순히 읽는 것보다 훨씬 깊이 있게 이해하는 데 도움이 되었다. 내가 발표를 위해 제네릭을 정리하는 과정에서 Object 타입과의 차이, 타입 캐스팅 문제 등 평소에 당연하게 쓰던 개념을 다시 한번 정확히 짚을 수 있었다.
    • 팀원들의 발표를 들으면서 교착 상태, DB 이상현상, 암호화 등 개발하면서 자주 마주치는 개념들이 면접에서 어떤 방식으로 물어봐지는지 감을 잡을 수 있었다.

     

    이 글은 패스트캠퍼스백엔드 개발 캠프에서 공부한 내용을 작성한 것입니다.

     

    Comments