Thread Local은 자바에서 제공해주는 멀티 스레드 환경에서 각각의 스레드에게 별도의 자원을 제공함으로써 공유되는 서비스에서 별도의 자원에 접근하게끔 하여 각각의 스레드가 각각의 상태를 가질 수 있도록 도와주고 있습니다. 실제로 Thread Local은 Spring진영에서 유용하게 쓰이고 있습니다. 대표적으로 RequestAttribute하고 SecurityContext가 존재합니다. 그렇다면 스프링에서 유용하게 쓰이는지 알아봅시다. 예를들어 로그인 기능이 존재하고 생각해봅시다. A와 B가 각각 클라이언트 요청을 통해 로그인이 필요한 상품 구매 시스템을 이용한다고 생각해 봅시다. Thread 1 - 로그인 정보를 갖고 상품 구매 요청 싱글톤 서비스 - 요청으로 들어온 로그인 정보 검증 및 저장 Th..
자세한 건 Github를 참고해주시기 바랍니다. 배경 개인 프로젝트를 진행하면서 redis를 인증번호 저장을 목적으로 개발을 하고 테스트 하던 과정에서 저장이 되더라도 get을 하지 않는 이슈가 발생하였습니다. 이를 트러블 슈팅하기 위해서 포스팅을 하게 되었습니다. 원인 @Transactional fun authorizePhoneNumber(phoneNumber: String, authNumber: Int): Boolean { val secureNumber = authNumberRepository.findByIdOrNull(phoneNumber.substring(4)) ?: throw SecureNumberNotFoundException(phoneNumber) return secureNumber.toIn..
배경 회사에서 7만개 혹은 11만개의 데이터를 외부에서 받아와 대량으로 전송해야하는 배치 프로그램을 개발 중이었습니다. 처음엔 FeignClient를 사용하여 개발 하였습니다. 하지만 단일 스레드로는 성능이 너무 나오지 않아 11번 호출해서 데이터를 받아오는데에도 오랜시간이 소요되었습니다. 만약 7만개 이상의 데이터를 가져오려면 너무 오랜 시간 동안 배치가 실행되어야 했고, 그러면 다른 배치들과 겹쳐서 돌아가기 때문에 서버에 큰 부담이 생기거나 제가 올린 배치 때문에 병목 현상이 생기는것도 고려해야했습니다. 🤔 멀티 스레드를 사용한다면? 처음에 이 문제를 해결 하기 위해서 저는 멀티 스레드를 사용했습니다. Executor를 Bean으로 등록하고 서비스에서 주입 받아 사용했습니다. @Service @Req..
Reflection API란? reflection은 힙 영역에 로드된 class 타입의 객체를 통해 원하는 클래스의 인스턴스를 생성할 수 있도록 지원하고 인스턴스의 필드와 메소드를 접근 제어자와 상관없이 사용할 수 있도록 해준다. 실제로 reflection을 이용하여 Spring이나 Java 직렬화(jackson) 또는 JPA 같은 기술에서 많이 사용되고있는 기술이다. 제공해주는 method를 통해서 알아보자 public class Test { public static void main(String[] args) { Class collection = Class.forName("java.util.Collections"); System.out.println(collection); Class double = ..
Thread 가시성이란 ? Thread 가시성이란 Thread의 시야 범위를 뜻한다. 공유하는 변수에 연산이 일어날 때 CPU를 점유하고 동작하는데 이 때 main memory에만 존재하는 것이 아니라 CPU cache에도 공유하는 자원에 대한 데이터가 들어있다. 이 때 CPU cache를 읽어오는데 언제 main memory에 옮겨갈 지 모르기 때문에 여러 thread가 동시에 읽음 연산과 쓰기 연산을 한다면 main memory에서 cache로 데이터를 옮기는 과정에서 다른 thread가 연산을 진행하여 결국 데이터 불일치 문제가 생기는 것이다. 이런 불일치 문제를 Thread 가시성 이슈라고 하며 자바에서는 volatile 키워드를 통해 해결할 수 있다. volatile은 캐시가 아닌 main me..
최근 회사에서 작업을 하면서 문제가 생긴 이력이 있다. 발생한 이슈는 50000개 이상의 데이터를 고객에게 전달해줘야하는 배치 프로그램에서 약 400 ~ 500개의 데이터가 손실된 것이었다. 재빨리 문제를 파악하기 시작하였고 원인은 다음과 같았다. 현재 ArrayList는 heap 영역에 올라가 있어 Thread간에 자원을 공유하고 있는 상황이다. 자원을 공유하기 때문에 함수를 실행하는 과정에서 race condition이 발생하였고 데이터가 덮어씌워졌다. 이 문제를 해결하기위해 우리는 발생의 근원이 되는 Concurrency(동시성)과 Parallel(병렬성)에 대해 알아보고 문제를 해결하기 위한 전략까지 살펴볼 것이다. Concurrency 동시성은 한마디로 설명하면 동시에 실행되는 것 처럼 보여지는..
자세한 내용은 Github를 참고해주시기 바랍니다. 오늘은 레포지토리에 대해 얘기를 해보겠다. 레포지토리는 일단 설계부터 추상화를 이용해 구체화에 의존하지 않는 것이 핵심이라고 생각한다. 구체화에 의존하는게 왜? 객체지향을 공부했더라면 알 것이다. 구체화에 의존하는 것은 유지보수성을 떨어트린다. 우리가 알아야하는건 저장소이지 구체적으로 어떤 저장소인진 알아야할 이유가 전혀 없다. 오히려 그렇게 된다면 저장소가 바뀔 때마다 우리는 그에 맞춰 서비스도 바꿔주어야한다. 예를들어 우리는 QueryDSL을 이용하다가 갑자기 JOOQ로 넘어가야하는 상황을 가정해보자 그럴려면 우리는 JOOQ에 관련된 레포지토리를 만들고 그걸 서비스에 주입시켜줘야한다. 거기서 만약에 MyBatis까지 넣어준다면 MyBatis에 관련된..
이제 서비스를 구현해볼 차례다. 먼저 서비스는 애플리케이션 레이어에 해당하는데 보통 비즈니스를 구현하는 구현부라고 생각하면 된다. 물론 이미 여러분들은 틀이 완성 되어있을 것이다. 컨트롤러를 먼저 만들었기 때문에 없는 클래스들은 alt + enter(mac. option + enter)를 이용하면 쉽게 틀을 만들 수 있다. 또한 ReadService와 Service가 따로 구현이 되어있는데 Transactional을 공통으로 사용할 수 있어 간결하게 코딩이 가능하며 나중에 Read와 Write 도메인이 분리되더라도 영향도를 줄일 수 있고 분리된 서비스를 기반으로 빠르게 리팩토링이 가능할 수 있습니다. @Service @Slf4j @RequiredArgsConstructor @Transactional pu..
Global Setting관련해서는 GitHub를 확인해주세요. (JWT와 Security는 매우매우 중요해서 추후 블로그 올립니다.) 우린 컨트롤러부터 서비스 엔티티 순으로 내려가며 개발할 예정입니다. 그렇다면 여기서 의문이 생길겁니다. 왜 컨트롤러부터 개발하나요 ? 먼저 제 생각을 말씀드리면 개발 속도와 깔끔한 아키텍처를 위해서 입니다. 저희는 개발하면서 Entity를 먼저 개발해왔지만 그런식의 개발은 Entity에 의존적인 개발을 할 수 없게 만들고 Entity에 의존적인 개발을 한다는 것은 결국 데이터 중심의 애플리케이션 개발이기 때문에 객체 중심의 개발이 이루어지는 요즘과는 맞지 않습니다. 그렇기 때문에 이벤트 기반으로 먼저 개발을 진행한 후 이벤트에 필요한 속성들을 모아 Entity를 개발하는..
블로그 프로젝트 시작이유 현대 백엔드 기술 중 가장 많이 쓰이는 기술들을 골라보라고 하면 대표적으로 Redis, Spring Boot, JPA 그리고 MySQL 등이 있습니다. 블로그 프로젝트는 이 기술들을 적절하게 사용하는 법을 제시할 예정입니다. 또한 FE와 협업하기위한 최적의 솔루션을 제시할 예정입니다. (본인피셜이니 거를 사람들은 걸러도 됩니다.) 혹시나 본인이 간단한 게시판 프로젝트를 통해서 실력을 높이고자 한다면 제 블로그를 보며 하는 것도 추천 드립니다. 그러면 우선 설계 부터 해봅시다. 블로그에서 일어날 수 있는 이벤트 들을 정리해보면 다음과 같습니다. 게시판 스터디 회원님 분들과 같이 작성한 이벤트 들입니다. 도메인 별로 이벤트를 나눴습니다. 그렇다면 이제 여기서 백엔드 영역의 기능들로 ..
- Total
- Today
- Yesterday
- 게시판
- CS
- java
- 동시성
- 코드
- DevOps
- docker
- 면접
- 취준
- 면접준비
- Spring
- Redis
- 인터뷰
- 면접 준비
- 개발
- 코딩
- 개발자
- Kotlin
- DB
- swarm
- 자바
- 취업준비
- thread
- 백엔드
- JPA
- IT
- 프로그래밍
- MySQL
- 프로젝트
- 취업
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |