개발
-
[OpenSearch] Spring - Kotlin 기반의 OpenSearch Client 구현개발/그 외 2023. 11. 3. 23:13
1. 개요 ElasticSearch 에 비해 AWS OpenSearch는 JAVA API Client 문서가 불친절한 느낌이다. 이것 저것 해보면서 겪었던 시행 착오들을 기록하고, SpringBoot - Kotlin 기반으로 AWS OpenSearch Instance에 접근하고 색인/검색 요청을 하는 JAVA API Client 설정 및 구현 방법을 정리한다. 2. Dependency dependencies { ... implementation("org.opensearch.client:opensearch-rest-client:2.11.0") implementation("org.opensearch.client:opensearch-java:2.7.0") implementation("jakarta.json:j..
-
[Spring] RestDocs로 API 문서화를 간단히 해보자개발/SPRING 2023. 6. 18. 21:58
1. build.gradle.kts 설정 추가해야 할 부분만 표시해놓았습니다~ import org.jetbrains.kotlin.gradle.tasks.KotlinCompile plugins { ... id("com.epages.restdocs-api-spec") version "0.16.0" ... } group = "com.test" version = "0.0.1-SNAPSHOT" java { sourceCompatibility = JavaVersion.VERSION_17 } repositories { mavenCentral() } dependencies { ... testImplementation("com.epages:restdocs-api-spec-mockmvc:0.16.2") } openapi3..
-
[Spring] DI를 쉽게 하는 방법 (Feat. @RequiredArgsConstructor)개발/SPRING 2023. 2. 26. 14:44
1. 개요 Spring DI 방법은 대표적으로 아래의 세 가지를 이용한다. 생성자 주입 Field 주입 Setter 주입 보통은 @Autowired를 이용한 Field 주입을 많이 사용하는데, 생성자 주입을 권장한다. 순환참조 이슈 Bean을 Immutable 하게 주입 가능 등 장점이 많다. 2. 기본적인 생성자 주입 방법 @RestController @RequestMapping("") public class TestController { private final ProjectService projectService; private final CatalogService catalogService; private final MailService mailService; public TestControlle..
-
[Spring] Intellij Community로 Multi Module Project 생성하기개발/SPRING 2023. 2. 26. 13:55
1. 개요 저는 Intellij Community를 사용하고 있는데, 제가 못하는건지 원래 안되는건지, Springboot-Java 프로젝트를 생성하는게 잘 안됐었습니다. 그래서 Springboot Initializer로 Project 들을 생성하고, 그 이후 root-project에 모듈들을 등록함으로써 Multi Module Project를 구성했습니다. 2. Project 구성 User라는 root-project와, 그 아래 admin/client/core/internal 4개의 Submodule을 구성했습니다. user (root-project) admin client core internal 3. Root Project 생성 Spring initializer로 root project(user) ..
-
[Spring Webflux] 웹플럭스에 대한 간단 정리개발/SPRING 2023. 2. 5. 22:31
Spring MVC와 Spring Webflux Spring MVC는 Blocking / 동기방식으로 동작한다. 요청이 발생할 경우, 스레드풀 내 스레드 하나를 점유해 요청을 처리한다. Spring Webflux는 Non-Blocking / 비동기방식으로 동작한다. 요청이 발생할 경우, 이벤트 루프가 돌아서 해당 이벤트를 처리하는 핸들러에게 처리를 위임하고, 처리가 완료되면 callback 메소드 등을 통해 응답을 반환한다. Spring Webflux를 사용하는 이유 Spring MVC에 비해 적은 스레드를 이용하여 동시성을 핸들링한다. 즉 서버 자원을 낭비하지 않고 효율적으로 동작하는 것을 목적으로 사용한다. 보통 Spring MVC 의 Tomcat 서버에서는 스레드 수가 Default 200개이다. ..
-
[Spring Batch] Spring Batch에 대하여개발/SPRING 2023. 1. 29. 02:32
Spring Batch란? 대용량 일괄처리의 편의를 위해 설계된 가볍고 포괄적인 배치 프레임워크 Spring Scheduler와는 별개의 개념이다. Batch는 보통 Jenkins나 Spring Scheduler에 의해 Trigger 된다. 왜 쓸까? (내 생각..) A라는 한 서버가 있고 이 서버에는 주기적으로 데이터를 처리해야하는 일련의 작업이 있다. A서버의 해당 작업은 Spring Scheduler에 의해 해당 로직이 수행된다. 그러면 A서버는 데이터를 주기적으로 처리하는 일 뿐만아니라 본래 수행해야하는 요청/응답까지 수행했을 때 리소스가 부족하거나 하진 않을까? 이 작업을 Spring Batch로 구현한다면 => 별도의 배치서버로 구현하고 해당 서버는 Scheduler에 의해 실행이 된다. 즉 ..
-
어떤 캐싱을 도입할까? feat. 로컬캐시, Redis, 웹캐시개발/Infra 2023. 1. 7. 18:23
캐시란? 복잡한 연산이나 시간이 오래 걸리는 연산을 미리 수행한 후, 그 결과 값을 저장하여 필요시 빠르게 가져와 사용할 수 있게 하는 것 캐시의 종류 로컬캐시 Redis DB내부 캐시 웹캐시 CDN 등 종류별 특징 로컬캐시: 서버의 리소스(Memory, Disk) 내 결과값을 저장한다. (Caffeine cache, EHcache) 장점 타 서버간 통신비용이 발생하지 않는다. 서버 인스턴스 메모리에 저장하기 때문에 가져오는데 속도가 빠르다. 단점 서버가 여러대로 클러스터링 되어있는 경우, 동기화가 되지 않는다. 캐시 데이터가 커질수록 서버 메모리가 부족해 지며 이에 따라 애플리케이션 성능이 저하 될 수 있다. Redis: 데이터 영속성을 지원하는 In-memory 저장소 (스냅샷 기능을 통해 Disk에..
-
트랜잭션과 격리 수준 (Isolation Level)개발/DB 2022. 12. 30. 15:38
트랜잭션(Transaction)이란? 데이터베이스의 상태를 변화시키기 위해 수행하는 작업의 단위 SELECT, INSERT, DELETE, UPDATE (SQL) 하나만을 의미하는게 아니다. 하나의 작업에는 여러개의 질의어가 포함될 수 있다. 트랜잭션의 특징 ACID 원자성 (Atomicity) 데이터베이스에 모두 반영되던가 (commit), 모두 반영되지 않던가 (rollback,aborted) 일관성 (Consistency) 트랜잭션의 작업 처리 결과가 항상 일관성 있어야 한다. 트랜잭션이 진행되는 동안 데이터베이스가 변경되더라도, 업데이트 이전의 데이터베이스에 트랜잭션이 진행됨으로써 일관성 있게 데이터를 처리한다. 독립성 (Isolation) 둘 이상의 트랜잭션이 동시 실행 되고있는 경우, 하나의 ..