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
17 changes: 16 additions & 1 deletion keyword/chapter01/keyword.md
Original file line number Diff line number Diff line change
@@ -1,38 +1,53 @@
## 🎯핵심 키워드

---

***1. 외래키***

외래키 : FK. 테이블간의 관계를 나타낼때 사용하며, 다른 테이블의 기본키를 참조해 외래키로 사용한다. 즉, 한 테이블의 외래키는 연결되어있는 다른 테이블의 기본키중 하나다.

사실 외래키 설정을 따로 하지 않아도 데이터 조회가 가능하지만, 굳이 하는 이유는 데이터 무결성 때문이다.

무결성: 데이터가 항상 정확한 값을 유지하는 성질

두 테이블중 왼쪽 테이블에서 A가 변경되었는데 오른쪽 테이블의 A가 변경되지 않았다면 문제가 생긴다. 이런 상황을 예방하기 위해 외래키가 존재한다.

---


***2. 기본키***

기본키 : PK. 테이블에서 각 행의 정보들을 식별할 수 있는 정보를 표현한다.
PK는 테이블 행의 여러 정보들 중 행을 식별할 수 있어야 하는 때문에 비어있으면 안되고(NOT NULL) 중복되어서도 안된다(Unique). 그리고 식별을 할 때 테이블의 정보를 최대한 빠르게 검색해야 하므로 간단한 정보일 수록 좋다.

PK는 테이블 행의 여러 정보들 중 행을 식별할 수 있어야 하는 때문에 비어있으면 안되고(NOT NULL) 중복되어서도 안된다(Unique).
그리고 식별을 할 때 테이블의 정보를 최대한 빠르게 검색해야 하므로 간단한 정보일 수록 좋다.

---


***3. ER 다이어그램***

ER 다이어그램 : ERD. 개체 관계 모델링, 관계형 데이터 베이스 설계를 위한 다이어그램을 말한다.

즉 개체-관계 모델, 테이블간의 관계를 설명해주는 다이어그램이라고 볼 수 있으며 이를 통해 프로젝트에서 사용되는 DB의 구조를 한눈에 파악할 수 있다.

API를 효율적으로 뽑아내기 위한 모델 구조도라고 생각하면 된다.

직사각형, 다이아몬드, 타원형 및 연결선과 같은 정의된 기호 집합을 사용하여 Entity, Relationships 및 해당 속성의 상호 연결성을 나타낸다.

개체를 명사로, 관계를 동사로 사용하여 문법 구조를 반영한다.

---



***4. 복합 키***

복합 키 : 두개 이상의 컬럼을 묶어서 하나의 기본키로 지정하는 것을 말한다.

이때 주의해야할 점은 기본키는 하나의 테이블에 하나만 존재할 수 있으며, 또한 기본키는 하나 이상의 컬럼으로 구성되어 있다.
기본키가 만약 복합키라면, 복합키 또한 당연히 유일성과 최소성을 만족해야한다.

---


Expand Down
10 changes: 8 additions & 2 deletions keyword/chapter07/keyword.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,17 +6,20 @@

- @RestControllerAdvice는 REST API 전용으로 예외를 전역에서 처리하도록 돕는 어노테이션이다. 스프링에서 예외를 다루는 여러 방식 중 @RestControllerAdvice는 API의 전반적인 예외 처리를 한 곳에서 담당하여, 일관된 응답 구조로 에러를 반환할 수 있게 한다.

- @RestControllerAdvice의 주요 기능 및 장점

- @RestControllerAdvice의 주요 기능
- 전역 예외 처리: 특정 컨트롤러에 종속되지 않고, 모든 @RestController의 예외를 포괄적으로 관리한다.
- 일관된 JSON 응답: 응답 형식이 JSON으로 고정되므로 RESTful 서비스에 적합하며, API 사용자에게 일관된 에러 형식을 제공할 수 있다.
- 핸들러 메서드: @ExceptionHandler를 통해 예외 유형별로 메서드를 정의하여, 상황에 맞는 에러 메시지와 HTTP 상태 코드를 설정할 수 있다.


- @RestControllerAdvice 활용 시 주의사항
- 클래스 분리: 예외의 복잡성이 커질 경우, 여러 @RestControllerAdvice 클래스로 예외 처리를 모듈화하여 관리하는 것이 좋다.
- 응답 형식 통일: 에러 응답의 포맷을 정해 클라이언트가 일관된 에러 메시지를 받을 수 있게 한다.
- 최상위 핸들러 설정: 예상하지 못한 예외에 대비해 최상위 예외 핸들러를 정의하여, 모든 에러가 적절한 에러 메시지로 응답될 수 있도록 한다.

- ExceptionHandler 사용 예시

- ExceptionHandler 사용 예시

@RestControllerAdvice
public class GlobalExceptionHandler {
Expand Down Expand Up @@ -45,12 +48,14 @@ public class GlobalExceptionHandler {

- Lombok은 자주 사용되는 코드 요소를 자동 생성하는 자바 라이브러리로, 다양한 어노테이션을 제공하여 생산성을 높이고 코드 가독성을 향상시킨다.


- Lombok의 주요 어노테이션 및 기능
- @Getter, @Setter: 클래스나 필드에 적용하여 getter, setter 메서드를 자동 생성한다.
- @AllArgsConstructor / @NoArgsConstructor: 모든 필드를 매개변수로 받는 생성자나 기본 생성자를 자동 생성한다.
- @Builder: 빌더 패턴을 적용해 객체 생성 시 유연성을 제공한다.
- @ToString: toString() 메서드를 자동 생성하여 객체의 정보를 문자열로 반환한다. ( 객체를 호출할 때 나올 메세지를 설정할 수 있음)


@Getter
@Setter
@AllArgsConstructor
Expand All @@ -62,6 +67,7 @@ public class User {
private String email;
}


- Lombok 사용 시 유의점
- 디버깅의 어려움: 자동 생성된 코드가 보이지 않기 때문에 디버깅 시 생성된 메서드의 호출 흐름을 추적하기 어렵다.
- 의존성: Lombok은 컴파일 타임에 동작하므로, 프로젝트의 빌드 도구와의 호환성 문제에 주의가 필요하다.
Expand Down
75 changes: 75 additions & 0 deletions keyword/chapter10/keyword.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
## 🎯핵심 키워드

---

***1. Spring Security***

- 스프링 시큐리티(Spring Security)는 스프링 기반 애플리케이션의 보안을 담당하는 프레임워크로, 인증(Authentication), 인가(Authorization), 권한 관리 등 보안 관련 기능을 간편하게 구현할 수 있도록 돕는 스프링 하위 프레임워크이다. 이는 웹 애플리케이션에서의 취약점을 방지하고 안전한 서비스를 제공하는 데 필수적인 도구이다. 특히, 스프링 시큐리티는 스프링 MVC와 독립적으로 동작하며, 필터 기반 아키텍처로 설계되어 있다.

- 특징
- 1. 다양한 인증(Authentication) 방식
- 폼 기반 로그인(Form-based Login): 사용자가 아이디와 비밀번호를 입력하여 로그인한다.
- HTTP 기본 인증: HTTP 헤더를 통해 인증 정보를 전달한다.
- 데이터베이스 연동: 사용자 정보를 데이터베이스에서 조회하여 인증한다.
- LDAP 인증: LDAP 디렉토리를 통한 인증을 지원한다.
- OAuth/OpenID/SAML: 다양한 외부 인증 프로토콜을 지원하여 확장성과 유연성을 제공한다.

- 2. 권한 부여(Authorization) : 스프링 시큐리티는 애플리케이션의 리소스 접근 권한을 관리한다. 특정 사용자 또는 그룹(Role)에 대해 권한을 설정하여 리소스 접근을 제어한다. 권한 부여를 위해 Role(역할)과 Authority(권한) 개념을 사용한다. URL 패턴, 메서드 호출 등 다양한 수준에서 권한을 설정할 수 있다.

- 3. 세션 관리 : 스프링 시큐리티는 세션 관리를 통해 다음과 같은 기능을 제공한다.
- 세션 타임아웃 설정
- 세션 고정 공격(Session Fixation) 방어
- 다중 로그인 제어(예: 한 계정의 동시 로그인 방지)

- 4. CSRF 방어 : CSRF(Cross-Site Request Forgery) 공격은 사용자가 인증된 상태에서 악의적인 요청을 보내는 것을 유도하는 공격이다. 스프링 시큐리티는 CSRF 방어 기능을 기본적으로 제공하여 이를 예방한다.

- 5. 보안 이벤트 로깅 : 스프링 시큐리티는 보안 관련 이벤트를 로깅하여 관리자와 개발자가 인증 및 권한 부여 과정을 추적할 수 있도록 돕는다. 이를 통해 잠재적인 보안 문제를 조기에 발견할 수 있다.

- 6. 필터 기반 아키텍처 : 스프링 시큐리티는 **필터 체인(Filter Chain)**을 기반으로 동작한다. 클라이언트 요청이 서버로 도달하기 전에 다양한 보안 필터를 거쳐 보안 검사를 수행한다.

- 7. Spring Boot와 통합 : 스프링 시큐리티는 Spring Boot와의 높은 통합성을 자랑한다. Spring Boot Starter를 사용하면 몇 줄의 설정만으로 기본적인 보안 기능을 활성화할 수 있다. 이를 통해 빠르게 안전한 애플리케이션을 개발할 수 있다.

- 8. 사용자 정의 보안 로직 : 스프링 시큐리티는 기본 제공 기능 외에도 사용자 정의 보안 로직을 추가할 수 있는 유연성을 제공한다.


- 필터 기반 인증/인가 처리 흐름
스프링 시큐리티는 요청이 서버에 도달하기 전에 여러 필터를 통해 인증 및 인가를 처리한다. 가장 많이 사용되는 폼 기반 로그인 인증 흐름은 다음과 같다.

- 1. 사용자가 로그인 폼에 아이디와 비밀번호를 입력하면, HttpServletRequest에 인증 정보가 전달된다.

- 2. AuthenticationFilter가 유효성 검사를 수행한 후, UsernamePasswordAuthenticationToken 객체를 생성한다. 이 객체는 AuthenticationManager로 전달되며, 다시 AuthenticationProvider에서 처리된다.

- 3. AuthenticationProvider는 사용자 정보를 UserDetailService에 요청한다.

- 4. UserDetailService는 데이터베이스에서 사용자 정보를 조회하여 UserDetails 객체로 반환한다.

- 5. 입력 정보와 데이터베이스 정보를 비교하여 인증 여부를 결정한다.

- 6. 인증에 성공하면 SecurityContextHolder에 인증 정보를 저장하고, 인증 성공 핸들러(AuthenticationSuccessHandler)를 실행한다. 실패 시 인증 실패 핸들러(AuthenticationFailureHandler)가 실행된다.


- 장점
- 편리한 보안 구현 : 인증 및 권한 부여 관련 로직을 간편하게 작성할 수 있다.
- 강력한 보안 옵션 : CSRF 방어, 세션 관리, 클릭재킹 방어 등 다양한 보안 기능을 기본적으로 제공한다.
- 확장성과 유연성 : 사용자 정의 필터를 추가하거나 기존 보안 설정을 변경하여 애플리케이션 요구 사항에 맞게 커스터마이징할 수 있다.
- 빠른 개발 지원 : Spring Boot와의 통합으로 기본적인 보안 설정을 빠르게 적용할 수 있다.
- 보안 표준 준수 : OAuth, OpenID Connect, SAML 등 다양한 인증 표준을 지원하여 최신 보안 요구사항을 충족한다.




---


***2. 인증(Authentication)과 인가(Authorization)***

- 인증(Authentication):
인증은 사용자의 신원을 검증하는 과정이다. 예를 들어, 사용자가 애플리케이션에 로그인할 때 입력한 아이디와 비밀번호가 올바른지 확인하는 작업이 인증이다. 이를 통해 사용자가 누구인지 식별할 수 있다.

- 인가(Authorization):
인가는 인증된 사용자가 애플리케이션의 특정 리소스에 접근할 수 있는 권한이 있는지를 확인하는 과정이다. 예를 들어, 관리자 계정은 관리자 페이지에 접근할 수 있지만 일반 사용자는 접근이 제한된다. 이를 통해 리소스 접근 권한을 효과적으로 관리할 수 있다.

- 스프링 시큐리티를 사용하면 이러한 인증 및 인가 작업을 효율적으로 처리할 수 있다. 개발자는 복잡한 인증과 권한 부여 로직을 직접 작성할 필요 없이 스프링 시큐리티가 제공하는 기능을 활용할 수 있다.


---
91 changes: 91 additions & 0 deletions mission/chapter06/mission.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
## 🔥 미션

---

- 2주차 미션 때 했던 해당 화면들에 대해 작성했던 쿼리를 QueryDSL로 작성하여 리팩토링하기


***1. 내가 진행 중, 진행 완료한 미션을 모아서 보는 쿼리***

Q회원 h = Q회원.회원;
Q선호음식카테고리 c = Q선호음식카테고리.선호음식카테고리;
Q미션 m = Q미션.미션;

List<Tuple> results = queryFactory
.select(h.name, m.mission_num, m.rest_name, m.request)
.from(h)
.join(c).on(h.email.eq(c.email))
.leftJoin(m).on(c.email.eq(m.email))
.where(h.email.eq("회원이메일"))
.orderBy(m.datetime.desc())
.fetch();

---


***2. 리뷰 작성하는 쿼리***

Q리뷰 review = Q리뷰.리뷰;

long insertedCount = queryFactory.insert(review)
.set(review.mission_num, 1234)
.set(review.email, "회원이메일")
.set(review.star, 4.5)
.set(review.content, "좋은음식이었어요~:)")
.set(review.datetime, LocalDateTime.now())
.execute();

---


***3. 홈 화면 쿼리 ***

- 지역내에서 성공한 미션들
Q미션 m = Q미션.미션;
Q점표 j = Q점표.점표;
Q지역 r = Q지역.지역;

long successCount = queryFactory
.select(m.count())
.from(m)
.join(j).on(m.mission_num.eq(j.mission_num))
.join(r).on(j.지역_id.eq(r.지역_id))
.where(
j.request.eq(1),
j.email.eq("회원이메일"),
j.지역_id.eq("선택지역id")
)
.orderBy(m.datetime.desc())
.limit(10)
.offset(0)
.fetchCount();

- 지역내에서 도전가능 미션들
List<Tuple> availableMissions = queryFactory
.select(m.rest_name, m.price, m.datetime)
.from(m)
.join(j).on(m.mission_num.eq(j.mission_num))
.join(r).on(j.지역_id.eq(r.지역_id))
.where(
j.request.eq(0),
j.email.eq("회원이메일"),
j.지역_id.eq("선택지역id")
)
.orderBy(m.datetime.desc())
.fetch();

---


***4. 마이 페이지 화면 쿼리***

Q회원 h = Q회원.회원;

Tuple myPageInfo = queryFactory
.select(h.name, h.email, h.address)
.from(h)
.where(h.email.eq("회원이메일"))
.fetchOne();