Spring

Spring - @Transactional 활용해 멀티 스레드 환경을 테스트할 때 주의점
문제 상황동시성 이슈를 고려해 상품의 재고량을 감소시키는 토이프로젝트를 할 때 발생한 문제다.동시성을 고려한 테스트를 위해 아래와 같이 코드를 작성했다.@Transactional@DisplayName("멀티 스레드 환경에서 상품 재고를 감소한다.")@Testvoid findAllProductsByNosWhenMultiThreadEnv() throws InterruptedException { // given Product product = createProduct(1000L, "1번 상품", 2000, 100); productRepository.save(product); OrderRequestDto orderRequestDto = new OrderRequestDto(); ..

Spring - 요청 파라미터 LocalDate타입 필드에 바인딩 및 검증
1. 배경 GET방식의 요청에서 쿼리 스트링으로 전달되는 값을 LocalDate 타입으로 변환하고, 검증할 때 겪은 문제다. 아래 처음에 작성한 코드다. startDate, endDate 두 개의 파라미터를 전달받아 LocalDate 타입으로 변환하고, null여부를 확인한다. 이 때 "http://localhost:8080/get?endDate=2024-04-01"로 요청하면 발생하는 문제는 크게 두 가지다. String -> LocalDate 변환 안됨 LocalDate의 null 검증 작동 안함 - null검증이 안되기 때문에 validateStartDtEarlierEndDt() 호출 후 NPE발생 @GetMapping("/get") public Object get(@Valid MyObject my..

Spring - Springboot + Vue3 + MariaDB를 카페24에 배포할 때 Tip(주의사항)
카페 24에 호스팅 과정은 어렵지 않으니 다른 블로그를 참고하면 쉽게 할 수 있다. 대신 호스팅 과정 중에 겪은 문제들을 기록하고자 한다. 1. 환경 * 프로젝트 SpringBoot 2.7.14 Vue 3.3.4 JDK 8 * 서버 Tomcat 8.5.x JSP 2.3 Servlet 3.0 JDK 8 MariaDB 10.1.X UTF-8 2. Tip 2.1 403 Forbidden 에러 * 원인 : 보안 인증이 안돼 있는 경우 발생 * 해결방안 : url의 https -> http 로 변경 또는 ssl 인증서 발급 2.2 DB설정 정보가 틀릴 경우 java.sql.SQLInvalidAuthorizationSpecException: (conn=565) Access denied for user * 원인 : ..

Spring - ArgumentResolver
1. ArgumentResolver란? * 요청 매핑 핸들러 어댑터에 넘어온 요청을 객체, 변수로 바인딩 위의 그림은 Http 요청 메시지의 예시다. 사용자의 요청은 Http Method에 따라 다르지만 url에 '?'뒤에 오는 쿼리스트링으로 전달될 수도 있고 위의 예시처럼 body안에 저장돼 전해질 수도 있다. 또는 JSON, XML 등 다양한 형태로 요청 메시지가 서버로 전해진다. 이렇게 다양한 요청 메시지들을 프로그래머가 일일이 설정해주기란 상당히 불편한 일이다. 그래서 Spring에선 ArgumentResolver를 지원해 해당 요청 메시지들을 객체, 변수에 바인딩 해 해결해준다. 2. ArgumentResolver 동작과정 1. 요청에 적합한 Handler(Controller)가 있는 지 조회 ..

Spring - DispatcherServlet에 대해 알아보자
1. DispatcherServlet? 과거엔 view(사용자에게 보여지는 영역)단에서 비즈니스 로직을 처리해 코드가 서로 얽혀 유지보수에 어려움이 있었다. 이를 해결하기 위해 나온 패턴이 MVC(Model-View-Controller)패턴이다. 초창기 MVC패턴에선 다양한 요청을 처리하기 위한 Controller가 많아지고 이에 따라 중복되고 공통된 기능을 하는 코드들이 늘어났다. 이를 해결하기 위해 나온 방법이 FrontController다. FrontController의 역할은 한 회사의 대표와 같다. 대표는 외부에서 들어오는 각각의 요청들을 적절하게 수행할 수 있는 직원들에게 분배한다. 또 본인 혼자서 수행하기에 업무양이 많다면 전무, 상무, 부장 등 간부들에게 지시를 내려 적합한 직원을 찾도록한..