전체 글 (38) 썸네일형 리스트형 [Spring Boot] JPAHibernate 기초 객체와 관계형 DB의 패러다임 불일치를 부수다 과거의 자바(Java) 백엔드 개발자들은 게시판 하나를 만들려 해도 INSERT INTO board VALUES..., SELECT * FROM board WHERE... 등 길고 지루한 SQL 쿼리문을 수백 줄씩 타이핑해야 했습니다. 만약 중간에 DB 테이블에 컬럼이 하나라도 추가되면, 그 수백 줄의 쿼리문을 일일이 다 찾아다니며 수정하는 끔찍한 '노가다'의 연속이었죠. 게다가 객체 지향 언어인 자바(Java)와 관계형 데이터베이스(RDB)는 태생적으로 사상(Paradigm)이 너무나도 달랐습니다. 자바는 '상속'과 '참조'를 사랑하지만, DB는 그냥 2차원 표(Table)일 뿐이니까요. 그런데 개발자가 순수하게 '자바 객체'만 다루면 알아서 뒤에서 SQL을 짜주고 DB에 넣어주는 마법의 기술이 등장했.. [Spring Boot] 의존성 주입DI과 IoC 컨테이너 객체의 생성 소멸 자동화 우리가 자바(Java) 학원에서 처음 프로그래밍을 배울 때, 어떤 클래스의 기능을 사용하려면 무조건 new 키워드를 사용해 메모리에 객체를 찍어내야 한다고 배웠습니다. 예를 들어 UserService에서 UserRepository가 필요하면 UserRepository repository = new UserRepository(); 처럼 직접 생성했습니다. 하지만 실무 스프링 부트(Spring Boot) 프로젝트 코드를 아무리 뒤져봐도 new 키워드를 찾아보기는 하늘의 별 따기입니다. 개발자가 객체를 직접 만들지 않는데 도대체 프로그램이 어떻게 굴러가는 걸까요? 이 거대한 미스터리를 푸는 열쇠이자, 전 세계 수많은 자바 개발자들을 스프링의 노예(?)로 만들어버린 가장 위대하고 핵심적인 철학이 바로 IoC(I.. [Spring Boot] 서버 로그(로깅) 완벽 가이드 초보 개발자와 실무 개발자를 구분하는 가장 확실한 기준 하나를 꼽으라면 바로 '로깅(Logging)을 어떻게 다루는가?'입니다. 대학생이나 학원 시절 프로젝트에서는 에러가 나거나 변수 값을 확인하고 싶을 때 무조건 System.out.println("바로여기")를 쓰곤 했었는데요. 하지만 실제 운영(Production) 서버에서 System.out.println을 쓰면, 치명적인 성능 저하(블로킹 I/O)가 발생할 뿐만 아니라, 서버가 재시작되는 순간 콘솔에 찍힌 글자들이 흔적도 없이 증발해 버립니다.어젯밤 11시에 결제가 실패해서 고객센터로 항의가 들어왔는데, 원인을 찾으려고 보니 로그 기록이 완전히 날아가 있다면 개발자는 등골이 오싹해질 수밖에 없습니다. 이번 글에서는 장애를 역추적하는 Spring .. [Jenkins] SonarQube 연동 불량 코드 자동 차단 시스템 Quality Gate 아무리 빠르고 완벽한 CI/CD 배포 파이프라인을 구축했다 한들, 개발자가 푸시한 코드 내부에 심각한 보안 취약점이나 NullPointerException을 유발할 버그가 숨어있다면 무슨 소용일까요? 버그가 듬뿍 담긴 코드를 운영 서버에 가장 빠르고 정확하게 꽂아 넣는 '자동화된 재앙 생성기'로 전락할 뿐입니다. 진정한 데브옵스(DevOps)는 단순히 배포만 해주는 것이 아니라, 품질 기준에 미달하는 쓰레기 코드(Bad Code)가 감지되면 그 즉시 파이프라인의 목을 비틀어 빌드를 강제 중단(Abort)시키는 무자비한 문지기 역할을 해야 합니다. 이번 포스트에서는 전 세계 정적 코드 분석 시장의 절대 강자인 SonarQube(소나큐브)를 젠킨스와 연동하여, 완벽한 'Quality Gate(품질 게이트)'.. [Jenkins] 병렬 빌드로 파이프라인 속도 혁신하기(Parallel Build) 파이프라인을 성공적으로 구축하고 자동화의 기쁨을 누리는 것도 잠시, 프로젝트의 덩치가 커지면서 빌드 시간이 점점 늘어나기 시작합니다. 프론트엔드 빌드 5분, 백엔드 스프링 빌드 5분, 유닛 테스트 5분, E2E 테스트 10분... 코드를 하나 푸시하고 나서 무려 25분을 기다려야 배포가 완료된다면 개발팀의 생산성은 바닥을 칠 것입니다. 이번 포스트에서는 "시간이 돈"인 현대 소프트웨어 개발 환경에서 가장 적은 노력으로 빌드 시간을 드라마틱하게 반토막 내버리는 '병렬(Parallel) 처리 기법'에 대하여 다뤄보겠습니다.1. 직렬 빌드의 치명적인 병목 현상기본적으로 젠킨스의 stages 블록 안에 적힌 stage들은 위에서 아래로 순차적(직렬)으로 실행됩니다. 앞의 작업이 끝나야만 뒤의 작업이 시작될 수 .. [Jenkins] 멀티브랜치 파이프라인 무한 증식 브랜치 자동화 우리는 지금까지 단일 파이프라인(Pipeline) Job을 생성하여 빌드하는 법을 배웠습니다. 하지만 현대 소프트웨어 개발은 GIT Flow나 Github Flow를 기반으로, 기능(Feature) 하나를 개발할 때마다 새로운 브랜치를 수십 개씩 파고(Branching) 합치는(Merge) 과정을 밥 먹듯이 반복합니다. 만약 새로운 브랜치가 생성될 때마다 젠킨스 관리자가 웹 UI에 접속해서 "새 잡(Job) 만들기 -> 복사하기 -> 브랜치명 수정" 노가다를 하고 있다면, 그것은 파이프라인이 아니라 수동 라인입니다. 이 포스트에서는 인프라 관리자의 잡(Job) 복제 스트레스를 0으로 만들어버리는 Multibranch Pipeline(다중 브랜치 파이프라인)의 엄청난 자동 발견(Auto Discovery).. [Jenkins] 젠킨스 워크스페이스 완벽 청소 가이드 (디스크풀 대응) 젠킨스를 도입하여 무중단 자동화 배포 파이프라인의 달콤함을 맛보고 있을 무렵, 보통 서비스 런칭 3개월에서 6개월 차 쯤에 모두가 똑같이 겪게 되는 거대한 재앙이 하나 찾아옵니다. 개발자가 코드를 푸시했는데 젠킨스가 아무런 응답을 하지 않고 뻗어버리는 현상입니다. 황급히 서버에 들어가 로그를 확인해 보면 어김없이 "No space left on device" (디스크 용량 100% 초과)라는 끔찍한 에러가 붉게 물들어 있습니다. 원인은 바로 젠킨스의 작업 공간인 Workspace(워크스페이스) 관리에 실패했기 때문입니다. 이 글에서는 인프라 관리자의 수명을 갉아먹는 이 고질적인 문제를 원천 봉쇄하고, Workspace Cleanup 플러그인을 활용하여 항상 쾌적하고 깔끔한 서버 환경을 유지하는 실무 최적.. [Spring Boot] application.yml 완벽 가이드 (+ Profile 환경 분리) 스프링 부트(Spring Boot)로 개발을 진행하다 보면 필연적으로 데이터베이스 접속 IP, 비밀번호, 외부 결제 API 연동 키(Key) 등 수많은 '설정(Configuration) 데이터'를 다루게 됩니다. 초보 개발자들은 흔히 자바(Java) 코드 안에 String dbUrl = "jdbc:mysql://localhost:3306..." 처럼 값을 하드코딩(Hard-coding)하는 실수를 저지릅니다. 이렇게 코드를 짜면, 내 노트북(로컬)에서는 잘 돌던 프로그램이, IP가 완전히 다른 실제 라이브 운영(Production) 서버에 배포되는 순간 데이터베이스를 찾지 못하고 펑 터져버립니다. 배포할 때마다 소스코드를 열어서 주석 처리하고 IP를 고쳐서 빌드하실 건가요? 이런 원시적인 작업을 우아하게.. [Jenkins] When 조건문으로 스테이지 완벽 제어하기 동적 파이프라인 구축 파이프라인 매개변수(Parameters)를 통해 외부에서 동적인 값을 주입받는 방법을 익혔다면, 이제 그 값에 따라 파이프라인의 물줄기를 요리조리 바꾸는 방법을 알아야 합니다. 만약 매개변수 설정만 해두고 if-else 문 같은 로직 분기를 태우지 않는다면 매개변수는 그저 화면에 찍히는 의미 없는 문자에 불과합니다.본 글에서는 Declarative Pipeline의 꽃이자, 하나의 파일로 수십 가지의 배포 시나리오를 감당하게 해주는 강력한 무기인 'when' 조건문의 완벽한 활용법과 다양한 실무 예제들을 다뤄보겠습니다. 이 글을 마스터하시면 더 이상 브랜치별로 수많은 잡(Job)을 복사/붙여넣기 하는 고통에서 영원히 해방될 수 있습니다.1. 왜 if-else 문을 쓰지 않고 when을 쓰는가?과거 Scr.. [Jenkins] Pipeline의 시작 Scripted vs Declarative 문법 완벽 가이드 과거의 젠킨스는 '마우스 클릭'으로 모든 것을 설정하는 Freestyle Project가 주류였습니다. 하지만 마이크로서비스 아키텍처(MSA)가 도입되고 배포 파이프라인이 수십 개의 스테이지로 복잡해지면서, 더 이상 GUI 화면만으로는 분기 처리나 예외 처리 같은 고도화된 로직을 감당할 수 없게 되었습니다. 그래서 등장한 것이 바로 '코드로 파이프라인을 작성(Pipeline as Code)'하는 방식입니다.본 가이드에서는 젠킨스 파이프라인 구축의 기초부터 실무 핵심 요소인 1) Scripted vs Declarative 문법 비교, 2) Jenkinsfile을 활용한 형상 관리(IaC), 3) Docker 기반 격리 에이전트(Agent) 설정, 4) 보안 자격 증명(Credentials)과 환경변수(En.. ← 이전 1 2 3 4 다음 →