전체 글 74

[기술적 의사결정] Service 인터페이스 분리 여부 판단 | 리팩토링 우선순위 정하기

이전에 했던 프로젝트들은 항상 service 로직에서 구현했기 때문에impl로 분리할 이유가 딱히 없었다.하지만 이번 사이드 프로젝트는전에 하던 프로젝트들에 비해 규모가 크기 때문에service 인터페이스와 impl의 분리가 필요하다고 판단되었다.service 인터페이스 분리 여부 판단 기준표를 통해service와 impl의 분리가 필요한지 확인해보겠다.✅ Service 인터페이스 분리 여부 판단 기준표우선순위리팩토링 대상이유기대 효과🔥 1순위외부 API 연동 서비스(예: PathHistoryRealtimeUpdateService, SubwayStationService)API 응답 변화나 테스트 어려움이 클 수 있음추상화로 테스트 용이 + 장애 대응 속도 향상⚡ 2순위비즈니스 로직이 많은 Service..

[트러블슈팅] RabbitMQ 연결 문제 | Caused by: io.netty.resolver.dns.DnsErrorCauseException: Query failed with NXDOMAIN at io.netty.resolver.dns.DnsResolveContext.onResponse(..)(Unknown Source) ~[netty-resolver-dns-4.1.118.Final.jar:4.1.118.Final]

사이드 프로젝트를 진행하면서,코드를 받고 실행하는 과정에서 자꾸 연결 중 rabbitmq DNS에 관한 문제가 지속적으로 발생했습니다. springboot, rabbitmq 둘다 도커 컴포즈로 실행시키고인텔리제이에서 실행해보니, 8080 포트 오류가 떴습니다.도커 컴포즈로 springboot를 띄운 것이 문제라 생각하여,도커 컴포즈에서 다운 시키고 다시 실행해보니 이번엔 이런 오류가 뜨더군요.. 오류를 분석해보니,rabbitmq의 DNS가 연결되지 않는 문제입니다.application.properties를 살펴볼게요. host 네임이 rabbitmq라고 쓰여져 있더군요.인텔리제이의 실행은 localhost 환경이기 때문에rabbitmq라고 쓰인 호스트 네임에서는 실행이 안되는 문제였어요. ..

트러블슈팅 2025.07.12

[Docker] 도커의 개념 | 도커 쉬운설명 | 도커 컴포즈 실행

도커(Docker)란? 🍱 필요한 물건이 다 들어있는 도시락통이라고 생각하면 쉽습니다. 예를 들어,엄마가 김밥을 도시락으로 싸줬다고 가정해보겠습니다. 김밥만 있으면 음료수, 젓가락 등 도시락에 더 필요한 요소가 없죠?밖에 나가서 먹으려면 이것저것 따로 준비해야 합니다. 👉 하지만, 도시락통 안에 담는다고 한다면, 김밥, 음료수, 과일, 젓가락 모두 들어가겠죠! 그래서 도시락통을 들고가면 언제 어디서나 그대로 먹을 수 있습니다. ✅ 도커도 똑같습니다! 도커는 컴퓨터에서 프로그램을 돌릴 때,그 프로그램이 잘 돌아갈 수 있도록필요한 것들을 모두 도시락통처럼 하나로 싸서 가져가는 것입니다! 💻 개발자 버전의 도시락이라고 생각하면 되겠죠! 예를 들어,🍙 김밥 = 우리가 만든 코드 (프로그램)🧃 음료수..

Docker 2025.07.12

[Java] JVM의 메모리 구조 | 메서드 영역, 힙, 호출스택

JVM은 Java Virtual Machine의 약자로,자바를 실행하기 위한 가상머신입니다. 자바는 어떤 OS에도 종속받지 않기 위해 JVM을 통한 컴파일을 합니다. JVM의 메모리 구조를 사진으로 보여드리겠습니다! 여기서 참고해야 할 용어들을 이해하기 쉽게 설명드리겠습니다. 📍 메서드 영역이란?해당 클래스의 파일을 읽고 분석하여 클래스 데이터를 메서드 영역에 저장하는 역할을 합니다.이때 클래스 변수도 함께 저장됩니다. 📍 힙 영역이란?인스턴스가 생성되는 공간입니다. 즉, 인스턴스 변수가 생성되는 공간입니다. 📍 호출스택이란?메서드 작업에 필요한 메모리 공간을 제공합니다.메서드가 호출되면 호출스택에서 호출된 메서드를 위한 메모리를 할당해줍니다.이 메모리가 메서드가 작업을 수행하는 동안 지역..

Java 2025.07.08

[개발일지] 파이썬을 활용한 야구선수의 승리기여도 확인 프로그램

평소 야구 보는 것을 좋아하여 직접 승리기여도를 측정하는 프로그램을 작성해보기로 한다.데이터 크롤링에 능하지 않기 때문에 데이터 크롤링을 잘하기 위해 실천해보겠다. 챗지피티를 활용하여 개발해보겠다. 1. 승리기여도의 정의 정하기 WAR, wRC+, OPS+, FIP, ERA, WHIP, 기초 스탯 등다양한 지표들이 있기 때문에 어떤 지표를 활용할지 결정해야 한다. 2. 데이터 수집 데이터를 입력해야 분석이 가능하다. 방법1. KBO 웹 크롤링 방법 2. Kaggle 등 공개 데이터셋 활용 3. 승리 기여도 산식 설계 혹은 기존 지표 활용 선택 1. 기존 공식 지표 활용 (복잡하지만 신뢰도가 높음)- WAR은 계산 방법이 복잡하지만 분석용 라이브러리가 일부 제공- 타자/투수별 WAR 공식이 다름..

개발일지 2025.06.30

[알고리즘] 자료구조 해시테이블 | 체이닝 vs 오픈 어드레싱 차이

해시테이블(HashTable)이란? 키(Key)와 쌍(Pair)을 저장하는 자료구조입니다.빠른 검색, 삽입, 삭제가 가능하며, 일반적으로 평균 시간 복잡도가 O(1)입니다.내부적으로 해시함수를 사용하여 배열의 인덱스를 계산하고, 해당 위치에 데이터를 저장합니다.  주요 개념 1. 해시 함수입력된 키를 특정 크기의 배열 인덱스로 변환하는 함수좋은 해시함수는 충돌을 최소화해야 함2. 충돌서로 다른 키가 같은 해시 값을 가질 때 발생하는 문제충돌 해결 방법으로 체이닝(Chaining) 또는 오픈 어드레싱(Open Addressing) 기법 사용    # 1. 체이닝class HashNode: def __init__(self, key=None, value=None): self.key = key..

알고리즘 2025.03.13

[알고리즘] 실무에 바로 쓰이는 알고리즘 by Python | 파이참 자동완성 끄기

https://www.inflearn.com/chats/1384039/%ED%95%9C%EC%A4%84-%EC%9E%90%EB%8F%99%EC%99%84%EC%84%B1-%ED%95%B4%EC%A0%9C-%ED%8C%8C%EC%9D%B4%EC%B0%B8-%EC%84%B8%ED%8C%85-%EA%B3%B5%EC%9C%A0%ED%95%A9%EB%8B%88%EB%8B%A4?srsltid=AfmBOor3ZbxouO4i_wMan0iJLgAvxrp_j9XLCU5G7RYt5jqEMoHPMO-w 한줄 자동완성 해제 파이참 세팅 공유합니다. - 인프런 | 고민있어요안녕하세요 고민글은 아니고 혹시나 해서 같이 강의 들으시는 분들하고 공유하고 싶어서글 올립니다.(아마 많이 알고 있으시겠지만 혹시나 싶어서 공유합니다. 혹시 ..

알고리즘 2025.02.04

[트러블슈팅] warning: adding embedded git repository 오류 해결 | 중첩 Git Repository 문제 해결

깃허브에서 이렇게 저장된 깔끔한 디렉토리로 정리하려고 시도했는데,  안에 내용들이 하나도 들어가지 못한 모습이다.  상태를 확인해주니 별 이상없이 잘 보이는 모습이다.하지만 안에 내용은 하나도 들어가지 않은 것을 보아 제대로 push가 이루어지지 않았음을 알 수 있었다.  파일을 강제로 푸쉬하고 add commit하려고 하는데warning: adding embedded git repository: flutter_project라는 오류가 발생했다.하위 프로젝트에 별도의 .git 파일이 있기 때문에 발생한 중첩 저장소 문제였다. rm -rf flutter_project/.gitrm -rf material_flutter_app/.git 이 명령어들로 삭제해주고 add까지는 성공했지만 커밋에서 막혔다.git a..

트러블슈팅 2024.12.13

[Flutter] 위젯의 생명주기 10단계

1. createState()처음 스테이트풀을 시작할 때 호출- StatefulWidget 클래스를 상속받는 클래스는 반드시 createState() 함수를 호출해야 함.이 함수는 다른 생명주기 함수들이 포함된 State 클래스를 반환해야 함.즉, 위젯의 상태를 생성하는 함수로 생각할 수 있음.  2. mounted == truecreateState() 함수가 호출되면 mounted는 true- createState() 함수가 호출되어 상태가 생성되면 곧바로 mounted 속성이 true로 변경.mounted 속성이 true라는 것은 위젯을 제어할 수 있는 buildContext 클래스에 접근할 수 있다는 의미.buildContext가 활성화되어야 setState() 함수를 이용할 수 있음. 아니면 오류..

Flutter 2024.12.10

[트러블슈팅] The emulator process for AVD Pixel_3_API_30 has terminated. 오류 | 플러터 에뮬레이터 실행 안됨 | AppData 경로 찾는법

1. 문제 정의Android Studio에서 Device Manager를 통해 에뮬레이터를 실행하려고 하니 The emulator process for AVD Pixel_3_API_30 has terminated.라는 오류가 지속됨.   2. 사실 수집    3. 원인 추론https://suzzeong.tistory.com/119 [error] The emulator process for AVD has terminated[error] The emulator process for AVD has terminated 이 에러로 갑자기 에뮬레이터가 작동 안될 때가 너어어어어어어무 많았다 그래서 결국 이 글을 쓰기로 결심!!!!!!! 이런 에러가 난다고 해서 한 가지 방법suzzeong.tistory.com이 블..

Flutter 2024.12.03