Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
151 changes: 151 additions & 0 deletions keyword/chapter09/keyword.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,151 @@
# 🎯 9주차 핵심 키워드


# Spring Data JPA의 Paging

> ***Paging**
사용자가 데이터를 요청했을 때, 전체 데이터 중 일부를 원하는 정렬 방식으로 보여주는 방식*
>

**⇒ Spring Data JPA는 페이징을 위해 Page와 Slice 인터페이스를 제공함.**

**페이징 기법 구현에 필요한 파라미터들**

- page : 페이징 기법이 적용되었을 때, 원하는 페이지
- size : 해당 페이지에 담을 데이터의 개수
- sort : 데이터 정렬 기준

**⇒ 이 데이터들은 Pageable이라는 객체로 Mapping됨.**

**Spring Data JPA의 쿼리 메소드에서 제공하는 페이징, 데이터 정렬 기능의 파라미터**

- org.springframework.data.domain.Pageable : 페이징 기능 ( 내부적으로 sort 포함 )
- org.springframework.data.domain.Sort : 데이터 정렬 기능

## Pageable 인터페이스

> ***Pageable**
페이징에 필요한 정보를 저장하는 인터페이스로, Pageable을 구현한 PageRequest 객체를 통해 사용됨.*
>

`PageRequest pageRequest = PageRequest.of(page, size);` **PageRequest 생성**

- Pageable 객체를 사용하면 리턴 타입은 Page<T>임.
- PageRequest 생성자의 파라미터는 현재 페이지, 조회할 데이터 수, 정렬 정보를 파라미터로 사용 할 수 있음.

# Page

```java
public interface Page<T> extends Slice<T> {
/*
메소드들
*/
}
```

- Page 인터페이스는 Slice 인터페이스를 상속하므로 Slice 인터페이스의 기능을 사용할 수 있음.
- 전체 데이터의 개수를 알 수 있으며, 이를 이용한 총 페이지의 개수의 정보도 알 수 있음.
- 조회쿼리 이후 전체 데이터 개수를 조회하기 위한 추가적인 카운트 쿼리가 실행됨.
- getTotalElements() : 전체 데이터의 개수
- getTotalPages() : 전체 페이지 개수
- getContent() : 실제 데이터 리스트 불러오기
*cf. List (자바 컬렉션): 추가 count 쿼리 없이 결과만 반환*

**⇒ 페이지 네비게이션, 전체 데이터의 크기와 총 페이지의 개수가 필요한 상황에서 사용됨.**

# Slice

```java
public interface Slice<T> extends Streamable<T> {
/*
메소드들
*/
}
```

- 데이터의 일부만 가지고 있으며, 다음 페이지가 존재하는지를 확인할 수 있음.
- 전체 데이터의 개수를 모르므로, 총 페이지의 개수를 알 수 없음.
- 전체 데이터 개수를 조회하지 않고 이전 또는 다음 Slice가 존재하는지만 확인함.
- hasNext() : 다음 페이지 존재 여부 확인.

**⇒ 무한 스크롤, 데이터가 많은 상황에서 자주 사용됨.**

# 객체 그래프 탐색

## 객체와 관계형 데이터베이스의 패러다임 불일치

> ***패러다임 불일치**
객체와 관계형 데이터베이스는 지향하는 목적이 서로 다르므로 기능과 표현 방법에 차이가 있음. 객체를 관계형 데이터베이스에 저장할 때, 관계형 데이터베이스에 있는 데이터를 객체로 가져와 조작하는 상황에서 발생하는 충돌을 뜻함.*
>

### ex1) 상속

- 객체 모델은 상속을 지원하지만, 관계형 데이터베이스에서는 상속을 지원하지 않음.

### ex2) 연관관계

- 객체 모델에서는 객체 간의 연관관계를 직접 참조로 표현할 수 있지만, 관계형 데이터베이스에서는 외래키를 이용해 표현해야 함.

### ex3) 비교

- 객체는 참조의 동등성을 비교하지만, 데이터베이스에서는 기본키를 이용해 행의 동등성을 비교함.

***따라서, 패러다임 불일치로 인해 객체 지향 프로그래밍에서는 객체 그래프 탐색을 할 수 없으므로, JPA를 이용함.***

## 객체 그래프 탐색

> ***정의**
객체 A가 있을 때, A가 참조하는 다른 객체들을 A를 통해 참조하는 것.
즉, 참조를 사용하여 연관관계를 탐색하는 것을 뜻함.*
>
- SQL을 직접 다루면 SQL에 따라 객체 그래프를 어디까지 탐색할 수 있는지 정해짐.
ex) SQL이 B와 C까지만 조회하는 SQL이라면 B나 C까지만 참조 가능
- 객체 그래프 탐색 범위를 확인하려면, DAO를 열어 SQL을 직접 확인해야 함.
⇒ A와 관련된 모든 객체를 조회해서 메모리에 올려두는 것은 비현실적이므로, DAO에 A를 조회하는 여러 메소드를 만들어야 함.

***⇒ JPA를 이용하면 연관된 객체를 사용하는 시점에 적절한 SELECT SQL을 실행하므로, 객체 그래프를 원하는 만큼 탐색할 수 있음. (지연 로딩)***

***또한, JPA는 연관된 객체를 즉시 조회할지 아니면 실제 사용되는 시점에 조회할지 설정 가능함.***

## JPA

> ***정의**
Java에서 객체를 관계형 데이터베이스와 매핑(ORM: Object-Relational Mapping)하여 데이터를 저장하고 관리할 수 있도록 하는 표준 인터페이스.
ex)Hibernate*
>

### JPA를 사용하는 이유?

**<생산성 향상>**

- 직접 SQL을 작성하지 않아도 되며, CRUD가 간편해짐.
- 특히 수정 부분은 Java 컬렉션처럼 사용할 수 있어 편리함.

```java
jpa.persist(user) // 저장
User user = jpa.find(userId) // 조회
user.setName("user") // 수정
jpa.remove(user) // 삭제
```

**<유지보수 용이>**

- SQL로 매핑하는 방식을 이용하면, 엔티티에 필드가 추가 및 변경될 때마다 SQL 쿼리문을 수정해야함.
- JPA를 이용하면, 필드 변경사항이 있을 때 개발자는 엔티티에 필드를 추가 or 삭제만 하면 되고, SQL은 JPA가 처리해줌.

**<객체와 관계형 데이터베이스의 패러다임 불일치 해결>**

**상속**

- JPA는 상속관계에 있는 객체를 저장할 때 필요한 테이블에 대한 INSERT 문을 자동으로 생성함.
- 상속관계에 있는 객체를 조회 시에도 알아서 JOIN 쿼리를 생성해줌.

**연관관계, 객체 그래프 탐색**

- JPA를 사용하면 자바 컬렉션을 사용하듯이 연관관계에 있는 객체를 저장할 수 있음.
- 특정 객체를 통해 연관관계로 참조하고 있는 객체를 쉽게 가져올 수 있음.

**비교**

- JPA를 사용하면 같은 조건으로 불러온 객체에 대한 == 비교가 가능함.
- 같은 트랜잭션에서 조회한 엔티티는 같은 엔티티임을 보장해줌.
123 changes: 123 additions & 0 deletions keyword/chapter10/keyword.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
# 🎯10주차 핵심 키워드

## Spirng Security

> *Java 기반의 Spring Framework를 위한 보안 프레임워크로, 애플리케이션에 인증(Authentication) 및 권한 부여(Authorization) 기능을 쉽게 추가할 수 있도록 설계됨. Spring 기반 애플리케이션을 보호하고, 보안 기능을 표준화함*>

## 주요 용어

### 인증(Authentication)

- 유저 아이디와 비밀번호를 이용하여 로그인하는 과정으로, 사용자 확인을 위함.

### 인가(Authorization)

- 인증된 사용자가 특정 리소스에 접근할 권한이 있는지를 확인함

### 접근 주체(Principal)

- 보호된 대상에 접근하는 유저

### 권한

- 인증된 주체가 애플리케이션의 동작을 수행할 수 있도록 허락되었는지를 결정할 때 사용하는 개념이자, 수행할 수 있는 작업의 범위

### CSRF

- 사용자를 속여, 의도치 않은 요청을 보내게 만드는 것을 방지하는 기능으로 Spring Security는 CSRF 토큰을 활용하여 보호함.

## 주요 구성 요소

### AuthenticationManager

- 인증 요청을 처리하는 중앙 관리자 역할
- 인증에 성공 또는 실패 여부를 반환하며, 내부적으로는 하나 이상의 AuthenticationProvider에 위임하여 인증을 수행함
- ProviderManager가 기본 구현체로 사용됨

### AuthenticationProvider

- 실제로 인증 로직을 수행하는 구현체를 말함
- 특정 인증 방식을 처리하며, AuthenticationManager에 의해 호출됨
- 다양한 인증방식을 지원할 수 있도록 여러 방식으로 구성할 수 있음

### UserDetialService

- 사용자 인증 정보를 제공하는 서비스
- Spring Security의 AuthenticationProvider에서 사용자 정보를 조회할 때 사용됨
- 기본적으로 사용자의 이름을 기반으로 자용자 정보를 검색함

### SecurityContext

- 인증된 사용자의 보안 정보를 저장함
- SecurityContextHodler를 통해 어플리케이션 전역에서 접근 가능함
- 사용자 인증 정보와 권한을 포함함
- 일반적으로, 요청 사이에서 상태 유지를 위해 세션이나 토큰을 사용함

### SecurityContextHolder

- 인증된 사용자 정보를 어플리케이션 전역에서 관리함
- 인증 정보를 SecurityContext 객체에 저장하며, 요청이 진행되는 동안 ThreadLocal에 저장됨
- SecurityContext(현재 인증 정보)와 Authentication(인증된 사용자 정보)으로 구성됨

### Filter Chain

- Spring Security가 요청을 처리하기 위해 사용하며, 요청에대한 인증 및 권한 부여를 처리함
- 모든 작업이 필터 체인을 통해 이루어지며, 요청이 필터를 통과할때마다 각 필터에서 보안검사 수행
- 역할1: 인증되지 않은 요청을 가로 챔
- 역할2: 인증/인과 과정을 실행
- 역할3: 요청이 적합한 경우, 컨트롤러에 전달함

**주요 필터**

**SecurityContextPersistenceFilter**

- 요청 간 SecurityContext를 유지
- 새 요청이 들어올 때 이전에 인증된 사용자의 정보를 복원

**UsernamePasswordAuthenticationFilter**

- 폼 기반 로그인을 처리함
- 사용자가 제출한 username과 password를 확인하여 인증을 시도함

**AnonymousAuthenticationFilter**

- 이전 필터에서 인증되지 않은 요청에 대해 익명 사용자 인증을 제공함

**ExceptionTranslationFilter**

- Spring Security 예외를 HTTP 응답으로 변환함
- 인증 실패 시 로그인 페이지로 리다이렉트하거나, 인가 실패 시 403 오류를 반환함

**FilterSecurityInterceptor**

- 접근 제어 결정을 내리는 마지막 필터
- 현재 인증된 사용자가 요청한 리소스에 접근할 권한이 있는지 확인함

## 인증(Authentication)

> *사용자가 누구인지 확인하는 과정으로, 사용자가 자신의 정체성을 증명해야하는 단계.
유효한 사용자인지를 확인하기 위한 과정이며, 사용자가 인증되면 Authentication 객체를 생성하여 인증 상태가 유지됨.*
*>

## 흐름

- 사용자의 로그인 요청이 들어오면 UsernamePasswordAuthenticationFilter가 요청을 가로채고 Authentication 객체를 생성함
- AuthencationManager가 적절한 AuthenticationProvider를 선택해 인증을 위임함
- 선택된 AuthenticationProvider가 UserDetailsServcie를 사용해 사용자 정보를 로드함
- 인증이 성공하면 Authentication 객체가 SecurityContext에 저장됨

## 인가(Authorization)

> *인증된 사용자의 권한을 확인하여 특정 리소스 작업에 대한 허가/거부를 결정하는 것이며, 사용자 인증 후, 요청한 리소스에 접근하려 할 때 수행됨.*
>

## 흐름

- 사용자의 리소스 접근 요청이 들어오면 FilterSecurityInterceptor가 요청을 가로채 권한 검사를 실행
- AccessDecisionManager가 현재 사용자의 권한과 요청된 리소스의 필요 권한을 비교함
- SecurityContext에서 현재 인증된 사용자의 권한 정보를 조회
- 권한이 충분하면 접근이 허용되고, 부족하면 403 Forbidden 응답 반환

## 인증과 인가의 차이

![](https://velog.velcdn.com/images/isb040818/post/57063dbe-d3bc-4924-b32a-4148b27399eb/image.png)
11 changes: 11 additions & 0 deletions mission/chapter09/mission.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
**1.내가 작성한 리뷰 목록**
![](https://velog.velcdn.com/images/isb040818/post/913a90d1-65e0-4c9d-b192-e80fc4ac630f/image.png)

**2.특정 가게의 미션 목록**
![](https://velog.velcdn.com/images/isb040818/post/0ccaa48f-d6e2-486c-bf1d-d9506d5e201c/image.png)

**3.내가 진행중인 미션 목록**
![](https://velog.velcdn.com/images/isb040818/post/1f16a7bf-67c7-4ad0-a262-687c52335890/image.png)

**4. 진행중인 미션 진행 완료로 바꾸기**
![](https://velog.velcdn.com/images/isb040818/post/95290c52-6601-4177-a29c-3abcc3ae3a14/image.png)
62 changes: 62 additions & 0 deletions mission/chapter10/mission.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
# 🔥 10주차 미션

## 실습 1

**회원가입 페이지**
![](https://velog.velcdn.com/images/isb040818/post/5f9a6a02-c618-4856-a599-40e7ed4a2054/image.png)

![](https://velog.velcdn.com/images/isb040818/post/f9e22d3a-08b5-4be0-9dab-e5392b149a9a/image.png)


**회원가입 후 DB**

member
![](https://velog.velcdn.com/images/isb040818/post/3a79bce5-d593-4e47-9da5-369f252a622a/image.png)

memeber_food
![](https://velog.velcdn.com/images/isb040818/post/4fd17b38-cb80-44bf-ac1b-866291b40b70/image.png)

![](https://velog.velcdn.com/images/isb040818/post/5975d738-72d6-4b66-9b4e-b08c0e1f19f8/image.png)




**회원가입 성공 후 로그인**

![](https://velog.velcdn.com/images/isb040818/post/34403d6f-e881-46ee-b0e4-850ac2b9d46d/image.png)


![](https://velog.velcdn.com/images/isb040818/post/95c24952-d4e8-42a0-a527-7146997e64ae/image.png)

**관리자 페이지**

처음 접근
![](https://velog.velcdn.com/images/isb040818/post/de803d40-0dd5-4c50-95c9-66c97028a7db/image.png)

ADMIN으로 변경 후 접근
![](https://velog.velcdn.com/images/isb040818/post/e219ca7b-5a08-4ba9-bc46-6c2e7d52d6f1/image.png)

![](https://velog.velcdn.com/images/isb040818/post/edf3054b-96a4-4b3e-82a0-750a18669755/image.png)


![](https://velog.velcdn.com/images/isb040818/post/27f47c11-3bfb-4bd3-aadc-eae1e9dd138b/image.png)

### 동작 과정
- 회원가입 시 폼에 입력한 데이터가 데이터베이스에 성공적으로 저장됨(비밀번호는 암호화하여 저장)
- 로그인을 통해 로그인이 성공하면 home페이지로 이동(logout시 login?logout으로 이동)
- 관리자 계정으로만 로그인해야, 관리자 페이지로의 이동 링크가 나옴

## 실습2

로그인 페이지
![](https://velog.velcdn.com/images/isb040818/post/71d0c44f-3b10-43c7-8d05-d5c53432672c/image.png)

![](https://velog.velcdn.com/images/isb040818/post/bad66f9e-5f30-4f4c-b436-697c76f9e603/image.png)

![](https://velog.velcdn.com/images/isb040818/post/57b60d3d-aa78-4282-87af-d79d81fbffec/image.png)

![](https://velog.velcdn.com/images/isb040818/post/ad82337c-bbc2-498b-ac8f-d31946fd0fe4/image.png)

![](https://velog.velcdn.com/images/isb040818/post/ae713164-c8bd-4ae2-bff8-b105d0f36988/image.png)