본문 바로가기

Back-End/Spring

(26)
스프링 blocking vs non-blocking : R2DBC vs JDBC & WebFlux vs Web MVC 들어가기 전 해당 글은 https://technology.amis.nl/2020/04/10/spring-blocking-vs-non-blocking-r2dbc-vs-jdbc-and-webflux-vs-web-mvc/ 를 번역한 글입니다. 영어가 더 편하시다면 이 글을.... 스프링 프레임워크 버전 5는 리액티프 프로그래밍을 위한 WebFlux를 2017년 8월에 릴리즈 하였고, 2019년 12월에 리액티프 드라이브를 사용한 관계형 데이터베이스인 R2DBC를 릴리즈하였다. 해당 포스팅에서는 WebFlux와 R2DBC를 사용했을 때 더 높은 동시성에 대해 알아본다. 이 둘을 사용하면 더 빠른 응답과 더 높은 처리량을 가지고, 뿐만 아니라 메모리도 조금 사용하고 요청당 CPU도 조금 사용한다. 그리고 JAR ..
Spring DeleteAllBy...In 호출시 에러 ( TransactionRequiredException ) 문제 상황 : deleteAllByIdxIn 호출 시 entitymanager가 왜 없을까? JPA OSIV라면 기본적으로 트랜잭션 범위는 서비스 단까지 있을테고, entity manager는 생성됐을 것이다. 그런데 왜 아래와 같은 에러가 났을까?? javax.persistence.TransactionRequiredException: No EntityManager with actual transaction available for current thread - cannot reliably process 'remove' call @Service @AllArgsConstructor public class ItemServiceImpl implements ItemService { private final It..
트랜잭션 전파 속성 ( propagation ), 롤백 예외 트랜잭션을 시작하거나 기존 트랜잭션에 참여하는 방법을 결정하는 속성이다. 트랜잭션 경계의 시작 지점에서 트랜잭션 전파 속성을 참조해서 해당 범위의 트랜잭션을 어떤 식으로 진행시킬지 정할 수 있다. 이렇게 글로만 보면 트랜잭션 전파 속성은 왜 써야하는지 전혀 와닿지 않는다. 항상 필요에 의한 공부를 할 때 진정한 공부가 되는 것 같다. e-커머스 회사를 다니고 있고, 고객 주문 + 주문 내역을 기록해주는 기능을 개발하라고 지시를 받았다! 어떻게 개발할 것인가? 트랜잭션을 어떻게 묶을까? 위의 상황을 분석해보면, 고객 주문은 성공을 했는데 주문 내역이 기록이 되지 않아 롤백된다면??? 이 얼마나 매출을 깍아먹는 개발자인가.... 즉 지금 상황에서 트랜잭션을 어떻게 묶을지 결정할 수 있는 요인은 중요한 일(주..
Spring Boot Test 및 심화 커머스 회사에서 개발을 하다보면 테스트 코드의 중요성은 스스로 깨닫게 된다. 그래서 Spring Boot 테스트 기능에 대해 간단히 정리해 보려한다. 테스트 코드는 멋으로 하는거 아니냐? 이렇게 생각하신 분은 아직 테스트 코드를 짤 줄 모르거나 짜지 않아서라 생각한다. 내가 생각하는 테스트 코드의 장점은 코드가 자동으로 깔끔해진다. 테스트 코드를 짜려면 결국 한가지 기능을 가진 클래스를 짤 수 밖에 없다. 리팩토링에 대한 자신감이 생긴다. 다른 개발자들에게는 설명서가 된다. (가장크다고 생각하는 부분) 테스트 코드가 없다면 주문/결제 테스트를 위해서 웹사이트에 들어가 상품검색부터 정보 입력까지 다 한 후에 코드를 테스트해야 한다. 한번만 테스트하면 끝이 나는가?? 수정->테스트->수정->테스트의 무한 반..
Spring을 이용하여 개발할 때 고민, 클린코드 짜기, 코드리뷰 항목 개발자라면 자신과 팀원들을 위해서 깔끔한 코드를 짜야 한다. 나도 항상 잘 짜고 싶고 고민이 많아 해당 블로깅을 통해 정리를 해놓으려고 한다. 1. 최소한의 정성은 들였는가? ( 중복, 단일 책임원칙, 의미를 담은 상수 ) 먼저 기본적으로 살펴볼 목록은 이정도 인 것 같다. 코드에 중복된 부분은 없는가? 코드가 무엇을 하는 것인지 이해가 불편하지 않은가? 코드가 자신이 있어야 할 자리에 있는가? 앞으로 변경이 일어난다면 어떤 것이 있을 수 있고, 그 변화에 쉽게 대응할 수 있게 작성 되었는가? // 읽기 편한 코드를 만들자! private boolean canUpgardeLevel(User user){ Level currentLevel = user.getLevel(); switch(currentLevel..
Spring @Order 어노테이션 @Order 어노테이션을 쓰면 스프링 빈의 순서를 정할 수 있다. 기본 옵션은 Ordered.LOWEST_PRECEDENCE 이다. Spring 4.0때부터 collection에 component를 주입할 수 있게 되면서부터 @Order를 이용하여 순서를 정하는데도 사용하게 되었다. @Component @Order(1) public class Excellent implements Rating { @Override public int getRating() { return 1; } } @Component @Order(2) public class Good implements Rating { @Override public int getRating() { return 2; } } @Component @Order(..
Spring Security - remember-me에 관하여 ( 로그인 유지하기 ) Remember-me architecture 로그인 기억하기를 구현할 때 굳이 전체 아키텍처를 이해하지 않아도 되지만, 커스터마이징이 많아질 수록 전체 흐름을 이해해야 구현하기 편해진다. 그래서 remember-me 전체 흐름도에 대해 알아보자. ( 해당 그림은 token 기반 remember-me의 흐름도다 ) 스프링 시큐리티 필터들과 같이, RememberAuthenticationFilter가 FilterChainProxy에 포함되어 있다. RememberAuthenticationFilter는 request를 보고 필요한 경우 특정 동작을 수행한다. RememberMeAuthenticationFilter인터페이스는 해당 사용자가 이미 로그인 한적이 있는지 확인하기 위해 RememberMeService..
Jackson 관련 객체간 서로 참조인 경우 @JsonManagedReference, @JsonBackReference 사용하기 @JsonManagedReference : 해당 부분이 serialize 된다 @JsonBackReference : serialize 에서 제외 된다.
AOP란 비즈니스 로직(모듈)은 가로로 배치하고 공통으로 적용시킬 보안, 로깅, DB처리 로직은 세로로 관통하는 모습이다. AOP의 구조와 용어정리 Aspect : AOP에서 관점이라 부르며 여러 객체에 공통으로 적용되는 기능을 담당 Advice : Aspect를 적용할 조건을 담당. 보안기능이 어떤 메소드에 적용할지, 예외 발생 후 동작할 건지 조건을 걸어준다. ( 모듈자체 - What ) Pointcut : 공통기능을 어떤 모듈의 Joinpoint 통과할건지 위치를 지정해주는 역할 Joinpoint : 공통기능이 적용 가능한 포인트들 메서드 실행 전 ( before ) 메서드 실행 후 ( after ) 반환된 후 ( afterReturning ) 예외가 던져지는 시점 ( afterThrowing ) 메서드 실..
Spring MVC에 관하여 Spring MVC 요청 흐름 개요 사용자가 요청( URL + parameters )을 서버에게 날린다. DispatcherServlet이 처음에 이 요청을 받는다. DispatcherServlet은 미리 설정되어 있는 Handlermapping 정보(web.xml or @Controller)를 통해 request를 Handler에게 위임(delegate)한다. Handler(Controller)에서 비즈니스 로직을 처리 한다. 그 결과에 View와 관련된 정보가 있다면 DispatcherServlet은 ViewResolver를 통해 view에 대한 정보를 받아온다. DispatcherServlet은 받아온 View와 Model을 통해 render을 하고 이를 브라우저에 돌려준다. Filter는 무엇을 ..