본문 바로가기

전체 글249

Bean 등록에 대한 재고 SpringBoot에서 Bean을 등록하는 방법은 무엇이 있을까. 1. 클래스에 직접 @Component 애노테이션을 사용하는 방식 2. @Configuration 애노테이션을 활용해 @Bean 등록하는 방식 위 2가지 방식이 보편적이다. 내가 지금까지 진행했던 보통의 애플리케이션 개발 과정에서는 1번을 압도적으로 많이 사용했던 것 같다. @Configuration 방식의 경우, 통상 외부 라이브러리를 Bean으로 등록하기 위함이라며 면접 질문에서 정석적으로 회자된다. 그 고정 관념 탓에, 나의 경우도 2번 방식은 외부 설정 이외에 사용하지 않았었다. Java9에서 나온, 새로운 추상화 개념인 모듈이라는 개념이 있다. 모듈에는 종속성(dependency)의 개념이 있으며, Public API를 내보내고 .. 2024. 10. 12.
Spring boot multi datasource 등록 시 주의 사항 Spring Boot Multi datasource 등록 시 주의 사항최근 진행했던 프로젝트는 외부 휴무일 정보 API를 호출하여 DB에 적재하는 월배치용 Spring Batch 애플리케이션을 개발하는 것이었다.회사에는 여러가지 DataBase가 있는데, 그 중 메인 DB를 사용하기로 했고, spring batch 용 DB는 따로 사용하게 되었다.그래서 멀티 datasource bean 을 등록해줘야 했다.그 과정에서 정말 기초적이지만 실수했던 부분을 설명해보겠다.Multi Datasource하나의 프로젝트에서 여러 개의 데이터베이스를 연결하는 것.spring 에서는 기본적으로 yaml 파일을 통해 쉽게 datasource 구성이 가능하다.따로 java 코드로 bean 을 등록할 필요가 없을 것이다.하지.. 2024. 9. 18.
번아웃, 나의 견해 어김없이 행복한 날들을 보내고 있다. 하고 싶은 일을 재밌게 하고, 새로운 취미 활동도 생겼기도 했고, 올해 이룰 새로운 목표도 생겨서 항상 매일이 즐겁다. 최근에 오랜만에 보는 지인을 만나서 가볍게 저녁을 먹으면서 이런저런 얘기들을 나눴다. 기존 전공과 다르게 나와 같은 커리어를 걸어가기 위해 열심히 공부하며 준비하는 중이었다. 그러한 대화를 하다보니, 나의 새롭게 서버 기반 개발을 공부하며 취업까지 1분 1초 아끼며 진행했던 시절이 떠올라, 경험과 기반 지식을 얘기하면서 자연스레 번아웃에 대한 주제가 튀어나왔다. "OO야 너는 그렇게 진행해 오면서, 번아웃 같은 게 없었어?" 지인이 질문을 던졌다. "글쎄, 나는 번아웃 그런 거 잘 모르겠어." "근데 목표가 명확하면 번아웃이 올 세가 없지 않을까.".. 2024. 9. 16.
일주일의 휴식과 새로운 취미 개시 퇴사 후 입사 전 일주일의 휴식 기간이 주어졌다.무엇을 하고 쉬어야 할까 하다, 주변 지인들 권유에 무계획으로 2박 3일 제주도 여행을 다녀 왔다.차가 없어서 불편했지만, 새롭게 만난 인연들을 통해 차도 얻어타가면서 뜻하지 않게 재밌게 구경하고 먹고 쉬었다.세상이 정말 좁다고 느낀게, 고등학교 친구를 아는 인연을 만났다는 것이다. 참 세상 좁고 신기했다.여행에 큰 감흥은 없어하는 성격이지만, 이번에는 짧게라도 다녀오길 잘했다는 생각이 든다.(면허 이번 년도 안에 무조건 따야겠다.) 주짓수도 시작했다.첫 회사 동일 직군 개발자 형과 지속적으로 연락하며 지내는데, 그 회사 다닐 때부터 항상 주짓수를 같이 하자고 권유했었다😅이직도 했겠다 저번 주 부터 시작했는데, 새롭게 운동을 배워보는 건 살면서 처음이다... 2024. 8. 19.
[DB] 옵티마이저 (1) Mysql 서버로 요청한 쿼리는 최적으로 실행 되기 위해 최적의 실행 계획을 수립하는 작업이 필요.대부분의 DBMS 에서는 옵티마이저가 이런 기능을 담당한다.Explain 명령으로 쿼리의 실행 계획 확인 가능. Mysql 에서는 비용 기반 최적화 (Cost-based optimizer, CBO) 를 사용한다. 기본 데이터 처리풀 테이블 스캔 조건- 테이블 레코드 건수가 작아, 인덱스를 택하기 보다 풀 테이블 스캔 하는 편이 더 빠른 경우- where 절이나 on 절에 인덱스를 이용할 수 있는 적절한 조건이 없을 경우- 인덱스 레인지 스캔을 사용할 수 있는 쿼리더라도, 옵티마이저가 판단한 조건 일치 레코드 건수가 많은 경우 위와 같은 조건에서 Mysql 옵티마이저는 풀 테이블 스캔을 시도한다.풀 테이블 스.. 2024. 8. 11.
원하는 것을 실현시켜 보고자. 구하라. 그러면 받을 것이다. 찾아라. 그러면 찾을 것이다. 문을 두드려라. 그러면 열릴 것이다. 누구든지 구하는 사람은 받을 것이며 찾는 사람은 찾을 것이요 두드리는 사람에게는 열릴 것이니. 마태복음 7장 7~8절이다.작성하고자 하는 글의 적절한 요약 인용구여서, 사용했다. 퇴근 후, 씻기 전 잠시 휴식을 취하고자 유튜브 시청 중 문득 이런 생각이 들었다.그리고, 최근 내가 시청해왔던 유튜브 목록을 살펴보았다. 내가 무엇을 위주로 시청해왔지? 어제는 빅테크 기업의 개발 관련 세미나 발표 및 공유 영상 위주로 시청했다.오늘은 운동 유튜버의 브이로그 및 치팅 데이 영상을 시청했다. 어제는 빅테크 기업의 기술적 고민과 해결책을 보며, 나도 그런 기술을 경험하고 싶다는 욕망이 생겼다.오늘은 운동 유튜버의 콘.. 2024. 8. 1.
누적 방문 3만명 달성 소회 작년 8월 즈음 2만 명 달성, 1년이 채 안 되어서 벌써 방문자 수 3만 명이다. 방문자 수 오르는 속도가 붙는 것 같기도? ㅎㅎ 1년 전 난 어떤 생각을 하고 있었을까? 열심히 코딩 중이었구나 ㅋㅋㅋㅋㅋ 😅😅 시간도 참 빠르다. 1년이 벌써 넘었으니 말이다. 그땐 항상 새벽까지 야근하면서, 개발에 몰입했었는데 말이지. 그 당시 마일스톤도 참 짧기도 했다. 주말 상관없이 항상 새벽 1, 2시 야근 후 귀가, 집 가서 자고 바로 출근의 반복. 그래도 보람찼다. 온전히 나만의 서비스를 개발하기 때문이었다. DB 구조 설계, 애플리케이션 개발, 배포 환경 구성까지 다 했으니 말이다. 옆에서 도움 주신 시니어 개발자분들께도 참 감사드린다. 이 회사에서 참 많이도 배웠다. 인프라 구성, 배포 환경 모니터링, 각.. 2024. 7. 27.
No more free! 세상에 공짜는 없다.세상은 나에게 빚 진게 없다. 살아오면서 항상 느꼈던 것은 원하는 것을 공짜로 바랄 수 없다는 사실이다.대가든 가치든, 무엇이든 지불해야 내가 원하는 것을 얻을 수 있다. 원하는 것을 쟁취하는 것은 세상과의 거래이다.무엇인가를 얻고자 한다면, 그에 상응하는 가치를 먼저 제공해야 한다.그래야, 비로소 공정한 거래가 성립된다.불공정 거래는 세상에서 성립되지 않는다. 여기서 말하는 가치는 꼭 물질적인 것만을 의미하지 않는다.비물질적, 즉 손에 잡히지 않는 무형의 가치도 각기 다른 상황에 처한 개인마다 충족시키고자 하는 욕구가 있을 것이다.그와 동등한 가치로 거래를 한다면, 충분히 공정한 거래가 이루어질 수 있다. 물질을 다루는 시장,무형의 지식을 다루는 교육,감정과 본능 그리고 무의식을 채.. 2024. 7. 17.
[DB] 인덱스 간략 정리 [1] 인덱스랜덤 & 순차 IO디스크 헤더를 1번, 여러번 옮기느냐? 즉, 디스크의 성능은 디스크 헤더 위치 이동 없이 얼마나 많은 데이터를 한 번에 기록하느냐에 따라 결정Mysql 는 그룹 커밋, 바이너리 로그 버퍼, InnoDB 로그 버퍼 등의 기능으로 개선결국 랜덤 IO 를 줄이는 것이 쿼리를 개선하는 것을 의미정의ArrayList 와 SortedList 의 차이를 아는가?순차적으로 저장 or 정렬하여 저장빠르게 적재 or 느리지만 정렬하여 적재인덱스를 적용한다는 것은 쓰기 성능을 어느 정도 포기하고, 읽기 성능을 택하겠다.B-Tree 에서 인덱스 키 추가 및 삭제 시보통의 경우, 레코드 추가 비용 1 가정 시 인덱스 추가 비용을 1.5 로 예측하는 편.인덱스 키 삭제와 변경의 경우, InnoDB 엔진에 .. 2024. 6. 29.
[DB] 트랜잭션과 락 간략 정리 트랜잭션트랜잭션은 애플리케이션 개발 입장에서, 고민해야 할 문제를 풀어주는 필수적인 DBMS 의 기능.트랜잭션 사용 시 주의사항DBMS 의 커넥션과 동일하게 꼭 필요한 최소의 코드에만 적용하는 것이 좋다. 트랜잭션의 범위를 최소화하라는 의미. 각 단위프로그램이 커넥션을 소유하는 시간이 길어질 수록 사용 가능한 여유 커넥션의 개수는 줄어든다. 메일 전송이나, 파일 전송 작업 등, 네트워크를 통해 원격 서버와 통신하는 작업은 트랜잭션 내에서 제거하라. 웹 서버뿐 아니라 DBMS 서버까지 위험한 상황 발생 저장 데이터의 단순 조회의 경우도 트랜잭션에 포함할 필요가 없다.락레코드 락레코드 자체만을 잠그는 것 InnoDB 스토리지 엔진은 레코드 자체가 아니라, 인덱스의 레코드를 잠근다. 인덱스가 없을 경우, 내부.. 2024. 6. 27.
청소 평소 청소를 자주 한다.난 더럽고 어지러운 것을 보기 힘들어하는 성격이기도 하고, 무엇보다 정리가 안 된 공간 자체가 싫기 때문이다. 오늘 오랜만에 꼼꼼하게 청소를 진행했다.재택근무를 2일 연속했다 보니, 집에 있는 시간이 많아져서 한번 크게 정리하고자 마음을 먹었다. 바닥부터 먼지를 쓸고, 물티슈로 얼룩을 닦아내었다.관리를 안 하면 금방 먼지가 쌓이는 창틀도 닦아주었다.주방에 인덕션 부분을 꼼꼼히 닦았고, 개수대도 닦아주었다.상대적으로 잘 닦지 않던 책상도 물건을 다 들어내고, 먼지를 닦았다.화장실도 락스를 이용하여 깨끗이 정리를 했다. 디테일한 부분까지 청소를 하다 보니,극도로 미니멀리즘을 추구하는 나의 공간 내에도 방치된 물건들이 눈에 띄었다.필요가 없어졌기에 과감히 모두 정리했다.홀가분했다. 이전.. 2024. 6. 6.
Spring Cloud OpenFeign 더 잘 사용해보기 마이크로 서비스에서,Spring Boot 를 이용하여 애플리케이션을 개발할 때면,외부 API 를 호출해야 하는 상황이 존재한다. Spring 프레임워크가 지원하는 여러 가지 Http Client 가 있다. RestTemplate 의 경우 Blocking 방식으로 Http 요청을 진행할 수 있다.하나의 요청을 위해, 코드를 작성하려면,재사용성을 고려한다 할때, 작디 작은 컴포넌트로 추상화를 많이 진행하여 번거로운 코드를 작성해야 한다는 점이 있었다.무엇보다 어떠한 요청을 하는지 한눈에 들어오지 않았다. WebClient 의 경우, Non-Blocking 방식으로 Http 요청을 진행할 수 있다.물론 Blocking call 도 가능하다.빌더 패턴을 활용한 방식으로, RestTemplate 보다는 가독성이 .. 2024. 5. 11.
Chatter 언젠가부터 음악을 잘 듣지 않기 시작했다. 항상 흐르는 선율에 취하던, 음악의 근원을 안 뒤, 감탄하던 순간 그리고 싶었다. 녹이고 싶었다. 순간의 느낌, 감정, 감각을 표현하고 싶었다. 나에게 음악은 소음이 되었다. 이제는 바라보아야 된다고. 언제나처럼 상주할 수는 없을 거라고. --- 이제 음악에 대해 크게 흥미를 잃었다. 애플에게 감사한다. "노이즈 캔슬링"이라는 기능을 탑재한 이어폰을 출시해 주어서. "에어팟 프로"를 세상에 처음 공개한 광고처럼, 이어폰을 착용하는 순간, 세상에 대한 노이즈를 차단하는 것. 나에게 이어폰을 착용하는 이유는, 그런 기능을 이용하는 것뿐이다. 최근 업무하며 노이즈 캔슬링을 곁들인 빗소리, 장작 타는 ASMR을 습관적으로 청취한다. 백색 소음, 뭔가 하는 과학적 이유를.. 2024. 5. 6.
MapStruct! JPA Entity 매핑 간 주의해서 사용하자 최근 비상 결제 모드를 개발 및 배포하며, 참으로 어이 없는 작은 코딩 관련 이슈로 인해 데이터에 이상이 있었다. 바로, MapStruct 얘 때문인데.. 한번 나열해보겠다. (항상 생각하는 거지만, 코드 단 한줄의 파급효과가 엄청 나다.) MapStruct 란?Java Bean 유형 간 매핑 구현을 도와주는 코드 생성기컴파일 타임에 코드 생성 및 런타임에서 안정성 보장순수 Java code 를 호출하므로 다른 매핑 라이브러리보다 속도가 빠르다. (Reflection 을 사용하지 않기 때문)Annotation Processor 를 이용하여 매핑 방식에 편리함을 제공 사용 예시JAVA@Mapper public interface UserMapper { UserMapper INSTANCE = Mappers.g.. 2024. 3. 24.
Spring Boot 애플리케이션 k8s 환경에서 WarmUp 적용하기 이 글을 작성하는 이유 현재 회사에서는 EKS 기반 k8s 환경에서 spring boot 를 포함 각종 프레임워크 애플리케이션을 운영 중이다. 기존 모노리스 Django Rest Framework 에서 점진적으로 도메인 분리를 Spring Boot 를 이용한 Micro Service Application 으로 진행 중인데, 내가 맡은 결제 도메인 관련 애플리케이션도 마찬가지이다. (Kotlin 기반 Spring Boot App) 문제는, 결제가 주문 및 유관 DB 와 너무 강하게 얽혀 있어서 바라보아야 하는 테이블이 많다는 점이고, 이것은 곧 배포 직후 속도에 커다란 영향을 끼쳤다. JVM 은 컴파일 된 .class 파일을 필요 시 클래스 로딩을 통해 사용하며, 기본적으로 인터프리터 방식을 사용하므로 J.. 2024. 3. 17.
반응형