목록전체 글 (24)
yongsa0221의 고물상
https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html Learning the Java Language > Classes and Objects)" data-og-description="The Java Tutorials have been written for JDK 8. Examples and practices described in this page don't take advantage of improvements introduced in later releases and might use technology no longer available. See Dev.java for updated t..

Expression 의 SepartorDeque의 요소와 OperandDeque의 요소가 모두 일치하는 객체는 같은 객체라고 판단한다Expression의 상태는 외부에서 변경할수 없으며 상태 변경 요청시 새로운 Expression을 반환한다 이런 Expression 객체가 있다고 생각해보자이녀석을 생성하기 위해선 Deque를 생성자에 넣어주어야 한다.Deque는 ArrayDeque와 LinkedList 두가지로 모두 선언 할 수 있는데 어떤 것을 써야 할까? 먼저 LinkedList를 알아보자public class LinkedList extends AbstractSequentialList implements List, Deque, Cloneable, java.io.Serializable...p..
우테코 프리코스 과제를 진행하며 AngularJs 커밋 컨벤션을 따르라는 요구사항이 있었다.https://gist.github.com/stephenparish/9941e89d80e2bc58a153#allowed-type 커밋 메시지의 형식“A commit message consists of a header, a body and a footer, separated by a blank line.”“커밋 메시지는 header, body, footer로 구성되며, 각 요소는 빈 줄로 구분된다”(): // header // 개행 // 개행커밋 메시지는100자를 넘으면 안된다 Any line of the commit message cannot be longer **100 characters**!type 커밋 성..

Springboot에서 ThreadPoolExecutor는 java.util.concurrent.ThreadPoolExecutor 에 기반한다. java.util.concurrent.ThreadPoolExecutor 요녀석은 어떻게 동작 하는 것일까?java doc에 따르면 ,,,요런 식으로 동작한다고 한다재미있는 사실은 corePoolSize만큼 항상 먼저 스레드풀을 할당하지 않는 다는 것.https://docs.oracle.com/en/java/javase/23/docs/api/java.base/java/util/concurrent/ThreadPoolExecutor.html ThreadPoolExecutor (Java SE 23 & JDK 23)An ExecutorService that execute..

생성형 ai를 호출하는 과정은 비동기적으로 이루어 진다. 시간이 많이 걸리기 때문. 스프링부트를 통해 async메서드를 만드려면 threadpool설정을 해주어야 한다.프로젝트 내에서 사용자의 한번의 요청에 비동기적으로 두가지 메서드를 한번에 실행시킨다.이 작업이 꽤나 반복되니 threadpool을 적절하게 설정하고 관리 하는 것이 굉장히 중요한 부분.한번의 요청이 들어오면 generateImage와 generateContextQuestion에 해당하는 두가지 요청을 동시에 gpt에게 보낸다. 비동기적으로 실행할 녀석들의 특징은...네트워크 작업임( open-ai api호출)대기시간이 엄청 길어질수 있다(생성속도가 보통 10초 ~)이자식들을 어떻게 하면 좋을가,,,, 먼저 프로그램이 실행될 서버의 사양을..

리팩터링 하며 패키지 구조와 역할분리를 조금 더 확실하게 하려고 하였다.중점사항은.. 도메인은 그 누구에게도 의존적이지 않아야 한다 메인의 다른 계층에 의존적이지 않게 하기 위해 infrastructure 계층을 인터페이스를 통해 사용하는 **의존성 역전(Dependency Inversion)**을 구현하였다. 이를 통해 도메인 계층은 구체적인 구현(infrastructure)에 의존하지 않고 추상화된 인터페이스에 의존하게 되어 저수준 모듈(ai관련 호출 로직)이 고수준 모듈의 구현(contextAndQuestionGenerator)에 의존하게 된다. 추가로 Adapter패턴을 사용하여 adpater에서 도메인 로직에서 사용되는 BookToProgress라는 녀석과 aiApi 호출을 위한 dto녀석간의..

프로젝트내의 패키징을 고민하면서 프로젝트 시작부터 괴롭혔던 질문이 다시 떠오른다.'생성형 ai는 도메인인가?' 여태껏 당연히 그렇다고 생각했다. 프롬프트라는 것이 생성형 ai에게 특정한 역할을 부여해주고, 이를 통해 도메인 내에서 특정 역할을 수행한다고 생각하고 접근하였다.그런데 이제와서 생각해보니 생성형 ai에 너무 집착한 나머지 도메인 계층에서의 추상화를 제대로 못했다고 생각이 든다. 각 기능을 추상화해놓고 이녀석을 다시 생성형 Ai라는 범주에 넣어버린 것이다. 도메인 계층에서 존재해야 될 녀석은 생성형 Ai가 아닌 이미지 생성기, 동화 생성기 등의 생성기 였던 것.생성형 Ai에 너무 매몰되어 이녀석을 '수단'으로서 생각하지 못햇던 것이다.결국 설계 단계에서 제대로 추상화해내지 못해 끈적끈적하게 얽..

기존의 Ai 관련 도메인을 전략패턴을 사용하여 수정하였다.AiModelBehavior라는 인터페이스를 통해 생성형 Ai를 통해 어떤 것을 생성할지 동작을 구현하는 부분을 분리하였다.외부 생성형 Ai api를 직접적으로 호출하는 부분을 오롯이 AiModelBehavior의 구현체를 통해서 구현하도록 수정하였다.이를 통해서 생성형 Ai를 사용하는 부분을 최대한 다른 도메인과 구분하여 관리하고자 한다. 왜 전략패턴인가?생성형 Ai가 프로그램 내에서 특정한 클래스로써 존재 할 수 있게 하는 속성은 “어떤 입력을 통해 어떤 출력을 생성하는가” 라고 생각한다.삽화 생성기는 사용자 텍스트와 사전설정된 프롬프트를 통해 특정 화풍의 이미지를 생성한다.전략 패턴을 사용함으로서 이러한 Ai에게 사전 설정값과 출력 타입을 설..
졸업 프로젝트를 리팩터링 해야한다.시작에 앞서 목표를 정하고 가보자. controller 코드 줄이기불필요한 의존성 줄이기유닛 테스트spring security더 공부하기패키징 신경쓰기theokanning 뚝배기 깨기( openAiservice구현하기)api key 입력해야 사용할수 있게 하기(돈 감당 안됨)과금요소 다 삭제하기(돈 감당 안됨)6번은 프로젝트 내에서 사용하던 openAi 써드파티 라이브러리가 24.6월로 지원 종료되어서 안타깝게 되었다. Azure openai를 통해 사용할 수 있다고 한다. (현재 공식적으로 java지원 되는 라이브러리)그냥 직접 구현하는 방식도 고려해보아야 할듯.. 7, 8 번을 수행하려면 사실상 도메인이 변경이 불가피하다.그래서 더이상 리팩터링이 아니라 다른 프로젝트..
프로젝트가 완료된 시점에서 리팩터링 해야 할 부분이 꽤나 많다.도메인 변경이 프로젝트는 졸업 전시의 일환으로서, 서비스 보다는 전시의 목적에 더 알맞았던 프로젝트였다.생성형 AI를 사용하는 부분에서 비용이 굉장히 많이 나왔기 때문에 개인적으로 리팩터링을 해서 프로젝트를 지속적으로 수정해나가기에는 문제가 있다.stable diffusion 삭제stablediffusion을 사용하여 캐릭터를 그리는 부분은 분명 이 프로젝트의 핵심 도메인이나 유지비용이 너무 많이 나온다. models lab에 한달에 47달러씩 비용을 내야 하며 그렇지 않다면 gpu서버를 구축해야 하지만 이마저도 비용이 만만치 않다. 실질적으로 stable-diffusion을 지속적으로 사용하기는 불가능하다고 판단하였다.이에 따라 캐릭터를 생..