728x90

전체 글 288

Redis Cluster 동작방식

클러스터 구동시 노드별로 데이터를 저장할 수 있는 hashslot을 할당받게 된다. 그리고 데이터 저장시 Redis 자체 해시 알고리즘에 의해 key에 맞는 hashslot이 선택되어 저장된다. 데이터를 읽을 때에는 역시 자체 해시 알고리즘에 의해 key 에 맞는 hashslot에서 데이터를 읽게 된다. 즉, 특정 키는 특정노드에만 저장된다. 그런데 어쨋든 클라이언트 입장에서는 이러한 Read/Write 는 를 수행하려면 특정 노드에 일단 연결이 되어야 한다. 예를 들어 1~3 까지의 노드가 있고 A key에 해당하는 hashslot이 3노드에 할당된 상태라고 가정해보자. 그런데 클라이언트가 1번 노드에 연결되어 A key를 Read/Write 하려고 하면 어떻게 될까? 이때는 3번 노드로 Redirec..

Backend/Redis 2021.04.28

redis 옵션 정리

daemonize redis 데몬을 백그라운드로 실행할지 여부를 지정한다. 기본값 no 로 이 경우 포그라운드로 실행된다. 이 경우 Ctrl+C를 하면 레디스 서버가 종료된다. 백그라운드로 실행시키고 싶다면 해당 옵션을 yes로 설정해야 한다. 해당 옵션의 기본값은 no 이다. appendonly Redis 는 in memory DB이기 때문에 서버가 비정상 종료시 기본적으로 데이터가 모두 날라간다. 이를 위해 redis 서버에 데이터가 입력/수정/삭제될 때 마다 해당 데이터를 디스크에 쓰는 기능을 제공하는데 appendonly 가 바로 그 설정이다. 이 값을 yes 로 지정할 경우 특정 파일에 데이터를 기록하게 되고 추후 redis 서버 시작시 읽어들어 메모리에 저장된다. 해당 옵션의 기본값은 no 이..

Backend/Redis 2021.04.27

Redis 구성 방법

Redis 는 Single instance, Sentinel, Cluster 방식 중 하나를 선택적으로 구성할 수 있다. Single instance 는 단일구성을 의미하는 것으로 굳이 정리가 필요없을 것 같고 Sentinel, Cluster 방식에 대해 정리해 보고자 한다. Sentinel 센터널 방식은 우리가 흔히 접할 수 있는 Master/Slave 구조이다. Write는 Master로만 진행하고 Read는 Slave로만 진행한다. 그리고 Master에 Write된 Data는 Slave로 Replication 된다. 일반적으로 Master 1대와 Slave 2~3대 정도로 운영하는 것 같다. 이런 구조에서는 Master 가 죽어버리면 Write를 할 수 없게 되기 때문에 Slave 중 하나가 임시로..

Backend/Redis 2021.04.27

SPOF(Single Point Of Failure)

시스템 구성 요소 중에서, 동작하지 않으면 전체 시스템이 중단되는 요소를 말한다. 예를 들어 이더넷 케이블과 전원, 이더넷 허브(HUB), 접속 단말들의 NIC(Network Interface Card) 등으로 이루어진 간단한 이더넷(Ethernet) 네트워크 시스템에 있어서 네트워크 허브(HUB) 장치의 전원은 SPOF이다. 허브의 전원이 차단됨과 동시에 나머지 모든 요소들은 네트워크를 사용할 수 없다. 높은 가용성을 추구하는 네트워크, 소프트웨어 애플리케이션, 상용 시스템에 단일 장애점이 있는 것은 바람직하지 않다. 단일 고장점, 단일 실패점이라고도 한다. https://ko.wikipedia.org/wiki/%EB%8B%A8%EC%9D%BC_%EC%9E%A5%EC%95%A0%EC%A0%90

Base/개념정리 2021.04.26

@ResquestParam, @RequestBody 와 Get, Post

알다시피 payload 는 url에 queryString을 통해 header 에 포함할 수도 있고, body에 포함할 수도 있다. Spring에서는 Controller 에서 해당 payload를 받아서 처리하게 되는데 전자의 경우 @RequestParam 을 사용하고 후자는 @RequestBody 를 사용한다. 여기에서 중요한 점은 @ResquestParam, @RequestBody 는 각각 Request 에서 payload를 읽어들일 곳을 지정하는 것 뿐이라는 것이다. 즉, @ResquestParam 는 header에서 payload를 읽어오고 @RequestBody 는 body 에서 payload를 읽어오게 된다. 간혹 jsp 시절부터 들어왔던 Get방식, Post방식 이라는 용어 때문에 @Resqu..

Backend/Spring+Boot 2021.04.26

threadContextInheritable

사내 레거시 프로젝트 마이그레이션을 위해 분석하던 중 아래와 같은 설정이 보였다. @Configuration public class WebConfig { @Bean public ServletRegistrationBean servletRegistration(ServletRegistrationBean registration) { registration.setLoadOnStartup(1); registration.addInitParameter("threadContextInheritable", "true"); return registration; } } Dispatchservlet의 threadContextInheritable 값을 true로 바꾸는 것인데 threadContextInheritable는 Requ..

Backend/Spring+Boot 2021.04.23

RequestContextHolder

RequestContextHolder 는 Spring 컨텍스트에서 HttpServletRequest 에 직접 접근할 수 있도록 도와주는 역할을 한다. Spring 2.x 부터 제공되던 기능으로 이를 활용하면 HttpServletRequest 사용하기 위해 이를 메소드 파라미터로 연이어 넘겨받을 필요가 없다. 예를 들어 RequestContextHolder 를 사용하지 않고 Service 단에서 HttpServletRequest 를 참조해야 한다고 하면 아래와 같이 해야 한다. @RestController @RequiredArgsConstructor @Log4j2 public class TestController { private final TestService testService; @GetMapping..

Backend/Spring+Boot 2021.04.23

Spring Security AuthenticationException message

Spring Security 를 이용해서 로그인을 구현할 경우 로그인 실패 처리는 일반적으로 아래와 같이 구현한다. @Log4j2 public class LoginFailHandler implements AuthenticationFailureHandler { @Override public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) { response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); response.setContentType("application/json;charset=utf-8..

Backend/Spring+Boot 2021.04.22
728x90