본문 바로가기
항해99

[TIL] 항해 19일차

by yeaseul912 2022. 7. 29.
728x90

새로운 조에 배정되었습니다.! 6조!

오늘부터 일주일동안 숙련학습 돌입

Spring Security, OAuth2 에 대해서 배우도록 하겠습니다.

 

인증 vs 인가

인증과 인가는 한글로 보나 영어 (Authentication vs. Authorization) 로 보나 비슷해 보일 뿐 아니라 실제 많이 혼동되어 사용되고 있지만 명확히 다른 의미를 가지고 있습니다.

  • 인증 (Authentication): 사용자 신원을 확인하는 행위  ex) 출입증을 통해 회사 출입
  • 인가 (Authorization): 사용자 권한을 확인하는 행위 ex) 회사 건물 내 접근 권한 관리
쿠키와 세션

👉 쿠키와 세션 모두 HTTP 에 상태 정보를 유지(Stateful)하기 위해 사용됩니다.

즉, 쿠키와 세션을 통해 서버에서는 클라이언트 별로 인증 및 인가를 할 수 있게 됩니다.

 

security 설정

 

 

스프링 - 생성자 주입을 사용해야 하는 이유, 필드 인젝션이 좋지 않은 이유

@Autowired를 활용한 Filed injection

Marks a constructor, field, setter method, or config method as to be autowired by Spring's dependency injection facilities. This is an alternative to the JSR-330 javax.inject.Inject annotation, adding required-vs-optional semantics.
Autowired Constructors
Only one constructor of any given bean class may declare this annotation with the required attribute set to true, indicating the constructor to autowire when used as a Spring bean. Furthermore, if the required attribute is set to true, only a single constructor may be annotated with @Autowired. If multiple non-required constructors declare the annotation, they will be considered as candidates for autowiring. The constructor with the greatest number of dependencies that can be satisfied by matching beans in the Spring container will be chosen. If none of the candidates can be satisfied, then a primary/default constructor (if present) will be used. Similarly, if a class declares multiple constructors but none of them is annotated with @Autowired, then a primary/default constructor (if present) will be used. If a class only declares a single constructor to begin with, it will always be used, even if not annotated. An annotated constructor does not have to be public.
Autowired Fields
Fields are injected right after construction of a bean, before any config methods are invoked. Such a config field does not have to be public.
Autowired Methods
Config methods may have an arbitrary name and any number of arguments; each of those arguments will be autowired with a matching bean in the Spring container. Bean property setter methods are effectively just a special case of such a general config method. Such config methods do not have to be public.
Autowired Parameters

Although @Autowired can technically be declared on individual method or constructor parameters since Spring Framework 5.0, most parts of the framework ignore such declarations. The only part of the core Spring Framework that actively supports autowired parameters is the JUnit Jupiter support in the spring-test module (see the TestContext framework  reference documentation for details).
Multiple Arguments and 'required' Semantics
In the case of a multi-arg constructor or method, the required attribute is applicable to all arguments. Individual parameters may be declared as Java-8 style java.util.Optional or, as of Spring Framework 5.0, also as @Nullable or a not-null parameter type in Kotlin, overriding the base 'required' semantics.
Autowiring Arrays, Collections, and Maps
In case of an array, java.util.Collection, or java.util.Map dependency type, the container autowires all beans matching the declared value type. For such purposes, the map keys must be declared as type String which will be resolved to the corresponding bean names. Such a container-provided collection will be ordered, taking into account Ordered and @Order values of the target components, otherwise following their registration order in the container. Alternatively, a single matching target bean may also be a generally typed Collection or Map itself, getting injected as such.
Not supported in BeanPostProcessor or BeanFactoryPostProcessor
Note that actual injection is performed through a BeanPostProcessor which in turn means that you cannot use @Autowired to inject references into BeanPostProcessor or BeanFactoryPostProcessor types. Please consult the javadoc for the AutowiredAnnotationBeanPostProcessor class (which, by default, checks for the presence of this annotation).

@Data

// @Data

@Getter
@Setter
@ToString
@RequiredArgsContructor

h2-console 사용

h2 console 이란?

작은 용량(2M)의 작고 빠른 DB

JDBC API지원

브라우저 기반 Console 지원

인메모리(In-Memory)기반 Server 모드와 Embedded 모드 지원

 인메모리?

시스템 메모리에 데이터를 저장. 디스크에 저장하는 방식보다 성능이 좋음. 프로그램이나 DB를 종료하면 데이터가 손실(RAM)

따라서 초기 개발시에 자주 사용.

 

application.properties

spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.h2.console.enabled=true
spring.h2.console.path=/h2-console

 

회원가입 진행

비밀번호 암호화

평문 -> (암호화 알고리즘) -> 암호문

복호화를 할 수 없도록 '일방향' 암호 알고리즘 사용.

스프링 시큐리티에서 권고하고 있는 BCrypt 해시함수를 사용하여 암호화

 

WebSecurityConfig.java 에 추가

@Bean
public BCryptPasswordEncoder encodePassword() {
    return new BCryptPasswordEncoder();
}

UserService.java 에 추가

private final PasswordEncoder passwordEncoder;
....

public void registerUser(SignupRequestDto requestDto) {
....

String password = passwordEncoder.encode(requestDto.getPassword());

....
}
  • 주제
  • 백엔드 개발자를 위한 DB기초
  • monolithic Architecture : 하나가 문제가 생기면 전체가 다운됨
  • Microservice Architecture : 역할을 다 분리 서비스-서비스끼리, UI-서비스 이렇게 통신을한다
  • MySQL Architecture

  • DDos -> DB Modeling 을 잘 못해서 SlowQuery가 발생 ->  효율성이 없는 방향으로 설계를 해서 DB가 처리하기 무리가 되서 발생 -> DB 모델링 설계 잘 하거나 Indexing 같은거 하거나
  • 복제(Replication) 사용자가 많아지는 만큼 DB도 늘어남.
  • 하나의 마스터 DB 와 여러대의 슬레이브 DB를 두어 CRUD별로 나눔? (primary, replica 로 요즘 표현)
  • 복제 과정의 Delay가 길어지면 서비스가 원활하게 돌아가지 않음 -> DBA나 Back이 모니터링해서 해결.. ^^
  • 데이터 모델링 -> 생활코딩 ㅊㅊ
  • 개념적 데이터 모델링 -> 논리적 -> 물리적
  • 후보키 기본키 대체키 중복키 외래키
  • SQL vs NoSQL
  • 정규화
  • First Nomal Form
  • Unnormalized form : feild에 값이 여러개(ex)tag)가 되면 DB분리를 고민해야 함.   배열처리 혹은 JSON형태로 데이터 담기 
  • 하나의 필드에는 하나의 값을 넣는다라고 생각하고 가셈 어려우니까.
  • DB가 늘어난다 -> 관리포인트가 늘어난다. 복잡해진다. 수가 정해져있으면 좋은 방법
  • Particial Dependency : 중복을 허용하지 않고 DB를 나눈다.
  • SQL vs NoSQL
  • DB 연관관계 및 ERD
  • DB Index 의 개념 및 중요성 이해
    • B-Tree.. B+Tree.. 클러스터링 인덱스.. 쿼리실행계획.. Explain 명령어..

 

반응형

'항해99' 카테고리의 다른 글

[TIL] 항해 21일차  (0) 2022.08.01
[WIL] 3주차  (0) 2022.07.31
[TIL] 항해 18일차  (0) 2022.07.28
CRUD 와 HTTP Method  (0) 2022.07.26
[TIL] 항해14일차  (0) 2022.07.25

댓글