스프링

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를 구현하기 위해 동적 프록시 기술을..
스프링부트 애플리케이션 테스트를 할 때 @Mock과 @MockBean을 사용할 때가 있다. 두 어노테이션 모두 모의 객체를 만들지만 용도가 조금씩 다르다. 간단하게 설명하면 비즈니스 로직을 단위 테스트할 때 @Mock을 사용한다. 애플리케이션 컨텍스트를 기반으로 하는 통합 테스트에서 빈을 모의 객체로 추가하거나 변경하는 경우에 @MockBean을 사용한다. Using @Mock For Spring Boot Unit Tests StockService라는 객체가 StockApiClient를 의존한다고 하자. 위 객체를 독립적으로 테스트하기 위해선 Junit과 Mockito가 필요하다. StockService를 테스트할 때 의존 객체들을 mock으로 대체했다. @InjectMock이 붙은 객체에 @Mock 어..
@SpringBootTest가 붙으면 Application Context에 의존성 주입 오류(NoSuchBeanDefinitionException) 없이 테스트에 필요한 모든 의존성을 제공해준다. 여러 객체들을 빈으로 등록해서 전체적인 통합 테스트를 진행할 때 사용할 수 있다. @SpringBootTest 내부 확인 맨 아래부터 보면 Junit Jupitier(Junit5의 일부)의 SpringExtension을 등록한 것을 볼 수 있다. SpringExtention은 Spring TestContext 프레임워크를 Junit5의 Jupiter 프로그래밍 모델에 통합한다. 이 extension은 테스트 프레임워크와 스프링의 원활한 통합을 위해 필수적이다. @BootstrapWith는 Sprint TestC..
공식 문서에 의하면 스프링 웹 MVC는 서블릿 API 기반의 웹 프레임워크이다. 스프링 MVC에 대해 공부하던 중 서블릿에 대한 개념을 간단히 집고 넘어가야 진행할 수 있을 것 같아 정리해 보았다. 서블릿이란? 서블릿은 웹 서버 내에서 실행되는 작은 자바 프로그램(인터페이스)이다. 일반적으로 HTTP를 통해 웹 클라이언트의 요청을 수신하고 응답하며 동적 웹 페이지를 만들 때 사용된다. 개발자가 HTTP 요청과 응답을 직접 다 파싱하고 응답을 만든다고 생각하면 해야 할 일이 너무 많다. 하지만 서블릿을 사용한다면 개발자는 HTTP 스펙을 매우 편리하게 사용할 수 있다. Servlet 인터페이스는 서블릿을 초기화하고, 요청을 처리하고, 서버에서 서블릿을 제거하는 방벙을 정의한다. 아래는 HttpServlet..
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을 이용하면 다음과 같이 사용할 수..
· 스프링
프레임워크란? 라이브러리와는 뭐가 다를까? 둘 다 다른 누군가가 쓴 코드이다. 하지만 ‘누가 누구를 컨트롤 하는가’에서 컨셉의 차이가 나타난다. 라이브러리는 내가 필요할 때 가져와서 사용한다. 쉽게 말해서 집을 지을 때 필요한 연장을 가져와서 사용하듯이 사용자가 라이브러리(도구)를 제어할 수 있다. 반대로 프레임워크는 내가 부르지 않는다. 프레임워크가 사용자를 부른다. 프레임워크를 사용할 때는 프레임워크의 규칙을 따라야 하며 규칙을 어긴다면 작동하지 않는다. 예를 들어 스프링 프레임워크에서는 원하는 동작을 얻기 위해서는 적절한 클래스에 알맞은 애너테이션을 달아야 하고 특정 파일은 정해진 명명 규칙이나 디렉터리 구조를 따라야 한다. Gof의 디자인 패턴으로 유명한 랄프 존슨(Ralph Johnson)은 "..
더즈
'스프링' 카테고리의 글 목록