728x90

Design Pattern

개념

  • 특정 상황에서 공통적으로 발생하는 문제에 쓰이는 재사용 가능한 해결책
  • 장점
    • 소프트웨어의 구조를 파악하기 용이
    • 재사용을 통한 개발 시간 단축
    • 설계 변경 시, 비교적 원활한 조치 가능
  • 단점
    • 객체 지향 언어에서 사용할 경우, 객체 지향적 설계를 추가로 고려해야 함
    • 초기 투자 비용이 큼

종류

  • 생성 패턴
    • 객체 생성과 관련된 패턴
    • 객체의 생성과 조합을 캡슐화해 특정 객체가 생성되거나 변경되어도 프로그램 구조에 영향을 크게 받지 않도록 유연성을 제공
  • 구조 패턴
    • 프로그램 구조를 설계하는데 사용되는 패턴
    • 클래스나 객체를 조합해 더 큰 구조를 만드는 패턴
  • 행위 패턴
    • 객체나 클래스 사이의 알고리즘 또는 책임 분배에 관련된 패턴
    • 결합도를 최소화하는 것이 주 목적

대표적인 생성 패턴

  • Singleton Pattern
      • 단 하나의 객체를 생성하고 생성된 객체를 어디서든 참조할 수 있도록 하는 패턴
      • 클래스를 static으로 선언하는 것이 아닌, 동적으로 생성하고 heap 영역에서 GC로 관리되도록 하되, 단 하나의 객체를 생성
      • 예시
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    class StudentBuilder {
        private int id;
        private String name;
        private String grade;
        private String phoneNumber;
     
        public StudentBuilder id(int id) {
            this.id = id;
            return this;
        }
     
        public StudentBuilder name(String name) {
            this.name = name;
            return this;
        }
     
        public StudentBuilder grade(String grade) {
            this.grade = grade;
            return this;
        }
     
        public StudentBuilder phoneNumber(String phoneNumber) {
            this.phoneNumber = phoneNumber;
            return this;
        }
     
        public Student build() {
            // Student 생성자 호출
            return new Student(id, name, grade, phoneNumber);
        }
    }
     
    public static void main(String[] args) {
     
        Student student = new StudentBuilder()
                    .id(2016120091)
                    .name("임꺽정")
                    .grade("Senior")
                    .phoneNumber("010-5555-5555")
                    .build();
     
        System.out.println(student);
    }
     
     
     
    • 사용 예시: DB Connection, Thread Pool
  • Builder Pattern
      • 인스턴스를 생성자를 통해 직접 생성하지 않고, 빌더라는 내부 클래스를 통해 간접적으로 생성하게 하는 패턴
      • 예시
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    class StudentBuilder {
        private int id;
        private String name;
        private String grade;
        private String phoneNumber;
     
        public StudentBuilder id(int id) {
            this.id = id;
            return this;
        }
     
        public StudentBuilder name(String name) {
            this.name = name;
            return this;
        }
     
        public StudentBuilder grade(String grade) {
            this.grade = grade;
            return this;
        }
     
        public StudentBuilder phoneNumber(String phoneNumber) {
            this.phoneNumber = phoneNumber;
            return this;
        }
     
        public Student build() {
            // Student 생성자 호출
            return new Student(id, name, grade, phoneNumber);
        }
    }
     
    public static void main(String[] args) {
     
        Student student = new StudentBuilder()
                    .id(2016120091)
                    .name("임꺽정")
                    .grade("Senior")
                    .phoneNumber("010-5555-5555")
                    .build();
     
        System.out.println(student);
    }
     
     
     
  • Factory Method
    • 추상 클래스에는 객체를 생성하는 추상 메서드를 정의하고, 이를 하위 클래스에서 구현하여 원하는 타입의 객체를 생성
    • 의존성과 결합도를 낮출 수 있음
    • 예시
      • 슈퍼 클래스, AnimalFactory - 추상 메서드 createAnimal() 보유
      • 하위 클래스, (DogFactory, CatFactory) - createAnimal()을 오버라이드 ▶ Dog와 Cat 인스턴스 생성
  • Abstract Factory Method
    • 슈퍼 클래스에서 기본적인 알고리즘의 흐름을 정의하고, 하위 클래스에서 특정 단계를 구현하는 방법
    • 예시
      • 슈퍼 클래스, Algorithm
        • 추상 메서드 step1(), step2(), step3() ...
        • algorithm(): 추상 메서드 step1(), step2(), step3()로 구성된 메서드
      • 하위 클래스, (AlgorithmA, AlgorithmB)
        • step1(), step2(), step3()을 구현하여 algorithm()을 사용

대표적인 구조 패턴

  • Adapter Pattern
      • 호환성이 없는 인터페이스 때문에 함께 동작할 수 없는 클래스들을 함께 작동해주도록 변환 역할을 해주는 행동 패턴
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class Adapter implements Target {
        // 호환성이 없어 직접 사용 불가능한 클래스
        Service adaptee;
     
        Adapter(Service adaptee) {
            this.adaptee = adaptee;
        }
     
        //Adapter method 호출 시, 기존 서비스인 adaptee medthod로 사용 가능
        public void method(int data) {
            adaptee.specificMethod(data);
        }
    }
     
     
     

대표적인 행위 패턴

  • Observer Pattern
    • 일대다 의존성을 가지며, 분산 이벤트 핸들링 시스템에 주로 사용
    • 한 객체의 상태가 변경되었을 때, 그 객체에 의존하는 다른 객체들에게 자동으로 알림을 보내고 갱신을 요청
  • Template Method Pattern
    • 여러 클래스에서 공통으로 사용하는 메서드를 템플릿화 하여 상위 클래스에서 정의하고, 하위 클래스마다 세부 동작 사항을 다르게 구현하는 패턴
    • 사용 예시: Abstract Map
  • Strategy Pattern
      • 비슷한 동작을 하지만 다르게 구현되어 있는 행위(전략)들을 공통의 인터페이스를 구현하는 각각의 클래스로 구현하고, 동적으로 바꿀 수 있도록 하는 패턴
      • 코드의 결합도를 낮춰 유지 보수성을 높일 수 있음
      • 예시
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    // 전략 인터페이스 (Strategy Interface)
    interface Strategy {
        int execute(int a, int b);
    }
     
    // 전략 구현 클래스 (Concrete Strategies)
    class AddOperation implements Strategy {
        public int execute(int a, int b) {
            return a + b;
        }
    }
     
    // 컨텍스트 클래스 (Context)
    class Context {
        private Strategy strategy;
     
        // 전략 교체 메소드
        public Context(Strategy strategy) {
            this.strategy = strategy;
        }
     
        // 전략 실행 메소드
        public int executeStrategy(int a, int b) {
            return strategy.execute(a, b);
        }
    }
     
    // 사용 예시
    public class Main {
        public static void main(String[] args) {
            int a = 10, b = 5;
     
            // 전략 설정
            Strategy addStrategy = new AddOperation();
            Context context = new Context(addStrategy);
     
            // 전략 실행
            int result = context.executeStrategy(a, b);
        }
    }
     
     
     
  • Iterator Pattern
    • 일련의 데이터 집합에 대하여 순차적인 접근(순회)을 지원하는 패턴
    • 자바에서 제공하는 Iterator Interface는 ArrayList, TreeSet, HashMap 등 컬렉션 클래스의 요소들을 순회하는 데 사용

MVC Pattern

  • Model-View-Controller의 약자로 애플리케이션을 세 가지 역할로 구분한 개발 방법론
    • Model
      • 데이터 관리 및 비즈니스 로직을 처리하는 부분
      • DAO, DTO, Service 등
    • View
      • 비즈니스 로직의 처리 결과를 통해 유저 인터페이스가 표현되는 구간
      • html, jsp, thymeleaf 등의 화면 구성
    • Controller
      • 사용자의 요청을 처리하고 Model과 View를 중개하는 역할
  • 종류model1 * Model1: Controller 영역에 View 영역을 같이 구현하는 방식이며, 사용자의 요청을 JSP가 전부 처리 model2 * Model2: 웹브라우저 사용자의 요청을 서블릿이 받고 서블릿은 해당 요청으로 View로 보여줄 것인지 Model로 보낼 것인지를 판단하여 전송

객체 지향 설계 원칙: SOLID

  • SRP (Single Responsibility Principle) 단일 책임 원칙
    • 하나의 클래스는 하나의 책임만 가져야한다는 원칙
    • SRP를 잘 따르면 응집도(cohesion)는 높이고 결합도(coupling)은 낮출 수 있음
  • OCP (Open Closed Principle) 개방 폐쇄 원칙
    • 요구사항의 변경이 발생하더라도, 기존 구성요소는 수정이 일어나지 말아야하며 쉽게 확장이 가능하여 재사용할 수 있어야 한다는 원칙
    • 추상화(Abstraction)와 다형성(Polymorphism)을 통해 실현할 수 있음
  • LSP (Liskov Substitution Principle) 리스코프 치환 원칙
    • 상속 관계에 있는 클래스들이 서로를 대체할 수 있어야 함
    • 부모 클래스의 인스턴스를 자식 클래스의 인스턴스로 대체해도 프로그램의 정확성을 보장해야 한다는 원칙
    • 다형성을 지원하기 위한 원칙
  • ISP (Interface Segregation Principle) 인터페이스 분리 원칙
    • 자신이 사용하지 않는 인터페이스는 구현하지 말아야 한다는 원칙
    • 인터페이스의 단일 책임을 강조
  • DIP (Dependency Inversion Principle) 의존 역전 원칙
    • 구체적인 구현 클래스에 의존하지 말고, 추상적인 인터페이스의 의존할 것을 강조

 

📚 참고 자료

https://gmlwjd9405.github.io/2018/07/06/design-pattern.htm
https://velog.io/@sunhwa508/GOF-%EB%8C%80%ED%91%9C%EC%A0%81%EC%9D%B8-10-%EA%B0%80%EC%A7%80-Design-patterns
https://github.com/GimunLee/tech-refrigerator/tree/master/Design%20Pattern
https://inpa.tistory.com/category/%EB%94%94%EC%9E%90%EC%9D%B8%20%ED%8C%A8%ED%84%B4/GOF?page=2
https://cocoon1787.tistory.com/733
https://flower0.tistory.com/416
https://velog.io/@falling_star3/Java-%EA%B0%9D%EC%B2%B4-%EC%A7%80%ED%96%A5-%EC%84%A4%EA%B3%84%EC%9D%98-5%EA%B0%80%EC%A7%80-%EC%9B%90%EC%B9%99-SOLID
https://dev-coco.tistory.com/163

728x90

'Computer > CS_Knowledge' 카테고리의 다른 글

[CS] Database  (0) 2023.07.28
[CS] Network  (0) 2023.07.12
[CS] Operating System  (0) 2023.07.12
[CS] Spring  (0) 2023.07.06
[CS] Java  (0) 2023.07.06
728x90

Database

DBMS

  • 데이터베이스를 관리하고 운영하는 소프트웨어
  • 대부분의 DBMS는 테이블로 이뤄진 RDBMS(Relational DBMS) 형태로 사용
  • 기능
    • 데이터 정의(DDL): 테이블과 컬럼을 정의
    • 데이터 조작(DML): 데이터의 CRUD 등을 수행
    • 데이터 제어(DCL): 데이터 무결성(data integrity)을 지키도록 제어

RDBMS / NoSQL

  • RDBMS:
    • 정해진 스키마에 따라 데이터를 저장하기 때문에 명확한 데이터 구조 보장
    • 시스템이 커질 수록 쿼리가 복잡해지고 성능이 저하되며, Scale-out이 어려움
  • NoSQL:
    • Key-Value 형태로 데이터를 자유롭게 관리할 수 있음
    • 데이터 중복이 발생할 수 있음
  • 데이터가 자주 변경이 이루어지는 시스템에서는 RDBMS를, 막대한 데이터를 저장해야 해서 DB를 Scale-out 해야 되는 시스템에서는 NoSQL을 사용

데이터베이스 무결성

  • 개체 무결성: PK는 NULL 값이나 중복된 값을 가질 수 없음
  • 참조 무결성: FK은 NULL이거나 참조 테이블의 PK값이어야 함
  • 도메인 무결성: 속성값은 정의된 도메인에 속한 값이어야 함
  • 키 무결성: 테이블은 최소 1개 이상의 키가 존재해야 함

정규화 정의 및 종류

  • 데이터의 중복 방지, 무결성을 충족하기 위해 데이터베이스를 설계하는 방법
  • 종류
    • 제 1정규형: 테이블의 컬럼이 원자값(1개의 값)을 갖도록 분해
    • 제 2정규형: 제 1정규형 만족 + 기본키가 아닌 속성이 기본키에 완전 함수 종속되도록 분해
    • 제 3정규형: 제 2정규형 만족 + 이행적 함수 종속을 없애도록 분해
  • 장점
    • 불필요한 데이터 중복으로 인해 공간이 낭비를 줄임
    • 삽입 이상, 갱신 이상, 삭제 이상 등 이상현상 제거
  • 단점
    • 릴레이션의 분해로 인해 릴레이션 간의 연산(JOIN 연산)이 많아져 질의에 대한 응답 시간이 느려질 수 있음

이상현상(Anomaly)

  • 삽입 이상: 원하지 않는 자료가 삽입된다든지, key가 없어 삽입하지 못하는(불필요한 데이터를 추가해야 삽입할 수 있음) 문제점
  • 삭제 이상: 하나의 자료만 삭제하고 싶지만, 그 자료가 포함된 튜플 전체가 삭제됨으로 원하지 않는 정보 손실이 발생하는 문제점
  • 갱신 이상: 일부만 변경하여 데이터가 불일치하는 모순, 또는 중복되는 튜플이 존재하게 되는 문제점

반정규화

  • 읽기작업이 많이 필요한 DB의 전반적인 성능을 향상시키기 사용
  • 테이블이 단순해지고 관리 효율성이 증가
  • 데이터의 일관성이나 무결성이 보장되지 않을 수 있음

Partitioning

  • 큰 테이블이나 인덱스를 작은 파티션(Partition) 단위로 나누어 관리하는 기법
  • 장점
    • Full Scan에서 데이터 접근의 범위를 줄여 성능을 향상시킬 수 있음
    • 큰 테이블들을 제거하여 관리를 쉽게 할 수 있음
    • 파티션 별로 독립적으로 백업하고 복구할 수 있음
  • 단점
    • Join 비용
    • 테이블과 인덱스를 별도로 파티셔닝 할 수 없음

JOIN

  • 둘 이상의 테이블을 연결해서 데이터를 검색하는 방법
  • Inner Join: 조인 키 컬럼 값이 양쪽 테이블에 공통적으로 존재하는 데이터만 추출
  • Left Outer Join: Inner 조인값과 Left outer join 키워드 왼쪽에 명시된 테이블에만 존재하는 데이터를 추출
  • Full Outer Join: 조인 키 컬럼 값이 양쪽 테이블 데이터 집합에서 공통적으로 존재하는 데이터와 한쪽 테이블에만 존재하는 데이터도 모두 추출

WHERE와 JOIN에서 ON의 차이

  • WHERE: JOIN 결과를 WHERE 조건절로 필터링이 이뤄짐
  • ON: JOIN 대상이 ON 조건으로 필터링 됨

WHERE와 HAVING의 차이

  • where: 그룹화 또는 집계가 발생하기 전 개별 행을 필터링하는데 사용
  • having: 그룹화 또는 집계가 발생한 후 그룹을 필터링하는데 사용

SELECT 쿼리의 수행 순서

FROM > WHERE > GROUP BY > HAVING > SELECT > ORDER BY

View

  • 데이터를 제한적으로 보여주기 위한 가상 테이블
  • 장점
    • view에 나타나지 않은 데이터를 간편히 보호할 수 있음
    • 필요한 데이터만 뷰로 정의해서 처리할 수 있기 때문에 관리가 용이하고 명령문이 간단해짐
  • 단점
    • Alter를 사용하여 뷰의 정의를 변경할 수 없음
    • 독립적인 인덱스를 가질 수 없음

Trigger

  • 특정 테이블에서 INSERT, DELETE, UPDATE 같은 DML문이 수행되었을 때, 데이터베이스에서 자동으로 동작하도록 작성된 프로그램
  • 장점
    • 데이터 무결성의 강화 (참조 무결성)
    • 업무처리 자동화
  • 단점
    • 트리거를 과도하게 사용한다면 복잡한 상호 의존성이 생김

Index

index

  • 데이터에 대한 검색 성능의 속도를 높여주는 자료 구조
  • 특정 컬럼에 인덱스를 생성하면 정렬된 데이터로 별도의 메모리 공간에 데이터의 물리적 주소와 함께 저장(Key-Value 타입)
  • 새로운 값의 추가, 수정, 삭제할 경우, 재정렬과 2개의 컬럼을 수정해야하는 함
  • 추가적인 메모리 공간을 필요하므로 자주 사용되는 조건에 Index를 설정하는 것이 좋음

Index 자료 구조

b-tree

  • B-Tree
    • 탐색 성능을 높이기 위해 균형 있게 높이를 유지하는 Balanced Tree의 일종
      • 편향된 트리에서 leaf node까지 탐색한다면 모든 node를 방문하기 때문에 O(N)의 시간이 걸리게 되는 단점은 보완
      • 최상의 경우 특정 key를 root node에서 찾을 수 있음
    • Full scan 시, 모든 노드 탐색

b+tree

  • B+Tree
    • 오직 leaf node에만 데이터를 저장하고 leaf node가 아닌 node에는 자식 포인터만 저장
      • 하나의 node에 더 많은 포인터를 가질 수 있기 때문에 트리의 높이가 더 낮아지므로 검색 속도를 높일 수 있음
      • 반드시 특정 key에 접근하기 위해서 leaf node까지 가야함
    • leaf node끼리는 Linked list로 연결
      • Full scan 시, 리프 노드에서만 탐색
  • 해시 테이블
    • key와 value를 한 쌍으로 데이터를 저장하는 자료구조
    • 평균적으로 O(1)의 매우 빠른 시간만에 원하는 데이터를 탐색할 수 있음
    • 데이터가 정렬되지 않은 상태로 등호 연산에 최적화되어있어, 부등호 연산이 많은 DB에서는 잘 사용되지 않음

트랜잭션

  • 데이터베이스의 상태를 변화시키기 위해 수행하는 작업의 논리적 단위
  • 특징
    • 원자성: 하나의 트랜잭션에서 일부 연산만 실행되면 안됨
    • 일관성: 트랜잭션 실행 전 후로 일관성을 갖춰야 함
    • 독립성: 트랜잭션은 다른 트랜잭션과 독립적으로 수행되어야 함
    • 영속성: 트랜잭션 결과는 영구적으로 반영되어야 함
  • 상태status_transaction - Active: 트랜잭션이 작업을 시작하여 실행 중인 상태 - Failed: 트랜잭션에 오류가 발생하여 실행이 중단된 상태 - Aborted: 트랜잭션이 비정상적으로 종료되어 Rollback 연산을 수행한 상태 - Partially Committed: 최종 결과를 데이터베이스에 아직 반영하지 않은 상태 - Committed: 트랜잭션이 성공적으로 종료되어 commit 연산을 실행한 후의 상태
  • 연산
    • Commit: TRANSACTION(INSERT, UPDATE, DELETE)작업 내용을 실제 DB에 저장
    • Rollback: TRANSACTION(INSERT, UPDATE, DELETE)작업 내용을 취소

JDBC, ODBC 차이

  • JDBC
    • Java가 Database를 사용할 수 있도록 연결
    • 자바 어플리케이션의 요청을 각 DBMS가 이해할 수 있도록 변환
  • ODBC
    • 언어에 상관없이 사용 가능
    • 응용프로그램에서 데이터에 접근할 때 사용

DELETE, TRUNCATE, DROP의 차이

  • DELETE
    • 데이터는 지우지만 테이블 용량은 줄어들지 않음
    • 원하는 데이터만 골라서 지울 수 있음
    • 삭제 후 되돌릴 수 있음
  • TRUNCATE
    • 전체 데이터를 한번에 삭제하는 방식
    • 테이블 용량이 줄어들고 인덱스 등도 삭제
    • 삭제 후 되돌릴 수 없음
  • DROP
    • 테이블 자체를 완전히 삭제하는 방식
    • 삭제 후 되돌릴 수 없음

SQL Injection

  • 악의적인 의도로 SQL 구문을 삽입하여, 데이터베이스를 비정상적으로 조작하는 코드 인젝션 공격 기법
  • 해결 방안
    • 저장 프로시저 사용하여 Query에 미리 형식을 지정하여 지정된 형식의 데이터가 아니면 Query가 실행되지 않도록 함

기타 용어

Schema: 데이터베이스에 저장되는 데이터 구조와 제약조건을 정하는 것
Sequence: 기본키가 유일한 값을 갖도록 순번을 자동 생성해주는 데이터베이스 객체

 

📚 참고 자료

https://coding-factory.tistory.com/746
https://rebro.kr/167
https://coding-factory.tistory.com/224
https://luv-n-interest.tistory.com/1466
https://dkswnkk.tistory.com/555

728x90

'Computer > CS_Knowledge' 카테고리의 다른 글

[CS] Design Pattern  (0) 2023.08.04
[CS] Network  (0) 2023.07.12
[CS] Operating System  (0) 2023.07.12
[CS] Spring  (0) 2023.07.06
[CS] Java  (0) 2023.07.06
728x90

Network

HTTP(Hyper Text Transfer Protocol)

  • 데이터를 주고 받기 위한 프로토콜
  • 상태 정보를 저장하지 않는 Stateless 및 클라이언트의 요청에 맞는 응답을 보낸 후 연결을 끊는 Connectionless 특징
    • 연결 상태 처리나 상태 정보를 관리할 필요가 없어 서버 디자인이 간단
    • 통신의 정보를 모르기 때문에 매번 인증 필요
      • 해결방안: 쿠키, 세션 등

HTTP Method

종류 기능
GET 데이터 조회
POST 요청 데이터 처리, 주로 등록에 사용
PUT 리소스를 대체(덮어쓰기), 해당 리소스가 없으면 생성
PATCH 리소스 부분 변경 (PUT이 전체 변경, PATCH는 일부 변경)
DELETE 데이터 삭제

HTTP 상태 코드

  • 1xx : 처리가 진행 중
  • 2xx : 성공 응답
  • 3xx : 리다이렉트, 요청을 완료하려면 추가적인 작업(페이지 이동)이 필요
  • 4xx : 클라이언트 요청 오류
  • 5xx : 서버 오류

HTTP와 HTTPS의 차이점

  • HTTP
    • 평문 데이터를 전송하는 프로토콜
    • TCP와 직접 통신
  • HTTPS
    • HTTP에 암호화가 추가된 프로토콜
    • HTTP는 SSL과 통신 + SSL이 TCP와 통신

TCP와 UDP의 차이

  TCP UDP
연결 방식 연결형(3-way handshake) 비 연결형
전송 순서 보장 보장 X
수신 여부 확인 O X
속도 느림 빠름
신뢰성 높음 낮음

3-way handshake와 4-way handshake

3handshake 4handshake
  • 3 way-handshake
    • TCP 네트워크에서 통신 하는 장치가 서로 연결이 잘 되었는지 확인하는 방법
  • 4-way handshake
    • TCP 네트워크에서 통신 하는 장치의 연결을 해제하는 방법
    • TIME-WAIT: 아직 서버에서 받지 못한 데이터가 연결이 해제되어 유실되는 경우를 대비해 일정시간 잉여 패킷을 기다림

쿠키와 세션 차이

  • 쿠키
    • 사용자의 컴퓨터에 저장하는 데이터 파일
    • 예: 팝업창을 통해 "오늘 이 창을 다시 보지 않기" 체크
  • 세션
    • 사용자(브라우저)로부터 들어오는 일련의 요구를 하나의 상태로 보고, 그 상태를 유지시키는 기술
    • 웹 서버의 저장되는 쿠키(=세션 쿠키)
    • 예: 화면을 이동해도 로그인이 풀리지 않고 로그아웃하기 전까지 유지
  쿠키 세션
저장 위치 Client PC Web Server
라이프 사이클 쿠키 저장시 설정(브라우저가 종료되어도 인증이 유지) 브라우저 종료시 삭제
속도 빠름 느림
보안 낮음(당사자가 아닌 제 3자도 조회 가능) 높음

세션 기반 인증과 토큰 기반 인증

session

  • 세션 기반 인증: 클라이언트로부터 요청을 받으면 해당 상태 정보를 저장하므로 Stateful한 구조
    • 중요한 정보는 서버에 있기 때문에 세션 ID 쿠키에는 유의미한 값을 가지고 있지 않음
    • 서버에 세션을 저장하기 때문에 사용자가 증가하면 서버에 과부하
    • 분산 서버 활용 시, 상태 유지가 올바르게 작동하지 않을 수 있음
    • 세션 하이재킹: 훔친 쿠키를 이용해 요청을 보내면 서버는 올바른 사용자가 보낸 요청인지 알 수 없음
    • 예: 넷플릭스 디바이스 로그인 개수 제한
 

session

  • 토큰 기반 인증: Access Token을 발급해준 후 요청이 들어오면 검증만 해주면 되기 때문에 추가 저장소가 필요 없는 Stateless한 구조
    • 이미 발급된 JWT를 돌이킬 수 없으므로 유출 시, 만료전까지 피해가 계속 발생할 수 있음
    • (JWT에서의 대안) Refresh Token을 추가적으로 발급해서 Access 토큰의 사용기간을 단축

JWT 토큰

  • 웹에서 사용되는 인증에 필요한 정보를 암호화시킨 JSON 형식의 토큰
  • JWT(JSON Web Token)의 구조
    • Header: 토큰의 타입과 Signature를 해싱하기 위한 암호화 알고리즘으로 구성
    • Payload: 토큰에 서비스에서 사용자에게 토큰을 통해 공개하기를 원하는 내용(= Claim), JSON(Key/Value) 형태
    • Signature: 토큰을 인코딩하거나 유효성 검증을 할 때 사용하는 고유한 암호화 코드
 
암호화 방식
  • 단방향 암호화 방식: 복호화 불가능
    • 예시: 사용자 비밀번호
  • 양방향 암호화 방식: 복호화 가능
    • 대칭키: 암호화와 복호화에 같은 키를 사용
      • 빠른 속도, 키 노출 위험
    • 비대칭키: 암호화와 복호화할 때 키를 서로 다른 키로 사용
      • 느린 속도(메시지 암호화에는 쓰이지 않고 주로 키를 암호화하는데에 사용), 높은 안정성
      • 예시: 공인인증서

공인(public) IP와 사설(private) IP의 차이

public_private_ip

  • 공인 IP: 중복되지 않는 단 1개의 IP 주소로 공유기가 인터넷과 통신하도록 하는 역할을 하는 외부 IP 주소
  • 사설 IP
    • 일반 가정이나 회사 내 등에 할당된 네트워크 IP 주소
    • 라우터(공유기)에 의해 로컬 네트워크상의 PC나 장치에 할당
  • 사설 IP 주소만으로는 인터넷에 직접 연결할 수 없고, 라우터를 통해 1개의 공인 IP를 할당하고, 라우터에 연결된 개인 PC는 사설 IP를 각각 할당 받아 인터넷에 접속
 

OSI 7 Layer Model

  1. 물리 계층(Physical Layer)
    • 0과 1의 비트 정보를 회선에 보내기 위한 전기적 신호 변환
  2. 데이터 링크 계층(Data Link Layer)
    • 인접 시스템 간 데이터 전송, 전송 오류 제어를 통한 신뢰성 구축
  3. 네트워크 계층(Network Layer)
    • 단말기 간 데이터 전송을 위한 최적화된 경로 제공
    • Protocol: IP
  4. 전송 계층(Transport Layer)
    • 송수신 프로세스(종단) 간의 연결. 신뢰성 있는 통신 보장
    • Protocol: TCP, UDP
  5. 세션 계층(Session Layer)
    • 송수신 간의 논리적 연결
  6. 표현 계층(Presentation Layer)
    • 데이터 형식 설정, 암/복호화
  7. 응용 계층(Application Layer)
    • 일반적인 응용 서비스를 수행

 

 

 

참고 자료

 

신입 개발자 기술면접 질문 정리 - 네트워크

💡 HTTP 프로토콜에 대해 설명해주세요. HTTP(Hyper Text Transfer Protocol)이란 데이터를 주고 받기 위한 프로토콜이며, 서버/클라이언트 모델을 따릅니다. HTTP는 상태 정보를 저장하지 않는 Stateless의 특

dev-coco.tistory.com

 

[Network] TCP 3-way, 4-way Handshake

3일만의 네트워크 포스팅이다 오늘은 TCP 에서 연결을 생성하고 해제하는 과정인 3-way handshake, 4-way handshake 에 대해 공부해 보았다 역시나 세부적인 내용까지 정리되어 있는 글을 찾기가 참 어려

velog.io

 

세션은 뭐고 JWT는 무엇일까

이번 포스팅에서는 토큰 기반 인증 시스템의 대표적인 규약인 JWT(JSON Web Token)에 대해 알아보...

blog.naver.com

 

암호화와 복호화, 양방향 알고리즘(공개키, 비공개키) · 지혜의 개발공부로그

암호화와 복호화, 양방향 알고리즘(공개키, 비공개키) 15 Sep 2021 | 암호화 복호화 공개키 비공개키 AES RSA 개인적인 연습 내용을 정리한 글입니다. 더 좋은 방법이 있거나, 잘못된 부분이 있으면 편

www.zehye.kr

 

🌐 HTTP 메서드 종류 & 요청 흐름 💯 총정리

HTTP Method 종류 HTTP 메서드란 클라이언트와 서버 사이에 이루어지는 요청(Request)과 응답(Response) 데이터를 전송하는 방식을 일컫는다. 쉽게 말하면 서버에 주어진 리소스에 수행하길 원하는 행동,

inpa.tistory.com

 

OKKY - 공인ip, 사설ip 구분 가능한가요?

안녕하세요 ip 에대해서 확인중인데공인ip (공유기 ip)사설ip (pc ip)를 구분하고 싶은데요 구글에서 my ip 검색하고 상위 웹페이지에 접속해서 내 ip를 보면 또한 cmd에 ipconfig 를 입력하면 아래와 같

okky.kr

 

728x90

'Computer > CS_Knowledge' 카테고리의 다른 글

[CS] Design Pattern  (0) 2023.08.04
[CS] Database  (0) 2023.07.28
[CS] Operating System  (0) 2023.07.12
[CS] Spring  (0) 2023.07.06
[CS] Java  (0) 2023.07.06
728x90

운영체제

OS 정의

: 응용 프로그램과 하드웨어 간의 인터페이스로써 사용자가 컴퓨터를 편리하고 효과적으로 사용할 수 있도록 환경을 제공하는 시스템 소프트웨어

Program & Process & Thread

  1. Program
    • 어떤 작업을 위해 실행는 파일
  2. Processprocess - 실행중인 프로그램
    - 각각 독립된 메모리 영역(Code, Data, Stack, Heap의 구조)을 할당
    - 최소 1개의 Thread(Main Thread 포함)를 보유
  3. Threadprocess - 프로세스 안에서 실행되는 여러 작업 단위
    - 프로세스 내에서 Stack만 따로 할당받고 Code, Data, Heap 영역은 공유
    - cf. Java-Thread: JVM에 의해 스케쥴되는 실행 단위 코드 블럭

Multi-process & Multi-thread

  1. Multi-process
    • 하나의 응용 프로그램을 여러 개의 프로세스로 구성하여 각 프로세스가 하나의 작업을 처리하도록 하는 것
    • 자원이 서로 다르게 할당되므로 작업이 독립적으로 수행되어 안정적이나
    • 작업량 많을수록 오버헤드 및 Context Switching으로 인한 성능 저하 우려
      • OverHead: 어떤 처리를 하기 위해 들어가는 간접적인 처리 시간 · 메모리 등
      • Context Switching: 멀티프로세스 환경에서 CPU가 어떤 프로세스를 실행하고 있는 상태에서 인터럽트 요청에 의해 다음 우선 순위의 프로세스가 실행되어야 할 때 Context(CPU가 해당 프로세스를 실행하기 위한 해당 프로세스의 정보들)를 교체하는 작업
    • 한 프로세스가 다른 프로세스와 통신하기 위해 IPC(Inter-process communication) 사용해야하므로 통신이 복잡함
  2. Multi-thread
    • 하나의 응용 프로그램을 여러 개의 스레드로 구성하여 각 스레드가 하나의 작업을 처리하도록 하는 것
    • 자원이 Stack만 따로 할당받으므로 시스템의 자원과 처리 비용 감소하며 Context Switching이 빠름
    • 스레드 간의 자원(Code, Data, Heap)을 공유하고 있기 때문에 통신의 부담이 적어 응답 시간이 빠름
    • 자원을 공유하고 있으므로 동기화 문제가 발생할 수 있으며, 하나의 스레드의 오류로 전체 프로세스에 문제 발생
 

멀티 쓰레드 환경에서의 주의사항

  1. 동시성 문제
    : 2 이상의 스레드가 동시에 같은 값을 변경하면서 발생하는 문제
  2. 교착 상태
    : 둘 이상의 프로세스들이 자원을 점유한 상태에서 서로 다른 프로세스가 점유하고 있는 자원을 요구하며 무한정 기다리는 상황
  3. 해결방법
    • 상호 배제(Mutual Exclusion): Locking과 UnLocking를 통해 구현
    • 세마포어(Semaphore): 최대 허용치만큼 접근 요청을 가능하게 설정하여 0이 되면 대기하도록 설정
    • Monitor: synchronized를 통해 구현

동기 & 비동기

  1. 동기
    • 설계가 간단하고 직관적
    • 결과가 주어질 때까지 다른 작업을 수행하지 못함
  2. 비동기
    • 동기보다 복잡
    • 어떤 작업이 진행 중일 때, 그 시간 동안 다른 작업을 할 수 있으므로 자원을 효율적으로 사용할 수 있음

페이지 교체 알고리즘

: 운영체제에서 필요한 페이지가 주기억장치에 적재되지 않았을 시(= 페이징 부재) 어떤 페이지를 선택해 교체할 것인지 결정하는 방법

  1. FIFO(first in first out)
    : 가장 간단한 알고리즘, 메모리에 올라온 지 가장 오래된 페이지를 교체
  2. 최적(Optimal)
    : 앞으로 가장 오랫동안 사용되지 않을 페이지를 교체 - 구현 불가능
  3. LRU(least-recently-used)
    : 가장 오래 사용되지 않은 페이지를 교체
  4. LFU(least-frequently-used)
    : 참조 횟수가 가장 작은 페이지를 교체
  5. MFU(most-frequently-used)
    : 참조 횟수가 가장 많은 페이지를 교체

 

 

 

참고 자료

 

신입 개발자 기술면접 질문 정리 - 네트워크

💡 HTTP 프로토콜에 대해 설명해주세요. HTTP(Hyper Text Transfer Protocol)이란 데이터를 주고 받기 위한 프로토콜이며, 서버/클라이언트 모델을 따릅니다. HTTP는 상태 정보를 저장하지 않는 Stateless의 특

dev-coco.tistory.com

 

[OS] 프로세스(Process)와 스레드(Thread) 차이 (멀티 프로세스, 멀티 스레드)

신입 개발자 기술 면접을 볼 때 항상 나오는 단골 질문 사항입니다. 프로세스와 스레드의 차이를 알고 프로그램이 작동하는 방식에 대해서 잘 이해하고 있는지 묻기 위한 질문이며, 그만큼 중요

cocoon1787.tistory.com

 

ThreadPoolTaskExecutor 설정 고민해보기 (feat. 외부 연동 서비스 API 비동기 호출)

ThreadPoolTaskExecutor 설정 어떻게 하고 있었나 이 포스트를 읽는 독자들에게 질문 하나를 던져보고 싶다. “외부에 있는 다른 서비스, 예를들면 결제 시스템에 결제 API 요청을 하고 응답을 받아야

jeong-pro.tistory.com

 

728x90

'Computer > CS_Knowledge' 카테고리의 다른 글

[CS] Design Pattern  (0) 2023.08.04
[CS] Database  (0) 2023.07.28
[CS] Network  (0) 2023.07.12
[CS] Spring  (0) 2023.07.06
[CS] Java  (0) 2023.07.06
728x90

Spring

POJO(Plain Old Java Object)

  • 외부의 종속성이 없는 단순한 자바 객체 프로그래밍 지향하는 프레임워크
  • 다른 클래스나 인터페이스를 상속하지 않고 getter, setter와 같이 기본적인 기능만 가진 자바 객체
1
2
3
4
5
6
7
8
9
10
public class example {
    private int age;
    private String name;
 
    public int getAge(){return age;}
    public String getName(){return name;}
 
    public void setAge(){this.age = age;}
    public void setAge(){this.name = name;}
}
 
 

 

IoC(Inversion of Control, 제어의 역전)

  • 인스턴스 생명주기 관리를 개발자가 아닌 컨테이너가 대신하는 것
  • IoC container: Spring에서 객체를 생성하고 관리하고 책임지고 의존성을 관리해주는 컨테이너
  • 종류
    • DL(Dependency Lookup): 저장소에 저장되어 있는 Bean(스프링 컨테이너가 관리하는 객체)에 접근하기 위해 컨테이너가 제공하는 API를 이용하여 Bean을 Lockup하는 것
    • DI(Dependency Injection): 필요한 객체를 직접 생성하는 것이 아닌 외부로부터 객체를 받아 사용하는 것
      • :star:Constructor Injection(생성자 주입)
        • 장점
          • 순환 참조 방지: 다른 주입 방식과 달리 스프링 애플리케이션 로딩시점에서 예외가 발생하여 실제 코드가 호출되기 전 오류를 확인할 수 있음
          • 불변성(Immutability): final로 참조형 변수는 반드시 선언과 함께 초기화가 되어야 하므로 누군가 해당 객체값을 임의로 변경할 수 없음
      • Setter Injection(수정자 주입)
        • 단점: 주입이 필요한 객체가 주입이 되지 않아도 객체를 생성할 수 있어 NullPointerException이 발생할 위험이 있음
      • Field Injection(필드 주입)
        • 단점: 주입이 필요한 객체가 주입이 되지 않아도 객체를 생성할 수 있어 NullPointerException이 발생할 위험이 있음

AOP(Aspect Oriented Programming, 관심 지향 프로그래밍)

  • 핵심 로직과 부가 기능을 분리하여 애플리케이션 전체에 걸쳐 사용되는 부가 기능을 모듈화하여 재사용할 수 있도록 지원하는 것
  • OOP: Business Logic의 모듈화, AOP: 기능의 모듈화

PSA(Portable Service Abstraction, 일관된 서비스 추상화)

  • 작업 환경이나 기술이 변하더라도 일관된 방식의 접근 방식을 제공하여 의존성을 크게 고려하지 않아도 되는 구조
  • 예시 psa - @Transactional: JDBC에 특화된 DatasourceTransactionManager, JPA에 특화되어 Entity Manager를 사용하는 JPATransactionManager를 각각 구현하는 것이 아니라, 최상위 추상화 인터페이스인 PlatformTransactionManager를 만들고 각각의 TransactionManager가 구현하도록 만들어서 DI로 주입받아 사용하도록 만들어짐

Spring MVC

  • View: 비즈니스 로직의 처리 결과를 통해 유저 인터페이스가 표현되는 구간
  • Controller: 사용자의 요청을 처리하고 Model과 View를 중개하는 역할
  • Model: 데이터 관리 및 비즈니스 로직을 처리하는 부분

Spring Boot와 Spring의 차이점

  1. Spring Boot: Spring-boot-starter를 통해 dependency를 보다 쉽게 설정할 수 있으며, 버전 관리도 자동으로 됨
  2. Jetty 및 Tomcat 등과 같은 임베디드 서버를 제공

용어

  1. Entity: 실제 DataBase의 테이블과 1 : 1로 매핑되는 클래스
    • DB의 테이블내에 존재하는 컬럼만을 속성(필드)으로 가져야 함
    • 상속을 받거나 구현체여서는 안됨
    • Entity 클래스는 다른 클래스에 영향을 미칠 수 있으므로 View와 통신하며 자주 변경될 수 있는 DTO 클래스로 따로 분리해야 함
  2. DTO(Data Transfer Object): 각 계층(Layer)간 데이터 교환을 위한 객체(Java Beans)
    • 로직을 갖고 있지 않는 순수한 데이터 객체이며, getter/setter 메소드만을 갖음
    • 예: View <-(DTO) -> Controller <- (DTO) -> Service
  3. VO(Value Object): 변하지 않는 데이터 객체, 오직 read만 가능하며 getter만 사용
    • 예: 고정된 값은 VO로 저장 후 Getter 호출
    1
    2
    3
    4
    5
    6
    7
    8
    DTO a = new DTO(1);
    DTO b = new DTO(1);
    // a != b
     
    VO a = new VO(1);
    VO b = new VO(1);
    // a==b
     
     

 

 

 

참고 자료

 

신입 개발자 기술면접 질문 정리 - 자바

💡 Java의 특징을 설명해주세요. Java는 객체지향 프로그래밍 언어입니다. 기본 자료형을 제외한 모든 요소들이 객체로 표현되고, 객체 지향 개념의 특징인 캡슐화, 상속, 다형성이 잘 적용된 언

dev-coco.tistory.com

 

Data Structure - HashMap

Implement HashMap with array and linked list.

jojozhuang.github.io

 

[Java 25] 자바 - 컬렉션 프레임워크 (1)

컬렉션 프레임워크에 대해 알아보겠습니다.

hyuntaekhong.github.io

 

스프링과 스프링부트(Spring Boot)ㅣ정의, 특징, 사용 이유, 생성 방법

스프링은 Java 백엔드 개발에 있어 떼어놓을 수 없는 프레임워크입니다. Java 백엔드의 핵심 기술이 되는 스프링 프레임워크와 스프링 부트가 무엇인지, 나아가 스프링 부트를 활용하여 프로젝트

www.codestates.com

 

Spring의 기본 특징-POJO

올해 1월달부터 스프링 프레임워크를 이용해 쇼핑몰 웹사이트를 구현해보는 프로젝트를 진행 중에 있다. 오늘은 스프링 프레임워크의 특징에 대해 간단히 정리해보고자 한다.아직까지 완벽하

velog.io

 

스프링 - 생성자 주입을 사용해야 하는 이유, 필드인젝션이 좋지 않은 이유

개요 Dependency Injection (의존관계 주입) 이란 Setter Based Injection (수정자를 통한 주입) Constructor based Injection (생성자를 통한 주입) 스프링에서 사용할 수 있는 DI 방법 세가지 생성자 주입을 이용한 순

yaboong.github.io

 

[Spring Boot] Spring PSA

이번 포스팅에선 IoC & DI, Spring AOP 와 함께 Spring 의 3대 특징인 Spring PSA 에 대해서 살펴보려고 한다. Spring PSA 란? Spring PSA 는 Portable Service Abstraction 의 약자로 휴대용 서비스 추상화라는 의미를 가진

ch4njun.tistory.com

 

@Transactional의 동작방식(AOP,PSA)

@Transactional 어노테이션을 AOP와 PSA의 관점에서 공부해보았다. AOP(Aspect Oriented Programming) @Transactional 어노테이션을 사용하면 별도의 트랜잭션 관련 코드없이 트랜잭션 서비스를 이용할 수 있다. 트

cantcoding.tistory.com

 

728x90

'Computer > CS_Knowledge' 카테고리의 다른 글

[CS] Design Pattern  (0) 2023.08.04
[CS] Database  (0) 2023.07.28
[CS] Network  (0) 2023.07.12
[CS] Operating System  (0) 2023.07.12
[CS] Java  (0) 2023.07.06