📝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
카테고리 없음

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 사이클은 어떤 행위를 누가 행할지 결정하는 과정입니다. 장기적인 개발 비용 감소장기적으로 개발 비용을 감소시킵니다.이는 모든 기능의 테스트코드가 작성이 되어있기 때문에 새로운 기능을 추가하더라도 사이드 이펙트 없이 개발할 수 있기 때문입니다. 단점초기 개발 비용앞..

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

테스트가 어려운 이유 그럼에도 작성해야 하는 이유

TDD를 논하기 전에 테스트가 가능한 구조로 변경 되어야 한다. 개발자라면 테스트 작성을 잘 해야한다라는 인식이 있습니다.테스트를 잘 작성하면 뭔가 멋있어 보이고 특히 TDD를 한다는 사람들을 보면마치 다른 세계의 개발자인것 마냥 신기하고 부러웠습니다. 하지만 같은 개발자로서 마냥 부러워하기만 하면 안된다는 생각에이제부터라도 테스트, TDD를 공부하려고 합니다. 지금 회사는 테스트 코드를 작성하지 않아 개인적으로 공부해야하지만또 그런맛이 있다고 생각합니다. 아직 반년차 신입 개발자이지만  테스트 코드를 작성하지 않았던 이유와작성해야 하는 이유를 소개해 드리겠습니다. 단점난이도테스트 코드는 어렵습니다.따로 공부해야할 라이브러리가 많고어디서부터 어디까지 그리고 어떻게 테스트를 해야할지 잘 모르기 때문입니다...

카테고리 없음

[HTML/CSS] HTML, CSS 기본

HTML/CSS가 어느정도 필요한거 같아 공부하고 기록하기 위한 글입니다. 네이버 부스트코스의 강의를 수강하며 작성하였습니다. 비전공자를 위한 HTML/CSS 부스트코스 무료 강의 www.boostcourse.org HTML HTML Tutorial W3Schools offers free online tutorials, references and exercises in all the major languages of the web. Covering popular subjects like HTML, CSS, JavaScript, Python, SQL, Java, and many, many more. www.w3schools.com 태그 태그 : , , , 컨테이너 태그 :, 리스트 태그 : , , 빈 태그..

Error

[Error] No EntityManager with actual transaction available for current thread - cannot reliably process 'persist' call

Jpa를 사용하여 Test코드를 작성하고 실행하는 도중에 아래와같은 에러가 발생했습니다. 딱봐도 EntityManager의 persist를 호출할때 잘못된거 같습니다. 자세히 읽어보니 현재 스레드에 사용 가능한 transaction이 없다고 합니다. 알고보니 @Transactional 어노테이션을 빼먹어서 생긴 에러였습니다. Jpa는 @Transaction 단위 기반으로 작동합니다. transaction 단위에 따라 persist() 메소드를 사용해 영속성 컨텍스트에 영속화시키고 작업을 진행합니다. persist() 메소드는 영속작업을 시작한다고 선언하는 것인데 객체가 들어갔으나 가능한 transaction이 존재하지 않았기에 저런 에러를 낸것입니다. 결론 @Transaction을 잊지 말자...

AWS

AWS에서 내 돈을 훔쳐간다?? (RDS backup storage 비용)

AWS에서 이것저것 만지고 놀다 VPC, EC2, RDS를 모두 삭제 하였습니다. 그런데 NHN KCP에서 요금청구서가 날라왔습니다. 145원이 결제되었다는 것입니다. 실제로 금액이 빠져나간것도 확인하였습니다. 145원... 곱게 줄 수있는 금액이 아니죠 바로 AWS 결제 대시보드를 확인하였습니다. 결제 대시보드 확인 서울지역에서 금액이 빠져나갔습니다. 서울지역에서 AWS 서비스를 사용했으니 제가 사용한 금액은 맞다는 것인데... 또 어떤 서비스를 종료하지 않았을까요? Relational Database Service Backup Storage에서 빠져나간 금액인거 같습니다. 분명 RDS 인스턴스는 삭제했는데..? 확인해보니 스냅샷에 2개가 띄워져 있었고 RDS를 생성하면 스냅샷은 자동으로 생성되는것 같..

Java

equals 사용시 주의할점

equals 사용시 주의할 점에대해 알아보겠습니다. equals는 객체가 동등한지 확인하는 메서드 입니다. Object의 메서드이지만 String에서 오버라이딩하여 문자열간의 비교를 할 수 있습니다. 간단하게 "==" 연산자와의 차이를 알아보면 아래와 같습니다. equals 값을 비교 == 주소값 비교 이처럼 equals는 값을 비교할때 사용하는데요 equals 사용시 주의점에 대해 알아보겠습니다. 주의점 String equals 에서 상수를 먼저 사용 상수를 먼저 사용하여 변수가 null일 경우 예외를 피하는 것입니다. 아래는 잘못된 예시 입니다. 변수.equals("상수") if (login.username().equals("test")) { return UriConst.HOME; } return U..

Error

[Error] Auto Complete가 작동하지 않는 경우 (ajax, interceptor)

JQuery를 사용해 Auto Complete를 사용하고 있었는데, ajax를 사용해서 DB정보에 맞게 가져와야 했습니다. 그래서 ajax를 사용해 구현을 했는데, Auto Complete가 동작하지 않았습니다. 저와 비슷한 문제를 만난 분들을 위해 해결과정을 글로 남겨보겠습니다. Auto Complete에 대한 자세한 글을 아니니, 해당 내용을 원하신다면 다른 곳에 자세한 설명과 구현방법이 있으니 참고 부탁드립니다. ajax를 사용한 Auto Complete Auto Complete를 위한 JQuery 입니다. $('#loginId').autocomplete({ source : function(request, response) { $.ajax({ type : 'get', url: '/auto/usern..

Sol b
생각을 글로