Development/Spring

    Spring Redis Template Transaction

    Spring에서 사용하는 Transaction을 RedisTemplate에도 쓰고 싶을 때가 있는데, Redis에서 지원하는 Transaction의 구현이 기존에 익히 알고있던 RDBMS(MySQL, MS-SQL...) 과는 동작이 달라서 정확한 동작방식을 알고 있어야 로직을 짜는데 도움이 될 것 같아서 작성해본다. Trsnaction 익히 알고있는 트랜잭션은 데이터의 불일치를 방지하고, 트랜잭션 내에 있는 로직이 원자성으로 실행됨을 보장해준다. 예컨데 아래와 같은 로직이 있다고 치자. @Transactional void logic(User user, List roles){ userService.save(user); roleService.save(roles); } User 엔티티와 Role 엔티티는 1:..

    Spring RequestContextHolder

    RequestContextHolder 개요 RequestContextHolder 는 Spring에서 전역으로 Request에 대한 정보를 가져오고자 할 때 사용하는 유틸성 클래스이다. 주로, Controller가 아닌 Business Layer 등에서 Request 객체를 참고하려 할 때 사용한다. Request Param이라던지.. UserAgent 라던지.. 매번 method의 call param으로 넘기기가 애매할 때 주로 쓰인다. 아래처럼 호출하면 같은 Request Thread 범위에 있는 경우 요청정보를 얻어낼 수 있다. RequestContextHolder.getRequestAttributes() 다만, 위에처럼 사용하면 Attribute만 얻어올 수 있으므로 아래와 같이 Wrapping해서..

    Spring Password Encoder

    Spring에서는 인증/권한인가 등의 처리가 필요할 때 사용하라고 만든 Spring Security 패키지가 존재한다. 그 중 유저가 입력하는 Password를 암호화해서 저장하는 방법에 대해서 알아보자 아, 그 전에 패스워드를 저장할 때 사용하는 알고리즘을 먼저 봐야 하는데 일단 패스워드는 무조건 단방향 암호화/해싱을 사용해야 한다. 한번 encode된 패스워드는 다시 복호화를 할 수 없도록 해야 하고(AES,RSA,DES… 등의 양방향 암호화를 사용하면 안된다는 뜻이다) 이를 비교하는 로직만 같은지 아닌지만 판단할 수 있게 만들어야 한다. 이를 지키지 않을 경우 최악은 DB에 저장된 유저의 패스워드가 다 복호화 되어 개인정보가 털리던.. 혹은 결제와 관련된 경우 직접적인 타격을 받게될 수도 있다. 혹..

    Dispatcher Servlet

    DispatcherServlet Javadoc 원문 설명 DispatcherServlet은 Spring의 모든 HTTP Call을 클라이언트(browser, http client …) 받아서 View 혹은 데이터를 내려주는 역할을 한다. 그리고 Handler를 등록해서 편리하게 url 매핑을 하거나, Exception Handling을 하는 것을 지원한다. Spring에서 제공하는 servlet은 유연한 interface를 가지고 있고, 적절한 adapter class를 사용해서 이를 handling할 수 있으며, MVC Framework의 기본적인 기능을 제공한다. MVC Pattern을 먼저 알아봐야 할 것 같은데, 이 아키텍쳐가 기본적인 MVC Pattern이며, 아래의 구성요소를 가지고 있다 Co..

    Spring Boot Prometheus Converter 406 Not Acceptable

    개요 Spring Boot Project에 actuator를 적용한 뒤, prometheus micrometer를 적용했을 때 WebMvcConfigurationSupport 를 customizing 하게 되면 발생하는 문제에 대한 해결책이다. 해당 문제를 보려면 일단 Spring Boot Project를 생성하자. (Spring boot Initializer를 사용하면 편리하다) 그 뒤, 아래의 dependency를 추가한다. org.springframework.boot spring-boot-starter-actuator io.micrometer micrometer-registry-prometheus application.properties에 아래 내용을 추가한다(추가하지 않으면 /actuator/pr..

    [JAVA/Spring] BeanUtils 관련

    Spring을 사용하다가, 은근히 종종 Class간 property를 복사해야 할 경우가 있다. 예를 들어, 위와 같은 클래스가 2개가 있다고 치자. 이 때 DB에서 조회한 Person1과 Person2가 있는데, 종종 어떠한 이유로 인하여 이 property를 서로 복사하거나 하는 작업을 해야할 때가 있다. 그럴때마다 원시적인 방법은 이를 그냥 set... set... 하면서 복사하는 방법이 있겠다(매우 비효율적이고 쓸데없이 코드 길이만 길어짐 & 가독성 최악) @Data @AllArgsConstructor @NoArgsConstructor class Person { private String name; private Integer id; private String address; private Str..