728x90

Backend 150

크로스 도메인 이슈

Javascript 는 동일 출처 정책(Same Origin Policy) 라는 정책을 두어 다른 도메인의 서버에 요청하는 것을 보안 문제로 간주하고 이를 차단한다. 요즘은 마이크로서비스 구조에서는 javascript 단에서도 타 서비스의 api를 호출해야 하는 경우가 많기 때문에 이에 대한 처리가 반드시 필요하며 이를 CORS(Cross-Origin Resource Sharing) 라 한다. 서버가 Spring 환경이라면 아래와 같이 Filter를 등록하는 것만으로 CORS 처리를 할 수 있다. 간단하게 원리를 설명하면 실제요청전 예비요청(Preflight request)을 통해 허용가능한 도메인, 메소드 등을 응답하고 이를 통해 통신을 하는 방식이다. @Component @Order(Ordered.H..

Backend/Spring+Boot 2021.04.29

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

@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

SpringBoot MVC 자동구성 제어하기

honeymon.io/tech/2018/03/13/spring-boot-mvc-controller.html [springboot] Spring MVC 자동구성 제어하기 - I'm honeymon(JiHeon Kim). 자동구성된 스프링 MVC 구성 조작하기 자동구성된 스프링 MVC 구성을 큰 변경없이 추가적인 조작하려면 다음과 같은 형태로 구성한다. 1 2 3 @Configuration public class WebMvcConfig implements WebMvcConfigurer, Web honeymon.io 가장 중요한 점은 @EnableWebMvc 어노테이션을 붙여주면 스프링부트의 기본적인 웹 MVC 기능들을 제외시키고 처음부터 생성해야 한다. 처음부터 다시 구현할게 아니라면 붙여주면 안된다. ht..

Backend/Spring+Boot 2021.04.21
728x90