Programming/[Spring Boot]

    [Spring Data JPA] - JPA Auditing

    JPA Auditing💡각 데이터마다 누가, 언제 생성했고 변경했는지 알기 위한 방법대표적으로 사용되는 필드생성 주체생성 일자변경 주체변경 일자 기능 사용해보기JPA Auditing 기능 활성화main 메서드가 있는 클래스에서 @EnableJpaAuditing Annotation을 추가한다.package com.springboot.advanced_jpa; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.data.jpa.repository.config.EnableJpaAuditing; @Spri..

    [Spring Data JPA] - 정렬과 페이징 처리

    정렬 처리단순 오름차 내림차 정렬// Acs : 오름차순, Desc : 내림차순 List findByNameOrderByNumberAsc(String name); // name인 Product를 찾되, Number기준으로 오름차순 정렬한다. List findByNameOrderByNumberDesc(String name); // name인 Product를 찾되, Number기준으로 내림차순 정렬한다.다중 오름차 내림차 정렬조건절에서 And, Or 붙이는 것과 다르게 여기서는 And, Or을 붙이지 않는다.// And를 붙이지 않음 List findByNameOrderByPriceAscStockDesc(String name); // name 인 Product 를 찾되, Price 기준으로 오름차순, Sto..

    Spring Data JPA 활용하기

    JPQL (JPA Query Language)💡JPA에서 사용할 수 있는 쿼리테이블이나 컬럼의 이름을 사용하는 것과 달리, Entity 객체를 대상으로 수행하는 쿼리 매핑된 Entity의 이름과 필드의 이름을 사용한다.SELECT p FROM Product p WHERE p.number=?1;SELECT \;p\;FROM\;Product\;p\;WHERE\;p.number=?1;SELECTpFROMProductpWHEREp.number=?1;위는 JPQL 쿼리의 기본구조이다.Product는 Entity 타입을 의미한다.p는 Entity를 의미한다.p.number는 Entity의 속성을 의미한다.쿼리 메서드JpaRepository로 단순 CRUD 연산은 가능했다.하지만, 좀 더 복잡한 쿼리의 경우 사용자가..

    [Spring Data JPA] - 쿼리 메서드의 주제(Subject) 키워드

    쿼리 메서드 주제에서 사용할 수 있는 키워드는 다음과 같다.find…Byread…Byget…Byquery…Bysearch…Bystream…By find…By 를 이용한 메서드// find...By // 특정 데이터 조회 Optional findByNumber(Long number); List findAllByName(String name); Product queryByNumber(Long number);exists…By 를 이용한 메서드// exists...By // 특정 데이터가 존재하는지 확인 boolean existsByNumber(Long number);count…By 를 이용한 메서드// count...By // 쿼리 결과 후 나온 레코드의 수 long countByName(String name..

    [Spring Data JPA] - 쿼리 메서드의 조건자 키워드

    서술어(Predicate) 부분에서 사용할 수 있는 몇가지 조건자 키워드이다.Is보통 생략하는 키워드값의 일치를 조건으로 사용한다.// Is, Equals 키워드를 사용한 쿼리 메서드 Product findByNumberIs(Long number); // findByNumber 과 똑같다. Product findByNumberEquals(Long number); // findByNumber 과 똑같다.(Is)Not값의 불일치를 사용하는 키워드 Not만 사용해도 무방// Not 키워드를 사용한 쿼리 메서드 Product findByNumberIsNot(Long number); // number 가 아닌 데이터 조회 Product findByNumberNot(Long number); // Is 생략이 가능하..

    테스트 주도 개발(TDD)

    💡테스트 코드를 먼저 작성한 후 테스트를 통과하는 코드를 작성하는 과정을 반복하는 소프트웨어 개발 방식테스트 코드 개발 주기실패 테스트 작성 : 실패하는 경우의 테스트 코드를 먼저 작성한다.테스트를 통과하는 코드 작성 : 테스트 코드를 성공시키기 위한 실제 코드를 작성한다.리팩토링 : 중복 코드를 제거하거나 일반화하는 리팩토링을 수행한다.테스트 주도 개발의 효과디버깅 시간 단축테스트 코드 기반으로 개발이 진행되기 때문에 문제의 추적이 쉬움생산성 향상테스트 코드를 통해 지속적으로 애플리케이션 코드의 불안정성에 대한 피드백을 받기 때문에 리팩토링 횟수가 줄고 생산성이 높아짐재설계 시간 단축작성돼 있는 테스트 코드 기반으로 작성하기 때문에 재설계가 필요할 경우 테스트 코드를 조정하는 것으로 재설계 시간 단축 ..

    테스트코드 작성 (이론편)

    💡우리가 작성한 코드나 비즈니스 로직 자체를 테스트하기 위해 작성한 코드테스트 코드를 작성하는 이유개발 과정에서 문제를 미리 발견할 수 있다.리팩토링의 리스크가 줄어든다.애프리케이션을 가동해서 직접 테스트하는 것보다 테스트를 빠르게 진행할 수 있다.하나의 명세 문서로서의 기능을 수행한다.몇 가지 프레임워크에 맞춰 테스트 코드를 작성하면 좋은 코드를 생상할 수 있다.코드가 작성된 목적을 명확하게 표현할 수 있으며, 불필요한 내용이 추가되는 것을 방지한다. 개발 과정에서 문제를 미리 발견할 수 있다.리팩토링의 리스크가 줄어든다.명세 문서로서의 기능을 수행한다.단위 테스트 & 통합 테스트단위 테스트💡애플리케이션의 개별 모듈을 독립적으로 테스트하는 방식 메서드 단위로 테스트를 수행의도한 결괏값이 나오는지 확인테..

    컨트롤러 테스트 코드 작성

    Slice Test@WebMvcTest Annotation을 사용한 테스트를 Slice Test라고 한다.단위 테스트와 통합 테스트의 중간 개념레이어드 아키텍처를 기준으로 각 레이어별로 나누어 테스트를 진행한다는 의미개요의존성 주입을 받는 클래스의 경우 의존성 주입을 받는 객체는 외부 요인에 해당된다.이를 최대한 배제하기 위해서 Mock을 사용한다.@RestController @RequestMapping("/product") public class ProductController { private final ProductService productService; @Autowired public ProductController(ProductService productService) { this.produc..

    Gson

    💡JSON String ↔ Java Object 상호 변환해주는 라이브러리Gson 공식 사이트https://github.com/google/gsonGitHub 코드 정리https://github.com/qpdh/Spring-Boot-Study/tree/main/gson설치 방법Gradledependencies { implementation 'com.google.code.gson:gson:2.10.1' }Maven com.google.code.gson gson 2.10.1 프로젝트 생성하기Intellij 를 이용하여 Maven 또는 Gradle 프로젝트를 생성한다. pom.xml에 dependency를 추가한 모습Java Object를 JSON String으로 변환하기User 클래스를 하나 생성한다.pac..

    서비스 테스트 코드 작성

    getProduct() 테스트 코드package com.springboot.test.service.impl; import com.springboot.test.data.dto.ProductResponseDTO; import com.springboot.test.data.entity.Product; import com.springboot.test.data.repository.ProductRepository; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.Mockito; import static org.mockito...