- Today
- Total
목록Framework (56)
개발하는 고라니
specification] framework - spring boot 2.6.3 test - Junit 5 들어가며 이제 애플리케이션을 개발하는데 있어 테스트는 선택이 아닌 필수가 되었으며, 작성을 용이하게 해주는 라이브러리 또한 플랫폼에 따라 많이 나와있다. 그만큼 개발자에게 테스트는 비교적 저렴한 비용으로 나의 코드가 안전함을 보장하는 이점이 있다. 대표적인 서적으로 Unit Test이 있고, 살짝 보았으나 역시 어려워 이해하는데 어려움이 있었다. 어쩃든, 테스트는 크게 단위 테스트와 통합 테스트로 나뉘는데 일반적으로 code review를 요청하기 위해 Github에 PR(Pull Request)을 올리는데, 이때 기존에 작성된 테스트 코드들이 깨지는지, 빌드가 깨지는지 등을 pipeline으로 정..
specification] spring boot - 2.6.3 서론 API를 만들면 종종 Exception이 발생하기 마련이다. Client에서 요청을 했는데, 예외가 발생했을 때 구체적이고 명시적으로 어떤 에러, 무엇 때문에 발생했는지를 "message"에 담아서 보낸다. fun validateMoney(money: BigDecimal) { if (money < BigDecimal(0)) { throw MinusMoneyException("금액이 음수입니다. money : $money") } } 하지만, 그간 무심코 넘어갔지만 에러 메세지를 확인해보려니 다음과 같이 발생한 적이 있을 것이다. { "timestamp": "2023-02-27T08:43:33.081+00:00", "status": 500,..
JobLauncher Batch Job을 실행시킨다. Job과 JobParameters를 인자로 받는다. Batch를 수행한 후 JobExecution을 반환한다. Spring Batch가 구동되면 JobLauncher 빈이 생성된다. Job 실행 jobLauncher.run(job, jobParameters) Sync taskExecutor를 SyncTaskExecutor로 설정할 경우 (Default) JobExecution을 획득하고 배치 작업 완료 후 JobExecution 반환 Scheduler에 의한 배치 작업에 적합 배치 처리시간이 길어도 상관없을 때 Async taskExecutor가 SimpleAsyncTaskExecutor로 설정할 경우 JobExecution을 획득하고 바로 JobEx..
[Spring Boot] Mono Repo, Multi Module (with. Gradle Kotlin DSL) Intro 개인 프로젝트 정도의 규모라면 하나의 프로젝트 안에 api, web, admin 등이 모두 들어가있어도 커버가 되지만, 규모가 커지면 각각 개별 프로젝트로 나누어야 관리가 될 정도가 된다. 그럼 나 dev-gorany.tistory.com 이전 글에서 프로젝트를 다중 모듈로 구성해보았다. Gradle을 사용하면 어렵지 않게 구현가능하다. 하지만 Gradle Kotlin DSL의 문법은 생소하기도 하고, 사용법이 미세하지만 달라서 낯설기 때문에 여러 삽질이 필요했다. 이번 글에서는 Querydsl을 적용해 api에서 QDomain class를 사용하는 것을 목표로 해보자. 목표 ap..
Intro 개인 프로젝트 정도의 규모라면 하나의 프로젝트 안에 api, web, admin 등이 모두 들어가있어도 커버가 되지만, 규모가 커지면 각각 개별 프로젝트로 나누어야 관리가 될 정도가 된다. 그럼 나눴다고 가정하자. 우리는 4개의 repository가 있다. api web admin-api admin-web 이때 admin에 어떤 기능을 추가해달라고 요청이 왔다. 그래서 admin-api, admin-web을 수정해서 PR(Pull Request)을 올렸다. 다음 요구사항은 새 프로모션이다. api, web, admin 모두 개발을 했고 PR을 올렸다. 하나의 이슈이지만 4번의 PR을 올렸다. 지금은 '이게 어때서?' 라고 생각할 수 있다. 조금 더 극단적으로 가정해서 주문과 정산, 회원이 다시..
Servicee 나 Repository에 대해 테스트 코드를 짜는 것은 조금은 익숙하나, Controller 레이어를 구성하고 테스트 하기 위해서는 Postman이나 Web UI 테스트를 진행해왔다. 이번에는 어플리케이션 수준에서 Controller 테스트를 하는 방법을 간단하게 알아보고자 한다. Environment - Junit 5 - Spring Boot 2.1.7 - JPA (Hibernate) Controller Test * Service, Repository, DTO 및 Entity에 대한 코드는 따로 명시하진 않는다. Controller에 대해 테스트를 하려면 Mock이라는 개념이 필요한데, 이에 대해서는 다음에 자세히 알아보도록 하고, 이번에는 어떻게 사용하는지만 알아보자. package ..
Querydsl Querydsl은 정적 타입을 이용해서 SQL과 같은 쿼리를 생성할 수 있도록 해주는 프레임워크이다. 또한 Querydsl은 JPQL 빌더이다. 현재 JPA를 JPQL -> Spring Data JPA -> Querydsl순으로 배우고 있다. Querydsl은 무엇이고 왜 쓰이는지, 어떻게 쓰는지 JPQL과 비교하며 알아본다. JPQL을 사용하다보면 한계에 부딪힐 때가 있다. 1) 복잡한 쿼리 - JPQL에서 복잡한 쿼리를 타이핑 중 오타가 날 수도 있고, 가독성이 떨어질 수 있다. - JPQL에서 파라미터를 .setParameter(name, value)를 통해 바인딩해야한다. - Querydsl에서 java 코드를 사용하기 때문에 컴파일 시점에 타입 체크나 오타를 잡아주어 IDE의 도..
JPA를 사용함으로써 단순 반복하는 CRUD의 SQL 작성을 획기적으로 줄일 수 있었다. 예를 들어, 테이블을 만들 때마다 Insert 쿼리, Select 쿼리, Update 쿼리, Delete 쿼리 1개씩은 대게 기본으로 SQL을 짜던 것을 JPA에서는 메서드로 가능하게 해주었다. 하지만 인간의 욕심은 끝이없다던가,, 이 간단한 CRUD 작업을 메서드로 하는 것 마저 반복을 줄일 수 없을까 고민을 하게되고, 처음에 이를 해결한 오픈소스 프로젝트를 Spring 측에서 함께 만들어 출시한 것이 Spring Data 프로젝트의 Spring Data JPA이다. 즉, Spring Data JPA를 사용한다면 간단한 저장/삭제/조회 메서드는 기본으로 장착이 되어있고, 커스터마이징 하는 것 또한 더 간편하게 할 ..