· 웹/Spring
Job Job은 Spring Batch의 계층 구조에서 가장 상위에 위치한 개념으로, 하나의 배치 작업 그 자체를 의미한다. Job은 최소 하나 이상의 Step으로 구성되며, Spring Batch가 정의한 Job 인터페이스를 구현해 빈으로 등록 후 배치 작업을 실행시킬 수 있다. JobParamter Job 자체는 동일한 논리적인 작업 그 자체이지만, 해당 Job 자체는 모두 독립적인 실행을 보장해야할 것이다. 예컨대 특정 사용자가 한 해 사용한 카드값을 정산하는 Job이 있다고 가정했을 때, 카드값을 계산하는 로직 자체는 누구에게나 동일할 것이지만 정산을 하는 시점 및 대상 등은 Job을 실행하는 시점에 따라 달라질 수 있다. 이러한 기능을 제공하기 위해서 Spring Batch에선 실제 Job을 실..
· 웹/Spring
WireMock? WireMock is a library for stubbing and mocking web services. It constructs an HTTP server that we can connect to as we would to an actual web service. When a WireMock server is in action, we can set up expectations, call the service and then verify its behaviors. https://www.baeldung.com/introduction-to-wiremock WireMock은 Mock API를 구축해주는 라이브러리로써, 외부 API와 통신을 하는 애플리케이션 코드를 테스트하기 위해 주로 ..
· 웹/Spring
우리는 스프링에서 테스트 코드 수행시간을 측정하기 위해 일반적으로 IDE의 도움을 받는다. 이미 많은 사람들이 사용하고 있는 JetBrains의 IntelliJ에서는 테스트의 수행시간을 화면 상에 표시해준다. 하지만, 이와 같은 방법은 몇 가지 한계점이 있다. 바로 @SpringBootTest 혹은 @DataJpaTest 등에서 테스트 컨텍스트를 로딩하는 시간이 수행 시간에서 제외된다는 것이다. 사실, 테스트 자체를 수행하는 시간은 1초 이상을 넘기는 일이 잘 없으며 테스트 컨텍스트 로딩 시간이 우리가 체감하는 테스트 수행 시간의 대부분을 차지한다. 이 시간을 줄이기 위해선 우선 해당 시간을 정확히 측정해볼 필요가 있다. 컨텍스트 로딩 시간을 포함한 테스트 코드 전체 수행시간을 구하기 위해선 스프링 프레..
· 웹/Spring
서론 Spring + JPA를 사용해 진행 중인 프로젝트에서 bulk insert가 필요한 상황이 생겼다. bulk라기엔 민망한 최대 300개 데이터이긴 하지만, JpaRepository의 saveAll 메서드를 호출해 저장 시 300개의 insert 쿼리가 따로 나간다는 점이 조금 마음에 걸렸다. 사실상 saveAll은 사용하지 말자는 것은 정해진 듯 보였고, 다음 고민거리는 대체자로 무엇을 사용할 것인가였다. 가장 일반적으로 사용되는 대안은 JdbcTemplate이었으나, 아예 문자열로 쿼리를 박아버리는 방식 자체가 찝찝해 다른 방법이 있는지 찾아보고 있던 상황이었다. 그러던 중 친구랑 나눈 대화가 실험욕구를 자극했다. 본론 그래서 JPARepository.saveAll과 JdbcTemplate.ba..
· 웹/Spring
Mock에 대한 이해 Spring에서는 DI 컨테이너에서 객체들 간의 의존성을 자동으로 관리해주기 때문에, 개발자는 소스 코드 상에서 의존성 주입에 대해 크게 신경쓰지 않고 개발할 수 있다. 하지만, 이렇게 작성한 소스 코드를 단위 테스트하는 과정에서 객체들 간 맺어진 의존성은 객체들이 서로 영향을 끼치도록 하여 테스트에서 각 객체들 간의 독립성을 해치고 테스트 코드의 신뢰성을 떨어트릴 수 있다. @RequiredArgsConstructor public class BookService { private final BookRepository bookRepository; public List getBooksUnderPrice(int price) { List allBooks = bookRepository.fi..
· 웹/Django
DRF를 통해 프로젝트 진행 중 JWT를 발급해야 할 상황이 생겼다. 토이 프로젝트이고 돈도 없다보니 데이터베이스를 AWS MySQL 프리티어로 사용하고 있는데, 아무래도 이게 성능도 안좋고 느리다보니 세션을 통해 인증과 인가를 하게 되면 매번 데이터베이스를 때리기 때문에 좋지 않다고 판단했다. DRF JWT 키워드로 서치를 많이 해봤는데, 대부분은 djangorestframework-jwt나 django-rest-authtoken 라이브러리를 사용하는 것 같았다. 처음엔 나 역시 이것들을 사용하려고 했는데, 2가지 이유로 그만뒀다. 첫 번째는, 토큰의 만료시간을 제외하곤 커스터마이징하기가 쉽지 않아보였다. 우선, 위 라이브러리들은 기본적으로 username과 password를 입력 받아 토큰을 생성해준..
· 웹/Django
이전 글과 이어지는 글입니다. seongonion.tistory.com/61?category=833472 [Django] Word Count 만들기 - 1 이전 글과 이어지는 글입니다. seongonion.tistory.com/59?category=0 [Django] Hello World 페이지 만들기 이전 글과 이어지는 글입니다. seongonion.tistory.com/58 [Django] django 프로젝트 및 앱 폴더 생성.. seongonion.tistory.com 지금까지 wordcount 페이지에서 form 태그로 값을 입력받고, 해당 값을 result 페이지로 옮겨가는 과정까지 완료했다. 이번에는 form 태그로 입력받은 값을 result 페이지에 옮겨갈 뿐 아니라 직접 '띄워주는 것'도..
· 웹/Django
이전 글과 이어지는 글입니다. seongonion.tistory.com/59?category=0 [Django] Hello World 페이지 만들기 이전 글과 이어지는 글입니다. seongonion.tistory.com/58 [Django] django 프로젝트 및 앱 폴더 생성 이전 글과 이어지는 글입니다. seongonion.tistory.com/57 [Django] Django란? - Django 설치 및 가상환경 설.. seongonion.tistory.com Django에서 특정 url을 탔을 때, 연결된 HTML을 띄워주는 방법을 이전 글에서 다루었다. 이번엔 동일한 로직을 응용해서 텍스트로 입력 받은 내용에 대해 각 단어들의 숫자를 출력해주는 페이지를 만들어보고자 한다. 이 페이지를 만들기 ..
SeongOnion
'웹' 카테고리의 글 목록