일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- LLaMa
- Redis
- 도커
- BFS
- 리트코드
- Machine Learning
- 메세지큐
- 쿠버네티스
- vuejs
- POD
- 생성형 AI
- 오픈시프트
- LeetCode
- Python
- fast api
- 로깅
- vue.js
- SpringBoot
- jpa
- fastapi
- kubernetes
- Docker
- 생성형
- GPT
- OpenShift
- k8s
- 컨설턴트
- 머신러닝
- 솔루션조사
- 컨설팅
- Today
- Total
목록개발지식/Springboot (10)
수 많은 우문은 현답을 만든다
안녕하세요 조영호입니다. 오늘은 Transational 어노테이션을 사용하면서 발생했던 한 가지 문제에 대해서 공유하고자 합니다. @Transactional 이 선언된 하나의 메소드에서 내부적으로 3개의 메소드를 호출하고 있는 메소드에서 아래 오류가 발생했습니다. 오류내용 Aborted connection - Error enlisting in transaction - connection might be broken? Please check the logs for more information... - nested exception is org.apache.ibatis.executor.ExecutorException: Error preparing statement: the XA resource has be..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/mD3hi/btsitFyxV64/fed4Q0QW2ligEaBedWJYM1/img.png)
안녕하세요, 조영호입니다. Spring에서는 공통 설정이나 숨겨야하는 내용들을 properties 또는 yml 파일에 적어놓고 그 값들을 호출해서 애플리케이션에서 사용합니다. 오늘은 이 설정값들을 불러오는 두 방법에 대해서 알아보겠습니다. 1. @Value 어노테이션 @Value("${api.url}") private String url; 2. @ConfigurationProperties 어노테이션 @Component @ConfigurationProperties(prefix = "api") @Data public class urlManager{ private String url; } 3. @Value vs @ConfigurationProperties 비교 한 두가지의 간단한 설정을 가져올때는 @Value..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/cEXeaG/btsivhp71Rs/d1gSLyIh2gAhPb84pQjRrk/img.jpg)
안녕하세요 조영호입니다. 오늘은 한글 인코딩으로 이틀간 고생했던 경험을 공유하고자 합니다. 혹시라도 누군가에게 도움이 되시길 바라면서.. 상황 설명 저는 VM 2개와 Rabbitmq 1개 사이에서 데이터를 주고받는 서비스를 개발하고 있었습니다. VM들에는 각각 A서비스, B서비스가 실행되고 있는 상태였습니다. 한글 인코딩 문제는, A서비스에서 "message" : "한글메세지" 형태로 메세지를 Rabbitmq로 보내서 B서비스에서 메세지를 Json Parsing 할때 예외가 발생했습니다. 예외 내용 예외의 내용은 대략 아래와 같았습니다. Json Parsing Exception : ':' is not expected value on "message" : "+#)!#*(":#(@". 메세지가 전달되는 과정..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/VZ7sz/btsitGK4cbz/Pc20hCMbHbJOzLFYMy3os0/img.png)
안녕하세요 조영호입니다. 오늘은 업무 중 세마포어와 관련된 질문을 받았고 바로 명쾌하게 대답하지 못했던 것이 아쉬워서 글로 남겨봅니다. 받은 질문과 대답 Q :"현 프로젝트에서 세마포어 구조를 쓰고있나요? 가령, 캐시 사용 같은 부분에서요" A : "프로세스 간에 함께 공유하는 자원이 없어 세마포어를 쓰고있지 않습니다" 자 우선 OS 이론에서 자주 등장하는 세마포어, 뮤텍스, 동기화의 차이에 대해서 알아보겠습니다. 세마포어(Semaphore) : 공유된 자원의 데이터 혹은 임계영역(Critical Section) 등에 여러 Process 혹은 Thread가 접근하는 것을 막아줍니다(즉, 동기화 대상이 하나 이상) 뮤텍스(Mutex) : 공유된 자원의 데이터 혹은 임계영역(Critical Section) ..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/cCfzPd/btsit0CpFlX/fB23BzMj6mDLQuPyxLobu1/img.png)
요즘에는 디비 구성을 할때 FK(Foreign Key) 사용을 최대한 지양하라고들 한다. 그러면 JPA 에서는 FK 없이 어떻게 처리할 수 있을까? -> ggregate에서 어플리케이션 레벨에서 관계를 지어서 각각의 연결된 엔티티를 처리되게 구성할 수 있다. 그럼 어쩔 수 없이 jpa에서 select가 여러번일어나게 어플리케이션을 짜야 하지 않을까? 아니면 jpa에 특별한 기능이 있는건가 ?? -> 이런 케이스에선 QueryDSL을 사용해서 여러번 IO를 발생하기 않게 구성하면 된다.
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/cO11ha/btrvuQnIeDD/Pm4UJ1iezMPrRNsKsrlwI1/img.png)
안녕하세요, 조영호입니다. 오늘은 개발 이후 PR(Pull Reqeust)를 올린 다음 사수로부터 개선을 요청받은 사항과 어떻게 개선했는지 그 과정을 공유하고 합니다. 기본적인 문제부터 의미있는 문제도 있으니 주니어분들은 눈여겨 보시면 좋을 것 같습니다. 우선 로그 수집 시스템은 ELK(ElasticSearch, Logstash, Kibana) 를 선택했고 3가지 서비스와 Java Application을 포함한 4가지 서비스를 Docker Container 로 구성했습니다. Java 애플리케이션에서 발생하는 예외나 로그 메세지들은 Logstash 에서 적절히 수집하고, Kibana 대시보드로 로그 모니터링을 할 수 있습니다. 이제 개선 사항을 살펴보겠습니다. AOP를 통한 MDC처리시 추적번호(Trans..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/b4vwJ2/btruexpdMFb/vVQ0vkfBgYcdt2DeZSTDNK/img.png)
이제 예외처리에 자신감이 생겼으니 애플리케이션에서 발생하는 예외들을 수집하는 '로깅 시스템'을 설계해보자. 로깅 시스템 설계 1. 예외 Coverage 100% 만들기 보통 애플리케이션에서 예외를 잡기 위해서 try-catch 를 사용한다. 이보다 중복 코드를 줄이고 가독성을 높히는 방법은 @ExceptionHandler 를 사용하는 방법이 있다. 이렇게 비즈니스 로직에서 발생할 수 있는 예외들은 개발자가 직접 잡아내면 되지만 예상하지 못한 예외들은 어떻게 해야할까? 이때는 @ControllerAdvice를 사용하면 애플리케이션 전역에서 발생하는 예외들을 처리할 수 있어서 예상하지 못한 예외까지 잡아낼 수 있다. 2. 로그 수집 방법 정하기 그러면 로그는 어떻게 수집할 수 있을까? 우선 우리는 보통 로그..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/bCNjZK/btrtTLU6jec/TkeuM119VfKu4vX6Cy22cK/img.png)
예외처리에 대한 고찰 안녕하세요 조영호입니다. 오늘은 어플리케이션의 예외처리에 대해 고민하고 발견한 내용들에 대해서 공유하고자 합니다. 막연한 시작에서 한 걸음 나아간 결과를 얻게되어 뿌듯합니다.. 부족한 점은 댓글 달아주세요! 어느날 새로운 프로젝트 팀으로 이동하게 되었습니다. 첫 미션은 해당 어플리케이션의 에러들을 '잘 관리할 수 있게 해봐라' 였습니다. 에러 모니터링이야 그냥 ELK/EFK 쓰면 간단할 것으로 생각했지만, 어플리케이션 단에서 저장해서 보여주고 싶다는 요건이었습니다. (찾다보니 front-end browser log를 저장하는 솔루션도 있더라구요 ! - Sentry) 해당 애플리케이션은 이미 메소드 별로 try-catch를 덕지덕지 쓴 상태였습니다. 어떻게하면 가독성을 향상시킬 수 있..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/IwgWm/btrrJU70uMD/iB5DSYkCelt9y98kMgMDt0/img.png)
JPA란 JPA(Java Persistence API)는 Java ORM 기술에 대한 API 표준 명세이다. 이에 대한 구현체로는 Hibernate, EclipseLink, DataNucleus가 있으며 Spring Framework는 기본적으로 Hibernate를 사용한다. ORM 이란 여기서 ORM은 Object Relational Mapping (객체-관계 매핑)로 OOP(Object Oriented Programming)에서 쓰이는 객체라는 개념을 구현한 클래스와 RDB(Relational DataBase)에서 쓰이는 테이블을 자동으로 매핑(연결)하는 것을 의미한다. 클래스와 테이블은 애초에 서로 호환가능성을 염두해두고 만들어진 것이 아니기 때문에 불일치가 발생하는데 이를 ORM이 해결한다. 즉 ..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/bjHg7B/btrlPotcA6b/Tuzy4dqf7KNa5kgnSpzG41/img.png)
안녕하세요, 오늘은 Springboot Application에 Spring Batch를 적용하면서 고민했던 내용을 공유하려고 합니다. 현재 DDD(Domain Driven Design) 방식을 채택하여 개발을 진행하고 있으며 Bounded Context(도메인 경계)를 5가지로 구분했습니다. organization, settings, attendance, approval, batch 5가지 개별 모듈로 서비스가 구성되어있으며 각각의 필요에 의해 서로 의존성을 가지도록 설정했습니다. 오늘은 batch 모듈을 구성한 방식에 대해 간략히 설명하고 배치서비스 구성을 어떻게 구현했는지 설명하도록 하겠습니다. 1. Batch 모듈의 의존성 설정 우선 프로젝트의 build.gradle > dependencies에 모..