본문 바로가기

Coding/Java Spring23

스프링 테스트 코드를 위한 어노테이션 개요 테스트 코드를 작성하다보면 중복코드가 많이 발생한다. 예를 들어 서비스 레이어를 테스트하는 슬라이스 테스트인 경우 @ExtendWith(MockitoExtension.class)를 통해 Mokcito를 활성화시켜주고, 필요하다면 @ActiveProfiles를 통해 프로필을 설정하는 등의 코드들이 계속 생겨나는 모습을 볼 수 있다. 본 포스팅에서는 통합 테스트/유닛/레포지토리 테스트 코드 작성 시 코드 로직 작성에만 집중할 수 있도록 각 테스트 대상에 맞는 통합 어노테이션을 만들고 적용하는 과정에 대해 기술한다. @TestEnvironment @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @ActiveProfiles("test") @Te.. 2023. 8. 22.
스프링 프로젝트 시작을 위한 컨벤션 설정 개요 프로젝트를 시작하기 전 가장 중요한 점이 있는데 바로 일관적인 코드가 유지될 수 있도록 하는것이다. 이는 코드 관점에서는 아키텍처와 규칙이 될 수 있겠고 컨벤션 관점에서는 포맷팅이 있을 것 같다. 사람이 코드 포맷팅을 직접 지키면서 작업하기는 힘들기 때문에 일반적으로 플러그인 등의 기능을 이용하여 모든 코드에 일관성을 지키는데 이를 도와주는 것이 바로 Spotless이다. Spotless를 사용하면 현재의 코드가 정해진 규약을 충족하는지 체크할 수 있고 충족하지 않는다면 자동으로 코드를 변경해주는 기능 또한 제공한다. 또한 모든 코드는 테스트 코드가 필수적으로 들어가는데, 사람이 직접 엣지 케이스를 찾아내는건 쉽지 않은 일이다. 이때 코드 커버리지를 측정하는 방법을 도입할 수 있는데 이는 실제로 굉.. 2023. 8. 22.
DDD 이벤트 스토밍 - 크림 클론 프로젝트 개요 본 프로젝트는 Kream 서비스를 클론하는 프로젝트이다. 기본적으로 헥사고날 아키텍처를 코드 베이스로 가져갈 예정이며 점진적으로 CQRS까지 도입해본다. 코드는 깃허브를 통해 작성할 예정이며 본 포스팅에서는 이벤트 스토밍을 통해 바운디드 컨텍스트를 도출하는 과정까지만 간략하게 기술한다. 소스코드는 https://github.com/teamhide 에서 확인할 수 있다. (아직 개발중인점 참고) 범위 모든 기능을 구현하진 않을 것이며 대략 아래와 같은 싸이클을 수행할 수 있도록 필요한 기능만을 구현할 예정이다. 유저가 회원가입을 한다. 구매자가 상품에 입찰/즉시구매를 한다. 판매자가 상품을 입찰/즉시판매를 한다. 낙찰된 상품이 배송된다. 도메인 이벤트 식별 - 주황색 도메인 이벤트 사이에 순차적인 관.. 2023. 8. 18.
Webflux Function Endpoints 정리 개요 Webflux에서는 HandlerFunction이라는 것을 통해 HTTP Request를 다루게 된다. HandlerFunction은 ServerRequest를 인자로 받고 지연된 ServerResponse(Mono)를 리턴한다. Request/Response 모두 JDK8에서 제공하는 기능을 통해 불변 객체로써 동작한다. HandlerFunction은 어노테이션 기반 프로그래밍에서 등장하는 @RequestMapping과 동일한 역할을 수행한다. 클라이언트로부터 들어오는 Request는 RouterFunction을 통해 다뤄진다. 해당 객체는 위에서 설명한 것 처럼, ServerRequest를 받고 지연된 ServerResponse를 리턴한다. Request가 라우터에 등록된 핸들러와 매칭되면 핸들.. 2023. 8. 17.
Spring Camp 2023 - 실무에서 적용하는 테스트 코드 작성 방법과 노하우 개요 Spring Camp 2023, 김남윤님이 발표하신 실무에서 적용하는 테스트 코드 작성 방법과 노하우 영상을 보며 포스팅으로 정리한 글입니다. Mock Server 기반 테스트 코드 예를 들어 위와 같은 코드가 있다고 가정해보자. 해당 코드는 PartnerClient라는 클래스를 통해 파트너의 정보를 얻어오는데, 해당 클래스는 외부 통신을 수행하는 클래스이다. 이런 경우 위와 같이 Mock Server를 통해 실제 응답값을 모킹하여 테스트 코드를 작성하곤 한다. 그런데 이 때 PartnerClient를 사용하는 클래스가 위처럼 수많이 늘어나면 어떻게 될까? 당연히 모든 테스트마다 Mock Server를 통해 모킹하는 작업이 필요할 것이다. 나아가서 Mock Server가 아닌 @MockBean을 통.. 2023. 8. 5.
Spring AOP 개념 정리 AOP 적용 방식 AOP 적용 방식은 크게 3가지 방법이 있다. 컴파일 시점 .java 소스 코드를 컴파일러를 사용하여 .class를 만드는 시점에 부가 기능 로직을 추가한다. 이때는 AspectJ가 제공하는 특별한 컴파일러를 사용해야 하는데, 컴파일 된 .class를 디컴파일 해보면 실제로 AspectJ 관련 호출 코드가 코드상으로 들어가게 된다. AspectJ 컴파일러는 Aspect를 확인하여 해당 클래스가 적용 대상인지 확인하고 적용 대상인 경우 부가 기능 코드를 적용한다. 이렇게 원본 로직에 부가 기능이 추가되는 것을 위빙(Weaving)이라고 한다. 하지만 특별한 컴파일러도 필요하고 타 방법에 비해 복잡하다는 단점이 존재한다. (잘 사용하지 않음) 클래스 로딩 시점 자바를 실행하면 자바 언어는 .. 2023. 7. 20.