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 R2DBC + MySQL

    Spring R2DBC Spring 에서 사용되는 JDBC Datasource는 항상 Blocking 방식으로 제공되어졌다. 한 Query를 수행하고 그에 대한 결과를 받기까지는 항상 Blocking이 되어 해당 쓰레드가 대기하는 문제점이 존재한다. Reactive Framework가 주로 사용되어 진지 꽤 지났음에도 불구하고 Spring에서 사용하는 Datasource는 아직도 예전의 Servlet의 쓰레드 모델에 멈춰있다는게 항상 답답함을 지울 수 없는 부분이었는데, 인큐베이팅 되던 모듈이 드디어 1.0.0 버전으로 릴리즈 되면서 Spring을 사용하면서도 Async-Nonblokcing Datasource를 함께 사용할 수 있다는 뜻이 된다. 이는 곧, Spring 5 Feature인 Webflux..

    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] spring boot XML Response 매핑

    Springboot에서 @RestController로 내려주는 Value에 대해서는 JSON 매핑을 알아서 변형해서 내려주지만, XML은 기본적으로 매핑되지 않아서 내려주지 않는다(Accept : application/xml로 요청 왔을 시 -> 406 Not Acceptable 로 떨군다) 해결법은 com.fasterxml.jackson.dataformat jackson-dataformat-xml 을 추가하면 된다 jackson 라이브러리의 dataformat-xml을 추가해주게 되면 JSON을 기반으로 내려주던 것을 XML로도 내려준다 그렇게 한 뒤에 Header에 Accept 값을 application/xml로 보내보면 xml로 파싱이 잘 된다.

    [Spring] Annotation 관련

    @Controller // 일반적인 MVC Controller의 컨트롤러.. 이를 사용한 클래스는 객체를 자동으로 Wrapping 해주지 않는다. @RestController // 위의 Controller와 같은 역할을 하지만(Servlet Request, Response 핸들링), // Rest에 적합한 Controller로써, @RequestBody, @ResponseBody를 사용하지 않아도 알아서 Convert를 해서 핸들링한다. @RequestBody // Request로 받은 Input을 자동적으로 JSON으로 Wrapping해서 가져온다. @ResponseBody // Response로 나가는 output을 자동적으로 JSON으로 Wrapping해서 내보낸다. // 아래는.. 게시판을 만들면..