diff --git a/keyword/chapter09/keyword.md b/keyword/chapter09/keyword.md new file mode 100644 index 0000000..21a1942 --- /dev/null +++ b/keyword/chapter09/keyword.md @@ -0,0 +1,39 @@ +- Spring Data JPA의 Paging + - Page + - **전체 페이지 정보**를 제공하는 페이징 객체. + - 데이터와 함께 **전체 데이터 개수, 총 페이지 수, 현재 페이지 번호** 등의 메타 정보를 포함. + - 반환 메서드: `Page` + - 주로 `Pageable` 인터페이스와 함께 사용. + + 주요 메서드 + + - `getContent()`: 조회된 데이터 목록 반환. + - `getTotalPages()`: 총 페이지 수 반환. + - `getTotalElements()`: 전체 데이터 개수 반환. + - `getNumber()`: 현재 페이지 번호 반환. + - `hasNext()` / `hasPrevious()`: 다음/이전 페이지 존재 여부 확인. + - Slice + - **현재 페이지 정보**만 제공하며, **전체 데이터 개수**나 **총 페이지 수**는 알 수 없음. + - 더 적은 리소스를 사용하여 다음 페이지 유무만 판단. + - 반환 메서드: `Slice` + - 주로 무한 스크롤과 같은 경우에 사용. + + 주요 메서드 + + - `getContent()`: 조회된 데이터 목록 반환. + - `hasNext()` / `hasPrevious()`: 다음/이전 페이지 존재 여부 확인. +- 객체 그래프 탐색 + + 엔티티 객체 간의 관계를 통해 연관된 데이터를 탐색하거나 로드하는 것. + + 1. **Lazy Loading (지연 로딩)**: + - 연관된 엔티티를 **실제 사용 시점**에 로드. + - `@OneToMany`, `@ManyToOne` 등에서 기본 설정. + - 성능에 유리하지만, **N+1 문제**가 발생할 수 있음. + 2. **Eager Loading (즉시 로딩)**: + - 엔티티를 로드할 때 연관된 엔티티를 **즉시 함께 로드**. + - `@OneToOne(fetch = FetchType.EAGER)`처럼 명시적으로 설정. + - 데이터를 즉시 사용 가능하지만, 불필요한 데이터 로드로 인해 성능 저하 가능. + 3. **JPQL 또는 Fetch Join**: + - JPQL에서 `JOIN FETCH`를 사용해 필요한 연관 데이터를 한 번에 로드. + - N+1 문제 해결에 효과적. \ No newline at end of file diff --git a/keyword/chapter10/keyword.md b/keyword/chapter10/keyword.md new file mode 100644 index 0000000..2aaddf6 --- /dev/null +++ b/keyword/chapter10/keyword.md @@ -0,0 +1,61 @@ +- **Spring Security** + + Spring Security는 애플리케이션의 보안(인증 및 인가)을 제공하기 위한 강력하고 유연한 프레임워크다. + + 스프링 기반 애플리케이션에서 주로 사용되며, 다양한 보안 관련 기능을 제공합니다. + + ### 주요 특징: + + 1. **보안 기능 제공** + - 인증(Authentication): 사용자의 신원을 확인하는 과정. + - 인가(Authorization): 사용자에게 특정 리소스에 대한 접근 권한을 부여하는 과정. + 2. **구성 가능한 보안** + - XML 또는 Java Config 기반 설정 가능. + 3. **다양한 인증 방식 지원** + - 기본 인증(Username/Password) + - OAuth2, JWT, SAML, LDAP 등. + 4. **강력한 커스터마이징** + - 사용자 정의 필터 및 인증/인가 로직을 쉽게 구현 가능. +- **인증(Authentication)과 인가(Authorization)** + + ### **인증(Authentication)** + + **Authentication**은 사용자가 누구인지 신원을 확인하는 과정입니다. + + ### 주요 개념: + + - **Principal**: 인증된 사용자 정보(예: 사용자 ID). + - **Credentials**: 사용자의 비밀번호와 같은 비밀 정보. + - 인증 성공 시, 인증된 사용자 정보를 **SecurityContext**에 저장하여 애플리케이션 전반에서 접근 가능하게 합니다. + + ### Spring Security에서의 흐름: + + 1. **AuthenticationManager**: 인증을 처리하는 핵심 인터페이스. + 2. **AuthenticationProvider**: 다양한 인증 방식을 구현하는 프로바이더. + 3. **UserDetailsService**: 사용자 정보를 가져오는 서비스. + + --- + + ### **인가(Authorization)** + + **Authorization**은 사용자가 특정 리소스 또는 기능에 접근할 권한이 있는지 확인하는 과정입니다. + + ### 주요 개념: + + - 권한(Role): 사용자가 가진 권한(예: `ROLE_USER`, `ROLE_ADMIN`). + - 접근 제어: 사용자의 권한에 따라 특정 기능 또는 리소스 접근을 허용/차단. + + ### Spring Security에서의 흐름: + + 1. **AccessDecisionManager**: 요청과 사용자 권한을 비교하여 접근 가능 여부를 결정. + 2. **Method Security**: 메서드 레벨에서 접근 제어 처리(`@PreAuthorize`, `@PostAuthorize`). + 3. **URL Security**: URL 기반 접근 제어(`httpSecurity.authorizeRequests()`). + + ### **Spring Security의 인증 및 인가 시나리오** + + 1. 사용자가 로그인 요청. + 2. `AuthenticationManager`가 요청을 `AuthenticationProvider`로 전달. + 3. `AuthenticationProvider`가 사용자 정보를 확인하고 인증. + 4. 인증 성공 시, `SecurityContext`에 사용자 정보 저장. + 5. 사용자가 리소스 요청 시, `AccessDecisionManager`가 요청과 권한을 비교. + 6. 인가 성공 시, 요청 처리. \ No newline at end of file