Transaction이 시작되고 끝나기까지 내부 코드는 과연 어떻게 돌아가는지 궁금해서 아주 조금 뜯어보았다. 2023년 7월 25일 이하 내용 추가 본 포스팅은 @Transactional을 붙였을 때 어떻게 동작하는지 내부 코드를 뜯어본 것인데, @Transactional어노테이션을 사용할 때 프록시 기반 AOP를 사용하는데 이 AOP에 대한 내용은 빠져 있다. 트위터에 어떤 분이 AOP에 대한 내용을 풀어주셔서 살펴보고 ChatGPT가 알려준 내용을 적어둔다. 테스트에 사용한 코드는 아래와 같다. 5번 라인부터 보면 알 수 있듯이 JPA에 대해서는 JpaTransactionManager가 트랜잭션을 지원한다. 스프링에서는 트랜잭션 처리에 대해 PlatformTransactionManager 인터페이스..
개발하고 있는 내용 중에 @Transactional을 중첩해서 사용하는 경우가 있어서 이 경우에 대해 실험을 해보았다. 실험을 하면서 알게 된 사실들이 있는데, 이 사실들을 먼저 알고 보면 도움이 될 것 같아 미리 적어둔다. 1. CheckedException은 예외 발생시 롤백하지 않는다. 2. 트랜잭션 전파(propagation)의 기본 속성은 REQUIRED다. 이 속성은 미리 시작된 트랜잭션이 있으면 참여하고 없으면 새로 시작한다. 3. 동일한 클래스 내에서 @Transactional이 아닌 메서드에서 @Transactional 메서드를 호출하면 트랜잭션이 적용되지 않는다. 3. 트랜잭션 전파의 속성 중 REQUIRES_NEW는 동일한 클래스의 메서드들끼리 호출하면 작동하지 않고, 반드시 다른 클..
업무에서 파라미터 유효성 체크를 할 때 각 클래스마다 checkParam의 방식으로 유효성 체크를 해왔는데, 좀 더 편하게 할 수 있는 방법이 없을까 고민했고, 이 글은 고민했던 내용을 적은 것이다. 우선은 기존에도 가지고 있었지만 사용하지는 않았던 Validation을 사용해보기로 했다. 기본적인 흐름은 다음과 같다. 1. 컨트롤러의 메서드 호출 2. @Valid 어노테이션이 붙은 파라미터의 유효성 조건 체크 3. 유효성 조건을 만족하지 못하면 ControllerAdvisor의 해당 Exception의 ExceptionHandler 어노테이션이 붙은 메서드가 수행된다. @Controller @RequestMapping("/post") public class TestPostController { @Res..
DispatcherServet은 HTTP 요청을 제일 앞에서 받아 적합한 컨트롤러로 요청을 넘겨주는 Front Controller의 역할을 한다. DispatcherServlet이 어떻게 동작하는지 보기 위해서는 그 클래스를 까보면 된다. (예전같았으면 인터넷 검색을 주로 했겠지만 스프링 자체가 실력있는 분들이 작성한 코드다보니 이런 분들이 작성한 코드를 보고 배우는 경험도 되고 직접 뜯어보는게 훨씬 기억에 잘 남아서 요즘은 공식문서를 보며 코드를 뜯어보고 있다.) 먼저 계층구조를 뜯어보면 위와 같다. 이제부터 살펴볼 DispatcherServlet은 FrameworkServlet을 상속하고 있다. FrameworkServlet은 WebApplicationContext를 멤버변수로 가지고 있다. publ..
이번 프로젝트에서 목록의 체크박스를 선택해서 삭제하는 기능을 구현하게 되었다. 기존 코드에 있던 대로 선택된 체크박스들을 ","로 연결해서 문자열로 가져오고 서버단에서 "," split해주었는데, 오늘 코드리뷰 중에 좀 더 간단하게 구현할 수 있는 방법이 있지 않겠냐는 대리님의 말씀이 있어서 한 번 찾아보았고, 훨씬 간결하게 구현할 수 있는 방법이 생겨서 포스팅해둔다. Front에서의 처리 사실 가 있어야겠지만 우선은 생략. 그리고 [선택삭제] 버튼을 누르면 ajax가 작동하도록 했는데, 이때 보내는 데이터를 아래처럼 만들었다. data : jQuery("input[name='checkRow']:checked").serialize(), Back에서의 처리 저렇게 ajax에서 데이터를 보내게 되면 chec..
공통업무를 프로그램 흐름의 앞, 중간, 뒤에 추가하여 자동으로 처리할 수 있는 방법이 세 가지인데, Filter, Interceptor, AOP이다. Interceptor와 Filter는 Servlet 단위에서 실행되고, 반면 AOP는 메서드 앞에 Proxy패턴의 형태로 실행된다. 요청이 들어오면 Filter -> Interceptor -> AOP -> Interceptor -> Filter순이다. Filter는 동일한 웹 어플리케이션의 영역 내에서 필요한 자원들을 활용하고, 웹 어플리케이션 내에서 동작하므로 스프링 Context에 접근하기 어렵다. Interceptor는 스프링에서 관리되기 때문에 스프링 내의 모든 객체에 접근 가능하다. https://goddaehee.tistory.com/154 [S..