본문 바로가기
728x90

전체 글85

[MSA / Jenkins / Docker] Window Server OS에서 Jenkins 빌드/배포 자동화 구축(feat. Docker Toolbox, VirtualBox, CI/CD) ▼ 이전 글에서, Window Server OS에서 Docker와 VirtualBox를 같이 사용할 수 있도록 Docker Toolbox와 Jenkins를 설치했다. [MSA / Jenkins / Docker] Window Server OS에서 Jenkins 설치 (feat. Docker Toolbox, VirtualBox) ▼ 이전 글에서는, Window 환경에서 Docker Desktop을 활용하여 Jenkins를 설치하고 빌드/배포 자동화를 구축하였다. [MSA / Jenkins / Gitea] Webhook 이벤트 감지와 Jenkins 파이프라인을 통한 빌드/배포 자동화 devlifetestcase.tistory.com 설치를 진행하였으니, 이제 Jenkins를 사용해볼 차례다. 우선, 진행과정은.. 2023. 5. 4.
[MSA / Jenkins / Docker] Window Server OS에서 Jenkins 설치 (feat. Docker Toolbox, VirtualBox) ▼ 이전 글에서는, Window 환경에서 Docker Desktop을 활용하여 Jenkins를 설치하고 빌드/배포 자동화를 구축하였다. [MSA / Jenkins / Gitea] Webhook 이벤트 감지와 Jenkins 파이프라인을 통한 빌드/배포 자동화 방법 A to Z(feat MSA 프로젝트를 진행하며, 코드를 수정하고 반영할 때마다 각각의 서비스를 수동적으로 다시 빌드하고 컨테이너로 올려야 하는 문제를 해결하기 위해, 빌드/배포를 자동화하도록 Jenkins를 도입하 devlifetestcase.tistory.com 그러나 Jenkins, Docker는 개발자의 로컬 PC가 아닌 서버에 설치가 되어야 하고 CI/CD 환경도 서버에 구축되어야 한다. 개발자는 IDE에서 코드만 작성하면 되도록 말이다.. 2023. 5. 3.
[MSA / Jenkins / Gitea] Webhook 이벤트 감지와 Jenkins 파이프라인을 통한 빌드/배포 자동화 방법 A to Z(feat. CI/CD) MSA 프로젝트를 진행하며, 코드를 수정하고 반영할 때마다 각각의 서비스를 수동적으로 다시 빌드하고 컨테이너로 올려야 하는 문제를 해결하기 위해, 빌드/배포를 자동화하도록 Jenkins를 도입하여 구축하게 되었다. ▼ 이를 위해 이전 글에서 Docker Desktop을 통해 Jenkins를 설치했다. [MSA / Jenkins / Docker] Docker Desktop에 Jenkins 설치 방법 A to Z(feat. CI/CD) MSA 프로젝트를 진행하면서, 여러 개의 서비스를 일일히 실행하고 관리해야하는 번거로움을 탈피하기 위해서, 계획과는 다르게 Docker를 빠르게 도입하게 되었다. 그리고, 한번에 실행하고 관리할 devlifetestcase.tistory.com 이제 설치한 Jenkins를 활.. 2023. 5. 3.
[MSA / Jenkins / Docker] Docker Desktop에 Jenkins 설치 방법 A to Z(feat. CI/CD) MSA 프로젝트를 진행하면서, 여러 개의 서비스를 일일히 실행하고 관리해야하는 번거로움을 탈피하기 위해서, 계획과는 다르게 Docker를 빠르게 도입하게 되었다. 그리고, 한번에 실행하고 관리할 수 있게 Docker-Compose까지 구축하게 되었다. 이를 통해서, IDE나 cmd로 각각의 서비스를 관리하는 번거로움에서 벗어날 수 있게 되었다. 그렇다면 문제가 해결된 것일까? 그렇지 않다! 하루는 팀원이 질문을 했다. Q. 그러면, 코드 수정하거나 pull하고 나면 다시 빌드하고 컨테이너로 올려야 하는거에요? 전부 다? A. 네... 불편하긴 했지만, 구축하면서 Docker에 익숙해졌던 나는 그냥 별 생각 없이 추가 서비스를 강행해서 개발하고 있었는데, 위의 질문을 받고 이건 아니다 싶었다. 그래서 CI.. 2023. 5. 3.
[MSA / Docker] Local Private Registry 생성하기 이전에 Dockerfile을 작성할 때 FROM으로 Docker Hub에서 Docker 이미지를 불러와서 Docker 이미지를 생성하도록 했다. 그런데 이 도커 이미지에 대해서 생각해볼 필요가 있다. 현재는 테스트로 개개인이 docker를 따로 설치하여 쓰고 있는데, 원래는 서버에 docker를 설치하고 개인은 코드만 git에 올리면 서버에서 알아서 처리되도록 해야한다. 필요 시에는 개인도 docker를 설치해서 서버의 도커이미지를 불러와 사용하도록 해야한다. 그래야 이미지 중복을 막고 개발 환경이 간편해진다. 그러면 이제 도커이미지를 어디에 올릴것인가가 관건이다. 프로젝트는 VCS로 공유하고 관리한다. 그 중에서도 Github가 대표적인 예시라고 할 수 있다. 도커는 그럼 어디에서 공유할 수 있을까? .. 2023. 4. 25.
[MSA / Spring Cloud / Docker / jsp] jsp 프로젝트를 Docker Container에 올리기(feat. war & jar) Spring Boot로 작성된 프로젝트를 JAR로 패키징하여 Docker 컨테이너로 올리는 것은 자료도 많고, 큰 막힘 없이 잘 된다. 그러나 레거시 환경으로 개발하던 팀에게, 기존 환경으로도 MSA 구성이 가능하다는 것을 보여주기 위해서는 thymeleaf같은 호환되는 템플릿 엔진이 아닌 기존의 jsp를 사용하는 프로젝트도 개발해서 연동해야했다. 그리고 Docker 까지 사용하게 되었으니 이 프로젝트도 도커 컨테이너로 올릴 수 있어야 했다. 이것이 큰 과제가 되었다. - 실패 경험 - 일단 진행하면서 가장 처음으로 만난 문제는, Spring Boot가 기본적으로 jsp를 지양한다는 문제이다. 그렇기 때문에 별도 설정을 통해 프로젝트에 jsp 경로를 지정해주어야만 jsp를 사용할 수 있다. spring:.. 2023. 4. 24.
[MSA / Spring Cloud / Docker] 여러 가지 조건을 적용한 Docker Compose 구축 Why Docker Compose ? 왜 Docker Compose를 쓰게 되었는가? 그것은 이전 글에서 밝혔듯이 모든 프로젝트(서비스)를 IDE에서 관리하는 것은 필요도 없고, 비효율적이고 불편했기 때문이다. 그리고 Docker를 실무에서 사용해보고 싶은 마음이 컸는데, ChatGPT가 Docker Compose를 사용해보라는 답변까지 주었기 때문에 사용하게 되었다. 그러면 Docker는 무엇인가? 그것은 이미 많은 답변이 있다. 하지만, VMware로 가상머신을 사용했던 나로서는 기존 설명들이 너무 이론적으로만 느껴져서, 비유를 통해 쉽게 이해해보기로 했다. 일단 컨테이너를 올린 것은, 새로운 VM을 만든 것과 유사하다고 생각하면 첫 접근이 쉽다. 큰 차이가 느껴지지 않기 때문이다. 다만, 여기서 V.. 2023. 4. 24.
[MSA / Spring Cloud / Eclipse] MSA 구성을 위한 Eclipse와 IntelliJ의 차이(feat. 도커 도입 배경) 장인은 도구를 탓하지 않는다 (물론, 내가 장인이라는 뜻은 절대 아님) 내 주도로 MSA를 활용해 팀 프로젝트를 하게 되었으니, 팀원이 납득할 수 있는 환경을 조성해야 했다. 습득한 환경은 IntelliJ 였지만, 팀원들에게 유료의 IntelliJ를 권할 수는 없었다. 언어도 선택이듯이, IDE도 선택이다. IDE는 도구에 불과한 것이지 환경에 종속되어서는 안된다. 그래서 팀에서 기존으로 쓰던 IDE인 Eclipse에서 MSA 개발 환경을 구축해야했다. Eclipse에서 Spring Boot 프로젝트는 어떻게 생성하고, 프로젝트 관리는 어떻게 해야할까. Eclipse에서는 레거시 환경만 구성해보았기에 고민이 되었지만, 그간의 경험이 있으니 일단 부딪혀 보기로 했다. 그런데 생각보다 어렵지도 않았고, 프로.. 2023. 4. 24.
[MSA] Microservice Architecture 구축에 들어가며, [ Prologue ] 풀스택 개발자로 취업했지만, 게임 개발로 프로그래밍을 처음 접했던 나로서는, 기능 구현 위주의 코드를 작성하고 나면 항상 2% 부족한 기분이 들었다. C++ 교육과 정보처리기사 취득 과정에서 익힌 객체 지향, 재사용성과 유지보수성이라는 개념이 항상 마음 한 켠에 남았기 때문이다. 부족한 프로젝트 일정은, 구현 위주의 하드 코딩을 유도했고, 나중으로 미루자며 리팩토링을 방해했다. 그럼에도 코드를 최대한 다듬어보자며, 메소드를 생성하고 클래스를 나누었지만 한계가 있었다. 운이 없었던 것인지 개발자 대부분 그런 것인지는 모르겠지만, 이를 같이 생각해보고 배울 수 있는 사람도 최근까지는 만날 수 없었다. 숙명이라 생각하고 혼자 개발 공부를 시작했는데, 다행히도 최근 몇 년간 양질의 인터넷.. 2023. 4. 18.
[Spring / Legacy / JSTL / JSP] Custom Tag를 이용해 JSP에서 사용할 사용자 함수 구현하기(feat. tld파일 작성법) Spring Legacy 프로젝트에서는 JSP를 템플릿 엔진으로 흔히 사용하는데, 이 때 서버단에서 받아온 데이터를 활용하기 위해 EL과 JSTL을 사용한다. 주로 사용되는 것이 core와 functions로 각각 c와 fn으로 prefix를 등록해 , 등을 활용해 데이터를 보여준다. 그런데 가끔 Java에서 제공하는 함수를 JSP에서도 사용하고 싶은데, JSTL에서는 제공되지 않아 아쉬운 경우가 있곤 했다. 예를 들어 Java Collection 중 List는 contains 함수를 제공하는데 JSTL에서는 제공되지 않기 때문에 를 활용해 반복문을 돌려서 찾는 식으로 처리하기도 했다. 그러다 문득, model1방식으로는 Java 코드를 직접 JSP에 작성했는데, 어떤 방법이 있지 않을까하는 생각이 떠올.. 2023. 2. 28.
[Github / IntelliJ] IntelliJ에서 Git Repository 연결 끊기 및 삭제하기 강의를 들으며 프로젝트를 만들어보다가 Github에 이미 등록된 프로젝트의 레퍼지토리를 삭제하고, 새로 올리고 싶었는데 사용 경험이 적다보니 마음처럼 잘 되지 않았다. 특히 처음에는 Github에서 repository를 삭제하였는데도 IntelliJ에서는 연결이 끊기지 않아 의아했다. 그래도 원인은 금방 떠올랐는데 로컬저장소에 남아있기 때문이라고 생각했다. 이 때, 로컬저장소를 지우는 명령어를 실행했어야 했는데... 바보 같이도 프로젝트 디렉토리에서 .git폴더와 .gitignore 파일처럼 git 관련 파일을 직접 지웠다... 그렇게 파일이 다 지워지긴 했지만, IntelliJ의 Git 연결은 끊기지 않았다. 여러 시행착오 끝에 IntelliJ 자체에서 연결을 끊는 방법을 발견했지만, 연결을 끊은 후 .. 2023. 2. 28.
[Spring Boot / Maven / Error] java: package org.junit.jupiter.api does not exist 에러 해결 Spring Boot로 Maven 프로젝트를 IntelliJ에서 진행하는 도중 해당 오류가 발생했다. 오류 내용은 2가지였다. 일반 콘솔창에서는 아래 오류가 발생했고, could not find or load main class com.example.XXservice.XXserviceapplication 빌드 창에서는 아래 오류가 발생했다. java: package org.junit.jupiter.api does not exist 일단 부연 설명으로, 이 프로젝트는 이전에 잘 동작했었는데 강의를 따라 진행하다가 갑자기 오류가 발생하며 프로젝트를 실행할 수 없게 되었다. 그러나 대충 어떤 원인으로 발생했는지는 느낌이 온다. 오류가 발생하기 전에, 터미널에서 maven으로 해당 프로젝트 경로에서 빌드한 것을.. 2023. 2. 8.
[Spring / Legacy] 다중 정렬 기능 구현(feat. Mapper XML 파일에서 List 처리 방법) Spring Legacy 프로젝트를 구현하면서, 정렬 기능은 흔하게 구현하는 기능이다. 간단하게는 쿼리에서 ORDER BY를 통해 쉽게 처리 가능하다. 그러나 이번에 구현할 기능은, 다중 정렬 기능이다. 별다른 기능은 아니고 여러 개를 동시에 정렬하는 기능이다. 위 이미지처럼 하나의 컬럼이 오름차순 정렬이 되어 있어도 다른 컬럼의 오름차순 정렬이 동작하는 기능이다. 여기까지만 생각하면, 그냥 리스트에 담아서 처리하거나 null 예외 처리 등으로 바로 쿼리의 ORDER BY에 대입하여 처리하면 될 것이다. 그러나 기능을 좀 더 분석해보기로 했다. 그 결과, 가장 마지막으로 선택한 Column을 최우선 순위로 하여 정렬하는 모습을 발견할 수 있었다. 당연하게도 ORDER BY는 가장 앞 순위의 컬럼부터 정렬.. 2023. 2. 7.
[JSP / JSTL / Javascript] 내용 전달 기능 구현을 위한 contenteditable 속성 이용해보기(feat. textarea) 프로젝트를 진행하면서 기획에 새로운 기능이 추가되었다. 바로, 내용 전달 기능... 화면 기획서에 전달 버튼 하나를 추가했을 뿐이라고 오늘도 기획자는 간단하게만 생각한다. 기획을 할 때 뒷단의 동작을 전혀 고려하지 않는데 이것이 참으로 사람을 힘들게 한다... 아무튼, 계속 질문을 던져서 정의된 동작은 Outlook이나 메일에서의 내용 공유 전달이었다. 그래서 기존 문서의 작성자, 수신자, 내용, 댓글까지 전부 신규 문서의 내용으로 복사가 되도록 기능을 구현하기로 했다. 문제는 textarea... 메일도 아니고, 단순 내용 작성이라 에디터를 사용하지 않기로 했다. 그렇기 때문에 퍼블리싱 작업도 textarea로 간단하게 처리되어 왔다. 그러나 textarea는 큰 문제가 있었는데... 일단 첫 번째로,.. 2023. 1. 4.
[Spring / API] Spring Legacy 환경에서 API KEY 관리하기(feat.properties 파일 여러 개 관리) 프로젝트를 하면서 팀원들이 각각 개발을 진행하다보니, 동일한 API의 키를 각자 신청해서 사용하고 있는 것을 알게 되었다. 이를 통합적으로 관리할 필요성을 느꼈고, 어떻게 관리하는 게 좋을지 고민했다. 일단 현재 상태에서 중요성은 낮은 편이라 깊게 고민하진 않았고, 그저 스쳐가는 생각으로, class로 처리할지, property 파일로 처리할지. 이 2가지 만을 놓고 고민했다. 둘 다 장단이 있겠지만, 결론만 말하자면 property 파일로 처리하는 방법을 선택했다. 그 이유는 다음과 같다. 1. 형상 관리를 할 때 키 정보를 제외하고 싶은 경우, property 파일만 ignore하면 되도록 설정하면 좋을 것 같았다. 2. 싱글톤 패턴 등으로 디자인한다고 해도 여기저기서 class를 호출해서 쓰는 것보.. 2022. 11. 30.
[CSS] DIV안의 DIV를 세로 가운데 정렬하는 방법 2가지(2022 최신 작성) 개발자인 나에게 css는 여러모로 스트레스를 주는 요소이다. 그럼에도 한 가지를 어쩌다 배우게 되면, 아이러니하게도 또 나름의 재미를 줘서 애증의 관계라고 생각한다. 평소에는 복잡한 css를 작성할 일도 없고, 구글링과 table 태그를 사용해서 어려운 부분이 거의 쉽게 해결되기 때문에 문제가 없었다. 그러나 이번에는 프로젝트 상황이 좀 꼬여서, 개발을 위해 조금 복잡한 css를 작성해야할 일이 생겼다. 물론 이것도 다른 방식으로 쉽게 처리할 수 있었겠지만, 이상하게도 오늘은 싸움을 피하고 싶지 않았다... 물론 지원군이 없었다면 어김없이 패배했을 것이다. 아무튼 원하는 기능은 아래와 같다. 제목 내용 확인 내용 일단, 구현하려는 형태는 위와 같다. 전체 내용은 co.. 2022. 11. 30.
[Java] Server IP와 Client IP를 조회하는 방법 A to Z(feat. virtualbox host-only network ip) Scheduler 기능을 구현하면서 IP 관련해서 처리할 필요가 생겼다. 스케줄러 기능을 구현해놓고 따로 처리하지 않을 시에는, 개발 PC들과 서버 PC 모두에서 스케줄러가 동작해 중복으로 작업이 처리될 것이기 때문이다. 다른 방법도 있겠지만, 나는 일단 IP로 처리하기로 했다. 스케줄러 동작 시에 현재 PC의 IP를 조회하고, IP가 서버 IP라면 스케줄러 기능이 동작하도록 말이다. 문제는 처음에 생각을 잘못해서 IP 조회를 Client IP를 획득하는 방식으로 했다는 것인데, 이 경우 모두 Localhost IP로 받아와지기 때문에 동일하게 처리된다. 또 다른 문제는, Client IP를 획득하려면 HttpServletRequest 의 데이터가 필요한데, 스케줄러로 동작 시에는 요청 시 필요한 데이터.. 2022. 11. 25.
[PostGIS / Error] ST_X(public.geometry) 이름의 함수가 없음 PostGIS로 좌표를 읽어, 데이터를 처리하는 도중 문제가 발생했다. ERROR 내용은 다음과 같았다. st_x(public.geometry) 이름의 함수가 없음 Hint: 지정된 이름 및 인자 자료형과 일치하는 함수가 없습니다. 명시적 형변환자를 추가해야 할 수도 있습니다. 일단 처음에는 Hint대로 명시적 형변환자를 추가해주기로 했다. SELECT ST_X(location)::real as lat ST_Y(location)::real as lon FROM tb_test WHERE location IS NOT NULL 원래는 ::real 없이 쿼리를 작성하였는데, ::라는 postgresql의 형변환 기능을 이용해 real 타입의 명시적 형변환을 해주었다. 하지만 에러는 여전히 동일하게 발생하였다. .. 2022. 11. 23.
반응형