Spring Framework에서 복잡한 비즈니스 로직 구조화하기 Filter Chain 오늘은 스프링 프레임워크에서 복잡한 비즈니스 로직을 구조화해 본 경험을 이야기 해보려고 합니다.제가 실제로 해결하고자 했던 비즈니스를 기반으로 설명하면 좋겠지만 아무래도 보안상 문제가 있을 수 있어 배달 어플에서 사용 가능한 쿠폰 목록을 고객에게 안내하는 비즈니스 도메인이 가장 적절하다고 생각하여 해당 도메인으로 설명을 해보도록 하겠습니다. 우리가 해결하고자 하는 비즈니스 도메인은 다음과 같습니다.1. 고객이 보유한 쿠폰 목록 중 주문에 사용 가능한 쿠폰 목록을 보여준다.2. 사용가능한 쿠폰에 대한 정의는 다음과 같습니다.- 고객이 보유한 쿠폰중 사용기한이 만료되지 않은 쿠폰- 고객이 보유한 쿠폰중 전체 브랜드 또는 주문하고자 하는 가게 브랜드에 적용이 가능한 쿠폰- 고객이 보유한 쿠폰중 전체 지역 또는.. 2025.04.20 Java 객체가 생성과 상태변경을 책임지는 방법 Spring Framework 백엔드 개발업무를 진행하면서 기존에 존재했던 코드들을 확인할 때 가장 힘이 들었던 부분은 객체의 생성과 상태 변경 로직들이 여러 비즈니스 로직에 나뉘어 녹아들어 있을 때였습니다. // 극단적 예시이긴 하지만 홍길동 이름을 가진 Person객체가// checkPerson 메소드에 매개변수로 전달후 name 출력값을 확인하면// 철수라는 이름으로 변경됩니다. 즉 checkPerson메소드에서 상태값을// 변경하는 로직이 있었습니다.Person person = new Person("홍길동");checkPerson(person);String name = person.getName();// 출력값: 철수System.out.println(name);객체의 상태값을 비즈니스 로직 여기저.. 2025.03.05 SpringFramework 버그에 대한 불안감 떨쳐내기 Spock Test 개발자로 첫 취업 후 고객들에게 실질적으로 서비스되는 프로젝트 첫 배포는 정말 인생에서 잊지 못할 기억으로 남을 것 같습니다. 그때 당시 주니어 개발자인 저에게 메인 서비스 리뉴얼을 맡기고 배포할 수 있는 기회는 정말 소중했던 경험으로 죽을 때까지 잊지 못할 기억이 될 것 같습니다.잊지 못하는 기억에 이유는 물론 고객들이 실제로 사용하는 서비스를 배포하고 한다는 점도 있지만 버그가 발생할 것 같은 마음에 코드를 보고 또 봐도 마음 한편에 불안감 때문 이었던 것 같습니다. 지금도 경력이 짧지만 이제는 웬만한 버그없이 안정적으로 서비스를 개발하는 것 같습니다. 이런 안정감을 어떻게 저는 찾게 되었냐면 짧지만 경험을 통해 방어로직을 잘 구성하는 것 도 있지만 중요 로직에 대한 테스트시나리오를 구성하고 테스트.. 2025.02.19 Mysql Repleication 구현해보기 오늘은 간단하게 Docker, Mysql을 통해 Replication을 구현해보겠습니다. 현업에서는 AWS RDS를 통해서 구현을 해보았는데 온프레미스에 구현한다 생각해보고 진행해 보겠습니다. 먼저 Master DB 1대, Slave DB 2대를 docker-compose를 통해 구현해보도록 하겠습니다.services: master: image: mysql:8.0 container_name: mysql-master restart: always environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: board ports: - "3306:3306" volumes: - /Users/include-h.. 2025.04.15 Private Docker Registre 구축 클라우드 서비스를 사용하지 않고 폐쇄 환경에서 CI/CD를 구축 하고 있습니다. Gitlap, Jenkins 파이프라인을 통해 CI 지속적인 통합 환경을 구축하였고 Docker Registry, Jenkins 파이프라인을 통해 CD환경을 구축하였습니다.그 중 오늘 소개할 방법은 Docker에서 공식적으로 제공하는 registry 이미지를 통해 프라이빗한 Docker image 저장소를 구축하는 방법입니다. 말이 뭔가 도돌이표인것같은 느낌이지만 Docker 환경에 Docker Image를 저장할 수 있는 Docker Registry 컨테이너를 띄워서 폐쇄환경에서 도커 이미지저장소를 구현해보겠습니다. Authentication// 아래 환경은 리눅스 Shell환경에서 진행이 됩니다.// 일단 간단하게 보안설.. 2025.01.08 Ollama 프라이빗 네트워크 환경 에서 LLM 구축 사용해보기 오늘은 간단하게 프라이빗 환경에서 회사문서나 개인적인 문서들을 AI LLM모델에 업로드하고 해당 문서들을 기반으로 질의하면 너무나 좋을것 같다는 궁금증에 로컬 프라이빗 LLM구축을 시도를 해보았습니다! 제가 이번에 사용한 솔루션들은 다음과 같습니다. Ollama, Llama3.1, Open Web Ui Ollama는 다양한 오픈소스 LLM을 간단하게 실행하고 관리할 수 있게 도와줍니다. Llama 3.1은 우리가 너무나 잘 알고있는 Meta 페이스북에서 개발한 언어모델입니다. Llama 3.1은 제가 자주 방문하는 커뮤니티에서 입소문이 자자하기도 하고 혹여나 보안적인 정보들을 학습시켜도 괜찮은 신뢰도가 있는 프로젝트로 시도해 보았습니다. 제가 LLM을 구동하는 하드웨어는 맥북 M2 16gb ram 모델로.. 2025.05.11 PostMan으로 GraphQL요청 하기 오늘은 GraphQL개발을 진행하며 요청과 응답을 클라이언트 관점에서 확인해 볼 수 있도록 PostMan을 활용하여 서버로 요청을 보내는 법을 공유해 보도록 하겠습니다.RestApi를 개발해오며 정말 많이 사용한 PostMan입니다. 예전에 PostMan으로 gRPC요청도 해보았는데 PostMan으로 GraphQL요청 또한 손쉽게 가능합니다.요청할 서버는 localhost:8080 로컬환경입니다. GraphQL은 한개의 엔드포인트만 갖기에 graphql로 요청을 보낼 수 있도록 설정합니다. 또한 GraphQL은 본질적으로 HTTP 프로토콜 이기 때문에 GET, POST를 설정할 수 있습니다. 다만 일반적으로 GET요청에 대한 한계가 있기 때문에 대부분 GraphQL 요청은 POST로 처리합니다. 이 부분.. 2025.05.06 Docker ugeek/webdav를 이용한 간편한 WebDav서버 구축 오늘은 간편하게 Docker ugeek/webdav 이미지를 활용하여 간편하게 WebDav서버를 구축하는 방법을 알려드리겠습니다. WebDav는 Http프로토콜을 통해 원격 파일 시스템에 대한 액세스와 관리 기능을 제공하는 표준입니다. 말이 어렵지만 그냥 손쉽게 설명하자면 파일 서버라고 생각하시면 편합니다.구글 드라이브를 사용하고 있기에 그닥 필요는 없었지만.. 최근 아이폰, 아이패드에서 사용하고 있는 nPlayer의 구글 드라이브 연동이 막혀버리는 바람에..막혔다기보다 유지보수를 안하고 있어서 구글드라이브 Api연동관련해서 문제가 발생하고 있나봅니다.. nPlayer에서 구글드라이브에 접근하면 차단된 앱이라는 안내만 나오고 인터넷에 나오는 각종 방법으로 시도했음에도 접속이 불가능 하더군요. 구글드라이브.. 2024.11.12