
이 책의 제목을 보고 클린 코드고 클린 아케틱처고 이론은 다 알겠지만 복잡한 우리 회사 프로젝트에는 어떻게 적용할지 잘 와닿지 않았는데, 드디어 내가 원하던 그 책인가! 라고 생각하는 독자가 계시다면 안타깝게도 그렇지 않습니다. 하지만 코드를 짜며 클래스 간의 의존관계는 어느정도로 허용해야 하고, 패키지 레벨은 어떻게 나눠야 하는지 등을 끊임없이 고민하는 분들이라면 이 책에서 조금의 힌트는 얻을 수 있으리라 생각합니다. - 역자 서문 역자 서문의 첫 구절이 이 책의 완벽한 요약이다. 애초에 책 한권이 복잡한 프로젝트의 아키텍처 문제를 해결해 주길 바란다면 그것만한 도둑놈 심보가 없다... 나는 2년 전 쯤, 이 책을 한번 구입했다가 환불했었다. 당시에는 헥사고날 아키텍처에 대해 전혀 알지 못했기 때문에..

PDF 파일의 내부 데이터를 핸들링할 일이 생겼다. 처음에 든 생각은 PDF 파일을 XML 형태로 바꾸면 되지 않을까?라고 생각을 했는데, XML 형태든 JSON 형태든 파일 형식을 바꿔버리면, 표나 이미지 글자 크기 등이 제대로 반영이 되지 않을 것 같았다. 물론할 수는 있겠지만 아마 솔루션 개발급 공수가 들어가지 않을까? 란 견적이 서서 다른 방법이 없나 찾아봤다. 찾다보니 가장 그럴듯한게 HTML로 변환 하는 것이었다. PDF box와 css box를 이용하는 방법인데 라이브러리를 쓰면 되다보니 그렇게 어렵지 않다. 하나씩 해보자. 코드 gradle # commons-io를 낮은 버전을 쓰고 있으면 버전업해야함, 안쓰고 있으면 필요 x implementation 'commons-io:commons-..

이전 프로젝트는 현재 담당하고 있는 것 보다 규모가 훨씬 커서 테이블의 종류가 많았다. 그래서 다양한 테이블에 insert하는 매서드의 경우 중간에 오류가 발생하는 경우를 대비해 별도의 Exception을 정의하고 데이터 무결성을 위해서 rollback 처리를 반드시 해줬어야 했다. 그런데 현재 프로젝트로 넘어와서 코드를 확인해보니, @Transational 어노테이션만 붙이고, rollback은 따로 처리하지 않고 있었다. 지금 생각해보면 이유라기보다는 개발자의 미숙에 가까운게, 해당 프로젝트는 단 하나의 CustomException이 없었다. Checked Exception이 없기 때문에 굳이 rollbackfor를 정의할 필요가 없다는 생각이었을까? 정말 안전할지 알아보자. Transcational..

이전 글에서 SMS 본인 인증(엄밀히 말하면 휴대폰 인증)을 구현하는 법을 간단히 알아봤다. 하지만 문제는, 반복 요청에 대한 처리를 하지 않았는데 이 외에도 몇 가지 문제가 더 있다. 1. 이미 인증한 사람이 인증 번호 반복 요청 2. 아직 인증하지 않은 사람의 인증 번호 반복 요청 3. 인증한 사람이 다른 번호로 인증 번호 반복 요청 인증 번호를 요청하는 것은 단순하게 생각하면 FE에서 막아줄 수 있다. 문제는 새로고침 했을 때, 이 사람이 인증을 했거나 대기 중인 상태란 걸 내려 줄 수 있어야 한다. (그렇지 않으면 당연히 반복 요청을 할 수 있을 것이다) 방법은 여러가지가 있을 것 같다. user 테이블에서 sms_cert 와 같은 컬럼을 생성하고 , "Y", "N", "P"(pending) 값을..

아래는 한 서비스에서 쓰고 있는 application.yaml 파일이다. 위와 같이 길어진 이유는 서버의 종류가 엄청 많기 때문이다. 서버가 local/dev/stag/qa/prod 외에도 스케줄러가 붙어있어서 7~8개의 profile이 한 yml파일에 존재하게 됐다. 각각 서버의 profile은 아래와 같이 분리해서 application.yml 파일에 설정한다. ### ### ### local ### ### --- spring: config: activate: on-profile: local 나눠 놓을 수는 것 까지는 좋다. 그런데 관리를 제대로 하지 않았다. 그래서 모든 서버에서 공통적으로 사용하는 부분을 분리하지 않아서 yaml 파일이 엄청나게 길어지게 된 것이다. 이런 식으로 보관하면, 모든 서버..

문제의 발생 새로운 프로젝트를 시작하면서, 로그를 다시 붙여야할 일이 생겼다. 기존 프로젝트에 로그를 개발하면서 했던 파이프라인을 그대로 가져와서 붙여넣었는데, POST 요청에서 이상하게 동작하지 않았다. 원인을 분석하면서 생긴 일을 정리해보려고 한다. 우선 현재 시스템에서 로그를 어떻게 찍는지 간단히 정리해보고 가자. 1. Controller에서 API 요청을 받아서 서비스로직까지 처리한 후 return 2. 이 return 할 때 AOP AfterReturning을 통해 캐치 3. 이때 발생하는 return object와 요청 정보를 담고 있는 HttpServletRequest을 통해서 로그를 생성 이 과정 중 3번에서 문제가 발생했다. 사실 스프링부트에서 POST 요청의 RequestBody를 가져..

6월 16일에 OpenAI가 업데이트 되었다. 몇 가지 모델이 업데이트 되었고, 토큰 수 증가와 함께 Function calling이란 기능도 함께 추가되었다. 이전 포스팅에서 토큰 수 증가로 대화 유지를 원활하게 할 수 있다는 것에 대해 다뤘으니, 이번에는 Function calling에 대해 알아보자. Function calling이란? Open AI reference에서 Function calling의 일부를 발췌했다. API 호출에서, 사용자가 gpt-3.5-turbo-0613, gpt-4-0613 모델에 함수를 설명할 수 있습니다. 모델이 이러한 함수를 호출하기 위한 인수가 포함된 JSON 개체를 출력하도록 지능적으로 선택하도록 할 수 있습니다. Chat Completions API는 함수를 호..
- Total
- Today
- Yesterday
- AWS EC2
- terraform
- cache
- 람다
- openAI API
- elasticsearch
- Spring
- OpenFeign
- 오블완
- EKS
- 후쿠오카
- Elastic cloud
- MySQL
- CloudFront
- springboot
- serverless
- 스프링부트
- docker
- ChatGPT
- AOP
- OpenAI
- lambda
- S3
- JWT
- 티스토리챌린지
- Log
- AWS
- GIT
- java
- Kotlin
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |