반응형 SpringBoot46 스프링부트를 이용한 유효성 검사(feat. Validation) 유효성 검사 어플리케이션의 비즈니스 로직이 올바르게 동작하려면 데이터를 사전 검증하는 작업이 필요합니다. 이를 '유효성 검사' 또는 '데이터 검증' 이라고 부르는데 이를 알아보겠습니다. 일반적인 어플리케이션 유효성 검사 문제점 계층별로 진행하는 유효성 검사는 검증 로직이 각 클래스별로 분산되어 있어서 관리하기가 어렵다 검증 로직 이외로 중복이 많아 여러 곳에 유사한 기능의 코드가 존재할 수 있다. 검증해야할 값이 많다면 검증하는 코드가 길어져서 코드가 복잡하고 가독성이 떨어진다. 문제 해결 방법 이를 해결하기 위해서 자바에서는 Bean Validation 이라는 데이터 유효성 검사 프레임워크를 제공한다. Bean Validation 어노테이션을 통해 다양한 데이터를 검증하는 기능 유효성 검사를 위한 로직.. Spring/스프링 이론 2023. 11. 22. @NotBlank, @Valid 적용하는 방법 Springboot validation 적용 스프링부트에서 유효성 검사를 위해 사용하는 어노테이션 중 하나인 @NotBlank 이나 @Valid 를 적용하는 방법에 대해 알아보겠습니다. Validation 어노테이션 에러 상황 @NotBlank 사용 하려는 중에 인텔리제이(Intellj)에서 자동 완성이 되지 않고, 심볼을 찾을 수 없는 경우 발생 원인 @NotBlank 등 Validation 어노테이션을 사용하려면 javax.validation.constraints 패키지에 존재한다. 스프링부트 ver 2.2 이하의 프로젝트에는 존재하지만 ver 2.3 이상은 따로 의존성을 추가해야 사용이 가능하다. 해결 조치 해당 프로젝트에 validation 관련 의존성을 추가해준다. 해당 의존성을 추가하면 유효성.. Spring/Issue 2023. 11. 16. 영속성 전이와 고아 객체 영속성 전이와 고아 객체 특정 엔티티의 영속성을 변경하는 '영속성 전이' 와 연관관계가 끊어진 '고아 객체' 에 대해 알아보겠습니다. 영속성 전이 특정 엔티티의 영속성 상태 변경 시에 연관된 엔티티의 상태가 변경되는 것을 의미한다. [예시 : @OneToMany] public @interface OneToMany { Class targetEntity() default void.class; CascadeType[] cascade() default {}; FetchType fetch() default FetchType.LAZY; String mappedBy() default ""; boolean orphanRemoval() default false; } casade() : 해당 어노테이션은 영속성 전이를 설.. Book/스프링부트 핵심가이드 2023. 11. 15. 연관관계 매핑(of. 다대다(N:N) 매핑) 연관관계 매핑 RDBMS를 사용할 때는 테이블 하나만 사용해서 애플리케이션의 모든 기능을 구현하는 것은 어렵다. JPA를 사용하는 애플리케이션에서도 테이블의 연관관계를 엔티티 간의 연관관계로 표현이 가능하다. 그 중에서 다대다(N:N) 매핑 방식에 대해 알아보겠습니다. 연관관계 매핑 종류와 방향 Many To Many : 다대다(N:N) 실무에서는 거의 사용되지 않는 구성이다. 예시) 상품과 생산 업체 : 한 종류의 상품이 여러 생산업체를 통해 생산될 수도 있고, 생산업체 한 곳이 여러 상품을 생산할 수도 있다. 다대다 연관관계에서는 각 엔티티에서 서로를 리스트로 가지는 구조로 만들어진다. '교차 엔티티' 라고 부르는 중간테이블을 생성하여 다대다 관계를 일대다 또는 다대일 관계로 해소시킨다. 다대다 단방.. Book/스프링부트 핵심가이드 2023. 11. 14. 연관관계 매핑(of. 다대일(N:1), 일대다(1:N) 매핑) 연관관계 매핑 RDBMS를 사용할 때는 테이블 하나만 사용해서 애플리케이션의 모든 기능을 구현하는 것은 어렵다. JPA를 사용하는 애플리케이션에서도 테이블의 연관관계를 엔티티 간의 연관관계로 표현이 가능하다. 그 중에서 다대일(N:1) , 일대다(1:N) 매핑 방식에 대해 알아보겠습니다. 연관관계 매핑 종류와 방향 One To Many : 일대다(1:N) Many To One : 다대일(N:1) 상품 테이블 입장에서 볼 경우 다대일 관계 공급 업체 테이블 입장에서 볼 경우 일대다 관계 다대일 단방향 매핑 공급업체 엔티티 클래스 @Entity @Getter @Setter @NoArgsConstructor @ToString(callSuper = true) @EqualsAndHashCode(callSuper .. Book/스프링부트 핵심가이드 2023. 11. 14. 연관관계 매핑 (of. 일대일(1:1) 매핑) 연관관계 매핑 RDBMS를 사용할 때는 테이블 하나만 사용해서 애플리케이션의 모든 기능을 구현하는 것은 어렵다. JPA를 사용하는 애플리케이션에서도 테이블의 연관관곌르 엔티티 간의 연관관계로 표현이 가능하다. 그 중에서 일대일(1:1) 매핑 방식에 대해 알아보겠습니다. 연관관계 매핑 종류와 방향 One To One : 일대일(1:1) 연관관계 이해 [예시] 재고관리시스템 재고로 등록되어 있는 상품 엔티티에는 공급업체의 정보 엔티티가 매핑되어있다. 공급업체 입장에서는 한 가게에 납품하는 상품이 여러 개가 있을 수 있으므로 상품 엔티티와 일대다 관계가 된다. 상품 입장에서 보면 하나의 공급업체에 속하게 되므로 다대일 관계가 된다. 데이터베이스에서 두 테이블의 연관관계를 설정하면 외래키를 통해 서로 조인해서 .. Book/스프링부트 핵심가이드 2023. 11. 14. [오류 처리] Failed to load ApplicationContext Failed to load ApplicationContext SpringBoot 프로젝트에서 TDD 구현 시에 발생하는 에러 관련 내용을 알아보겠습니다. 오류 내용 java.lang.IllegalStateException: Failed to load ApplicationContext 오류 원인 데이터베이스 소스를 구성하지 못해서 나오는 에러이다. Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured. 오류 해결 방안 H2, HSQL or Derby 등의 데이터베이스를 추가해줘야한다. 해당 프로젝트에서는 H2 DataBase 의존성을 추가하여 진행하였다. c.. Spring/Issue 2023. 11. 9. 정렬과 페이징 처리 방법과 예시 정렬과 페이징 처리 애플리케이션에서 자주 사용되는 정렬과 페이징 처리는 쿼리 메서드를 작성하는 방법을 기반으로 수행할 수 있다. 기본 쿼리 메서드를 통해서도 가능하다. 기본적인 정렬과 페이징 처리 방법을 알아보겠습니다. 정렬 처리하기 일반적인 쿼리문에서는 정렬을 사용할 때 ORDER BY 구문을 사용한다. 쿼리 메서드도 정렬 기능에 동일한 키워드가 사용된다. // Asc : 오름차순, Desc : 내림차순 List findByOrderByNumberAsc(String name); List findByOrderByNumberDesc(String name); 기본 쿼리 메서드를 작성한 후에 OrderBy 키워드를 삽입한다. 정렬하고자 하는 컬럼과 오름차순/내림차순을 설정하면 정렬이 수행된다. 쿼리 메서드에서.. Book/스프링부트 핵심가이드 2023. 11. 9. JaCoCo를 활용한 테스트 JaCoCo를 활용한 테스트 커버리지를 확인하기 위한 도구 중 가장 보편적으로 사용되는 도구인 JaCoCo에 대해서 알아보겠습니다. JaCoCo란? JaCoCo는 Java Code Coverage 의 약자이다. JUnit 테스트를 통해 애플리케이션의 코드가 얼마나 테스트 되었는지 Line과 Branch를 기준으로 한 커버리지로 리포트한다. JaCoCo는 런타임으로 테스트 케이스를 실행하고 커버리지를 체크하는 방식으로 동작된다. 리포트는 HTML, XML, CSV와 같은 다양한 형식으로 확인이 가능하다. JaCoCo 플러그인 설정 의존성 주입(pom.xml) org.jacoco org.jacoco.cli 0.8.7 플러그인 추가(pom.xml) 1️⃣ 태그 **/ProductServiceImpl.class.. TEST/JaCoCo 2023. 11. 8. 단위 테스트 방법 [part 3 : 리포지토리(Repository)] 적합한 테스트 가이드 레이어(layer)별로 사용하기 적합한 방식의 테스트 가이드에 대해 알아보겠습니다. 그 중에 '리포지토리 객체'를 테스트하는 방법을 알아보겠습니다. 리포지토리 객체의 테스트 리포지토리는 개발자가 구현하는 레이어 중에서 가장 데이터베이스와 가깝다 JpaRepository를 상속받아 기본적인 쿼리 메서드를 사용할 수 있다. 📌 리포지토리 객체의 테스트 코드 작성 시 고려할 사항 findById(), save() 같은 기본 메서드에 대한 테스트는 큰 의미가 없다. 리포지토리의 기본 메서드는 테스트 검증을 마치고 제공된 것이기 때문이다. 데이터베이스의 연동 여부는 테스트 시에 고려해볼 사항이다. 데이터베이스를 연동한 테스트는 테스트 데이터를 제거하는 코드까지 작성하는 것이 좋다. 테스트 데.. TEST/JUnit 2023. 11. 8. 단위 테스트 방법 [part 2 : 서비스(Service)] 적합한 테스트 가이드 레이어(layer)별로 사용하기 적합한 방식의 테스트 가이드에 대해 알아보겠습니다. 그 중에 '서비스 객체'를 테스트하는 방법을 알아보겠습니다. 1️⃣ ProductService 메서드 테스트 class ProductServiceTest { private final ProductRepository productRepository = Mockito.mock(ProductRepository.class); private ProductServiceImpl productService; @BeforeEach public void setUpTest() { productService = new ProductServiceImpl(productRepository); } @Test void getPro.. TEST/JUnit 2023. 11. 8. lombok 설정 방법과 주요 어노테이션 lombok 사용 반복되는 코드의 작성을 생략할 때 도와주는 어노테이션인 lombok에 대해 알아보겠습니다. lombok 데이터(모델) 클래스를 생성할 때 반복적으로 사용하는 Getter/Setter 같은 메서드를 어노테이션으로 대체하는 기능을 제공하는 라이브러리이다. lombok 의 장점 어노테이션 기반으로 코드를 자동 생성하므로, 생산성이 높아진다. 반복되는 코드를 생략할 수 있어서 가독성이 높아진다. 롬복을 안다면 간단하게 코드를 유추할 수 있어 유지보수에 용이하다. lombok 의 의존성(dependencies) 생성 Maven(pom.xml) org.projectlombok lombok true Gradle(build.gradle) dependencies { compileOnly 'org.pro.. Book/스프링부트 핵심가이드 2023. 11. 3. 이전 1 2 3 4 다음