본문 바로가기

분류 전체보기

(11)
OAuth2.0 자세히 파헤치고 이해하기 이번에 서비스를 운영하다가 OAuth2.0 관련 이슈가 있었다Slack을 이용해서 소셜 로그인이 구현된 사이트였는데 갑자기 어느 순간부터 Slack 로그인 페이지가 에러 페이지로 redirect되었다 Slack OAuth2.0가 버전 업그레이드 되면서로그인 URL의 쿼리 파라미터 scope 값의 구분자를(+ -> ,) 수정하는 간단한 방법으로 해결될 수 있었지만 https://api.slack.com/legacy/oauth  Legacy: OAuth 2.0 for legacy Slack appsOAuth 2.0 for legacy Slack apps.api.slack.comhttps://api.slack.com/authentication/oauth-v2  Installing with OAuthUsing ..
@Async 비동기로 호출 시에 SecurityContext 전달하기 - Spring Security, Thread Pool 😓 문제상황배경프로젝트에서 Request시에 RTT가 오래 걸리는 API가 있어서Request가 들어오고 해당 쓰레드에서 비동기로 새로운 쓰레드를 만들어서 작업을 위임하고Response를 바로 내리는 프로세스가 있었다.  Spring Security로 Request한 유져의 정보를 Thread 단위로 관리하고 있어서SecurityContextHolder.MODE_INHERITABLETHREADLOCAL 로 설정하여 부모 쓰레드에서 파생된 자식 쓰레드에 SecurityContext가 전파될 수 있도록 설정하였다  상황 - 비동기 쓰레드의 SecurityContext(인증정보)가 완전 꼬임 👅Local에서 개발할 때는 Request한 유져의 인증정보가 있는 SecurityContext가 비동기 쓰레드로 ..
동시성 처리 - 비관적 Lock/낙관적 Lock/분산 Lock 비교 및 케이스에 따른 분석해보기 프로젝트에서 동시성 처리를 해야할 일이 생겼다휴가 신청을 하는데, 하나의 계정에서 브라우저를 두개 띄워놓고같은 휴가, 같은 날짜를 선택하고신청 버튼을 누르면 신청이 되어버리는 문제가 있었다 휴가 신청 프로세스에 협력하는 서버는 총 세개(신청 Server / 휴가 Server / 근무 Server)로 구성되어있고,각 도메인 서버는 각각의 데이터베이스를 가지고 있다🤣 임계구역 (Critical Section) 식별해보기휴가 신청과 관리자의 휴가 관리 프로세스는 아래와 같고, 각 단계에서 동시성 문제가 발생하는 임계구역 먼저 도출해보기 시작했다휴가를 하나의 상품이라고 생각하고 구매자(직원) / 판매자(관리자)로 봐도 무방한 플로우다(빨간색으로 표시된 부분이 임계구역) 휴가 신청STEP 1-  신청- 신청 S..
TransactionManager 까보기 - DataSourceTransactionManager? JpaTransactionManager? 😥 문제Batch 개발 도중 Batch 모듈에서 JPA를 이용해, insert 작업을 진행했는데Transaction이 없다고 에러가 발생했다 🤔 원인은?insert 작업을 진행하는 메서드가 @Trasnactional(propagation=REQUIRE_NEW)로 새로운 transaction을 생성해서 작업을 수행하는 부분이라서새로운 transaction 생성에 문제가 있겠구나 하고 찾아봤었는데, 애초에 TransactionManager에 문제가 있음을 확인했다 Batch 모듈에서는 TransacationManager에 대한 Config가 커스텀되어있었는데@Configurationpublic class TransactionManagerConfig { private static final Strin..
Gradle은 어떻게 동작하는 걸까?? Multi Module을 활용한 Mono Repo로 구성된 프로젝트를 수행하다가 문득각 모듈들이 어떻게 빌드가 되고, 어떻게 하나의 어플리케이션으로 띄워지는지 궁금해졌다 project ㄴ api ㄴ...main..java... ㄴApiApplication ㄴbuild.gradle ㄴ core ㄴ... ㄴbuild.gradle ㄴbatch ㄴ... ㄴbuild.gradle ㄴ gradle ㄴwrapper ㄴgradle-wrapper.jar ㄴgradle-wrapper.properties ㄴ gradlew ㄴ gradlew.bat ㄴ bu..
서버에서 파일 다운로드는 어떻게 될까?? 엑셀파일 다운로드 하기 (Java Spring Boot, Apache POI) 프로젝트에서 엑셀 다운로드 API를 개발하다가 문득어떠한 과정을 통해서 엑셀 다운로드가 이루어지는지 원리가 궁금해졌다 Apache POI는 MS Office 파일 포맷을 Java로 읽고 쓰는 기능을 제공하는 라이브러리다 Apache POI를 사용하는 방법보다는POI가 라이브버리 내부에서 어떠한 과정을 거쳐서 엑셀 파일을 만드는지,엑셀파일은 어떻게 HTTP 통신을 통해 클라이언트로 전달되는지,뜯어보면서 무지성으로 라이브러리만 썼던 시간을 반성해보고자 한다ㅋㅋ 🤔 파일 다운로드 HTTP Response파일 다운로드 API의 Response의 Header를 살펴보면,Content-Disposition=attachment;filename=파일이름.확장자를 확인할 수 있다 💁 Content-Dispositio..
DDD 개념과 Boundary Context? Aggregate? Domain Model? 이번에 회사 프로젝트에서 DDD 설계 방식을 도입해서 백엔드 개발을 진행했다처음에는 평소에 하던 백엔드 개발 방식과 무엇이 다른가 의아했지만3,4개월이 지나고 관련 서적들을 읽으며 정리해보니 내가 여태까지 했던 백엔드 개발은 객체지향 언어인 JAVA를 사용해서 절차지향적인 프로그램을 한 것이라는 생각이 들었다. 3,4개월동안 DDD로 프로젝트를 진행한 지금 한번더 서적들과 사이드 프로젝트에 DDD를 적용해보며 DDD에 대해서 정리해 보는 시간을 가지고자 한다. 😀 DDD (Domain Driven Development)비즈니스 Domain 별로 나누어 설계Domain과 모듈 간에 낮은 결합도 / 높은 응집성비즈니스 정책 변경 시, 파일 한개만 수정해서 배포해도 전 시스템에 반영되도록 😀 DDD의 구성..
Java Thread의 상태? Join? Interrupt? 동작 원리 RUNNABLE 상태인 Thread를 갑자기 정지하고 싶으면 interrupt를 사용하면 된다고 한다interrupt가 어떻게 동작하는지 원리를 파헤쳐보고자 한다 ✅ Thread 상태Thread.State Enum을 확인해보면 아래와 같이 6개의 상태로 관리되고 있다public enum State { NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, TERMINATED; }NEW : 아직 Thread가 시작되지 않은 상태RUNNABLE : CPU Core에 의해 실행중이거나, 실행 준비가 된 상태실행 상태 + OS 스케줄러의 실행 대기열에서 Context Switching 대기하는 상태BL..
내부 호출로 @Cacheable / @CacheEvict 작동 안되는 이유 - AOP Self Invocation 회사 프로젝트에서 버그 티켓이 하나 따져서 확인해봤더니저장 후 바로 조회하는 화면에서 수정한 내용이 반영되지 않았다는 내용이었다 내가 기능 개발한 이후로 다른 개발자 분이 조회 메서드에 @Cacheable을 걸고저장, 수정에는 @CacheEvict를 걸지 않아서 수정하기 위해 최초로 조회 API 호출 -> @Cacheable 적용 되어, 해당 메서드 return값 Redis에 캐싱됨Front에서 값 수정 후 저장 API 호출 -> DB에 반영저장 후 Front에서 조회 API 호출 -> DB에 가지 않고 Redis에 캐싱되어있으므로 1번의 캐싱된 값 반영위와 같은 이유로 버그가 발생했던 것이다. 😥 조치 사항 그러나 실패/당황간단히 저장하는 메서드에 @CacheEvict를 적용하면 된다고 생각했다코드를..
Thread는 무엇이고, JVM은 Thread를 어떻게 생성할까? 근래에 프로젝트에서 트랜잭션 관리에 대해서 찾아보다가 Thread에 대해서 깊이 알지 못한채로 사용하고 있는 것 같아서 찾아보기 시작했다강의(김영한의 실전 자바 - 고급1편)과 서적(Java의 정석2)을 통해 학습한 내용을 정리해보고자한다. 평소에 생각없이 말했던 용어 정리부터 해보자면 Process실행중인 프로그램의 인스턴스프로그램이 실행되기 전에는 하나의 코드 파일 -> 프로그램이 실행되면 Process각각의 프로세스는 RAM에서 별도의 메모리 공간을 할당 -> 다른 프로세스에 영향을 주지 않음Code : 실행 프로그램의 코드가 저장되는 영역Data : 전역 변수 / 정적 변수 저장 영역Heap : 동적으로 할당되는 메모리의 영역Stack : 메서드 호출시 생성되는 지역변수 및 반환값의 참조 주소 저..