오늘 진행한 학습 요약
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, 배열, 사용자 정의 클래스 등.
- 기본형 (Primitive): 값을 직접 저장하는 타입.
- 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에서 멀티스레딩을 지원하여 동시에 여러 작업을 수행할 수 있음.
- 스레드 생성 방법:
- Thread 클래스 상속.
- 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을 사용하면 웹 개발에 필요한 의존성을 한 번에 관리할 수 있음.
- Starter Dependency를 제공하여 필요한 의존성을 간단히 추가할 수 있음.
- 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 작업을 간단히 처리할 수 있음.
- spring-boot-starter-data-jpa를 사용해 데이터베이스와 쉽게 연동할 수 있음.
- 8. 보안 (Spring Security)
- spring-boot-starter-security를 사용하여 인증 및 권한 관리를 간단히 구현할 수 있음.
- OAuth2, 세션 관리 등 다양한 보안 기능을 지원함.
- 9. 테스트 지원
- Spring Boot는 애플리케이션 테스트를 위해 다양한 어노테이션과 도구를 제공함.
예: @SpringBootTest, @WebMvcTest, @DataJpaTest - Mock 객체를 사용하여 효율적으로 테스트를 작성할 수 있음.
- Spring Boot는 애플리케이션 테스트를 위해 다양한 어노테이션과 도구를 제공함.
- 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: 사용자 정의 검증 로직
- @Controller vs @RestController
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 세션마다 새로운 인스턴스를 생성
- 세션별로 상태를 관리해야 하는 경우 유용
- Singleton (기본값):
- Bean Scope는 Spring 컨테이너가 Bean의 생명 주기를 관리하는 범위를 정의
- Spring Bean 생명 주기
- 의존성 주입(DI, Dependency Injection)
- Spring은 DI를 통해 객체 간의 의존성 관리
- Field Injection:
- @Autowired를 필드에 직접 적용
- 간단하지만, 테스트와 유지보수가 어려움
- Setter Injection:
- Setter 메서드에 @Autowired를 적용
- 선택적인 의존성 주입이 필요한 경우 유용
- Constructor Injection (권장):
- 생성자에 @Autowired를 적용
- 필수 의존성을 명확하게 정의하며, 불변 객체를 만들 수 있음
- 테스트 코드에서 Mock 객체를 쉽게 주입 가능
- Field Injection:
- Spring은 DI를 통해 객체 간의 의존성 관리
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)은 연관 엔티티를 즉시 조회하며, 불필요한 데이터를 가져오는 문제가 발생
- 1차 캐시
- 영속성 컨텍스트의 특징
- JPA N + 1 문제
- 연관 관계가 있는 엔티티를 조회할 때, 한 번의 조회(findAll)로 N개의 엔티티를 가져오고, 각각의 연관 엔티티에 대해 추가적인 단건 쿼리 N번이 발생하는 문제
- 해결 방법
- JPQL에서 join fetch 사용
- FetchType 설정
- N + 1 문제 발생 시점
- 즉시 로딩(Eager Loading)
- 조회 시점에 즉시 연관 엔티티를 로드하며, N번의 단건 조회가 추가로 발생
- 지연 로딩(Lazy Loading)
- 초기에는 연관된 엔티티를 로드하지 않지만, 연관 엔티티를 사용하는 순간 N번의 단건 조회가 발생
- 즉시 로딩(Eager Loading)
- 해결 방법
- 연관 관계가 있는 엔티티를 조회할 때, 한 번의 조회(findAll)로 N개의 엔티티를 가져오고, 각각의 연관 엔티티에 대해 추가적인 단건 쿼리 N번이 발생하는 문제
Spring Test
- Spring Boot에서 테스트의 종류
- 단위 테스트(Unit Test)
- 개별 메서드나 클래스의 동작을 검증
- Mocking을 사용하여 외부 의존성을 분리
- @MockBean, @Mockito, @Test
- 통합 테스트(Intergration Test)
- 여러 계층(Service, Repository 등)이 조화를 이루며 동작하는지 확인
- 데이터베이스, 컨트롤러 등을 포함
- @SpringBootTest
- 컨트롤러 테스트(Web Layer Test)
- 컨트롤러 계층을 독립적으로 테스트
- MockMvc 사용
- @WebMvcTes
- 단위 테스트(Unit Test)
- 주요 어노테이션과 활용
- @SpringBootTest
- Spring 컨텍스트를 로드하여 통합 테스트를 실행
- 실제 데이터베이스나 기타 구성 요소와 함께 어플리케이션 전체를 테스트
- @WebMvcTest
- 컨트롤러만 테스트
- 서비스나 레포지토리는 Mock으로 처리
- @DataJpaTest
- JPA 관련 테스트를 위해 최소한의 설정만 로드
- 임베디드 데이터베이스 (H2) 사용 가능
- @MockBean
- 테스트에서 Mock 객체를 주입하여 외부 의존성을 대체
- @TestConfiguration
- 테스트를 위한 별도의 Bean설정을 정의
- @SpringBootTest
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에 사용자 정보 저장
- JWT 기반 인증의 흐름
- 인증(Authentication)
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로 연동.
- SQL 데이터베이스:
- SQL (Structured Query Language):
- 트랜잭션 (ACID)
- 원자성 (Atomicity):
- 하나의 트랜잭션 안에서 실행되는 모든 작업은 성공하거나 모두 실패합니다.
- 예: 송금 시스템에서 A 계좌에서 돈을 빼는 작업과 B 계좌에 돈을 넣는 작업이 모두 성공하거나 모두 실패.
- 일관성 (Consistency):
- 트랜잭션 실행 전후에 데이터는 항상 유효한 상태여야 합니다.
- 예: 은행 계좌의 잔액은 음수가 될 수 없습니다.
- 고립성 (Isolation):
- 서로 다른 트랜잭션은 독립적으로 실행되어야 하며, 다른 트랜잭션의 중간 작업을 볼 수 없습니다.
- 격리 수준(Isolation Level) 예시:
- READ_UNCOMMITTED: 커밋되지 않은 데이터를 읽을 수 있음.
- READ_COMMITTED: 커밋된 데이터만 읽을 수 있음.
- REPEATABLE_READ: 같은 트랜잭션 내에서는 같은 데이터를 읽을 때 항상 동일한 값을 반환.
- SERIALIZABLE: 가장 엄격한 격리 수준, 모든 트랜잭션이 직렬적으로 실행.
- 지속성 (Durability):
- 트랜잭션이 커밋된 후에는 어떤 시스템 오류에도 데이터가 손실되지 않습니다.
- 데이터는 로그 파일, 스냅샷 등을 통해 안전하게 보존됩니다.
- 원자성 (Atomicity):
- SQL Mapper
- SQL 쿼리를 XML이나 어노테이션으로 직접 매핑하는 프레임워크.
NetWork
- 1) 물리(Physical)
- 리피터, 케이블, 허브 등
- 단지 데이터를 전기적인 신호로 변환해서 주고받는 기능을 진행하는 공간
- 즉, 데이터를 전송하는 역할만 진행
- 리피터, 케이블, 허브 등
- 2) 데이터 링크(Data Link)
- 브릿지, 스위치 등
- 물리 계층으로 송수신되는 정보를 관리하여 안전하게 전달되도록 도와주는 역할
- Mac 주소를 통해 통신한다. 프레임에 Mac 주소를 부여하고 에러검출, 재전송, 흐름제어를 진행
- 브릿지, 스위치 등
- 3) 네트워크(Network)
- 라우터, IP
- 데이터를 목적지까지 가장 안전하고 빠르게 전달하는 기능을 담당라우팅, 흐름 제어, 오류 제어, 세그먼테이션 등을 수행
- 라우터를 통해 이동할 경로를 선택하여 IP 주소를 지정하고, 해당 경로에 따라 패킷을 전달
- 라우터, IP
- 4) 전송(Transport)
- TCP, UDP
- TCP와 UDP 프로토콜을 통해 통신을 활성화한다. 포트를 열어두고, 프로그램들이 전송을 할 수 있도록 제공
- TCP : 신뢰성, 연결지향적
- UDP : 비신뢰성, 비연결성, 실시간
- TCP, UDP
- 5) 세션(Session)
- API, Socket
- 데이터가 통신하기 위한 논리적 연결을 담당한다. TCP/IP 세션을 만들고 없애는 책임
- API, Socket
- 6) 표현(Presentation)
- JPEG, MPEG 등
- 데이터 표현에 대한 독립성을 제공하고 암호화하는 역할을 담당
- 파일 인코딩, 명령어를 포장, 압축, 암호화
- JPEG, MPEG 등
- 7) 응용(Application)
- HTTP, FTP, DNS 등
- 최종 목적지로, 응용 프로세스와 직접 관계하여 일반적인 응용 서비스를 수행
- 사용자 인터페이스, 전자우편, 데이터베이스 관리 등의 서비스를 제공
- HTTP, FTP, DNS 등
HTTP
- 인터넷 상에서 클라이언트와 서버가 자원을 주고 받을때 쓰는 통신규약
- 보안 문제를 해결해 주는 프로토콜은 HTTPS
- HTTP의 취약점
- 평문으로 통신해서 도청 가능
- 통신 상대를 확인하지 않아, 위장된 상대와 통신 가능
- 완정성을 보장하지 않아 변조가 가능
- 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) 데이터에 대한 메타데이터를 포함함.
- 요청 헤더 (Request Header)
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가 포함