본문 바로가기
728x90

분류 전체보기157

얼마나 꾸준할 수 있는가 개발실력 향상에서 가장 기본이 되고 중요한 대목은개발을 계속 하는 것이다.중간에 그만두거나, 쉬더라도 쉬는기간이 장기화 되선 안된다.그럴경우 개발에 대한 감과 실력 향상을 기대한 만큼 이루기 힘들기 때문이다. 그럼 어떻게 꾸준하게 유지할 수 있는가?(누구에게는 이게 더 쉬울 수도 있다.) 그 방법 중 하나는개발에 흥미를 느껴야 한다는 것이다. 개발에 흥미를 느끼는 방법은 사람마다 상황마다 매우 다를 것이다. 1. 개발실력에 향상을 스스로가 인식할 수 있어야한다.2. 개발에 대한 이야기를 다른 사람과 공유할 수 있어야 한다.3. 개발자로 인정받아야 한다.    (회사 안에서면 좋겠지만, 개발자가 많이 없을 경우 커뮤니티에서라도!)4. 배우는 재미를 알아야 한다.     (게임도, 일도 잘하면 자연스럽게 잼.. 2025. 1. 3.
Langchain with OpenAI, weaviate, RAG 1. RAG 를 동작단계, 문의사항이 prompt 기반에 바로 LLM 모델로 흘러가는 것이 아니라 아래 그램처럼   Retrieve 단계를 걸쳐, Augment 된 내역을 기반으로 Generate 됨 > 줄여서 RAG   (궁극적인 목표는 문의내역을 LLM 모델이 잘 인식할 수 있도록 변환해 주는 역할! by reducing hallucinations)  2. 궁극적으로 Retrieve 을 어떻게 만드냐에 따라 결과는 달라질 수 있음    - 외부 소스로 부터 질문에 대한 컨텍스르를 검색하고, 임베딩 모델을 이용하여 추가 컨텍스트가 저장된     Vector DB에 저장. 유사도 검색을 통해 Vector DB(weaviate 등) 에서 가장 유사한 상위 n개의 Data 를 반환    - 개발자는 가장 유.. 2024. 12. 29.
주니어 교육 최근 몇년동안 여러 주니어들을 직접 교육 시킨 결과,크게 네가지 타입으로 나눠 졌다.(현시점에 너무 세분화는 시키지말자.) 첫번째 유형: 개발에 대한 이해도 빠르고 꾸준히 학습하는 끈기도 있다.두번째 유형: 개발에 대한 이해도는 빠르지만, 꾸준히 학습 하지는 않는다.세번째 유형: 개발에 대한 이해도는 느리지만, 꾸준히 학습하는 끈기는 있다.네번째 유형: 개발에 대한 이해도도 부족하고 끈기도 부족하다. (여기서 꾸준히는 최소 2년 이상 하루 이틀 정도 쉬는 텀외에 계속 했는지에 대한 기준이다.) 자! 그럼 어떤 개발자를 채용하고 성장시켜 나아가야할까?그간 여러 과정을 통해 내가 내린 결론은!! 첫번째 유형과 세번째 유형이다.왜?우린 개발자이기 때문이다.(물론 최악은 네번째...) 지금 이글을 작성하는 이순.. 2024. 12. 29.
mysql named lock 에 대해서 분산락이라고 하면 레디스 기반으로 처리하는것이 일반적이다.하지만, 개발 조직이 소규모이고, 레디스를 사용하는 것에 대해 기술적 비용적 부담이 있다라고 하면 손쉽게 mysql 기능 중 하나인 named lock 을 기반으로 분산락을 구현할 수 있다. MySQL의 GET_LOCK()과 RELEASE_LOCK() 함수를 이용해 보자! 1. GET_LOCK(lock_name, timeout)    : 지정된 이름으로 락을 획득하려고 시도(timeout 은 초기반) 2. RELEASE_LOCK(lock_name): 지정된 이름의 락을 해제 import org.springframework.data.jpa.repository.Query;import org.springframework.data.repository.qu.. 2024. 12. 27.
instancio 자바 스프링 테스트 객체(entity, dto) 빠르게 만들어 보자 단위테스트 코드를 짤때, DTO 나 entity 와 같은 object 단위를 생성하고 속성값들을 하나하나 씩 입력해줘야 했다.또한 단위테스트를 수행할 때는 실제 data 를 고려하지 않는다.(실제 data 와 유사한 data 를 직접 넣어주게 되는데, instancio 는 이러한 data 를 랜덤하게 자동 생성해준다.) 다양한 Data를 제공해주므로써 오히려, 테스트의 정확성도 높일 수 있다.왜? 내가 지정한 Data에서는 잘돌아갈 수 있는데 다른 Data 에서는 이슈가 발생할 수도 있기때문이다.이때 이슈 핸들링이 로직적으로 잘 수행되어있는지도 비지니스 레이어에서 처리가 되어야 하는데, instancio를 통해 이를 테스트 할 수 있기때문이다.그렇다고 우리가 매번 다른 Data를 넣는것도 현실적으로 힘.. 2024. 12. 27.
ReentrantLock 과 ConcurrentHashMap을 함께 사용해보자 앞의 블로그에서 언급했던것처럼 ReentrantLock 특징 중하나가 여러 쓰레드 중 동시에 락을 획득할 수 있는 쓰레드는 오직 "하나"라는 것이다.이를 획득하기 위해 내부적으로 직렬화된 작업이 들어가게 되고 오직 그중 한번에 하나만의 락을 취할 수 있는것이다. 그럼 우리가 서로 다른 목적으로 ReentrantLock 을 동시에 사용하게 되는 경우는 어떨까?예를 들면, 상품별 재고 수량 증가과 차감을 고민해 볼 수 있다.동일한 상품과 옵션일때만, 동시성 제어가 필요한 상황인데(청바지 M 사이즈라고 가정해보자), ReentrantLock 단독으로 사용하게 되면, 상관없는 다른 상품(티셔츠)의 수량증가도 막히게 된다.(왜냐? 한번에 하나씩이니깐) 이는 비지니스 시나리오에 부합하지 않기때문에,Concurren.. 2024. 12. 21.
ReentrantReadWriteLock vs ReentrantLock Java의 ReentrantReadWriteLock과 ReentrantLock에 대한 비교분석 글을 작성해보려한다.( JDK 5.0 이상에서 Java 동시성 유틸리티의 일부로 제공되고 있으며, 둘다 나온지가 상당히 오래되서 다들 잘알겠지만...) 우선 결혼만 이야기하면 둘다 쓰레드를  기반으로한 Lock 제어 방식으로, DB나 분산락, MQ로 동시성제어 외에Lock 이 필요할 경우 사용하면 된다. 두개의 가장 큰 차이는 Data 정합성 측면과, Reading 이 많냐? Writing이 많냐? 의 상황 이 두가지일 것이다. 1. Data 정합성 측면    : 절대적으로 정합성이 보장되어야하면, ReentrantLock 사용이 필요하다.      (한번에, 오직 하나의 쓰레드만 락획득이 가능하기 때문이다.).. 2024. 12. 21.
일하다가 갑자기 개발자가 퇴사한다고라고 하면? 어느 일상과 다르지 않게 일하고 있던 하루 였다.오전 스크럼 미팅이 끝나고 갑자기 할말이 있다며, 나를 불러세운다. [개발자] "CTO님... 드릴 말씀이 있습니다." [CTO] "무슨일이죠?"[개발자] "여기서 말하기 좀 그래서 단둘이 이야기 하고 싶습니다." [CTO] '쎄~~한 느낌이 온다. 이 페턴은 퇴사하겠다고 말할려는 패턴!!'[CTO] "네 회의실로 다시 가시죠" [개발자] "시간내주셔서 감사합니다. 좋은 오퍼가 와서 퇴사를 해야할 거 같습니다."[CTO] '역시...'           많이들 겪어 봤을것이다. 자 이럴때 어떻게 할 것인가? 1) 퇴사하겠다고 말한 개발자가 회사에 Key Member 가 아니라면?    : 축하해주면 된다.       (그들도 다양한 경험을 할 수 있고, 회.. 2024. 12. 20.
단방향 암호화 sha512 단방향 암호화는?: 암호화 수식을 이용하여 원 input 을 암호화된 digest 로 변경하는 역할을 수행한다. 왜 단방향이냐? 복호화가 불가능 하다(그렇다고 100프로 안전한건 아니다. 1234와 같은 숫자를 암호화 화면 똑같은 결과가 나와서 이는 누구나 유추 가능 할 수 있기 때문이다.)암호의 글자수와 조합이 얼마나 중요한지 나오는 대목이다. 단방향 암호화의 종류에는…SHA(256), (512)MDHAS우리는 일반적으로 사용되는 SHA-512로 암호화에 대해 알아보겠다.fun transSHA512(input: String): String { val digest = MessageDigest.getInstance("SHA-512") val hashDigest = digest.digest(in.. 2024. 12. 18.
오토와이어링할 수 없습니다. '' 타입의 bean을 찾을 수 없습니다. 오토와이어링할 수 없습니다. '' 타입의 bean을 찾을 수 없습니다. 와 같은 오류를 개발을 하다보면 볼 수가 있다. 주로 pakage 구조를 변경하거나 초기세팅에서 보았을 것이다!그도 그럴 것이 두가지 대표적인 원인을 확인할 수 있는데, 1. @SpringBootApplication(scanBasePackages = ["com"]) class Application : main 에서 위와 같이 옯바른 경로로 잡혀있는지 확인 필요하다 root package 내에 포함되지 않은 package 의 bean 을 인식할 수 없다ㅣ. 2. 최근에 pacakge 구조를 변경한 경우 : 참조하고 있는 package 에 접속을 해서 오류나는 부분이 없는지, 이전경로로 import 되어있는게 없는.. 2024. 12. 18.
Kotlin when 문 Kotlin 기본 문법 중 when 문에 대해 알아보겠다. 코틀린 when 은 여러 조건 중 조건을 만족하는 것을 선택하여 명령어를 실행한다.다른 언어의 switch 와 매우 유사한 형태이나, 한가지 차이점이 있다. 그건 바로 " fallthrough" 하지 않는다는거!switch 문의 경우 어떤 조건을 만족할 때 까지 조건문을 찾고 실행하고 명시적으로break가 있어야만 동작을 마무리 한다. 하지만, when은 만족하는 한가지 명령만 수행하고 fallthrough(폴스루)하지 않는다. 예시)fun testFun(n:Int): Int = when(n) { 10 -> n + 1 100 -> n + 11 1000 -> n + 111 else -> 0} 2024. 12. 15.
PrismaClientInitializationError: Unable to require(`/app/node_modules/.prisma/client/libquery_engine-linux-musl.so.node`). 오류 해결방법 위와 같은 오류를 보았다면!https://hub.docker.com/layers/library/node/18-alpine3.20/images/sha256-7000d2e73f938c4f62fdda6d398d7dffd50e6c129409ae2b1a36ccebf9289ffe?context=repo https://hub.docker.com/layers/library/node/18-alpine3.20/images/sha256-7000d2e73f938c4f62fdda6d398d7dffd50e6c129409ae2b1a36ccebf9289ffe?context=repo hub.docker.com dockerfile 수정하면 된다!!node:18-alpine 부분을!! node 버전 20으로!!  [예시]FROM --pl.. 2024. 12. 15.
DataFetchingEnvironment 세팅하는 방법 graphql 을 사용한다는 것은 당연히 resolver 에 대한 개념도 알고 있을 것이다.그럼 DataFetchingEnvironment 은 무엇이냐? 그건 각각의 resolver 단에서 사용자 정보와 같은 공통정보에 바로 접근이 가능하다는 것이다.없을 경우? f/e 로 부터 받던지, JWT payload 값을 분해하는 로직을 호출해야 한다. 하지만, 이걸 resolver 에서 전달 받기 전에 한번에 처리해서 받으면은 어떨까??그럴때 사용하는 것이 DataFetchingEnvironment 이다. 사용법은 우선 Graphql contect factory 로 하여금 어떤 context 를 생성할 것인지 명시해준다. request time과 user name, user id 정도? 호출 받아서 toGrap.. 2024. 12. 11.
Webflux 는 어디서 동작하나? WebFlux는 서블릿 기반이 아닌 비동기적, 논블로킹 방식으로 동작하는 리액티브 웹 프레임워크에서 동작한다.하지만 예외인 경우가 있다!!(알고있었나?) 우선 WebFlux와 서블릿관계부터 알아보자 WebFlux는 기본적으로 두 가지 실행 모델을 지원한다.서블릿 기반 (@EnableWebFlux): 전통적인 서블릿 컨테이너인 Tomcat, Jetty, Undertow와 같은 서버에서 실행될 수 있고, 이 경우, WebFlux는 ReactiveAdapter를 통해 서블릿 환경에서 리액티브 모델을 지원 한다.리액티브 서버 기반 (Netty, Undertow 등): 비동기 및 논블로킹 방식의 리액티브 서버에서 WebFlux를 실행할 수 있는데, 이 경우 서블릿 API와는 다르게 완전히 논블로킹 방식으로 동작하.. 2024. 12. 10.
org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property 'spring.profiles.active' imported from location 'class path resource [application-dev.yml]' is invalid in a profile specific resource [origin: class path resource [applic org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property 'spring.profiles.active' imported from location 'class path resource [application-dev.yml]' is invalid in a profile specific resource [origin: class path resource [application-dev.yml] 와 같은 오류는!!스프링 부트 2.4 이전에는 profiles 에 구분자를 추가하고 applicatioin.yml 등의 default profiles 에 "-" 로 구분 되는 yml 파일로 사용이 가능했다 예) applicatio.. 2024. 12. 9.
5-2. repository 완성 ( with Prisma ) 1. 개발해야할 repository 리스트!    1) 카트 추가하기    2) 카트 조회하기    3) 주문하기    4) 주문내역확인하기    5) 상품 조회하기    6) 상품 재고 차감하기 2. Prisma의 transaction    const result: boolean = await this.prisma.$transaction(async (tx) => { const products = await this.productRepository.getProductByIds(productIds, tx); await this.orderDetailRepository.createOrderDetail(detailWithOrderNo, tx) } async createOrderDetail(cre.. 2024. 12. 6.
5-1. prisma 기본 1. 왜 Prisma 인가? : https://www.prisma.io/docs/orm/more/comparisons/prisma-and-typeorm Prisma ORM vs TypeORM | Prisma DocumentationLearn how Prisma compares to TypeORM.www.prisma.io TypeORMPrisma종합기존의 ORM으로, 데이터베이스 테이블을 클래스 모델로 매핑최신화된 ORM으로, 기존 ORM에서 발생하는 문제(복잡한 모델 인스턴스, 비즈니스 로직과 저장 로직의 혼합, 타입 안정성 부족 등)를 해결객체관리entity 객체의 관리를 통해 DB 와 mappingPrisma 스키마로 데이터 모델 관리프로그램밍 측면객체 지향 프로그래밍(OOP) 기반더 간결하고.. 2024. 12. 6.
4. controller & service정리 1. 불필요한 Controller 및 Service 코드 제거    - Default로 생성된 불필요한 코드 제거  2. Controller 및 Service 에서 사용할 DTO 정의    - controller 의 DTO 와 service 의 DTO를 분리해보기!    - prisma의 entity를 DTO로 변환해서 return    3. 2번의 작업을 하는이유!    1) 책임의 분리         : Controller와 Service는 각기 다른 역할을 수행하는데, DTO를 분리하면 각 레이어가 서로의 책임을 명확히 할 수 있다.    2) 유연성 및 확장성         : Controller와 Service에서 DTO를 분리하면, 특정 레이어에 변경이 생겼을 때 다른 레이어에 영향을 미치지 .. 2024. 12. 6.
3. Nest 프로젝트 생성 및 예상 아키텍처 1. 설치     (1) 설치 명령어(기존에 설치하지 않은 경우에만)     (pnpm 을 권장드리나, yarn이나 npm 이 편할 경우 사용해도 됨) pnpm i -g @nestjs/cli     (강의 내용은  npm i -g @nestjs/cli@10.4.8 버전 기반)nest new commerce   nest 명령어를 사용하여, nest 프로젝트를 생성해보자    또는    git clone 으로 Nest 프로젝트 시작가능git clone https://github.com/nestjs/typescript-starter.git project(cd project)yarn install (pnpm 사용해도 됨)      (2) 빌드 명령어npm run build or yarn build or pnpm.. 2024. 12. 6.
2. 요구사항 분석 및 ERD 설계 요구사항 분석현업에서 개발을 진행할 때 요구사항 분석 과정 없이 바로 개발부터 진행하는 주니어 개발자들이 눈에 많이 보입니다. 개발 이후 막히거나, 기획쪽 수정될 내용을 뒤늦게 찾게되면, 기존 개발했던 로직들을 전반적으로 수정해야해서 개발 시간을 더 달라는 개발자들이 있습니다. 그럴때 저는 반대로 질문합니다.요구사항 분석 제대로 하셨나요?개발 전에 충분히 알 수 있었던 내용으로 보입니다만? 개발자 중 어떤 개발자는 질적으로도 속도로도 잘하는 개발자가 있는 방면, 어떤개발자는 코드 리뷰에도 수정될 부분이 많이 발생하고 개발시간도 느리게 개발하는 사람들이 있어요. 그런데 그 중 원인을 분석해보면, 요구사항분석을 개발전에 진행했냐? 안했냐로 구분되기도 합니다. 요구사항 분석 제대로 하기 : 무엇을 개발할 지를.. 2024. 12. 6.
728x90