Java/Spring & Spring Boot 20

Spring Rest Docs Custom

다이전 포스트에서 Spring Rest Docs를 이용하여 API문서의 자동화를 진행하던 중 몇가지 보완해야될 점을 발견했다. 테이블에 optional에 대한 정보 표현 유효성 검증에 대한 정보 표현 두가지를 표현하기 위해서 Spring Rest Docs 사용자 정의를 이용하여 API문서를 좀 더 개발자에 맞게 표현해줄 수 있다. Optional에 대한 정보 표현 1. Request fields의 Optional에 대한 정보 표시 @WebMvcTest(MemberController.class) @MockBean(JpaMetamodelMappingContext.class) @AutoConfigureRestDocs public class MemberControllerRestDocsTest { ... ... ..

Spring Rest Docs (API 문서화)

API 문서화란 클라이언트가 REST API 백엔드 애플리케이션에 요청을 전송하기 위해서 알아야 되는 요청 정보(요청 URL(또는 URI), request body, query parameter 등)를 문서로 잘 정리하는 것을 의미한다. API 자동 문서화의 방법으로 Swagger와 Spring Rest Docs를 사용한다. 둘의 특징은 다음과 같으며 이번 포스트에서는 Spring Rest Docs를 사용한다. Swagger의 API 문서화 방식 애터네이션 기반의 API 문서화 방식 애플리케이션 코드에 문서화를 위한 애너테이션들이 포함된다. 가독성 및 유지 보수성이 떨어진다. API 문서와 API 코드 간의 정보 불일치 문제가 발생할 수 있다. API 툴로써의 기능을 활용할 수 있다. Spring Res..

Slice test

메서드 단위로 테스트하는 단위 테스트와 는 달리 Slice 테스트는 계층별로 테스트를 진행한다. (ex. Api 계층, 서비스 계층, 데이터베이스 계층) API 계층 테스트 Api계층의 Controller 테스트를 위한 테스트 클래스 구성 import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; import org.springfra..

Unit test (단위 테스트)와 테스트 종류

단위 테스트 위의 그림에서 알수 있듯이 단위 테스트는 가장 작은 단위인 메서드 단위로 테스트하는 것을 말한다. F.I.R.S.T 원칙 단위 테스트를 위한 테스트 케이스를 작성하기 위해 참고할 수 있는 가이드 원칙으로 F.I.R.S.T 원칙을 참고할 수 있다. Fast(빠르게) 일반적으로 작성한 테스트 케이스는 빨라야 한다. Independent(독립적으로) 각각의 테스트 케이스는 독립적이어야 한다. Repeatable(반복 가능하도록) 테스트 케이스는 어떤 환경에서도 반복해서 실행이 가능해야 된다. Self-validating(셀프 검증이 되도록) 단위 테스트는 성공 또는 실패라는 자체 검증 결과를 보여주어야 한다. Timely(시기적절하게) 단위 테스트는 테스트하려는 기능 구현을 하기 직전에 작성해야 ..

DB N+1 문제해결(JPQL의 join fetch 사용)

N+1문제란 DB에서 어떠한 데이터를 불러올때 해당 엔티티의 연관관계(N)만큼 쿼리가 추가 발생하는 문제이다. 이러한 문제를 JPQL의 join fetch를 사용하여 발생하는 쿼리의 수를 줄일수가 있다. 테스트를 위한 세팅 @Profile("n-plus-one-problem") @Configuration public class NPlusOneProblemConfig { private EntityManager em; private EntityTransaction tx; @Bean public CommandLineRunner testJpaFetchStrategyRunner(EntityManagerFactory emFactory) { this.em = emFactory.createEntityManager();..

이벤트리스너와 비동기

이벤트리스너 ApplicationEventPublisher를 이용하여 이벤트를 발생시킨뒤 @EventListener와 @TransactionalEventListener 에너테이션을 사용하여 정해진 대상과 관련된 메서드를 특정한 시점에 호출시킬수 있다. 이벤트리스너를 사용하면 정해진 조건에 맞는 이벤트만을 추적하여 관련된 메서드만을 자동으로 실행시킬수 있게 되어 따로 특정한 로직을 실행 시키기위해 다른 객체들과 의존관계를 맺지 않아도 되어 코드간의 의존성을 낮추고 더 독립적인 프로그래밍이 가능하다. 예제 코드 @Getter @Component @Slf4j public class EventHandler { // 1. @EventListener public void process(Member member){ ..

BeanWrapper를 이용하여 객체의 필드값 접근

기존코드 public Member updateMember(Member member) {// 수정시킬 필드값들을 담고있는 Member 엔티티 객체 Member findMember = findVerifiedMember(member.getMemberId());// 데이터베이스에 저장된 Member 엔티티 객체 //매개변수로 받은 객체의 필드들을 하나씩 확인하여 값이 들어있는 필드의 값들만 업데이트 Optional.ofNullable(member.getName()) .ifPresent(name -> findMember.setName(name)); Optional.ofNullable(member.getPhone()) .ifPresent(phone -> findMember.setPhone(phone)); Optio..

JPA 엔티티간 연관 관계 매핑 (feat. Fetch전략, Cascade)

JPA 엔티티간 연관 관계 매핑 JPA에서 연관 관계 매핑은 단방향 연관 관계와 양방향 연관 관계가 있으며 방향성과 관계없이 일대다(1:N), 다대일(N:1), 다대다(N:N), 일대일(1:1)관계가 존재한다. JPA 엔티티의 연관 관계를 매핑할때 보통 다대다(N:N)의 구조를 일대다(1:N)와 다대일(N:1)로 분리하고 분리된 관계들을 각각 단방향으로 다대일(N:1)로 연결해준 뒤 필요에따라 일대다(1:N)로 양방향 연결을 해준다. 위의 관계도를 보면 Order와 Coffee간 다대다 관계를 OrderCoffee로 일대다 다대일 관계로 나누었다. 또한 Order와 Member는 다대일 관계이며 Member와 Stamp는 일대일 관계이다. 다대일(N:1) 연관 관계 @Getter @Setter @Buil..

JPA의 Entity 매핑 (feat. Auditable, GeneratedValue 전략)

Entity와 테이블간의 매핑 @Getter @Setter @Builder @Entity // 1. public class Member extends Auditable { // 8. @Id // 2. @GeneratedValue(strategy = GenerationType.IDENTITY) // 3. private Long memberId; @Column(nullable = false, updatable = false, unique = true) // 4. private String email; @Column(length = 100, nullable = false, name = "FULL_NAME") private String name; @Column(length = 13, nullable = fals..

JPA(Java Persistence API)

JPA JPA(Java Persistence API)는 Java 진영에서 사용하는 ORM(Object-Relational Mapping) 기술의 표준 사양(또는 명세, Specification)이다. Java의 인터페이스로 사양이 정의되어 있기 때문에 JPA라는 표준 사양을 구현한 구현체는 따로 있다. Hibernate ORM Hibernate ORM는 JPA 표준 사양을 구현한 구현체중 하나이다. 쉽게말하면 JPA라는 표준사양을 구현하는 API이며 JPA에서 지원하는 기능 이외에 Hibernate 자체적으로 사용할 수 있는 API 역시 지원하고 있다. JPA는 Java Persistence API의 약자이지만 현재는 Jakarta Persistence라고도 불린다. 데이터 액세스 계층에서의 JPA 위치..