ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2022-08-09 : Spring
    TIL ( 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을 해결할 수 있다.

     

     

    참고 자료 : 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

    '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

    댓글

Designed by Tistory.