Today I Learned

250121 TIL / Java, Spring, 기타 CS 지식 정리

shinelee26 2025. 1. 22. 00:17

오늘 진행한 학습 요약

1. Java 정리

  • Java 기본 개념
  • Java 객체 지향
  • Java Class
  • Java Interface
  • Java Abstract Class
  • Java 상속
  • Java  변수

2. Spring 정리

  • Spring Boot 특징
  • Spring MVC
  • Layered Architecture (계층형 아키텍처)
  • Spring Bean
  • Spring JPA
  • Spring Test
  • Spring Security
  • Spring Cookie, Session, Token, Filter, Interceptor

3. CS 정리

  • DB
  • NetWork
  • HTTP
  • Cloud
  • CI/CD
  • Docker

1. Java 정리

 

Java 기본 개념

  • 1. 객체 지향 프로그래밍 (OOP, Object-Oriented Programming)
    • Java는 객체 지향 프로그래밍 언어로, 코드 재사용성과 유지보수를 높이는 데 중점을 둠.
    • 4가지 주요 특징:
      • 캡슐화: 데이터를 클래스 내부에 감추고, 외부에서는 메서드를 통해 접근함.
      • 상속: 기존 클래스의 속성과 메서드를 새로운 클래스에서 확장하여 사용함.
      • 다형성: 동일한 인터페이스나 부모 클래스를 기반으로 서로 다른 동작을 수행할 수 있음.
      • 추상화: 불필요한 세부 사항은 숨기고, 중요한 부분만 노출함.
  • 2. 클래스와 객체
    • 클래스: 객체를 생성하기 위한 설계도. 속성(필드)과 동작(메서드)으로 구성됨.
    • 객체: 클래스에 정의된 설계로 생성된 실체. 메모리에 할당되어 동작할 수 있음.
    • 객체 생성: ClassName obj = new ClassName();
  • 3. 데이터 타입
    • 기본형 (Primitive): 값을 직접 저장하는 타입.
      • 예: int, float, boolean, char 등.
    • 참조형 (Reference): 객체의 주소값을 저장하는 타입.
      • 예: String, 배열, 사용자 정의 클래스 등.
  • 4. 변수와 상수
    • 변수: 데이터를 저장하기 위한 메모리 공간. 값을 변경할 수 있음.
      • 지역 변수, 인스턴스 변수, 클래스 변수(정적 변수)로 구분됨.
    • 상수: 값이 변하지 않는 변수. final 키워드로 선언됨.
      • 예: final int MAX_VALUE = 100;
  • 5. 제어문
    • 조건문: 프로그램 흐름을 제어하기 위한 구조.
      • if, if-else, switch.
    • 반복문: 특정 코드를 반복적으로 실행함.
      • for, while, do-while.
  • 6. 메서드
    • 특정 작업을 수행하는 코드 블록으로, 재사용 가능함.
    • 선언 방식: 리턴타입 메서드명(매개변수) { 코드 }
    • 메서드 오버로딩: 같은 이름의 메서드를 매개변수 유형이나 개수로 구분하여 선언함.
  • 7. 예외 처리
    • 프로그램 실행 중 발생할 수 있는 오류를 처리하기 위한 구조.
    • try-catch-finally 블록을 사용하여 예외를 처리함.
  • 8. 접근 제어자
    • 클래스, 메서드, 변수의 접근 범위를 제어함.
      • public: 어디서나 접근 가능.
      • protected: 같은 패키지 또는 상속받은 클래스에서 접근 가능.
      • default: 같은 패키지에서만 접근 가능.
      • private: 클래스 내부에서만 접근 가능.
  • 9. 상속
    • 기존 클래스(부모 클래스)의 속성과 메서드를 새로운 클래스(자식 클래스)가 물려받음.
    • 키워드: extends.
    • 메서드 오버라이딩: 부모 클래스의 메서드를 자식 클래스에서 재정의함.
  • 10. 인터페이스와 추상 클래스
    • 추상 클래스: 공통적인 기능을 정의하는데 사용되며, 인스턴스를 생성할 수 없음.
      • 키워드: abstract.
    • 인터페이스: 클래스가 구현해야 할 동작을 정의함.
      • 키워드: interface, 메서드는 기본적으로 추상 메서드임.
  • 11. 컬렉션 프레임워크
    • 데이터를 효율적으로 저장하고 관리하기 위한 클래스 집합.
      • 주요 인터페이스: List, Set, Map.
      • 구현 클래스: ArrayList, HashSet, HashMap 등.
  • 12. 스레드 (Thread)
    • Java에서 멀티스레딩을 지원하여 동시에 여러 작업을 수행할 수 있음.
    • 스레드 생성 방법:
      1. Thread 클래스 상속.
      2. Runnable 인터페이스 구현.
  • 13. 입출력 (I/O)
    • 파일, 콘솔, 네트워크 등 다양한 입력과 출력을 처리함.
    • 주요 클래스: InputStream, OutputStream, Reader, Writer.
  • 14. JVM (Java Virtual Machine)
    • Java 애플리케이션을 실행하기 위한 가상 머신.
    • 주요 구성:
      • Class Loader: 클래스 파일을 로드함.
      • Runtime Area: 메모리를 관리함.
      • Execution Engine: 바이트코드를 실행함.

 

Java 객체 지향

  • 프로그래밍에서 필요한 데이터를 추상화시켜 상태와 행위를 가진 객체로 만들고, 객체들 간의 상호작용을 통해 로직을 구성하는 프로그래밍 방법
  • 유연하고, 코드의 재사용을 줄이고, 코드의 가독성을 높이며, 유지보수를 용이하게 만드는 것이 목적
    • 캡슐화
      • 데이터와 메서드를 하나의 단위로 묶어, 외부에서 접근하지 못하도록 보호하는 개념
      • 캡슐화 해야하는 이유
        • 불안정한 부분과 안정적인 부분을 분리해서 변경의 영향을 통제할 수 있기 때문
    • 상속
      • 여러 개체들이 지닌 공통된 특성을 부각시켜 하나의 개념이나 법칙으로 성립하는 과정
      • 부모→자식
    • 다형성
      • 프로그래밍에서의 다형성이란 같은 자료형에 여러 가지 타입의 데이터를 대입하여 다양한 결과를 얻어낼 수 있는 성질
    • 추상화
      • 객체들이 공통적으로 필요로 하는 속성이나 동작을 하나로 추출해 내는 작업

Java Class

  • 클래스는 객체를 생성하기 위한 설계도
  • 객체의 상태를 저장하는 필드(속성)와 객체의 동작을 정의하는 메서드(행동)로 구성
  • 이를 통해 프로그램에서 필요한 데이터와 동작을 하나로 묶어 관리
    • 특징:
      • 인스턴스 생성: 클래스를 기반으로 객체를 생성
      • 상태와 동작 포함: 클래스는 필드(상태)와 메서드(동작)를 포함하며, 이 둘은 클래스 내에서 유기적으로 결합
      • 접근 제한: 필드와 메서드는 접근 제한자(public, private, protected)를 사용해 외부 접근을 제어

 

Java Interface

  • 인터페이스는 클래스가 구현해야 하는 메서드의 "청사진"을 제공
  • 인터페이스 자체에는 구현이 없으며, 구현은 이를 상속받는 클래스가 담당
    • 특징:
      • 다중 상속 가능: 클래스와 달리 인터페이스는 여러 개를 동시에 구현할 수 있음
      • 메서드: 인터페이스의 모든 메서드는 기본적으로 public abstract
      • 상수: 인터페이스의 모든 필드는 기본적으로 public static final로 간주.
      • 구현 의무: 인터페이스를 구현하는 클래스는 인터페이스의 모든 추상 메서드를 반드시 구현해야 함.
      • 디폴트 메서드: Java 8 이후, default 키워드를 사용하여 메서드에 기본 구현을 제공할 수 있음

 

Java Abstract Class

  • 추상 클래스는 일부 메서드만 구현하거나, 아예 구현하지 않은 메서드를 포함할 수 있는 클래스
  • 이 클래스는 객체를 직접 생성할 수 없으며, 상속을 통해 사용
    • 특징:
      • 추상 메서드: 구현되지 않은 메서드는 abstract 키워드로 선언
      • 일반 메서드와 혼용 가능: 일반 메서드(구현된 메서드)와 추상 메서드를 혼합하여 사용할 수 있음
      • 객체 생성 불가: 추상 클래스 자체로는 객체를 생성할 수 없습니다. 이를 상속한 클래스만 객체 생성이 가능

 

Java 상속

  • 상속은 기존 클래스(부모)의 속성과 메서드를 새로운 클래스(자식)에게 물려주는 구조
    • 특징:
      • 코드 재사용성: 중복 코드를 줄이고, 유지보수를 쉽게 힘
      • 오버라이딩: 부모 클래스의 메서드를 자식 클래스에서 재정의하여 사용할 수 있음
      • 단일 상속: Java는 클래스 간 단일 상속만 허용. (다중 상속은 인터페이스를 통해 구현 가능)

 

Java  변수

  • 인스턴스 변수
    • 정의: 클래스 내부에 선언되고, 객체가 생성될 때 메모리에 할당되는 변수.
    • 특징:
      • 객체마다 별도로 존재하며, 값이 독립적입니다.
      • 선언 시 초기화하지 않으면 기본값으로 초기화됩니다. (예: 숫자는 0, 참조형은 null)
  • 클래스 변수 (static 변수)
    • 정의: static 키워드로 선언된 변수로, 클래스 로딩 시 메모리에 할당되는 변수.
    • 특징:
      • 모든 객체가 공유하는 변수입니다.
      • 객체 없이 클래스 이름으로 접근 가능합니다.
      • 선언 시 초기화하지 않으면 기본값으로 초기화됩니다.
  • 지역 변수
    • 정의: 메서드나 블록 내부에서 선언되고, 해당 범위 내에서만 유효한 변수.
    • 특징:
      • 메서드 호출 시 생성되고, 메서드 종료 시 소멸됩니다.
      • 반드시 초기화 후 사용해야 합니다.
  • 전역 변수 (멤버 변수)
    • 정의: 클래스 내부에 선언된 변수로, 모든 메서드에서 접근 가능합니다. (인스턴스 변수 + 클래스 변수 포함)
    • 특징:
      • 객체의 상태를 나타내며, 클래스의 모든 메서드에서 접근 가능합니다.
      • static 여부에 따라 인스턴스 변수와 클래스 변수로 나뉩니다.
  • Stack
    • 메모리에서 일시적인 데이터를 저장
    • 지역 변수, 매개 변수, 리턴 주소 등을 저장
    • 메모리를 빠르게 할당하고 해제할 수 있어 속도가 빠름
    • 메모리 관리가 자동으로 이루어짐
    • LIFO (Last In, First Out) 방식으로 데이터가 쌓이고 제거
    • Stack은 크기가 제한되어 있어 너무 많은 데이터를 할당할 경우 Stack Overflow가 발생
  • Heap
    • 동적으로 할당되는 메모리 영역
    • 객체와 같은 큰 데이터, 런타임에 생성되는 변수들을 저장 (new로 생성되는거!)
    • Stack에 비해 메모리 할당과 해제 속도가 느리지만, 유연하게 메모리를 사용
    • 프로그래머가 직접 메모리를 할당하고 해제해야 하며 자바에서는 가비지 컬렉터가 자동으로 메모리를 관리
    • 메모리 관리를 잘못하면 메모리 누수가 발생

 


2. Spring 정리

 

Spring Boot 특징

  • 1. 자동 설정 (Auto Configuration)
    • Spring Boot는 복잡한 설정을 자동으로 처리함.
    • @SpringBootApplication 어노테이션을 사용하면 필요한 설정이 자동으로 적용됨.
      예: 데이터베이스 연결, JPA 설정 등이 자동화됨.
  • 2. 내장 서버 (Embedded Server)
    • Tomcat, Jetty, Undertow 등의 웹 서버가 내장되어 있어, 외부 서버 설치 없이 JAR 파일 실행만으로 애플리케이션이 구동됨.
    • 별도의 서버 설정 없이 독립적으로 실행 가능함.
  • 3. 의존성 관리 (Dependency Management)
    • Starter Dependency를 제공하여 필요한 의존성을 간단히 추가할 수 있음.
      예: spring-boot-starter-web을 사용하면 웹 개발에 필요한 의존성을 한 번에 관리할 수 있음.
  • 4. 프로덕션 준비 기능
    • Spring Boot Actuator를 통해 애플리케이션 상태를 모니터링할 수 있음.
    • /actuator 엔드포인트에서 메트릭, 헬스체크 정보를 확인할 수 있음.
  • 5. 외부 구성 (Externalized Configuration)
    • application.properties 또는 application.yml 파일을 사용해 애플리케이션 설정을 외부에서 관리할 수 있음.
    • 환경별 설정은 spring.profiles.active를 통해 분리 가능함.
  • 6. Spring Boot CLI
    • Spring Boot CLI를 사용하면 간단한 스크립트로 애플리케이션을 빠르게 실행하거나 테스트할 수 있음.
    • Groovy 언어를 기반으로 빠른 프로토타이핑이 가능함.
  • 7. JPA와 데이터 액세스
    • spring-boot-starter-data-jpa를 사용해 데이터베이스와 쉽게 연동할 수 있음.
      Hibernate를 기본으로 지원하며, CRUD 작업을 간단히 처리할 수 있음.
  • 8. 보안 (Spring Security)
    • spring-boot-starter-security를 사용하여 인증 및 권한 관리를 간단히 구현할 수 있음.
    • OAuth2, 세션 관리 등 다양한 보안 기능을 지원함.
  • 9. 테스트 지원
    • Spring Boot는 애플리케이션 테스트를 위해 다양한 어노테이션과 도구를 제공함.
      예: @SpringBootTest, @WebMvcTest, @DataJpaTest
    • Mock 객체를 사용하여 효율적으로 테스트를 작성할 수 있음.
  • 10. DevTools
    • Spring Boot DevTools를 사용하면 코드 변경 시 자동으로 애플리케이션을 재시작함.
    • 브라우저 자동 새로 고침 기능으로 개발 생산성을 높임.
  • 11. Gradle 및 Maven 지원
    • Gradle과 Maven을 사용하여 의존성 관리와 빌드를 간단히 처리할 수 있음.
    • Spring Boot 플러그인을 활용해 JAR 파일 생성 및 실행을 쉽게 할 수 있음.

 

Spring MVC

  • MVC 패턴이란 웹 어플리케이션에서 자주 사용되는 디자인 패턴으로 시스템을 크게 Model, View, Controller로 나누어 모듈간에 결합도를 낮추고 응집도를 높이기 위해 사용하는 패턴
    • Controller사용자로부터 요청을 받아서 모델, 뷰와의 상호작용을 통해 적절한 응답을 제공해주는 중개자의 역할을 하는 컴포넌트
    • Model은 시스템에서 사용하는 도메인
    • View는 사용자에게 제공하는 화면이나 페이지
  • DispatcherServlet
    • pring MVC의 핵심. 모든 HTTP 요청을 받아 컨트롤러로 전달
    • 역할:
      • 요청 → 핸들러 매핑 → 컨트롤러 호출 → 뷰 리졸버로 결과 반환
  • 주요 어노테이션
    • @Controller vs @RestController
      • @Controller: View 반환
      • @RestController: JSON 반환
      • @Controller + @ResponseBody = @RestController
        • 이 두개가 만나면 RestController처럼 작동한다.
    • @RequestMapping vs @GetMapping
      • @RequestMapping: HTTP 메서드 지정 필요
      • @GetMapping: GET 메서드 전용
    • @PathVariable vs @RequestParam
      • @PathVariable: URL 경로 변수
      • @RequestParam: 쿼리 파라미터
    • @Validation
      • @Valid와 @Validated: 요청 데이터 검증
      • BindingResult: 검증 결과 처리
      • Custom Validator: 사용자 정의 검증 로직

Layered Architecture (계층형 아키텍처)

  • Controller:
    • 사용자의 HTTP 요청을 처리하고 응답을 반환.
    • 주로 @Controller 또는 @RestController로 선언.
  • Service:
    • 비즈니스 로직을 처리하는 계층.
    • 주로 @Service로 선언하며, Controller와 Repository 사이에서 역할
  • Repository:
    • DB와 직접 통신하며 데이터를 조작.
    • 주로 @Repository로 선언하며 Spring Data JPA를 활용.

 

Spring Bean

  • Spring Bean은 Spring IoC 컨테이너에서 관리되는 객체
    • Spring Bean 생명 주기
      • 생성: @Component, @Service, @Repository, @Configuration 사용
      • 초기화: @PostConstruct 또는 InitializingBean의 afterPropertiesSet()
      • 소멸: @PreDestroy 또는 DisposableBean의 destroy()
    • Bean Scope
      • Bean Scope는 Spring 컨테이너가 Bean의 생명 주기를 관리하는 범위를 정의
        • Singleton (기본값):
          • 애플리케이션 내에서 Bean의 단일 인스턴스를 공유
          • 메모리 사용량 감소 및 성능 향상
          • 상태를 유지해야 하는 경우 주의 필요 (동시성 문제)
        • Prototype:
          • 요청할 때마다 새로운 인스턴스를 생성
          • 상태를 유지하거나 다르게 동작해야 하는 객체에 적합
        • Request:
          • HTTP 요청마다 새로운 인스턴스를 생성
          • 주로 웹 애플리케이션에서 사용
        • Session:
          • HTTP 세션마다 새로운 인스턴스를 생성
          • 세션별로 상태를 관리해야 하는 경우 유용
  • 의존성 주입(DI, Dependency Injection)
    • Spring은 DI를 통해 객체 간의 의존성 관리
      • Field Injection:
        • @Autowired를 필드에 직접 적용
        • 간단하지만, 테스트와 유지보수가 어려움
      • Setter Injection:
        • Setter 메서드에 @Autowired를 적용
        • 선택적인 의존성 주입이 필요한 경우 유용
      • Constructor Injection (권장):
        • 생성자에 @Autowired를 적용
        • 필수 의존성을 명확하게 정의하며, 불변 객체를 만들 수 있음
        • 테스트 코드에서 Mock 객체를 쉽게 주입 가능

 

Spring JPA

  • Java에서 사용하는 ORM 표준 = JPA
  • JPA는 자바 EE(현 Jakarta EE) 스펙으로 정의된 ORM 인터페이스의 집합입니다.
  • Spring Data JPA란?
    • Hibernate와 같은 JPA 구현체를 기반으로, 데이터를 더 쉽게 다룰 수 있도록 Spring에서 제공하는 모듈
    • 기본적인 CRUD 작업과 쿼리 메서드 자동 생성 등 개발 생산성을 높이는 여러 기능을 제공
  • ORM이란?
    • Object Relational Mapping(객체 관계 매핑)
    • 객체지향 언어의 객체와 관계형 데이터베이스(RDB)의 테이블을 자동으로 매핑해 주는 기술
    • ORM의 장점
      • 객체지향적인 DB 조작
      • 가독성, 재사용성, 유지보수성 향상
      • DB 종속성 감소
  • 영속성 컨텍스트란?
    • 영속성 컨텍스트는 데이터를 영구적으로 보관하는 환경을 의미
    • 논리적으로 애플리케이션과 DB 사이에서 객체를 관리하는 역할
    • EntityManager 생성 시, 1:1로 영속성 컨텍스트가 생성
    • 영속성 컨텍스트를 통해 엔티티를 저장하거나 조회하고 변경 사항을 감지
      • 영속성 컨텍스트의 특징
        • 트랜잭션 시작 시 EntityManager와 함께 생성되며, 커밋 시 변화가 DB에 반영되고 종료
        • 영속성 컨텍스트는 트랜잭션이 없어도 EntityManager에 의해 독립적으로 동작
      • JPA 영속성 컨텍스트의 이점
        • 1차 캐시
          • 조회한 데이터를 1차 캐시에 저장하고, 동일한 트랜잭션 내에서 동일한 엔티티를 재조회할 때 DB 대신 1차 캐시에서 반환
        • 동일성 보장
          • 1차 캐시에 저장된 동일한 엔티티는 == 연산으로 비교 시 참조가 동일하게 보장
        • 쓰기 지연
          • 트랜잭션 커밋 전에 SQL 명령어를 쓰기 지연 SQL 저장소에 저장하고, 커밋 시 한꺼번에 실행
        • 변경 감지
          • 엔티티가 변경되면 스냅샷(초기 상태)과 비교하여 자동으로 Update 쿼리를 생성하고 적용
        • 지연 로딩(Lazy Loading)
          • 연관 엔티티를 실제 사용할 때 DB에서 조회하는 방식
          • 반대로 즉시 로딩(Eager Loading)은 연관 엔티티를 즉시 조회하며, 불필요한 데이터를 가져오는 문제가 발생
  • JPA N + 1 문제
    • 연관 관계가 있는 엔티티를 조회할 때, 한 번의 조회(findAll)로 N개의 엔티티를 가져오고, 각각의 연관 엔티티에 대해 추가적인 단건 쿼리 N번이 발생하는 문제
      • 해결 방법
        • JPQL에서 join fetch 사용
        • FetchType 설정
      • N + 1 문제 발생 시점
        • 즉시 로딩(Eager Loading)
          • 조회 시점에 즉시 연관 엔티티를 로드하며, N번의 단건 조회가 추가로 발생
        • 지연 로딩(Lazy Loading)
          • 초기에는 연관된 엔티티를 로드하지 않지만, 연관 엔티티를 사용하는 순간 N번의 단건 조회가 발생

 

Spring Test

  • Spring Boot에서 테스트의 종류
    • 단위 테스트(Unit Test)
      • 개별 메서드나 클래스의 동작을 검증
      • Mocking을 사용하여 외부 의존성을 분리
      • @MockBean, @Mockito, @Test
    • 통합 테스트(Intergration Test)
      • 여러 계층(Service, Repository 등)이 조화를 이루며 동작하는지 확인
      • 데이터베이스, 컨트롤러 등을 포함
      • @SpringBootTest
    • 컨트롤러 테스트(Web Layer Test)
      • 컨트롤러 계층을 독립적으로 테스트
      • MockMvc 사용
      • @WebMvcTes
  • 주요 어노테이션과 활용
    • @SpringBootTest
      • Spring 컨텍스트를 로드하여 통합 테스트를 실행
      • 실제 데이터베이스나 기타 구성 요소와 함께 어플리케이션 전체를 테스트
    • @WebMvcTest
      • 컨트롤러만 테스트
      • 서비스나 레포지토리는 Mock으로 처리
    • @DataJpaTest
      • JPA 관련 테스트를 위해 최소한의 설정만 로드
      • 임베디드 데이터베이스 (H2) 사용 가능
    • @MockBean
      • 테스트에서 Mock 객체를 주입하여 외부 의존성을 대체
    • @TestConfiguration
      • 테스트를 위한 별도의 Bean설정을 정의

 

Spring Security

  • Spring Security는 애플리케이션의 인증(Authentication)과 권한 부여(Authorization)를 처리하는 강력한 보안 프레임워크
    • 인증(Authentication)
      • 인증이란: 사용자가 본인임을 증명하는 과정
      • Spring Security는 AuthenticationManager와 AuthenticationProvider를 통해 인증을 처리
      • 구성 요소:
        • AuthenticationManager: 인증 요청을 관리
        • AuthenticationProvider: 인증 로직을 구현
        • UserDetailsService: 사용자 정보를 로드
    • 권한 부여(Authorization)
      • 권한 부여란: 인증된 사용자가 특정 자원에 접근 가능한지 확인
      • 방법:
        • @PreAuthorize와 @PostAuthorize를 사용
        • URL 기반 권한 설정 (HttpSecurity 사용)
      • 서블릿 필터(Servlet Filters): 인증 및 권한 부여를 위한 다양한 필터를 제공
      • 보안 컨텍스트(Security Context): 현재 실행 스레드에 대한 보안 정보를 보유
    • JWT(Json Web Token)
      • 인증에 필요한 정보들을 토큰에 담아 암호화 시킨 인증 방식.
      • Header, Payload, Signature로 구성되어있는데, header는 토큰의 타입이나, 어떤 알고리즘이 적용되었는지를 저장하고, Payload는 key-value 형태인 claim으로 개발자가 정한 사용자 정보들을 저장
      • signature는 암호화된 인증 장치로서, 서버가 가지고 있는 개인키로만 복호화를 할 수 있고 이를 토대로 jwt의 유효성을 검증
      • 주요 장점으로는 별도의 인증 저장소가 필수적이지 않고, 클라이언트의 상태를 서버에 저장해두지 않아도 
        • JWT 기반 인증의 흐름
          • 로그인 요청 → JWT 생성 후 클라이언트 전달 → 요청 시 JWT 포함 → 필터에서 JWT 검증 → SecurityContext에 사용자 정보 저장

 

Spring Cookie, Session, Token, Filter, Interceptor

  • Cookie
    • 정의: 클라이언트(브라우저)에 저장되는 작은 데이터 조각.
    • 특징:
      • 클라이언트가 서버와 통신할 때 자동으로 포함됨.
      • 세션 유지, 사용자 식별 등에 사용.
      • 단점: 보안 취약(SQL Injection, CSRF).
  • Session
    • 정의: 서버에 사용자의 상태 정보를 저장하는 방법.
    • 특징:
      • 서버가 사용자 식별을 위해 고유 ID(Session ID)를 클라이언트에 제공.
      • 클라이언트는 Cookie 또는 URL 파라미터를 통해 Session ID 전달.
      • 서버에서 사용자의 상태 정보를 유지.
  • Servlet의 HttpSession
    • 정의: Java Servlet에서 사용자를 식별하고 상태를 저장하는 객체.
    • 특징:
      • HttpSession 객체로 세션 데이터 관리.
      • 서버 메모리에 세션 데이터 저장.
  • Spring의 Session
    • 정의: Spring Framework에서 세션 관리를 위한 확장된 방식.
    • 특징:
      • 기본적으로 HttpSession 사용.
      • Spring Session을 이용하면 세션을 Redis, JDBC 등 다양한 저장소로 확장 가능.
    • Session의 한계
      • 단점:
        • 서버 메모리에 세션 저장 → 대규모 트래픽에서 부하.
        • 서버 간 세션 공유 어려움 → 로드 밸런싱 문제.
        • 스케일링 복잡성 증가.
  • Token
    • 정의: 서버에서 클라이언트에 발급하는 인증 정보.
    • 특징:
      • 클라이언트가 요청 시 포함하여 서버 인증.
      • Stateless(상태 비저장) 방식 → 서버 부하 감소.
  • JWT (JSON Web Token)
    • 정의: JSON 기반으로 정보를 안전하게 전송하는 토큰.
    • 구조: Header.Payload.Signature
      • Header: 타입, 해싱 알고리즘.
      • Payload: 데이터 클레임(사용자 정보).
      • Signature: 위변조 방지 서명.
    • JWT 인증
      • 서버가 JWT 생성 및 발급 → 클라이언트가 요청 시 헤더에 포함 → 서버는 JWT 검증 후 처리.
      • 예: Authorization: Bearer <JWT>.
    • JWT의 장단점
      • 장점:
        • 상태 비저장 → 서버 부하 감소.
        • 클라이언트가 토큰에 저장된 데이터로 즉시 접근 가능.
      • 단점:
        • 토큰 길이 증가 → 네트워크 부하.
        • 토큰 만료 전까지 유효 → 악용 가능성.
    • Access Token & Refresh Token
      • Access Token: 짧은 기간 동안 인증에 사용.
      • Refresh Token: Access Token 만료 시 재발급 요청에 사용.
  • Filter
    • 정의: 요청과 응답 처리 전후에 실행되는 구성 요소.
    • 역할:
      • 공통 로직 처리(인증, 로깅 등).
      • 요청/응답 데이터 수정 가능.
  • 공통 관심 사항 (Cross-Cutting Concerns)
      • 정의: 여러 모듈에서 공통적으로 처리해야 하는 로직.
      • : 인증, 로깅, 캐싱.
      • Spring에서는 **AOP(Aspect-Oriented Programming)**로 처리 가능.
  • Servlet Filter
    • 정의: Servlet에서 요청 및 응답을 처리하기 전후에 동작하는 필터.
    • 특징:
      • javax.servlet.Filter 구현.
      • URL 패턴 기반으로 필터 적용.

3. CS 정리

 

DB

  • DB (Database):
    • 데이터를 체계적으로 저장하는 논리적 공간
    • 테이블, 뷰, 트리거 등의 개념으로 데이터를 저장하고 관리
    • 데이터는 정형 데이터(테이블 구조) 또는 비정형 데이터(텍스트, 이미지 등)로 구성
  • DBMS (Database Management System):
    • 데이터베이스를 관리하고 활용하기 위한 소프트웨어입니다.
    • 데이터의 삽입, 수정, 삭제, 검색과 같은 작업을 제공합니다.
    • 주요 기능:
      • 데이터 무결성 유지
      • 데이터 보안 관리
      • 동시성 제어
      • 트랜잭션 관리
    • 예: MySQL, PostgreSQL, OracleDB, MongoDB 등
    • Spring Boot와의 연계:
      • JDBC: Java 애플리케이션에서 SQL 쿼리를 실행하는 API.
      • JPA: 객체 지향 프로그래밍과 데이터베이스의 테이블 간 간극을 메워주는 ORM(Object-Relational Mapping) 기술.
  • SQL vs NoSQL
    • SQL (Structured Query Language):
      • 관계형 데이터베이스(RDBMS)에서 데이터를 관리하기 위한 표준 언어.
      • 정형 데이터(테이블 형식) 저장에 적합.
      • 주요 특징:
        • 고정된 스키마 구조
        • SQL 문법을 사용해 데이터를 조작
        • JOIN을 통해 복잡한 관계형 쿼리 가능
      • 대표적인 SQL 기반 DBMS: MySQL, PostgreSQL, OracleDB, Microsoft SQL Server
    • NoSQL (Not Only SQL):
      • 비관계형 데이터베이스로 유연한 스키마를 가집니다.
      • 대규모 데이터와 비정형 데이터를 처리하는 데 적합.
      • 주요 특징:
        • 데이터 모델이 문서(Document), 키-값(Key-Value), 열(Column Family), 그래프(Graph) 형태.
        • 스키마가 고정되지 않아 확장성이 뛰어남.
      • 대표적인 NoSQL DBMS: MongoDB, Cassandra, DynamoDB
    • Spring Boot에서의 활용:
      • SQL 데이터베이스:
        • JPA(Hibernate), Spring Data JPA를 통해 관계형 데이터베이스와 쉽게 통신.
      • NoSQL 데이터베이스:
        • MongoDB, Redis와 같은 NoSQL DB를 Spring Data NoSQL로 연동.
  • 트랜잭션 (ACID)
    • 원자성 (Atomicity):
      • 하나의 트랜잭션 안에서 실행되는 모든 작업은 성공하거나 모두 실패합니다.
      • 예: 송금 시스템에서 A 계좌에서 돈을 빼는 작업과 B 계좌에 돈을 넣는 작업이 모두 성공하거나 모두 실패.
    • 일관성 (Consistency):
      • 트랜잭션 실행 전후에 데이터는 항상 유효한 상태여야 합니다.
      • 예: 은행 계좌의 잔액은 음수가 될 수 없습니다.
    • 고립성 (Isolation):
      • 서로 다른 트랜잭션은 독립적으로 실행되어야 하며, 다른 트랜잭션의 중간 작업을 볼 수 없습니다.
      • 격리 수준(Isolation Level) 예시:
        • READ_UNCOMMITTED: 커밋되지 않은 데이터를 읽을 수 있음.
        • READ_COMMITTED: 커밋된 데이터만 읽을 수 있음.
        • REPEATABLE_READ: 같은 트랜잭션 내에서는 같은 데이터를 읽을 때 항상 동일한 값을 반환.
        • SERIALIZABLE: 가장 엄격한 격리 수준, 모든 트랜잭션이 직렬적으로 실행.
    • 지속성 (Durability):
      • 트랜잭션이 커밋된 후에는 어떤 시스템 오류에도 데이터가 손실되지 않습니다.
      • 데이터는 로그 파일, 스냅샷 등을 통해 안전하게 보존됩니다.
  • SQL Mapper
    • SQL 쿼리를 XML이나 어노테이션으로 직접 매핑하는 프레임워크.

 

NetWork

  • 1) 물리(Physical)
    • 리피터, 케이블, 허브 등
      • 단지 데이터를 전기적인 신호로 변환해서 주고받는 기능을 진행하는 공간
      • 즉, 데이터를 전송하는 역할만 진행
  • 2) 데이터 링크(Data Link)
    • 브릿지, 스위치 등
      • 물리 계층으로 송수신되는 정보를 관리하여 안전하게 전달되도록 도와주는 역할
      • Mac 주소를 통해 통신한다. 프레임에 Mac 주소를 부여하고 에러검출, 재전송, 흐름제어를 진행
  • 3) 네트워크(Network)
    • 라우터, IP
      • 데이터를 목적지까지 가장 안전하고 빠르게 전달하는 기능을 담당라우팅, 흐름 제어, 오류 제어, 세그먼테이션 등을 수행
      • 라우터를 통해 이동할 경로를 선택하여 IP 주소를 지정하고, 해당 경로에 따라 패킷을 전달
  • 4) 전송(Transport)
    • TCP, UDP
      • TCP와 UDP 프로토콜을 통해 통신을 활성화한다. 포트를 열어두고, 프로그램들이 전송을 할 수 있도록 제공
      • TCP : 신뢰성, 연결지향적
      • UDP : 비신뢰성, 비연결성, 실시간
  • 5) 세션(Session)
    • API, Socket
      • 데이터가 통신하기 위한 논리적 연결을 담당한다. TCP/IP 세션을 만들고 없애는 책임
  • 6) 표현(Presentation)
    • JPEG, MPEG 등
      • 데이터 표현에 대한 독립성을 제공하고 암호화하는 역할을 담당
      • 파일 인코딩, 명령어를 포장, 압축, 암호화
  • 7) 응용(Application)
    • HTTP, FTP, DNS 등
      • 최종 목적지로, 응용 프로세스와 직접 관계하여 일반적인 응용 서비스를 수행
      • 사용자 인터페이스, 전자우편, 데이터베이스 관리 등의 서비스를 제공

 

HTTP

  • 인터넷 상에서 클라이언트와 서버가 자원을 주고 받을때 쓰는 통신규약
  • 보안 문제를 해결해 주는 프로토콜은 HTTPS
    • HTTP의 취약점
      • 평문으로 통신해서 도청 가능
      • 통신 상대를 확인하지 않아, 위장된 상대와 통신 가능
      • 완정성을 보장하지 않아 변조가 가능
  • HTTPS(HyperText Transfer Protocol Secure)
    • 인터넷 상에서 정보를 암호화 하는 SSL 프로토콜을 이용해 클라이언트와 서버가 자원을 주고 받을 때 쓰는 통신 규약
    • 텍스트를 공개키 암호화 방식으로 암호화
  • SSL인증서
    • 클라이언트와 서버간의 통신을 공인된 제 3자(CA) 업체가 보증해주는 전자화된 문서
    • SSL 통신에 사용할 공개키를 클라이언트에게 제공
  • HTTP Header 구조
    • 요청(Request) 헤더응답(Response) 헤더로 구분
    • Header는 key-value 형식으로 작성
    • 빈 줄(줄바꿈 문자 \r\n)로 헤더와 본문(Body)을 구분
      • 요청 헤더 (Request Header)
        • 요청에 대한 세부 정보를 서버에 전달함.
        • GET /index.html HTTP/1.1
          Host: www.example.com
          User-Agent: Mozilla/5.0
          Accept: text/html, application/json
          Authorization: Bearer abc123
          Cookie: session_id=abc123
      • 응답 헤더 (Response Header)
        • 서버가 클라이언트에게 응답할 때 전달되는 헤더.
        • 응답의 세부 정보를 클라이언트에 제공함.
        • HTTP/1.1 200 OK
          Content-Type: text/html; charset=UTF-8
          Content-Length: 1024
          Server: Apache/2.4.41
          Set-Cookie: session_id=xyz789; HttpOnly
          Cache-Control: no-cache
      • 엔터티 헤더 (Entity Header)
        • 본문(Body) 데이터에 대한 메타데이터를 포함함.

 

Cloud

  • AWS S3
    • AWS S3(Simple Storage Service)는 확장성, 보안성, 성능이 뛰어난 객체 스토리지 서비스
  • AWS EC2
    • AWS EC2(Elastic Compute Cloud)는 클라우드에서 확장 가능한 가상 서버를 제공하는 서비스

 

CI/CD

  • Github Actions
    • Github Actions는 CI/CD를 지원하는 도구로, 레포지토리 내에서 워크플로우를 정의하여 자동화 작업(테스트, 빌드, 배포 등)을 수행

 

Docker

  • Docker는 애플리케이션을 컨테이너에 격리하여 실행할 수 있는 플랫폼
  • 컨테이너는 애플리케이션과 해당 환경을 함께 패키징하여 어디서든 일관되게 실행
    • Docker : 경량화된 컨테이너 기술로, 호스트 OS 위에서 실행되며 애플리케이션과 필요한 의존성만 포함
    • VM : 하드웨어 수준에서 격리된 환경을 제공하며, 각 VM에는 자체 OS가 포함