본문 바로가기

스터디/Spring37

@ExceptionHanlder의 동작 원리(Feat.HandlerExceptionResolver) 이번 포스팅에서는 @ExceptionHandler의 동작 원리를 살펴보도록 하겠습니다. ExceptionHandler라는 이름에서 알 수 있듯이 예외를 핸들링하는 데 사용하는 애노테이션이다. 예외를 핸들링하려면 예외가 발생해야합니다.그렇다면, Spring에서는 예외가 발생하였을 때 어떤 흐름일까요? 예외 발생 FLOWHTTP 요청 : WAS -> Filter -> DispatcherServlet -> Interceptor -> Controller -> Service -> 등등...만약 파란색부분에서 에러가 발생하였을 경우, 아래와 같은 FLOW를 타게됩니다.Controller -> Interceptor -> DispatcherServlet -> Filter -> WAS 만약 에러 페이지를 요청한다면, 다.. 2024. 1. 15.
private 메서드는 트랜잭션 처리를 할 수 없는 이유 의문 private 메서드는 @Transactional을 적용할 수 없다. 뭔가 예상이 가지만 그래도 한번 알아보자!! 먼저 @Transactional 부터 살펴보자! @Transactional 평소에 저희가 자주 사용하는 @Transactional에는 AOP가 적용되어있습니다. 이를 스프링 트랜잭션 AOP라고 합니다. 스프링 트랜잭션 AOP는 @Transactional이 붙여진 메서드가 실행되기 전에 begin을 호출하고 메서드가 종료한 뒤에 commit을 호출합니다! 어떻게 할 수 있는 걸까요?? 답은 프록시입니다!! Spring에는 두가지 프록시 구현체가 있는 데 Springboot에서는 CGLIb를 사용하기 때문에 CGLIb를 기준으로 설명하겠습니다! 아래는 에코노베이션 동아리에서 진행중인 도토링.. 2023. 7. 26.
DTO에 대한 고민 저번 주에는 카카오 테크 캠퍼스 2단계 과제 수행을 기회로 평소 DTO에 관해 고민한 것을 정리해보는 시간을 가졌습니다!! DTO는 Data Transfer Object 즉, 데이터를 전달할 때 사용하는 객체입니다.   먼저, 첫 번째 고민이었습니다.과연 DTO를 사용하면 어떤 이점을 얻을 수 있는 걸까요? 단일 호출 시 여러 매개변수를 일괄처리하여 네트워크의 오버헤드를 줄인다.직렬화의 캡슐화의 이점직렬화된 객체는 외부로부터 데이터를 캡술화하고 보호하는 데 도움이 된다. → 보안 기술 적용하기 좋다.객체를 직렬화함으로써 플랫폼간의 호환성을 높일 수 있습니다.엔티티를 프레젠테이션 레이어에 노출시키지 않을 수 있다. 위의 DTO 이점 중 3번에 대해서는 알고 있었지만, 1번과 2번 장점은 이번에 공부하며 처.. 2023. 7. 17.
Mocktio - Spring 단위 테스트 Mockito 소개 Mockito는 개발자가 동작을 직접 제어할 수 있는 가짜 객체를 지원하는 테스트 프레임 워크이다. 일반적으로, Spring으로 개발하다보면 여러 객체들에게 의존성이 생기는 데 이때 Mockito 라이브러리를 사용하면 단위테스트를 수월하게 진행할 수 있다. 스프링 부트 2.2부터는 프로젝트 생성 시 spring-boot-start-test에서 자동으로 Mockito를 추가해준다. 현재 본인은 스프링 부트 2.7.5버전이므로, spring-boot-start-tset에서 자동으로 Mockito를 추가해주는 것을 알 수 있다. Mockito 사용법 Mock 객체 의존성 주입 Mockito에서 가짜 객체의 의존성 주입을 위해서는 크게 3가지 어노테이션을 사용할 수 있다. @Mock : 가짜.. 2023. 5. 10.
Mockito when-thenReturn 사용 시 WrongTypeOfReturnValue 오류 Junit 5와 Mockito를 사용해서 테스트 코드를 작성하던 중... @DisplayName("login시 loginTokenDto가 반환되는 지 확인") @Test void login_return_loginTokenDto(){ when(memberRepository.findById(loginRequest.getMemberId())).thenReturn(Optional.ofNullable(member)); when(authService.generateToken(loginRequest.getMemberId())).thenReturn(loginTokenDto); Assertions.assertThat(authService.login(loginRequest)).isEqualTo(loginTokenDto);.. 2023. 5. 10.
필터와 인터셉터 애플리케이션의 여러 로직에 공통으로 관심이 있는 것들을 공통 관심사라고 한다. 공통 관심사 중 웹과 관련된 것들을 처리할 때는 HTTP의 헤더나 URL의 정보들이 필요한데, 이를 처리하는 방법들을 서블릿 필터나 스프링 인터셉터가 제공한다. 필터 필터는 J2EE 표준 스펙 기능으로 디스패처 서블릿에 요청이 전달되기 전/후에 url 패턴에 맞는 모든 요청에 대해 부가 작업을 처리할 수 있는 기능을 제공한다. 참고로, 디스패처 서블릿은 프론트 컨트롤러 (스프링의 가장 앞단에 존재하는 것)이므로, 필터는 스프링 범위 밖에서 처리가 된다. 즉, 필터는 스프링 컨테이너가 아닌 톰켓과 같은 서블릿 컨테이너에서 관리가 되는 것이다. (하지만, 스프링 빈 등록은 가능하다!) 필터 흐름은 아래와 같다. HTTP 요청 → .. 2023. 4. 7.
728x90