프로젝트 관리는 어떻게?토이 프로젝트의 관리 도구로는 Jira를 선택했다.가장 큰 이유는 익숙함이었다. 회사에서 이미 프로젝트 관리 도구로 Jira를 사용하고 있었기 때문에, 별도의 학습 비용 없이 바로 활용할 수 있다는 점이 좋았다. 또 Atlassian의 Jira와 Confluence는 10명까지 무료로 사용할 수 있어, 개발자가 두 명뿐인 이번 토이 프로젝트에도 부담 없이 적용할 수 있었다.물론 처음부터 Jira를 선택한 것은 아니었다. 처음에는 JetBrains에서 만든 YouTrack을 사용해봤다. 하지만 실제로 며칠 사용해보니 Confluence처럼 문서화와 협업을 함께 가져가기에는 조금 아쉽게 느껴졌고, UI도 아직 익숙하지 않았다. 결국 3일 정도 사용해본 뒤 Jira로 변경했다.개발자는 ..
같은 회사를 다니는 개발자 둘이 있었다. 한 명이 회사 일 말고도 다른 걸 해보고 싶어서, 토이 프로젝트를 먼저 제안했다. 회사 업무에 조금씩 질리고 있던 참이었다. 쳇바퀴에 갇힌 기분을 좀 벗어나고자 시작하게 된 것도 있었다.그래서 오히려 회사 업무랑 조금 거리가 있는 주제로 해보기로 했다.그 친구도 아무것도 모르고 내 말을 수락했다. 😊뭘 만들까?당시 나는 BPLTE-CORE 라는 베이스 프로젝트를 만들고 있었다. BPLTE-CORE는 어떤 프로젝트를 하든 반복해서 필요한 기본 요소들을 미리 정리해둔 프로젝트다. 에러 핸들링, DB 커넥션, 인증/인가처럼 은근히 손이 많이 가고, 초반에 제대로 세팅해두어야 하는 것들을 먼저 만들어두고 다른 프로젝트에서 재사용하려는 목적이었다.예를 들어 Java에서 ..
0. 목표Pipeline Item으로 GitHub Public Repository를 Docker 기반으로 빌드하는 것이다. 즉, Agent 서버 자체 JDK에 의존하지 않고, Docker 이미지 안에서 빌드 환경을 고정하는 방식을 목표로 했다.추후 배포 서버도 AWS로 구축이 완료되면 ECR을 통해서 자동 배포까지 고려하고 있다.1. Agent 사전 점검Agent 서버에 접속해서 도커가 정상적으로 설치되어 있는지 확인한다.docker --versiondocker ps또한, 그리고 Jenkins Agent 실행 유저가 docker 그룹에 속해 있어야 한다.sudo usermod -aG docker ec2-usergit 도 설치되어 있는지 확인하고 없다면 설치를 진행한다.sudo yum install git..
0. Agent 내부 구성Jenkins Agent에 Docker를 설치하면, 파이프라인에서 동일한 Docker 이미지로 빌드와 테스트를 실행할 수 있어 환경 차이로 인한 문제를 줄일 수 있다. Agent 한 대가 Docker 호스트 역할을 하면 Java·Node·Python 등 여러 런타임을 각각의 컨테이너로 돌릴 수 있어, 에이전트마다 다른 툴을 깔 필요 없이 한 Agent로 여러 환경을 제공할 수 있으므로, Docker까지 함께 설치하는 것을 구상했다.1. AWS 인스턴스 생성Agent 또한 스펙은 chatGPT의 도움을 받았다.애플리케이션 및 OS 이미지(Amazon Machine Image)Amazon Linux 선택AMI : Amazon Linux 2023 kernel-6.1 AMI아키텍처 : ..
인증/가입 관련 API는 외부에 공개되어 있고, 인증이 필요 없는 경우가 많아 공격 시도에 자주 노출되는 영역이다. 특히 응답 구조가 단순하고 처리 비용이 낮은 API는 자동화된 반복 요청의 대상이 되기 쉽다. 이번 글에서는 토이 프로젝트 서비스에 10분 단위 호출 제한을 도입하기까지 어떤 선택지를 검토했고, 왜 해당 방식을 최종적으로 채택했는지, 또 어떻게 구현했는지를 정리했다.1. 왜 이 고민을 했는가진행하고 있는 토이 프로젝트에서 /auth/available/user_id API는 응답이 boolean 하나뿐이다./** * 사용자 아이디 사용 가능 여부 * * @param userId 사용자 아이디 * @return true = 사용 가능, false = 사용 불가 */@GetMapping("/av..
0. 시작하며맥북 로컬 환경에서 Docker로 Jenkins를 띄우고, Job을 만들어 빌드까지 수행해보는 것은 크게 어렵지 않았다. 기본적인 Job 구성과 빌드 흐름을 이해하는 데에는 충분한 경험이었다.하지만 돌아보니, 그 구조는 Controller와 실행 노드가 하나로 붙어 있는 built-in 방식이었다. 말 그대로 “Jenkins를 실행해본 것”에 가까웠지, 실제 운영과 비슷한 환경에서의 Jenkins를 경험했다고 보기는 한참 부족했다.현업에서는 보통 Controller와 Agent를 분리하고, 빌드는 별도의 노드(Agent 서버)에서 수행한다. 리소스를 분리하고, 확장성과 안정성을 고려한 구조다. 로컬 단일 노드 환경에서는 이런 부분을 체감하기 힘들었다.그래서 이번에는 AWS EC2 위에 Jen..
문제의 시작, 이 요청은 누가 했을까?API를 개발하다 보면 등록, 수정, 삭제와 같은 변경 작업에서 요청자가 누구인지 반드시 기록해야 하는 경우가 대부분이다.게시글 작성자수정 요청자삭제 요청자감사 로그 기록Spring Security + JWT를 사용하는 환경이라면 보통 아래와 같이 구현한다.@PostMappingpublic ApiResponse createPost(@RequestBody PostCreateRequest request) { Authentication auth = SecurityContextHolder.getContext().getAuthentication(); String userId = auth != null ? auth.getName() : null; request...
배경회사에서 개발 중인 솔루션에서는 서로 다른 도메인(사용자, 업무 코드)에 속한 특정 필드 간에 중복이 허용되지 않는 제약 조건이 필요했다. 문제는 이 제약이 단일 테이블이나 단일 도메인 수준에서 해결될 수 있는 성격이 아니라는 점이었다.해당 솔루션은 GitLab을 미들웨어로 연계하고 있으며, GitLab은 URL 기반 네임스페이스 구조를 사용한다.https://gitlab.com/{namespace}/{project}이 구조로 인해 GitLab 사용자 아이디와 GitLab 그룹명은 서로 중복될 수 없다. 네임스페이스 충돌은 곧 GitLab 리소스 접근 오류로 이어지기 때문이다.솔루션에서는 이를 다음과 같은 정책으로 매핑하고 있었다.GitLab 사용자(User)는 솔루션의 "사용자 아이디"를 기준으로 ..
❓ 이 글을 쓰게 된 이유주로 MyBatis를 사용해 개발하다 보니 Hibernate라는 기술은 익숙한 이름이었지만, 정작 “Hibernate가 무엇이냐”는 질문에는 늘 추상적인 설명밖에 하지 못했다. ORM과 JPA에 대한 기본적인 개념은 알고 있었고, 가볍게 JPA를 사용해 본 경험도 있었지만, Hibernate가 어떤 역할을 하고 어떤 책임을 지는지 명확하게 설명하기는 쉽지 않았다.이번 글은 그동안 어렴풋하게 알고 있던 개념들을 정리하고, Hibernate를 보다 정확하게 이해하기 위해 작성한 기록이다. 이를 위해 Hibernate 자체부터 설명하기보다는, 먼저 ORM과 JPA라는 기본 개념부터 다시 짚어본다.1. ORM(Object-Relational Mapping)ORM(Object-Relati..
1. 트랜잭션이란?트랜잭션은 "모든 작업이 성공하거나, 모든 작업이 실패하거나" 하는 원칙으로 ACID 특성을 갖는다.Atomicity (원자성): 모두 성공하거나 또는 모두 실패Consistency (일관성): 트랜잭션 전후 데이터 무결성 유지Isolation (격리성): 동시 실행되는 트랜잭션들이 서로 간섭 안 줌Durability (지속성): 성공한 트랜잭션은 영구적으로 저장2. Spring 트랜잭션 구조Controller ↓Service (프록시 객체) ↓TransactionInterceptor ↓PlatformTransactionManager ↓TransactionSynchronizationManager ↓DataSource / JDBC Connection각 요소별로 역할을 살..
- Total
- Today
- Yesterday
- jenkins
- 톰캣
- 도커
- mariadb
- 자바스크립트
- 스프링
- oracle
- 파이썬
- 젠킨스
- 스프링부트
- 크롤링
- Spring
- MySQL
- 마리아디비
- docker
- nodejs
- 스프링시큐리티
- BeautifulSoup
- java
- springsecurity
- Minikube
- k8s
- 오라클
- JavaScript
- 쿠버네티스
- MongoDB
- springboot
- 쿼리
- AWS
- kubernetes
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |