목록Spring (7)
잡동사니를 모아두는 서랍장
메소드 내부에서 사용하지 말자. mommoo.tistory.com/92 [Spring] @Transactional 사용시 주의해야할 점 Spring @Transactional 주의점 안녕하세요. 오늘은 Spring 의 @Transactional 어노테이션을 사용할 때, 주의점에 대해 포스팅합니다. Spring 에서 JPA 기술을 쓸 때 빼놓을 수 없는 기능중 하나는 @Transa. mommoo.tistory.com 확인된 예외는 롤백되지 않는다. stackoverflow.com/questions/28348985/spring-transactional-commiting-partial-results-even-exception-is-thrown
Request Body를 인터셉터에서 읽고 싶을 때 2편 주의 꼭 인터셉터가 아니라도 body 값은 한번 읽히면 날아간다는 건 동일하다. 저번엔 필터에서 래핑하여 인터셉터에서 읽었지만 그렇게 하면 성능 이슈가 있다고 한다. 이번엔 다른 대안으로 소개받은 RequestBodyAdviceAdapter 를 사용해서 body값을 다른 곳에서 읽어보려 한다. 정확히 말하자면 body를 읽는건 여전히 한번이지만, 이 내용이 변환된 객체를 컨트롤러로 넘어가기 전에 확인하는 작업을 해보자. RequestBodyAdviceAdapter 는 RequestBodyAdvice 인터페이스를 구현한 클래스이다. RequestBodyAdvice 는 Body의 내용을 읽고 Object로 변환하기 전에 요청을 커스텀 하거나, 변환된 ..
구직과 퇴사와 인수인계 때문에 현생이 혐생이었어서 이제야 새로운 글을 작성한다. 한달만 놀고 다시 출근하면 좋겠다... 한창 전 직장에서 일할 때, 요청에 들어온 데이터로 인증 여부를 판별해야 하는 일이 있었다. 하지만 한 가지 문제가 있었는데...판별 데이터가 Request Body에 있고 나는 이것을 필터가 아니라 인터셉터에서 읽어내야 했다는 것이다. 모두 알다시피 Body 는 한번만 읽을 수 있다. 이유는 HttpServletRequest의 InputStream 은 한번 읽으면 다시 못읽기 때문에. 다시 읽으려고 하면 Exception 파티 일어난다. 고통스럽다... 해결방안을 모색하려고 하던 중 이전에 팀장님께서 팀 슬랙에 Request Body를 로깅하는 포스트를 공유하신적이 있다. 거기에서 인..
일하면서 요청이 들어오면 처리 후 응답을 해주는게 아니라 비동기적으로 선 응답 후 이벤트로 결과를 알려주는 방식으로 구현해야 하는 일이 생겼다. 비동기 응답에 대해서 생 자바부터 스프링 async 까지 한번씩 건들여봤다. 1. 직접 쓰레드를 새로 생성하는 방법 당장 생각나는 방법은 가장 무식한 방법. 컨트롤러에서 요청을 받았을 때 비즈니스 로직이 구현된 서비스를 호출하지 않고 중간에 대신 실행해주는 서비스를 호출하는 방식. 대행하는 서비스는 쓰레드를 생성해 비즈니스 로직이 구현된 서비스를 호출한다. @Slf4j @Service public class ServiceTest { public void getTest() { try { Thread.sleep(5000); // 명확한 확인을 위해 5초 sleep을..
겉으로 보기엔 둘이 하는게 비슷해 보이지만 애초에 위치가 다르다. Filter DispatcherServlet 앞단에서 DispatcherServlet에 요청이 가기전에 정보 처리 J2EE 표준 스펙에 정의되어 있는 기능 메소드 실행 시점 init() : 필터 인스턴스 초기화시점에 실행 doFilter() : 전/후 처리 destory() : 필터 인스턴스 종료시 실행 Interceptor DispatcherServlet에서 Handler(Controller)로 가기전에 정보 처리 SpringFramework에서 자체적으로 제공하는 기능 메소드 실행 시점 preHandle() : 컨트롤러 들어가기 전에 실행 postHandle() : 컨트롤러에 들어갔다가 나온 후 뷰로 보내지기 전에 실행 afterCom..
프로파일에 따라 프로퍼티가 다르고, 프로퍼티 파일이 외부에 있는 상황일 수도 있는 상황이 있었다. 단순히 파일을 확인해서 긁어 오거나 @PropertySource 를 지정해도 되겠지만 오늘은 PropertySourcesPlaceholderConfigurer를 써보자. PropertySourcesPlaceholderConfigurer PropertySourcesPlaceholderConfigurer 는 추상 클래스 PlaceholderConfigurerSupport 를 구현한 클래스. PropertySource를 추가하여 @Value 어노테이션의 ${...} 부분에 프로퍼티 값을 주입해준다. Bean 으로 등록해서 사용하며, PropertySource 를 여러개 등록할 수 있다. 프로퍼티가 겹칠 땐 먼저 ..
보통 프로퍼티 로딩시에 @PropertySource를 많이 사용하고 있었다. 이번에도 똑같이 사용했었는데 적용이 안됬다. 한참을 삽질하다가 아무리 생각해도 이상해서 찾아본 결과...우선 순위가 존재한다. 나중에 또 헤매지 않게 적어둬야지. 나의 경우에는 시스템 프로퍼티가 이미 지정되어 있어서 @PropertySource가 안먹혔던거였나보다... 1. 유저 홈 디렉토리에 있는 spring-boot-dev-tools.properties 2. 테스트에 있는 @TestPropertySource 3. @SpringBootTest 애노테이션의 properties 애트리뷰트 4. 커맨드 라인 아규먼트 5. SPRING_APPLICATION_JSON (환경 변수 또는 시스템 프로퍼티) 에 들어있는 프로퍼티 6. Ser..