스프링 정리

스프링 정리

JPA의 save와 saveAll의 성능차이

spring batch를 통해 데이터를 가공하고 저장하는 업무가 있었다. 당시 나는 for문을 통해 단순히 한 건마다 save를 진행해서 코드를 작성했는데 생각보다 처리 시간이 너무나 오래 걸려 이를 최적화할 방법을 찾다 saveAll을 통해 어느정도 시간을 단축한 경험이 있다. 당시에는 그냥 saveAll을 쓰니 단축이 되네? 정도로만 하고 넘어갔지 실제 이유는 모른채 넘어갔기에 이참에 정리해보려한다. @Transactional @DisplayName("save 성능") @Test void saveTest(){ //Given long start = System.currentTimeMillis(); //When for(int i = 0; i < 1000000; i++) { Member member = n..

스프링 정리

Path Variable vs Query Parameter

우리가 자주 코드를 작성하다보면, client로부터 인자를 path Variable로 받을지, RequestParam으로 받을지, 아니면 RequestBody로 받을지 고민된다. GetMapping에서는 RequestBody를 지원하지 않기에, 자연스레 GetMapping을 할 때는 PathVariable vs RequestParam으로 귀결되게 된다. 이런 상황일 때, 나름의 기준이 있으면 좋을 것 같아 정리해보려 한다. 1. Query Parameter /users?id=123 # 아이디가 123인 사용자를 가져온다. @GetMapping("/user") public String getUser(@RequestParam String id, @RequestParam(name="password" Strin..

스프링 정리

왜 생성자 주입이 @Autowired(필드 주입)보다 좋을까?

개발 공부를 하며 들었던 이야기 중 하나는, 필드 주입보다는 생성자 주입을 쓰라는 이야기였다. 심지어 인턴 당시 사수에게는 필드 주입들을 싹 다 생성자 주입으로 바꾸라는 조언도 들었다. 왜 생성자 주입을 써야할까? 필드 주입이 편하지 않을까? 우선 해당 두 방법의 차이를 알아보자. 1. 생성자 주입 public class OrderController { // final 변수로 선언 private final OrderService orderService; public OrderController(OrderService orderService) { this.orderService = orderService; } } 2. 필드 주입 public class OrderController { @Autowired p..

스프링 정리

테스트코드에서의 @Transactional

이번에 과제를 진행하면서 테스트 코드를 작성하던 중 고민을 해볼 지점이 생겼다. 현재 내 테스트 코드는 DB에 값을 insert한다거나 update, delete 하는 등 DB에 접근하는 행위들이 있다. 테스트마다의 독립성을 보장하기 위해서, 나는 각 테스트마다 진행된 것들이 다른 테스트에 영향을 끼치지 않기 위해 끝나면 롤백해주고 싶다. 현재 코드에는 그런 기능을 하는 것이 두 개가 동시에 들어가고 있다. @Transactional , @AfterEach의 db.clear() 여기서 내가 조금 걱정이 되었던 부분은, 각 테스트가 실행될 때마다 db를 clear를 통해 다 지우는 것이 과연 합리적일까? 라는 생각이 들었다. 그냥 내가 수정한 부분들만 rollBack을 해주면 되는 것 아닐까? 라는 생각이..

스프링 정리

Spring Batch - @PersistJobDataAfterExecution

이전 포스팅에서 Job의 작업 실행횟수를 실행하기 위해 jobDataMap의 executeCount 변수를 활용한 적이 있다. @Component public class QuartzBatchJob implements org.quartz.Job { @Autowired private JobLauncher jobLauncher; @Autowired private BeanUtil beanUtil; private int executeCount = 0; @SneakyThrows @Override public void execute(JobExecutionContext context) throws JobExecutionException { JobDetail jobDetail = context.getJobDetail()..

스프링 정리

Spring Security & JWT(Json Web Token) 활용 예제

https://github.com/voidmelody/SpringSecurity-Jwt GitHub - voidmelody/SpringSecurity-Jwt: 스프링 시큐리티와 Jwt를 활용한 인가/인증 방식 구현 예제입니다. 스프링 시큐리티와 Jwt를 활용한 인가/인증 방식 구현 예제입니다. Contribute to voidmelody/SpringSecurity-Jwt development by creating an account on GitHub. github.com 생각보다 워낙 다양한 방법들이 있어서, 내가 원하는 구현에 있어서 어려움이 많았다. 많은 다른 이들의 포스팅과 레퍼런스 등을 참고해서 그래도 가장 만족할만한 코드를 짠 것 같습니다. 세션 기반이 아닌, Jwt 토큰을 활용한 header에..

스프링 정리

Spring Batch & Quartz 활용해보기

지난 포스팅에 이어 Quartz를 활용해봅시다. Quartz는 스케쥴러, 즉 일정 시간마다 지정한 횟수만큼 반복해서 Job을 실행할 수 있는 라이브러리를 말합니다. 단순히 몇 번 반복하는 작업이라면 for문등의 반복문을 활용할 수도 있겠지만, 작업 실패 시 재시작 처리라던가, 재 시작 후에 작업 복귀 등의 복잡한 기능이 필요할 때 이를 단순히 구현하는 것보다 수준 높은 기능을 제공합니다. 또 설정된 스레드 풀 내에서 새로운 스레드를 생성해 작업을 진행하기 때문에 메인 스레드를 방해하지 않고 비동기적으로 작동할 수 있습니다. 그냥 줄글로 작성하기보다는, 코드를 보면서 설명하는 게 좋을 듯 싶어 코드를 첨부해가며 진행해보겠습니다. Quartz도 Batch처럼 데이터베이스에 실행중인 작업이나 트리거에 대한 정..

스프링 정리

Spring Batch 간단하게 활용해보기(스프링 배치 5.0)

이번 포스팅은 인턴 기간 중 맡았던 과제에 대한 리뷰 및 복기 목적 하에 작성합니다. 최근 스프링 부트 3.0으로 업그레이드 되면서 Spring Batch에서도 많은 변화가 있었습니다. 현재 스프링 배치는 5점대입니다. 기존의 많은 블로그 포스팅이나 자료에서는 스프링 2점대 기반의 코드들이었기에 이번 실습을 하면서 어려움이 있었습니다. 혹시 저처럼 해매고 계실 분이 계실까 해 개선한 코드를 공유하고자 합니다. 우선 배치라는 개념이 무엇일까요? 이번에 실습하며 배치라는 개념에 대해 새로 알게되었습니다. 개념에 대한 정의에 설명하기 앞서 예시를 이해해봅시다. 만약 매일 아침 5시에 어제 전체 데이터를 집계 처리해야한다고 가정해봅시다. 저라면, 그냥 Tomcat이랑 Spring MVC 등의 웹 어플리케이션을 ..

void_melody
'스프링 정리' 카테고리의 글 목록