본문 바로가기

스프링12

[MSA] MSA란? Clound Native Architecture 확장 가능한 아키텍쳐 수평적 확장에 유연(스케일 아웃) 시스템의 부하 분산, 가용성 보장 서비스 단위 패키지(컨테이너 기반 패키지) 모니터링 탄력적 아키텍쳐 서비스 생성-통합-배포에 따른 환경 변화에 따른 대응 시간 단축 분할된 구조 Stateless 통신 프로토콜 서비스 변경 자동 감지 사용자 요청에 따른 동적 처리 장애 격리 특정 서비스에 오류가 발생해도 다른 서비스에 영향을 주지 않음 Cloud Native의 구성 요소는? CI/CD CI란: 지속적 통합 통합 서버, 소스 관리,빌드 도구, 테스트 도구 대표적인 CI 도구: 젠킨스, 트래비스 CD란: 지속적 배포 continuous depoloyment 실행되는 파일을 실행 환경에 자동 반영 카나리 배.. 2022. 3. 10.
[코틀린] 맥북에 설치하고 스프링 Rest API로 CRUD 해보기 설치 우선적으로 코틀린 설치가 되어 있어야 합니다. 설치는 Homebrew를 이용합니다. //코틀린 설치 brew install kotlin //설치 확인 kotlinc -version 프로젝트 만들기 https://start.spring.io/ 에서 쉽게 만들 수 있어요. postgresql을 사용했지만 다른 mysql이나 mongoDB를 사용하셔도 무방합니다 yml 설정 spring: jpa: hibernate: ddl-auto: create-drop datasource: password: '{password}' username: {username} url: jdbc:postgresql://localhost:5432/{database name} driverClassName: org.postgresql.. 2022. 3. 8.
스프링 커버링 인덱스로 페이징 성능 개선하기 지난 글 2022.02.07 - [스프링 부트/A-ger] - 스프링 무한스크롤 페이징 검색 처리 및 동적쿼리 적용하기 지난 글에서 무한 스크롤 적용을 위해 slice와 booleanExpression으로 동적 쿼리를 적용했었습니다. 검색 기능은 아무래도 이용자들이 가장 많이 이용할 기능이기에 더 많은 성능 개선을 위해 커버링 인덱스를 적용하기로 했습니다. 일단적으로 조회 쿼리에서 성능 저하의 원인이 되는 것은 인덱스 검색 후 컬럼 값을 읽을 때입니다. select 부분에서 데이터 블록에 접근하기 때문에 많은 성능 저하를 유발합니다. 그러나 커버링 인덱싱을 적용하게 되면 where, order by, offset, limit를 인덱싱으로 빠르게 Id만 찾아내 데이터 블록에 접근하기에 성능 향상에 도움이 .. 2022. 2. 18.
스프링 부분 수정 쿼리 @DynamicUpdate 개요 프로젝트를 진행하던 중에 수정 쿼리를 날려야 할 상황이 거의 모든 엔티티에 있었습니다. JPA의 기본 설정은 모든 컬럼을 업데이트하게 되어 있습니다. 대부분의 경우 엔티티마다 전부 수정하는 쿼리를 날리는 경우는 없습니다. 따라서 부분 수정쿼리를 날리는 어노테이션을 찾던중 @DynamicUpdate 을 발견하였습니다. 사용법 사용법은 간단합니다. 엔티티 클래스에 @DynamicUpdate만 붙여주면 변경된 컬럼만 찾아 업데이트를 해줍니다. 자주 사용되는 상태변경이나 조회 수 같은 경우에 사용하면 좋을거 같습니다. @Entity @DynamicUpdate public class Product { ... } 2022. 2. 18.
스프링 레디스 최근 검색어 관리하기 거래 플랫폼 프로젝트를 진행하던중 검색 창에 최근 검색어 기능 추가를 했으면 좋겠다는 의견이 있었습니다. 2가지 방법을 생각했는데 첫번째는 search 엔티티를 만들어 관리하는 방식이었습니다. 두번째는 레디스에서 최근 검색어를 위해 리스트 자료구조를 이용해서 관리하는 방식을 생각했습니다. 첫 번째 방식은 인메모리 캐시 방식인 레디스에 비해 속도가 느릴거 같고 관리 측면에서도 원하는 사이즈가 꽉 찾을때 시간순으로 정렬한 후에 가장 오래된 컬럼을 삭제하고 다시 insert를 해야한다는 점이 번거로웠습니다. 그래서 엔티티를 아예 만들지않고 accountId로 식별할 수 있는 레디스 리스트를 만들어서 관리하는 방식을 택했습니다. 로직은 사용자가 검색을 하게되면 accesstoken으로 사용자를 조회하고, 키 값.. 2022. 2. 10.
스프링에서 카프카 시작하기 진행중인 프로젝트에 적용하기 전에 간단하게 카프카로 보내는 프로젝트를 만들어 보겠습니다. 1. 프로젝트 생성 start.spring.io에서 gradle, spring boot 2.5.9 버전 dependency에 spring web과 kafka, lombok, websocket을 추가해주세요. 2. 설정 값 생성 클래스 생성하셔서 아래 값을 기입해주세요. 토픽과 그룹 아이디, 주소를 주입해줄거에요. public class KafkaConstants { public static final String KAFKA_TOPIC = "kafka"; public static final String GROUP_ID = "test"; public static final String KAFKA_BROKER = "loc.. 2022. 2. 9.
스프링 무한스크롤 페이징 검색 처리 및 동적쿼리 적용하기 목적 프로젝트에서 무한 스크롤 기능과 동적 쿼리를 활용해 카테고리별 정렬, 키워드 검색 등을 수행하기 위해 만들었습니다. 장점 원래 프로젝트에는 /api/product/views,/api/product/time, /api/product/category로 나뉘어져 각 조회마다 다른 기능을 하도록 되어 있었습니다. 그러다 보니 코드의 양도 몇 배가 늘어버리고, 단순히 검색이라는 키워드 안에 여러가지 api가 섞여버려 본래의 목적을 읽어버린 느낌까지 들었습니다. 페이징과, 동적 쿼리를 적용 시키고 난 후엔 검색용 api가 통합되어 알아보기 쉽게 만들어졌고 프론트엔드에서도 쿼리 파라미터에 추가만 하면 되니 사용법이 쉬워진 것 같습니다. 코드의 양적으로 봐도 훨씬 줄어 클린 코드가 만들어지게 됐습니다. 단점은 U.. 2022. 2. 7.
스프링 Java 8 LocalDateTime 직렬화 역직렬화 오류 해결 방법 Java 8 date/time type java.time.LocalDateTime not supported by default LocalDataTime을 역직렬화하지 못해서 생기는 문제입니다. jackson-datatype-jsr310 종속성을 추가하고 해결해야 됩니다. //자바 역직렬화 문제 해결 패키지 implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310' implementation 'com.fasterxml.jackson.core:jackson-databind' 추가적으로 만약 캐시로 사용할 객체에 LocalDateTime 타입의 값이 존재한다면 위처럼 @JsonSerialize, @JsonDeserialize 어노테이션을 기.. 2022. 2. 5.
[Error-Log] ConcurrentModificationException 해결법 @OnetoMany에서 collection 삭제할 때 에러 해결 방법 프로젝트에서 상품 이미지를 수정하려고 할 때 이미지를 새로 올리도록 설정해놨습니다. 그렇기 때문에 기존 이미지 url들을 삭제한 후에 이미지를 업로드하는 로직으로 구성하는 와중에 생긴 에러입니다. orphanremoval 설정을 해두어 url쪽의 FK만 null로 설정해줘도 연관 관계가 끊기게 되고 자동으로 해당 url 엔티티는 delete가 됩니다. 그러나 일반적으로 for을 사용해서 삭제를 진행하게 되면 삭제될 때마다 index가 바뀌어 제대로 삭제가 진행되지 않으면서 ConcurrentModificationException 에러를 띄우게 됩니다. for(Url url : productById.getUrlList()) { url.s.. 2022. 2. 4.
스프링 레디스 redis cache 프로젝트에 적용하기 실행 환경 mac air m1 몬터레이 spring boot: 2.6.2 redis: 6.2.6 Docker Desktop: 4.4.2 스프링에서 레디스를 사용하기 위해서 도커에 redis 컨테이너가 실행 중인 상태로 두신 상태를 전제로 진행하겠습니다. 1. build.gradle에 implementation 추가하기 data-redis와 cache manager 사용을 위해 두 가지 모두 추가해줍니다. implementation 'org.springframework.boot:spring-boot-starter-data-redis' implementation 'org.springframework.boot:spring-boot-starter-cache' 2. @EnableCaching 추가 프로젝트에서 캐.. 2022. 2. 4.
스프링 레디스 Redis 에러 Creating Server TCP listening socket *:6379: bind: No error 실행 환경 - 윈도우 , redis 3.0.504 버전 혹시나 이 오류를 만나셨다면 1. cmd를 관리자 권한으로 실행 시켜주세요 2. redis-cli.exe를 실행 시켜주세요 3. shutdown을 입력한 후에 exit로 종료해주세요 4. redis-server.exe redis.windows.conf를 cmd 창에 입력하면 redis server가 실행됩니다!! 2022. 1. 18.
스프링부트 JPA N+1 문제와 해결 방법 N+1 문제??? 스프링에서 객체 간 연관 관계 설정시에 발생하는 문제로 조회한 데이터만큼의 SQL 쿼리가 추가적으로 발생해 읽어오는 문제를 말합니다. Fetch 전략을 Lazy나 Eager 어떤 전략과 상관없이 N+1 문제는 발생하게 됩니다. 원인 스프링에서 SQL 조회 쿼리를 날려주는 JPQL(Java Persistence Query Language)를 실행하게 되면 JPA가 분석해 쿼리를 작성하게 됩니다. 그러나 JPQL은 Fetch 전략에 대한 정보가 없기 때문에 개발자가 선택한 특성을 무시하고 쿼리를 작성하게 됩니다. 해결 방법 Fetch Join 사용법 @Query("select a from Account a join fetch a.product") List findAllByProducts().. 2022. 1. 18.