TIL ( Today I Learned )

2022-08-09 : Spring

PHM 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을 해결할 수 있다.

 

 

참고 자료 : https://steady-coding.tistory.com/586

추가 공부 자료 : https://velog.io/@jungh00ns/Spring-Boot-Redis-Spring-Session-%EC%97%B0%EB%8F%99-Redis-%EB%A3%AC%EB%AC%B8%EC%9E%90-%ED%95%B4%EC%84%9D