-
2022-08-09 : SpringTIL ( Today I Learned ) 2022. 8. 9. 15:45
1. WebMvcConfigurer
- @EnableWebMvc 어노테이션에서 제공하는 Bean을 커스터마이징(설정) 할 수 있는 기능을 제공하는 인터페이스
- 할 수 있는 일들
ㆍaddFormatters
ㆍaddInterceptors
ㆍaddResourceHandlers
ㆍaddReturnValueHandlers
@GetMapping("/hello") public String hello(@RequestParam("id") Person person) { return "hello " + person.getName(); } @GetMapping("/message") public Person sendMessage(@RequestBody Person person) { return person; }
- ReturnValueHandler는 핸들러에서 리턴되는 String 등을 처리하는 핸들러
- addReturnValueHandlers를 통해 리턴 값 핸들러를 설정
- 스프링 MVC가 제공하는 리턴 값 핸들러 이외에 커스텀한 리턴 핸들러를 추가
ㆍaddViewController
@GetMapping("/hi") public String hi() { return "hi"; }
- /hi를 입력했을 때 hi에 해당하는 뷰로 바로 이동시키려면?
@Override public void addViewController(ViewControllerRegistry registry) { registry.addViewController("/hi").setViewName("hi"); }
- 이런식으로 WebMvcConfigurer의 메소드를 오버라이딩 함으로써 처리
ㆍTaskExecutor
- 비동기 설정시 사용할 TaskExecutor을 통해 타이아웃, 스레드풀을 설정
ㆍContent Negotiation 설정
- URL에 확장자를 쓰고 싶은 경우
ㆍCORS 설정
- 같은 도메인에서 온 요청이 아니라도 처리를 허용하고 싶을 시 설정
- 스프링 부트는 자동 설정으로 통해 이런 스프링 MVC 기능들을 기본으로 제공한다.
- 그리고 @EnableWebMvc를 사용하여 스프링 부트 자동 설정을 사용하지 않을 수도 있다
참고 자료 : https://100100e.tistory.com/360
2. WebSecurityConfigurerAdapter
- Spring Security의 의존성을 추가한 경우 위와 같이 WebSecurityConfigurerAdapter 클래스가 실행
- WebSecurityConfigurerAdapter 클래스는 스프링 시큐리티의 웹 보안 기능의 초기화 및 설정들을 담당하는 내용이 담겨있으며 내부적으로 getHttp() 메서드가 실행될 때 HTTPSecurity 클래스를 생성
- 이때의 HTTPSecurity는 인증/인가 API들의 설정을 제공
- 인증/인가의 설정을 바꾸고자 한다면 WebSecurityConfigurerAdapter 클래스를 상속한 SecurityConfig클래스를 생성하여 configure(HttpSecurity http) 메서드를 override하며 설정
@Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired UserDetailsService userDetailsService; @Override protected void configure(HttpSecurity http) throws Exception { // 인가 정책 설정 http .authorizeRequests() // 요청에 대한 보안 검사 실행 .anyRequest().authenticated(); // 어떠한 요청에도 인증을 받도록 설정 // 인증 정책 설정 http .formLogin(); // formLogin인증 방식을 사용하도록 설정 } }
@EnableWebSecurity란?
- @EnableWebSecurity을 보면 WebSecurityConfiguration.class, SpringWebMvcImportSelector.class, OAuth2ImportSelector.class, HttpSecurityConfiguration.class 들을 import해서 실행시켜주는 것을 알 수 있다.
- 해당 어노테이션을 붙여야지 Security를 활성화시킬 수 있다.
참고 자료 : https://velog.io/@seongwon97/security
3. Redis
Cache
: Cache란 나중에 요청할 결과를 미리 저장해둔 후 빠르게 서비스해주는 것을 의미
- 미리 결과를 저장하고 나중에 요청이 오면 그 요청에 대해서 DB또는 API를 참조하지 않고 Cache를 접근하여 요청을 처리하는 기법
[ 사용구조 ]
1. 클라이언트로부터 요청을 받는다
2. Cache와 작업을 한다
3. 실제 DB와 작업
4. 다시 Cache와 작업
- Cache Hit : 클라이언트가 웹 서버에 요청을 보내면, 웹 서버는 데이터를 DB에서 가져오기 전에 캐시에 데이터가 있는지 확인하고, 있다면 바로 클라이언트에게 저장된 데이터를 반환한다.
- Cache Miss : 반대로 캐시 서버에 데이터가 없으면 DB에 데이터를 요청하여 원하는 데이터를 조회한 후 그 데이터를 클라이언트에게 제공
- Look Aside Cache ( Lazy Loading )
ㆍ캐시에 데이터 존재 유무 확인
ㆍ데이터가 있다면 캐시의 데이터 사용
ㆍ데이터가 없다면 캐시의 실제 DB데이터 사용
ㆍDB에서 가져온 데이터를 캐시에 저장
- look aside cache는 캐시를 한 번 접근하여 데이터가 있는지 판단한 후, 있다면 캐시의 데이터를 사용하고 없으면 실제 DB또는 API를 호출한다. 대부분의 캐시를 사용한 개발이 해당 프로세시를 따른다.
- Write Back
ㆍ모든 데이터를 캐시에 저장
ㆍ캐시의 데이터를 일정 주기마다 DB에 한꺼번에 저장(배치)
ㆍDB에 저장한 데이터를 캐시에서 제거
- write back 은 주로 쓰기 작업이 굉장히 많아서, INSERT 쿼리를 일일이 날리지 않고 한꺼번에 배치 처리를 위해 사용한다
- write back 기반의 캐시를 사용하면 캐시 메모리에 데이터를 저장해 놓고, 이후 DB 디스크에 업데이트 해주면 안전하게 쓰기 작업을 이행할 수 있다.
- DB에서 디스크를 접근하는 횟수가 줄어들기 때문에 성능 향상을 기대할 수 있지만, DB에 데이터를 저장하기 전에 캐시 서버가 죽으면 데이터가 유실된다는 단점.
Memcached
: 무료로 사용할 수 있는 오픈 소스이며, 분산 메모리 캐싱 시스템
- DB의 부하를 줄여 동적 웹 애플리케이션의 속도 개선을 위해 사용하며, DB나 API 호출 또는 렌더링 등으로부터 받아오는 결과 데이터를 key-value 형태로 메모리에 저장한다.
[ 장점 ]
- 시스템의 사용되지 않는 일부 메모리를 활용할 수 있어 남는 자원을 효율적으로 사용하여 성능을 향상시킬 수 있다.
[ 단점 ]
- 인 메모리 기반의 시스템이므로 재부팅 시 데이터가 소멸하고, 이로 인해 영구적인 저장용 시스템으로 활용할 수 없다는 문제
- 만약 영구 저장이 필요하다면 해당 데이터를 DB에 저장해 두고, 재부팅 시 DB로부터 데이터를 받아야 한다.
Redis
: Redis는 오픈 소스로서 NoSQL로 분류되기도 하고, Memcached와 같이 인 메모리 솔루션으로 분류되기도 한다.
- 성능은 Memcached에 버금가면서 다양한 데이터 구조체를 지원함으로써 DB, Cache, Message Queue, Shared Memory 용도로 사용될 수 있다.
- 한편, Redis는 Remote Dictionary Server 의 약자로 외부에서 사용 가능한 Key-Value 쌍의 해시 맵 형태의 서버라고 생각할 수 있다
- 그래서 별도의 쿼리 없이 Key를 통해 빠르게 결과를 가져올 수 있다.
- 또한, 디스크에 데이터를 쓰는 구조가 아니라 메모리에서 데이터를 처리하기 때문에 작업 속도가 상당히 빠르다.
* Redis는 고성능 키-값 저장소로서 String, list, hash, set, sorted set 등의 자료 구조를 지원하는 NoSQL
[ 특징 ]
ㆍ영속성을 지원하는 인 메모리 데이터 저장소
ㆍ다양한 자료 구조를 지원
ㆍ싱글 스레드 방식으로 인해 연산을 원자적으로 수행 가능
ㆍ읽기 성능 증대를 위한 서버 측 리플리케이션을 지원
ㆍ쓰기 성능 증대를 위한 클라이언트 측 샤딩 지원
ㆍ다양한 서비스에서 사용되며 검증된 기술
[ Redis의 영속성 ]
- Redis는 영속성을 보장하기 위해 데이터를 디스크에 저장할 수 있다
- 서버가 내려가더라도 디스크에 저장된 데이터를 읽어서 메모리에 로딩
- 데이터를 디스크에 저장하는 방식은 두 가지
ㆍRDB(Snapshotting) 방식
ㆍ순간적으로 메모리에 있는 내용 전체를 디스크에 옮겨 담는 방식
ㆍAOF(Append On File) 방식
ㆍRedis의 모든 write/update 연산 자체를 모두 log파일에 기록하는 형태
[ Redis의 컬렉션 ]
- Redis는 단순히 데이터를 메모리에 저장하여 빠른 DB이고, 단순한 Key-Value 쌍이 아닌 다양한 데이터 구조체를 지원하는 것을 컬렉션이라고 부름
[ 싱글 스레드를 사용하는 Redis ]
- Redis는 싱글 스레드를 사용하므로 연산을 원자적으로 처리하여 Race Condition이 거의 발생하지 않는다.
- Redis는 싱글 스레드를 사용하므로 하나의 트랜잭션은 하나의 명령만 실행할 수 있으므로 다수의 Race Condition을 해결할 수 있다.
'TIL ( Today I Learned )' 카테고리의 다른 글
2022-08-18 : JAVA (0) 2022.08.18 2022-08-10 : SpringBoot의 원리 및 활용 (0) 2022.08.10 2022-08-05 : JS (0) 2022.08.05 2022-08-03 : Spring (0) 2022.08.03 2022-08-02 : Spring (0) 2022.08.02