Spring

H2 DB로 테스트 수행 시 문제점 스프링으로 웹개발을 하고 테스트를 작성하고 있다면 H2 데이터베이스를 많이 사용한다. H2는 인메모리 데이터베이스로 스프링부트에 내장되어 있어 별도의 DB 설정 없이 간편하게 이용할 수 있다. 깃허브에서 프로젝트를 클론한 사람 모두가 테스트를 아무런 환경 세팅 없이 쉽게 돌릴 수 있고 테스트 속도도 빠르기에 개발 초기 단계나 토이 프로젝트에서 많이 사용하고 있다. 하지만 운영 환경에서는 MySQL 같은 데이터베이스를 사용하기 때문에 운영 환경과 다른 환경에서 테스트를 한다는 불안감이 있다. 실제로 환경적인 측면에나 문법적인 측면에서 다른 부분이 있어 테스트는 돌아가더라도 운영 환경에서 장애가 날 수도 있다. Transactional(readOnly = true) 문제 ..
· 스프링
최근에 처음으로 기술 면접을 경험했다. 프로젝트에 관한 질문이 많았는데 당시에 비즈니스 로직 중 비동기 처리를 해야 했었다. DB에 접근하는 로직이었기에 @Transactional과 @Async를 함께 적용시켜 사용했다. 이에 대해 면접관이 물었다. @Async와 @Transactional이 내부에서 어떻게 동작하는지 아시나요? 덧붙여서 상상력을 발휘해도 좋다고 했다. 정확하게 AOP 내부 구현을 몰랐던 나는 다음과 같이 대답했다. 아마 트랜잭션 관련 AOP 프록시가 부가 기능을 수행한 뒤 비동기 관련 AOP 프록시가 비동기 부가 기능을 넣고 마지막으로 target을 호출할 것 같습니다. 내부적으로 순서가 있을 것 같은데 반대의 순서도 상관없을 것 같습니다. 정확히 저렇게 말하진 않았겠지만 저런 흐름이었..
· 스프링
스프링 AOP 애플리케이션 기능의 종류에는 크게 핵심 기능과 부가 기능으로 나눌 수 있다. OrderService라는 객체에서 핵심 기능이라 함은 ‘주문을 한다’이고 부가 기능이라 함은 ‘트랜잭션 처리’라고 예를 들 수 있다. 이러한 부가 기능은 보통 여러 클래스에서 동시에 적용되는 데 이를 횡단 관심사(cross-cutting concerens)이라고 한다. 이러한 부가 기능을 적용하기 위해선 보통 많은 반복과 중복 코드, 그리고 중복으로 인한 많은 수정을 요하게 된다. AOP는 관점 지향 프로그래밍(Aspect-Oriented Programming)의 약자로 이러한 중복되는 횡단 관심사를 모듈화 하여 분리하기 위해 나온 패러다임이다. 동적 프록시 스프링에서는 AOP를 구현하기 위해 동적 프록시 기술을..
알림 적용기 1편 알림 적용기 2편 이것저것 알아봤으니 이제 프로젝트 코드에 알림 트랜잭션 분리를 적용해 보고자 한다. 챌린지 인증 임박 알림 트랜잭션 분리 테스트 작성 @DisplayName("알림 이벤트에 예외가 발생해도 새로운 사이클은 저장된다.") @Test void cycleCreate_pushEventException() throws InterruptedException { // given LocalDateTime now = LocalDateTime.now(); willThrow(new RuntimeException("알림 로직에 예상치 못한 예외 발생!")) .given(pushEventListener).handle(any(PushEvent.class)); // when Long cycleI..
POST 요청은 일반적으로 데이터를 body로 보낸다 @PostMapping(value = "/boards/{boardId}", params = "command=move") public ResponseEntity movePiece(@PathVariable int boardId, @RequestBody CommendDto commendDto) { gameService.move(boardId, commendDto); return ResponseEntity.ok(gameService.gameStateAndPieces(boardId)); } 처음에 위와 같이 코드를 짰었다. boardId에 해당하는 체스판을 CommandDto 안의 위치 정보를 통해 체스 말을 움직이는 요청을 처리한다. 그런데 위와 같은 피드백..
@SpringBootTest가 붙으면 Application Context에 의존성 주입 오류(NoSuchBeanDefinitionException) 없이 테스트에 필요한 모든 의존성을 제공해준다. 여러 객체들을 빈으로 등록해서 전체적인 통합 테스트를 진행할 때 사용할 수 있다. @SpringBootTest 내부 확인 맨 아래부터 보면 Junit Jupitier(Junit5의 일부)의 SpringExtension을 등록한 것을 볼 수 있다. SpringExtention은 Spring TestContext 프레임워크를 Junit5의 Jupiter 프로그래밍 모델에 통합한다. 이 extension은 테스트 프레임워크와 스프링의 원활한 통합을 위해 필수적이다. @BootstrapWith는 Sprint TestC..
HTTP 요청 데이터 3가지 전달 방법 GET – 쿼리 파라미터 /url?username=hello&age=20 메시지 바디 없이 URL에 데이터를 전달 POST – HTML Form content-type: application/x-www-form-urlencoded 메시지 바디에 쿼리 파라미터 형식(usermane=hello&age=20)으로 전달 HTTP 메시지 바디에 데이터를 직접 담아서 요청 주로 JSOM 데이터 형식을 사용 {“username” : “hello”, “age” : 20} @RequestParam Get 쿼리 파라미터 전송과 POST HTML Form 전송 방식 둘 다 조회할 수 있다. 다음과 같이 URL 요청이 들어올 때 @RequestParam을 이용하면 다음과 같이 사용할 수..
더즈
'Spring' 태그의 글 목록