
개요난 꽤 오랫동안 "서비스 로그를 어떻게 남겨야 할까?"라는 고민을 해왔고, 이 고민은 다음의 블로그 글들로 이어져 왔다.스프링부트 서비스에 LOG 남기기 (with. Logback)스프링부트 AOP를 이용해 로깅 처리하기스프링부트에서 Multipart/form-data 요청의 MultipartFile 정보 로그 남기기Terraform으로 EKS 배포하기 11. Grafana Loki와 로그 모니터링 로그를 남길 때 가장 많이 고민한 건 다음과 같은 질문들이었다. API마다 어떤 로그를 남겨야 하는가?예외 발생 시 어떤 정보를 남겨야 대응하기 좋을까?known 에러는 어떻게 표기할까?서버 에러는 어떻게, 또 알람은 어떤 기준으로 발생시킬까?이번 서비스 개발을 계기로, 어느 정도 최종안을 정리할 수 있었..

개요서비스에 파일 다운로드 시나리오가 추가되었다. 과부하에 대응하기 위해 파일을 인메모리에 저장하지 않고 스트림을 통해 클라이언트에 전달하는 방식을 사용했다. 이에따라 응답에 파일 이름을 전달할 수 없게 됐고, 파일명을 다른 방식으로 전달할 수 밖에 없었다. 어떻게 처리할까 고민하다가 Content-Disposition 헤더를 알게되서 이번에 사용해봤다. 동작 자체는 잘 됐지만, 다기종과 연동하면서 생긴 문제를 함께 정리해보려고 한다. Content-Disposition란?일반적인 HTTP 응답에서 Content-Disposition 헤더는 컨텐츠가 브라우저에 inline 되어야 하는 웹페이지 자체이거나 웹페이지의 일부인지, 아니면 attachment 로써 다운로드 되거나 로컬에 저장될 용도록 쓰이는 것..

개요현재 프로젝트에서 파일 저장소로 S3를 사용하고 있다. 파일을 저장하면서 몇 가지 요구 사항이 붙게 됐다. 1. 업데이트를 하면 파일이 새로 업로드됨2. 그런데 업데이트 하기 전 파일로 롤백하려는 요구 사항이 있을 수 있음3. 그럼 업데이트된 파일을 어떻게 관리할 것인가? 사용하지 않는 파일에 아이디를 일일히 부여하는게 맞는가? 그럼 로우가 계속 늘어날텐데?4. 그러면 삭제 정책이 필요한데, 얼마나 저장할 것이며 어떻게 삭제할 것인가? 스케줄러를 돌리는 것도 말이 안되지 않나? 이런식으로 계속 꼬리질문이 나오는 상황에서 S3를 뒤져보던 중 객체 버저닝이란 것을 알게 됐다.https://docs.aws.amazon.com/ko_kr/AmazonS3/latest/userguide/versioning-w..

저번 글에서, Kotlin DSL로 JOOQ를 프로젝트에 적용시켜봤다.2025.02.28 - [개발/SPRING] - Kotlin + SpringBoot에 JOOQ 적용기 - 1. 선택 이유와 코드 자동 생성하기 사실 사용법은 여기서 다룰 필요 없이 공식문서에서 굉장히 잘 다뤄주고 있다.https://www.jooq.org/doc/latest/manual/sql-building/sql-statements/select-statement/ 이번 포스팅에서는 그냥 내가 썼던 쿼리들을 몇개 가져와서 어떻게 썼나 소개해보려고 한다. SELECTfun findById(userId: String, projectId: String): Project { return dsl.selectFrom(PROJECTS) ..

서버 개발 중 스프링 부트가 실행 될 때, 반드시 한번 실행 시키고 싶은 코드가 생겼다. 코드 상 서비스로직에 추가해야할 것 같고, 굳이 빈일 필요가 없다. 예를 들어, 변수에 어떤 값을 초기화 한다던가, 객체를 초기화 한다던가 여러가지 예가 있을 것 같다. 여러가지 방법이 있다. 하나씩 정리해보자.1. @PostConstruct @Serviceclass DataService { private val dataList = mutableListOf() @PostConstruct fun loadData() { // 애플리케이션 시작 시 데이터 초기화 dataList.addAll(listOf("Data1", "Data2", "Data3")) println(..

개요이직 후 거의 바로 QueryDSL을 도입했었다.스프링부트에 QueryDSL 적용기 - 1 (Mybatis vs JPA vs JOOQ vs QueryDSL 비교)스프링부트에 QueryDSL 적용기 - 2 (설치 및 사용법, Spring Data JPA와 함께 사용하기) QueryDSL 도입에는 여러가지 이유가 있는데 대표적인 이유로는 담당하게된 프로젝트가 MyBatis와 JPA가 혼재되어 있었다는게 첫번째 이유였다. JPA를 완전히 덜어내기 어려운 상황이었고, 두번째는 이직 전 회사에서부터 엄청난 길이의 MyBatis 동적쿼리에 고통받고 있던 나는 Native Query를 백엔드 코드에서 더 이상 보고싶지 않았기 때문이었다. QueryDSL 도입 초기에는 컴파일 단계에서 쿼리 오류를 잡아주는 게 너무..

2024.07.19 - [개발/SPRING] - Kotlin + SpringBoot 서버에 테스트 도입기. Kotest와 MockK 이전 포스팅에서 테스트는 왜 필요하고, 어떤 것들이 있는지에 대해 정리해봤다. 그리고 현재 프로젝트에서 어떻게 쓰면 좋을지도 결정했었다. 이 후 한동안 실제로 테스트를 구현하면서, 어떻게 테스트를 서비스에 잘 녹일 수 있을지 고민하면서 구현했다. 테스트가 있긴 있었지만, 레거시의 레거시를 테스트하는 용도라 싹 들어내고 다시 구현했다. 1. 테스트는 기능을 테스트하는 용도도 크지만 히스토리 용도도 크다테스트는 사이드 이펙트를 잡는 용도도 크지만 이 코드가 왜 만들어졌는가를 남기는 요소도 포함하고 있다. 주석도 서비스 로직에 남겨져 있는 것보다, 테스트에 남기는게 최신화 하기 ..

서버 to 서버로 데이터를 전송할 일이 생겼는데.... 문제가 생겼다. 문제 상황은 다음과 같다. 1. A 서버에서 B서버로 요청을 보낼 계획2. A 서버는 S3에서 파일정보를 가져와서 ByteArray 형태로 들고 있음3. B 서버에는 MultipartFile을 파라미터로 받는 API(ex. /api/file)가 존재함 - 수정 불가(FE에서 사용 중) 4. A 서버에서 B 서버로 /api/file을 요청해야 함 - 데이터만 삽입하고 끝내기엔 이력이나 업데이트해야할 정보가 많음5. A 서버에서는 FeginClient를 사용 중(HTTP 통신을 위해서 사용 중, 굳이 고집하지 않아도 됨) 요약하면, 요청을 보내기 위해서 스프링부트 서버에서 MultipartFile을 어떻게 만들 것인가? 와 Feign..
- Total
- Today
- Yesterday
- AWS
- 람다
- 스프링부트
- java
- AWS EC2
- JWT
- serverless
- 후쿠오카
- Spring
- ChatGPT
- CORS
- EKS
- 오블완
- docker
- 후기
- S3
- object
- ecs
- elasticsearch
- 티스토리챌린지
- cache
- OpenAI
- Kotlin
- AOP
- GIT
- terraform
- CloudFront
- lambda
- Log
- springboot
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
29 | 30 |