목록분류 전체보기 (518)
개발놀이터
이번 포스팅은 스프링 부트가 얼마전 3.0이 됨에 따라 바뀌게 된 점 중 저에게 해당하는 점만 정리해보겠습니다. 자세한 내용은 이곳! https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Migration-Guide Spring Boot 3.0 Migration Guide Spring Boot. Contribute to spring-projects/spring-boot development by creating an account on GitHub. github.com 스프링 부트 3.0 1. JavaEE에서 JakartaEE로 변경 javax 패키지에 있던 것들이 전부 jakarta로 변경되었습니다. 때문에 만약 JPA를 사용하신다면 ..
Q. 스프링 시큐리티의 동작 방식에 대해서 설명해주세요. A. 먼저 Proxy Chain Filter가 필터를 만듭니다. 그리고 프록시로 생성된 필터가 request를 인터셉트합니다. 인터셉트한 request로 인증을 진행하고 인증이 끝나면 Security Context를 업데이트합니다. 업데이트함과 동시에 인가가 진행되고 Exception을 핸들링 한 다음 사용자의 요청을 핸들링합니다. Q. 스프링 시큐리티의 인증 방식에 대해서 설명해주세요. A. 먼저 request와 걸맞는 필터가 작동합니다. form 형식의 request는 UsernamePassowrdAuthenticationFilter가 작동하고 OAuth 2.0의 형식은 OAuthLoginAuthenticationFilter가 작동합니다. 그리..
Q. 낙관적 락과 비관적 락에 대해서 설명해주세요. A. 둘 다 데이터에 락을 걸어서 동시성 문제를 해결하는 방법중에 하나입니다. 낙관적 락은 충돌이 빈번하지 않은 경우에 효과적입니다. 낙관적 락은 커밋과정에서 충돌을 감지하여 Exception을 던지는데 이 때 Exception은 OptimisticLockingFailureException입니다. 이 예외를 처리함으로써 동시성 문제를 해결할 수 있습니다. 비관적 락은 충돌이 빈번한 경우에 더 효과적입니다. 비관적 락은 반드시 동시성 문제가 발생한다는 가정을 하고 락을 걸기 때문에 데이터의 정합성이 보장되지만 낙관적 락에 비해 성능이 조금 부족할 수 있습니다.
Q. 비동기 프로그래밍과 Non-blocking (Architecture) 의 차이에 대해서 설명해주세요. A. 동기 / 비동기 프로그래밍은 클라이언트와 서버간에 커뮤니케이션을 할 때 한번 request를 보내면 그에 상응하는 response가 올때까지 기다려야 한다는 것입니다. 반면에 블로킹 / 논블로킹 아키텍처는 여러개의 프로그램 혹은 스레드가 공유된 자원에 접근할 때 같은 자원에 하나의 스레드만 접근할 수 있도록 접근을 막는 것입니다.
스프링 부트가 5.0이 됨에 따라 그런지 모르겠지만 javax.persistence에 있던 EntityManager가 작동하지 않는 상황이 발생했습니다. 이제 EntityManager는 jakarta.persistence로 바뀌게 되었는데 이에따라 querydsl의 설정을 바꿔줘야할 필요가 생겼습니다. 구글링을 해본 결과는 다음과 같습니다. buildscript { ext { queryDslVersion = "5.0.0" } } plugins { id 'java' id 'org.springframework.boot' version '3.1.0' id 'io.spring.dependency-management' version '1.1.0' // querydsl plugin 제거 //id "com.ewerk..
스프링 부트가 5.0에 들어오면서 기존 Job과 Step을 작성할 때 사용하던 JobBuilderFactory, StepBuilderFactory가 Deprecated 되었습니다. 때문에 기존 방법 대신 아래와 같은 방법으로 사용해야합니다. @Configuration @RequiredArgsConstructor @Slf4j public class MonthClickToZeroBatch { private final EntityManagerFactory emf; private final JobRepository jobRepository; private final PlatformTransactionManager platformTransactionManager; private static final int PA..
1. 기존 검색 방식 LIKE 연산자를 이용한 검색을 했습니다. 2. 기존 검색의 문제점 인덱스 설정을 할 수 없습니다. 인덱스를 설정하면 시간 복잡도가 O(log n)이지만 인덱스를 설정하지 못하기 때문에 시간 복잡도가 O(n)에 바인딩 즉, 풀스캔으로 조회합니다. 3. ver.2에서 개선한 점 Elasticsearch의 역색인을 이용해 검색 성능을 20배 (100만행 기준) 끌어올렸습니다. Elasticsearch 고난 항상 느끼는 것이지만 NoSQL은 진입장벽이 어마어마한 것 같습니다. RDBMS에 너무 익숙해진 것도 있겠지만 하나부터 열까지 새롭지 아니한게 없었습니다. RESTful API로 테이블 (인덱스)를 만들고 모든 CRUD 또한 RESTful API를 따르고 있었습니다. 또한, GUI도 ..
이번 포스팅에선 Elasticsearch의 데이터와 MySQL 데이터를 동기화하는 방법에 대해서 포스팅해보도록 하겠습니다. 우선 제가 이 방법이 필요했던 이유는 기존 프로젝트에서 이미 수백개의 데이터가 있는데 이걸 Elasticsearch와 연동시켜야 제가 원하는 검색성능이 나올 것 같아서 알아보게 되었습니다. 마이그레이션 하느라 조금 고생했는데 한번 보시죠! Elasticsearch 마이그레이션 Elasticsearch에서 데이터를 마이그레이션 하는 방법에는 몇가지가 있습니다. 일일이 집어넣기 Logstash 사용하기 go-mysql-elasticsearch 사용하기 저야 수백개가 되는 데이터니까 잘만하면 일일이 집어넣는게 가능하겠지만 현실에선 불가능하겠죠? 또 logstash를 사용하는 방법이 있는데..
이번 포스팅에선 이제 제가 공부하는 스프링에서 사용해봐야죠. 우리는 앞선 포스팅에서 Elassticsearch의 전반적인 내용과 CRUD를 해봤습니다. 스프링에선 Elasticsearch를 어떻게 사용하고있을까요? 한번 알아보죠! 스프링에서 Elasticsearch 사용하기 // elasticsearch implementation 'org.springframework.boot:spring-boot-starter-data-elasticsearch' implementation 'org.elasticsearch.client:elasticsearch-rest-high-level-client' 우선 의존성을 추가해줍니다. ElasticsearchConfig.java package com.hello.capston...