📝How I Think
개인프로젝트

[Error] Multi Module 적용 에러

멀티모듈 적용중 API Test를 하다 에러를 만나 기록하려고 합니다. 이상하게 모든 요청을 Found 할 수 없다고 응답결과가 돌아왔습니다. 변경한 것은 Multi Module을 적용한것 밖에 없어 검색을 해보았지만, 제 프로젝트에는 해당되는것이 없었습니다. 그러다 Multi Module간에 Bean이 서로 적용되지 않았나? 라는 생각을 했습니다. 2가지 잘못된 점이 있었습니다. Multi Module간에 중복 Bean Multi Module을 적용하면서 RepositoryImp를 core에서 sns모듈로 옮길때 core에 있는 RepositryImpl들을 옮기지 않았고 이때 각 모듈들은 같은 Bean을 공유하지 않았습니다. core의 Repositry들은 삭제하여 중복되는 Bean들을 제거하였습니다...

Java

ThreadPool

ThreadPool은 멀티 스레드를 이용해야할때 Thread를 효율적으로 관리하기 위해 사용합니다. Thread를 효율적으로 관리한다는 말은 어떤뜻일까요? 저는 ThreadPool을 한마디로 정의하면 아래와 같이 말할것 같습니다. Thread를 재활용하기 위한 저장소 주의 : QueueCapacity 그럼 ThreadPool에 대해 자세히 알아보겠습니다. ThreadPool을 사용하지 않을때 Context Switching java는 One-to-One Threading-Model로 Thread를 생성합니다. 즉, OS Thread와 UserThread를 1:1로 생성하는 것입니다. 그렇다면 Thread를 생성할때마다 OS kernel의 작업이필요하게됩니다. 즉, Context Switching이 일어나..

개인프로젝트

ThreadLocal 초기화 에러

ThreadLocal을 사용하여 메세지 기반의 이벤트 처리를 하고 있었습니다. Command가 성공하면 ThreadLocal에 Event가 등록되고 Aop를 사용하여 Transaction이 성공될때만 ThreadLocal에 있는 Event를 가져와 처리하는 로직입니다. 하지만 예상치 못한 에러를 발견하였습니다. public class Events { private static ThreadLocal eventThreadLocal = new ThreadLocal(); private Events() { throw new IllegalStateException("Do not Initialize."); } public static void register(T event) { if (event == null) { ..

Spring

[스프링의 삼각형] AOP - 횡단괌심

AOP는 관점 지향 프로그래밍으로 DI가 의존성 주입이라면 AOP는 로직 주입이라고 할 수 있습니다. 이체, 입출금, 이자계산 로직에서 전부 로깅, 보안, 트랜잭션이 반복해서 동작하는것을 알 수 있습니다. 이것을 횡단 관심사라고 합니다. 프록시 패턴으로 관심사의 로직 주입 설정대로 실행됩니다. 인터페이스 기반입니다. 메서드에만 적용 가능? 런타임 기반입니다. AOP 적용, 로직 주입 방법 로직을 주입할 수 있는 곳은 총 5군데가 있습니다. AOP 적용 방법 @Aspect : Class에 사용하면 AOP에서 사용하게됩니다. JoinPoint : 호출된 객체의 메서드입니다. JoinPoint를 활용하여 메서드의 정보를 확인할 수 있습니다. @PointCut : 자르는 지점으로 Aspect의 적용 위치를정확히..

개인프로젝트

Spring Integration 적용하기

Spring Integration은 메시지 기반 애플리케이션 개발을 적용하기 위해 사용하였습니다. Spring Integration은 유기적으로 연결해서 효율적으로 통합하는 방법을 여러 패턴을 통해 사용할 수 있게 도와주는 프레임워크입니다. Spring Integration에 대해서는 블로그에 설명한 글이 많기 때문에 자세한 설명은 생략하겠습니다. Spring Integration Point🔥 아래 3가지만 기억하시면 주요 기능을 사용하기에 충분합니다. Message 전송할 데이터가 담긴 Wrapper Class Channer (Pipes Line) Message Wrapper Class가 발/수신 되는곳 Endpoint (Filters) GateWay Message Wrapper Class의 출/도착지..

개인프로젝트

ThreadLocal적용하여 Thread 안에서의 값을 공유하기

ThreadLocal이란? 스레드의 Stack마다 정보를 따로 저장할 수 있는 공간입니다. ThreadLocal을 이용하면 쓰레드 영역에 변수를 설정할 수 있기 때문에, 특정 쓰레드가 실행하는 모든 코드에서 그 쓰레드에 설정된 변수 값을 사용할 수 있습니다. 내부적으로 HashTable의 구조를 갖고 있습니다. 스레드 전용 전역변수라는 느낌을 받았습니다. 사용 이유 Spring Integration을 사용하여 Message기반 이벤트 처리를 하고 있습니다. Command가 성공적으로 Transaction Commit을 성공하였을때 AOP를 활용하여 Event 처리를 하고 있습니다. 이때 Commit을 성공한 정보를 ThreadLocal에 저장하여 Event Channel로 보낼때 사용하였습니다. 궁금하시..

개인프로젝트

[Spring Integration] Direct Channel과 Executor Channel 차이

Spring Integration을 사용하던중 메세지 기반 처리를 하기위해 비동기 처리를 해야했습니다. 기존에 사용하던 Direct Channel을 사용했을때 비동기 처리가 되지않아던 것을 해결하는 과정을 정리한 글입니다. Direct Channel point-to-point 채널이지만 PublishSubscribeChannel입니다. 구독자에게직접 메시지를 발송하지만, point-to-point채널이기에 하나의 endPoint에 message를 전송한다는 점에서 PublishSubscribeChannel과 다릅니다. 특히 중요한 점은 단일 스레드로 구현이 됩니다. 문제 원인 Direct Channel을 단일 스레드입니다. 그래서 해결한 방법은 gateway로 넘겨줄때 ThreadPool을 직접 설정하여..

개인프로젝트

TransactionSynchronizationManager를 사용해 Transaction 이후에 Event 등록하기

Message기반의 이벤트 처리를 위해 Spring Integration을 적용하였습니다. Command는 DB를 조작할때 사용했고, Event는 DB이후에 데이터를 처리할때 사용하려고 합니다. 원하는것은 DB관련 로직의 Transaction이 성공적으로 커밋되면 Event를 발행하여 Event채널로 보내는 것입니다. 🎯데이터 베이스의 Trigger와 비슷한 개념입니다! 검색해보니 TransactionSynchronizationManager가 동기화 작업을 등록하고 이후의 처리한다는 것을 알았고 바로 적용해 보았습니다. 전체 흐름도 트랜잭션 동기화 하나의 실행 단위에서 모든 작업은 모두 성공하거나 실패해야 합니다. 이것을 원자성이라고부릅니다. 원자성을 지킬수 있게 하나의 Connection으로 모든 작업..

팀프로젝트 - 운동메이트

[Refectoring] Sse를 Strategy Pattern -> 컴포넌트(Bean)으로 리펙토링!

[Refectoring] Sse로직을 재사용을 해보자 (Static, 메소드 오버로딩(overloading)) 국비를 통해 처음 프로그래밍을 배우면서 팀프로젝트 진행하였습니다. 프로젝트의 기능은 잘 구현해서 해커톤 우수상을 받았지만, 코드는 당연히(?) 엉망이였습니다. 그리고 몇개월이 지난 지 sol-b.tistory.com 이전 글에서 이어지는 Sse 실시간 알림 기능을 리펙토링하는 글입니다. 이전에는 Static으로 Sse기능을 Static영역에서 공통으로 관리하여 사용했습니다. 이후 Sse기능을 Strategy pattern으로 리펙토링하였습니다. 그 이유는 각 서비스마다 Sse를 사용하여 알림을 보내는것을 전략으로 생각한다면 Strategy Pattern으로 적용하면 되지 않을까? 라는 생각에서부..

팀프로젝트 - 운동메이트

[Refectoring] Sse로직을 재사용을 해보자 (Static, 메소드 오버로딩(overloading))

국비를 통해 처음 프로그래밍을 배우면서 팀프로젝트 진행하였습니다. 프로젝트의 기능은 잘 구현해서 해커톤 우수상을 받았지만, 코드는 당연히(?) 엉망이였습니다. 그리고 몇개월이 지난 지금... 리펙토링을 해보려고 합니다. 우선 SSE기능에대한 리펙토링을 해보려고 합니다. 사실 SSE는 SSE Emitter에 등록을 하고 삭제한는것을 빼면 전부 같은로직을 반복하는것입니다. 그래서 저는 이 기능을 재사용할 수 있는 코드로 리펙토링 하겠다고 생각하였습니다. 기능 영상 SSE의 기능 SSE를 사용하는 이유는 실시간으로 알림을 보내기 위해서입니다. 그리고 프로젝트에서 SSE는 알림이 발생했을때 (좋아요, 팔로우, 댓글) 사용자에게 알림이 전송되는 기능입니다. 즉, 메인 기능은 1가지입니다. 접근 방식 우선 재사용을..

Recent
카테고리 없음

[Flutter] Supabase Google Login (Web, Andriod, IOS)

Flutter와 supabase로 google login을 하려는 분들에게 도움이 되기 위한 글입니다. Supabase docs와 블로그를 참고했습니다. Login with Google | Supabase DocsUse Sign in with Google on the web, in native apps or with Chrome extensionssupabase.com  간단하게 목차를 살펴보면 아래와 같습니다. 1. supabase 계정 생성 및 프로젝트 생성  - google 인증 enable 변경2. 구글 클라우드 플랫폼에 프로젝트 생성  - client id web, andriod, ios 3개 필요3. flutter에 supabase 연결 supabase 계정 생성은 및 프로젝트 생성은 구글 검..

카테고리 없음

🔥 Flutter + Firebase: 빈 리스트([])와 Map 저장 방식의 차이점

📌 개요Flutter에서 Firebase Realtime Database를 사용할 때, 빈 리스트([])를 저장하는 것과 필드를 아예 저장하지 않는 것의 차이를 경험한 적 있나요?같은 데이터를 저장하는데도 teams 필드가 배열처럼 저장되거나, 원하는 형태의 Map이 유지되지 않는 경우가 있습니다.이 문제는 Firebase의 데이터 구조와 Flutter의 toJson() 변환 방식 차이에서 발생합니다.이번 글에서는 Firebase Realtime Database에서 빈 리스트([])와 Map을 저장하는 방식의 차이점과 해결 방법을 설명하겠습니다.🔥 Firebase에서 빈 리스트([])와 Map의 차이점✅ 1. teams 필드를 []로 직접 초기화한 경우 (teams: []) class Player {..

개인프로젝트

flutter GestureDetector 움직임이 느리네??

최근 flutter로 개인프로젝트를 하고 있다flutter를 사용한 이유는 여러가지 이지만 이 글에서 말할건 아닌거 같아 넘어가겠다.(기회가 있다면 설명...) 아무튼 flutter는 너무 편리하다특히 백엔드 개발을 주로하는 나같은 개발자에게  UI에 신경쓸 많은 시간을 아껴준다 본론으로 돌아와서축구 전술을 설정하는 기능을 만들기 위해 마우스 드래그 기능이 필요했다플러터의 사용자 동작(제스터)를 감지하는 GestureDetector위젯을 사용했다그런데 아이콘은 잘 되는데 선수들은 느리게 반응했다. 우선 코드를 보고 생각해보자(index) => _buildPlayer( position: redPlayerPositions[index], )Widget _buildPlayer({ ... ..

카테고리 없음

error: RPC failed; HTTP 400 curl 22 The requested URL returned error: 400 send-pack: unexpected disconnect while reading sideband packet

개인 프로젝트를 하던중 작업 내용을 git에 push하려다 토큰이 만료되었다.그래서 토큰을 새로 발급받고 다시 Push를 하려던 중에 에러가 발생했다. error: RPC failed; HTTP 400 curl 22 The requested URL returned error: 400 send-pack: unexpected disconnect while reading sideband packet 검색해보니 저장소에 올라갈 내용이 많다면 http packet제한에 걸려 실패할 수 있다고 한다.이미지를 조금 많이 넣었는데 그게 문제가 되었던가 같다.이미지의 용량을 적게 만드는 방법도 있는지 알아봐야겠다.대충 계산해보니 2MB가 넘는 크기였다. 푸시할 데이터 크기 확인git count-objects -vH출력에..

카테고리 없음

SourceTree gitlab 인증 에러 (Access Token, SourceTree passwd 파일)

잘 사용하던 SourceTree가 갑자기 Authentication falied 에러가 발생했는데요 git -c diff.mnemonicprefix=false -c core.quotepath=false --no-optional-locks fetch --no-tags origingit: 'credential-osxkeychain' is not a git command. See 'git --help'.git: 'credential-osxkeychain' is not a git command. See 'git --help'.remote: HTTP Basic: Access denied. The provided password or token is incorrect or your account has 2FA en..

카테고리 없음

Flutter: include of non-modular header inside framework module 'firebase_core.FLTFirebasePlugin'

플러터에 firebase를 연결하던 중 Flutter: include of non-modular header inside framework module 'firebase_core.FLTFirebasePlugin'에러를 만나게 되었다. 이런 에러는 나중에 찾기 힘들기 때문에 블로그에 오랜만에 글을 쓴다...아래 링크를 참고해서 해결했다. 플러터는 andrid와 ios 설정해야할 것이 두개나 있어서 작동원리를 확실하게 알아야하는것 같다...https://stackoverflow.com/questions/66148505/flutter-include-of-non-modular-header-inside-framework-module-firebase-core-fl Flutter: include of non-modu..

카테고리 없음

Cross Join이 갑자기...?

간단한 쿼리를 작성해 개발하다SQL Trace를 보고 이상한 점을 발견했습니다. select consumable0_.id as id1_10_, ... ... ... from consumable_po consumable0_ cross join supplier supplier1_ cross ... ... where ... ... ... 갑자기 Cross join이 되었다는데...아... 쿼리에서 뭔가 잘못되었다.. 라고 생각했고바로 원인을 찾기 시작했습니다.Cross Join은 아래와 같은 단점이 있습니다. Cross Join은 집합의 모든 경우의..

Java Spring 테스트를 추가하고 싶은 개발자

TDD 장단점

테스트 코드하면 TDD를 떠올리게 됩니다.TDD는 RED, GREEN, BLUE의 싸이클로 개발하는 방법론 입니다. RED : 깨지는 테스트GREEN : 성공하는 테스트BLUE : 리펙토링 단계 그럼 이제 TDD의 장단점에 대해 알아보겠습니다.장점인터페이스를 강제한다깨지는 테스트를 작성해야하기 때문에 인터페이스를 강제합니다.이것은 객체지향의 핵심 원리인 행동에 집중하겠다는 것입니다. 즉, What/Who 사이클을 고민하게 합니다.What/Who 사이클은 어떤 행위를 누가 행할지 결정하는 과정입니다. 장기적인 개발 비용 감소장기적으로 개발 비용을 감소시킵니다.이는 모든 기능의 테스트코드가 작성이 되어있기 때문에 새로운 기능을 추가하더라도 사이드 이펙트 없이 개발할 수 있기 때문입니다. 단점초기 개발 비용앞..

Sol b
생각을 글로