SpringBoot 24

[SpringBoot] Controller - Service 리펙토링

안녕하세요. 회사와 함께 성장하고 싶은 KOSE입니다. 이번 포스팅은 Contoller와 Service를 리펙토링 하여 Controller의 부하를 줄이고 계층 간 분리하는 과정을 작성하고자 합니다. Spring에서 Controller와 Service는 각각 하는 역할이 다릅니다. Controller는 Service에 의존 관계 주입을 받고 특정 Uri로 오는 요청을 처리하여 응답을 보내는 역할을 수행합니다. Service는 Controller에서 받은 요청을 위임받아 핵심 비즈니스 로직을 수행하여 실행하거나 값을 리턴하는 역할을 수행합니다. 저는 코드를 작성할 때 Controller와 Service를 서로 의존 관계 주입으로 설정할 때 고민되는 것들이 있습니다. 첫째는 Controller의 역할 과중이..

SpringBoot 2023.03.12

[SpringBoot] 관계형 데이터베이스 동시성 문제 해결하기

안녕하세요. 회사와 함께 성장하고 싶은 KOSE입니다. 이번 포스팅은 관계형 데이터베이스에서 발생하는 동시성 문제를 해결하는 과정을 작성하려고 합니다. 다른 서비스들은 모두 동시성 문제를 해결하여 완성시켰지만, member-service 프로젝트는 동시성 문제를 해결하지 않았습니다. 따라서 리펙토링을 수행하며 동시성 문제가 해결되는 과정을 정리하고자 합니다. 1. 동시성 문제 동시성 문제는 가장 까다롭고 어려운 문제입니다. 성능과 안정성을 모두 고려해야 하는 난제로, 관계형 데이터베이스 혹은 인메모리 데이터베이스 등 다양한 분야에서 발생하는 문제입니다. 동시성 문제는 다수의 스레드가 동시에 공유 자원에 접근할 때 발생합니다. Read 모드로 접근하는 경우, 락의 상황에 따라 다르지만 일반적으로 동시성 문..

SpringBoot 2023.03.12

[SpringBoot] Spring Cloud Gateway Authentication 문제

안녕하세요. 회사와 함께 성장하고 싶은 KOSE입니다. 이번 포스팅은 AWS로 서버를 배포하는 과정에서 발생했던 Spring Cloud Gateway의 Authentication 문제에 대해서 다뤄보려고 합니다. 1. Sprong Cloud Gateway 역할 Gateway Server는 Spring Cloud로 구성할 수 있으며 MSA 아키텍처에서 중요한 역할을 수행하는 서버입니다. Spring Cloud Gateway는 각 서비스별 요청을 라우팅 하고, 보안 및 로드밸런싱 기능을 제공할 수 있습니다. 먼저 라우팅 기능은 MSA 아키텍처로 구성되어 있는 다양한 서비스가 gateway에 연결되어 요청 라우팅을 처리할 수 있습니다. 보안적인 측면에서는 다양한 필터를 통해 요청에 대한 응답이나 보안 처리, ..

SpringBoot 2023.03.10

[SpringBoot] RedissonClient로 멀티스레드 환경의 동시성 극복하기(2)

안녕하세요.! 회사와 함께 성장하고 싶은 KOSE입니다. 이번 포스팅은 앞 선 포스팅에서 정리한 RedissonClient로 멀티스레드 환경 동시성 극복하기 2편을 작성하고자 합니다. (앞선 RedissonClient로 repository에 동시성을 제어하는 포스팅 링크입니다. : https://gose-kose.tistory.com/24) 프로젝트를 진행할 때 복잡한 비즈니스 로직 작성은 피할 수 없습니다. 싱글 스레드 환경에서 데이터를 조회하고 수정하는 과정은 순차적으로 이루어지기 때문에 데이터의 정합성을 보장할 수 있습니다. 하지만 멀티 스레드 환경에서는 데이터에 대한 접근과 수정은 데이터의 정합성을 보장하기 어렵습니다. 따라서, synchronized 키워드로 순차처리가 진행되도록 하거나 Redi..

SpringBoot 2023.02.18

[SpringBoot] RedissonClient로 멀티스레드 환경의 동시성 극복하기

안녕하세요! 회사와 함께 성장하고 싶은 KOSE입니다. 이번 포스팅은 프로젝트를 진행하며 발생했던 멀티스레드 환경의 동시성 문제를 극복하는 과정을 작성하고자 합니다. 1. 멀티 스레딩이란? Thread란 프로세스 내에서 작업을 수행하는 단위로 프로세스의 자원을 이용해 작업을 수행합니다. Multi Threading은 하나의 프로세스 내에서 여러 스레드가 동시에 작업을 수행하는 것입니다. CPU코어는 한 번에 하나의 작업만 수행할 수 있으므로, 실제로 동시에 처리되는 작업의 개수와 일치합니다. 하지만, 코어가 매우 빠른 시간 동안 여러 작업을 번갈아 가며 수행하므로 우리가 느끼기에 동시에 수행되는 것처럼 보이도록 합니다. 멀티 스레드를 이용하면 공유하는 영역이 많아 프로세싱 방식보다 Context Swit..

SpringBoot 2023.02.18

[SpringBoot] Redis 적용 - MSA 아키텍처

안녕하세요 회사와 함께 성장하고 싶은 KOSE입니다. 이번 프로젝트는 MSA 아키텍처를 적용하여 서비스를 구축해 보는 활동을 진행하고 있습니다. Gateway 역할을 수행하는 서버를 기준으로 각 서비스가 개별적으로 운영되는 아키텍처를 구상하고 있습니다. 그중, wait-service는 대기실 관련 서비스를 Redis를 통해 구현하고자 하였습니다. 이번 포스팅은, Redis를 활용하여 redis-server에 값을 저장, 수정, 삭제하는 테스트 코드를 작성하고자 합니다. 1. Redis-Server Ubuntu20.04에 추가로 적용하기 저는 기존에 Token을 저장하는 Redis-Server를 6379 port에서 활용하고 있었습니다. token 관련 운영은 게이트웨이에서 진행하도록 프로젝트를 구성하여,..

SpringBoot 2023.01.30

[SpringBoot] @GeneratedValue 분석하기

안녕하세요. 회사와 함께 성장하고 싶은 KOSE입니다. 이번 포스팅은 SpringBoot에서 Entity를 생성할 때, 자주 사용하는 @GeneratedValue에 대해 분석하는 글을 작성하고자 합니다. 1. @GeneratedValue 일반적 사용 @GeneratedValue는 필드의 생성 전략에 활용되는 기술로 데이터 베이스의 Sequence Object를 사용하여 데이터베이스가 자동으로 기본키를 생성하도록 합니다. 해당 어노테이션을 받는 필드가 객체라면 null을, primitive 타입이라면 0으로 판단하여 적용됩니다. (default) Book 객체를 생성할 때, id 없이 객체를 생성하면 GeneratedValue로 인해 객체에 id가 생성되어 주입이 되는 것을 확인할 수 있습니다. @Enti..

SpringBoot 2023.01.13

[SpringBoot] Data JPA 벌크연산

안녕하세요. 회사와 함께 성장하고 싶은 KOSE입니다. 이번 포스팅은 SpringBoot의 Data JPA 벌크연산에 대한 글을 작성하고자 합니다. 1. 벌크 연산 벌크 연산은 여러 건의 데이터를 한 번에 수정하거나 삭제하는 방법으로 대용량 데이터를 한 번에 처리할 때 유용합니다. 현재 주어진 Member table에는 6개의 행이 존재합니다. 만약 25살 이상의 나이에 모두 1살을 더하라는 요청이 오면 , 다음과 같은 쿼리를 생성할 수 있습니다. update member m set m.age = m.age + 1 where m.age >= 25; 혹은 Member table에서 member_id가 5 이상인 행을 제거하라는 요청이 오면 쿼리는 다음과 같습니다. delete from member m wh..

SpringBoot 2023.01.12

[SpringBoot] 프록시와 내부 호출 프록시 미적용 문제 해결하기

안녕하세요. 회사와 함께 성장하고 싶은 KOSE입니다. 이번 포스팅은 SpringBoot의 프록시 방식의 AOP에서 발생하는 내부 호출 문제를 해결하는 방법에 대해서 정리하는 글을 작성하도록 하겠습니다. 스프링에서는 AOP를 적용하기 위해 프록시를 통해 대상 객체를 호출하는 방법을 따릅니다. 프록시에서 먼저 어드바이스를 호출하고 대상 객체를 호출합니다. saveRepository라는 테스트 메서드를 실행하면 다음의 절차에 따라 진행됩니다. blogRepository는 인터페이스가 아닌 구현체에 해당하므로 스프링의 AOP 프록시 정책에 따라 CGLIB 방식의 프록시가 적용됩니다. 1. 프록시 처리 과정 코드 예시 1) Pointcuts @Slf4j public class Pointcuts { @Pointc..

SpringBoot 2023.01.10

[SpringBoot] AOP 적용하기(1)

안녕하세요. 회사와 함께 성장하고 싶은 KOSE입니다. 밤이 늦었지만, AOP에 관한 내용을 나눠서 정리하고자 글을 작성하게 되었습니다. AOP를 알기 전에는, 핵심 로직과 부가 기능을 분리하지 않고 작성하다 보니, 추후 리팩토링 하는 과정에서 난관에 부딪친 적이 있습니다. 영한님 스프링 핵심 원리 고급편을 수강하고 나니, AOP를 활용하는 방법을 배울 수 있었고, 앞 선 문제를 해결하는데 많은 도움을 받을 수 있었습니다. 이제 본격적으로 SpringBoot AOP과 AOP를 사용하는데 활용되는 어노테이션을 정리하는 글을 이어 나가도록 하겠습니다. 1. AOP(Aspect-Oriented Programming)란 ? AOP란 애플리케이션을 바라보는 관점을 하나하나의 기능에서 횡단 관심사 관점으로 보는 것..

SpringBoot 2023.01.09