Backend 취업준비/Spring(15)
-
@Transactional사용 시 주의 사항과 원인
1. 프록시와 내부 호출의 문제 @Transactional이 적용된 메서드(코드 예시의 internal())를 @Transactional이 적용되지 않은 메서드(코드 예시의 external()) 안에서 사용하게 되면, external()메서드를 사용할 때 우리의 기대와 다르게 internal() 에서 트랜잭션이 전혀 적용되지 않는다. 이는 @Transactional 이 작동하는 프록시 객체의 원리에 있다.코드 예시@Slf4jstatic class CallService { public void external() { log.info("callExternal"); printTxInfo(); internal(); } @Transactional publ..
2024.09.21 -
스프링MVC, DispatcherServlet, ArgumentResolver, HttpMessageConverter
서블릿 이란?위와 같은 HTTP요청, 응답 흐름에 필요한 일련의 작업들에서 의미있는 비지니스 로직을 제외한 모든 작업들을 자동화 해주는 객체HTTP 요청 정보를 편리하게 사용할 수 있는 HttpServletRequest 객체 제공HTTP 응답 정보를 편리하게 제공할 수 있는 HttpServletResponse 객체 제공 서블릿 객체의 작동 방식스프링 부트가 실행하면서 내장 통켓 서버가 스프링 부트가 내장 톰켓 서버를띄워줌. 톰켓 서버 (WAS)는 내부에 Servlet Container 기능을 가지고 있음WAS의 Servlet Container가 servlet 객체를 생성클라이언트가 해당 servlet을 사용하는 http 요청을 하면, Servlet Container에서 request,response 객..
2024.08.15 -
AOP를 활용한 api 중복 요청 방지 (따닥 방지)
숙박 서비스를 만들면서 숙소 등록 / 예약 등록 버튼을 누를 때 버튼을 실수로 여러번 누른다거나 하는 경우가 있었고, 이는 서비스에 안좋은 영향을 끼칠 것이라고 판단하여 이를 방지하고자 하였다.프론트로 alert창으로 1차적으로 막는걸 시도했지만, 약간의 버튼을 누르고 alert창이 뜰 때 까지 약간의 텀이 있는 경우도 존재해서 충분하지 않았다. 이에 스프링 AOP를 활용하였다. HttpServletRequest 객체에서 우저 정보를 가져온 후 시간 정보와 함께 HashMap에 저장한다HttpServletRequest는 서블릿 컨테이너(예: 톰캣)가 HTTP 요청에 대한 정보를 제공하기 위해 사용하는 객체. 클라이언트로부터의 요청 정보를 포함하고 있으며, 파라미터, 헤더, 세션 정보 등을 제공특정 기준 ..
2024.07.22 -
@WebMvcTest를 사용한 Controller 단위 테스트
스프링 시큐리티가 적용된 곳에서 @SpringBootTest 를 사용하여 controller계층을 테스트 해보았었는데 이것을 @WebMveTest로 단위테스트로 리팩토링 하면서 많은 오류들을 마주하였어서 기록합니다먼저 단순히 @SpringBootTest 어노테이션을 @WebMveTest로 바꾸어 주게 되면 다음과 같은 오류 메세지를 확인할 수 있다 주요 오류 메세지org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jpaAuditingHandler': Cannot resolve reference to bean 'jpaMappingContext' while setting constructor argum..
2024.07.15 -
@Transactional, 영속성 컨텍스트
@Transactional데이터 접근 기술마다 데이터 베이스 접근 방법이 다름하지만 실제로 하는 일은 비슷함 => 추상화 가능@Transactional은 Spring AOP로 구현되어 있다.빈 생성시 @Transactional애노테이션이 붙어있다면 프록시 객체가 빈으로 등록된다.=> @Transactional를 Service 클래스에 선언하면 해당 클래스에서 비지니스 로직을 수행할 때 Service의 프록시 객체가 빈으로 등록되어 수행 스프링에서 @Transactional 을 이용하여 트랜잭션 처리를 하는 방법DB와 관련된, 트랜잭션이 필요한 서비스 클래스 혹은 메서드에 @Transactional 어노테이션을 달아주어야 한다클래스, 메서드 모두에 @Transactional 어노테이션을 붙이면 메서드 레..
2024.03.23 -
엔티티와 @RequestBody를 쓰는 DTO에서 기본 생성자, getter/setter의 필요성 (리플랙션)
엔티티 데이터베이스의 테이블과 매핑 하기 위해 기본 생성자 필요 getter/setter 둘 중 하나 필요 엔티티 클래스에서 setter은 지양되니 getter 권장 JPA 구현체(예: Hibernate)가 내부적으로 리플렉션 개념을 사용하여 매핑을 수행 @RequestBody를 쓰는 DTO JSON 객체의 필드를 Java 객체의 필드에 매핑 하기 위해 기본 생성자 필요 getter/setter 둘 중 하나 필요 Jackson 라이브러리의 ObjectMapper가 내부적으로 리플랙션 개념을 사용하여 매핑을 수행 리플랙션이란? 프로그램 실행중(런타임)에 사용자와 운영체제 및 기타 프로그램과 상호작용 하면서 클래스와 인터페이스 등을 검사하고 조작할 수 있는 기능 자바 소스 파일을 컴파일하면 클래스 로더를 통..
2024.03.22