전체 글
Git submodule 사용시gradle 의존성 명시 누락으로 인한 오류(contextLoads() FAILED, java.lang.IllegalArgumentException)
상황 submodule로 application.yml 파일을 관리하려고 구현하였지만, build에 실패하였다. test 수행시 IllegalStateException으로 인해 contextLoads에 실패하였고 UrlumberjackApplicationTests > contextLoads() FAILED java.lang.IllegalStateException at DefaultCacheAwareContextLoaderDelegate.java:142 Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException at ConstructorResolver.java:800 Caused by: org.springframework.beans..
TCP/IP와 HTTP에 대하여
0. 들어가며 TCP프로토콜은 OSI 4계층, IP프로토콜은 3계층에 위치합니다. 그리고 HTTP 프토토콜은 7계층에 속하지만, TCP/IP에 의존적인 프토콜입니다. 그렇다면 HTTP 프로토콜과 TCP프로토콜은 어떤 차이가 있을지 알아보도록 하겠습니다. 1. TCP/IP 흔히 TCP/IP 라고 묶어서 부르지만, 각각 다른 프로토콜입니다. 하나씩 간단히 보도록 하겠습니다. IP 프로토콜 IP프로토콜은 지정한 IP주소에 데이터를 패킷 이라는 통신 단위로 전달하는 역할을 합니다. 단, 목적지까지 패킷의 순서와 도착을 보장하지 않습니다. 그리고 연결과 관련된 상태 정보도 유지하지 않습니다. 그리고 IP 패킷은 헤더와 데이터필드로 나뉘게 됩니다. 데이터 필드는 상위 계층에서 전달된 PDU가 삽입되며, 헤더필드는 ..
[IntelliJ] codeStyle - naver code convention 적용하기
0. 개요 coding convention? 소스코드의 작성 규칙을 정의한 것입니다. 소스코드의 일관성을 유지할 수 있고, 같은 규칙을 공유하는 팀원들이라면 빠르게 읽고 이해할 수 있어 유지보수에 도움을 줍니다. [네이버 핵데이 자바 코딩 컨벤션 내용 확인하기] [네이버 핵데이 자바 코딩 컨벤션 git repo] 어떻게 적용할까? 정적 코드 분석 도구를 사용해 적용합니다. 이를 사용해 적용하게 되면, 규칙에 알맞지 않은 코드가 존재할 시 컴파일이 되지 않도록 설정할 수 있습니다. 정적 분석 도구란? 소스코드, 바이너리 코드를 분석해 버그 및 취약점을 찾아내는 도구입니다. 컴파일 하지 않고 코드 자체를 분석하므로, 코딩 컨벤션의 규칙을 확인하기에 알맞습니다. 대표적으로 Checkstyle이 있습니다. 적용..
Github Action으로 CI/CD 구축하기
0. 개요 기존에 젠킨스를 통해 CI/CD를 구축을 해 보았었는데 이래저래 설치 및 설정에 상당한 시간이 소요되었었습니다. 그래서 이번엔 별도 서버 구축도 필요 없고, 간단하게 yaml작성으로 CI/CD를 구현할 수 있는 Github Action으로 CI/CD를 구축해 보았습니다. 1. Github Action 이란? Github repo를 기반으로 한 Workflow 자동화 도구입니다. 간단한 YMAL 작성을 통해 빌드, 테스트, 릴리즈, 배포가 가능합니다. 그리고 market place라는게 활성화되어 있어, 본인이 직접 작성하지 않더라도 다른 개발자가 작성한 yaml을 참조하거나 불러와서 자유롭게 사용할 수 있습니다. 더보기 YAML이란? 들여쓰기와 키-값 쌍의 계층 구조를 사용해 데이터 구조를 나..
Git submodule을 통해 application.yml 관리를 해보자!
0. 개요 프로젝트를 진행하는데, application.yml 파일을 관리를 어떻게 해야할지 고민이 되었습니다. 프로젝트 repo가 public이여서 원격 저장소에 설정파일을 올릴 순 없고, 매번 yml파일을 어딘가 저장해놨다가 불어와서 쓰기에는 번거롭고 형상관리에 문제점이 많았습니다. github secret으로 관리할경우 히스토리 관리가 전혀 되지가 않았고, 별도로 설정값을 저장해서 불러오는 API서버나 DB를 운용하기엔 시간과 노력이 너무 많이 들어가게 되는것 같았습니다. 그래서, 프로젝트 repo에 하위 repo를 등록해 사용하는 git submodule을 사용해보게 되었습니다. 1. submodule 사용시 장점 매우 간단하다. 프로젝트에 서브모듈을 등록하고, 최신화는 깃 명령어 한줄씩만 입력하..
Spring boot 서버를 쉘스크립트 배포하기
0. 개요 지난번 글에선 서버에서 직접 커맨드 명령어를 사용해 spring boot 서버를 빌드/배포했었습니다. 이번에는 스크립트를 실행하는 한번의 명령어로 spring boot 서버를 빌드/배포 할 수 있도록, 쉘 스크립트를 짜보면서 남긴 기록입니다. 1. 쉘 스크립트란? 저번에는 서버에서 여러 줄의 Unix 커맨드를 통해 spring boot 서버를 빌드하고 배포했었습니다. git에서 소스를 끌어 오고, gradlew로 빌드 하고, 만약 서버가 실행중이라면 배포를 위해 종료하고, nohup 명령어로 백그라운드에서 실행시키고... 배포할때마다 매번 반복해서 입력해야 하는 명렁어들을 하나의 파일로 작성해, 나란히 실행시킬 수 있도록 하는 것이 바로 쉘 스크립트 입니다. 2. 작성하기 작성하면서 생각한 포..
Spring - MyBatis 설정하기
0. 개요 개인 프로젝트를 할 때, 블로그 글을 보고 복사-붛여넣기로 의존성 설정을 해왔었는데요, 이번엔 좀 정확한 정보를 직접 보고 판단해서 설정하도록 공식문서를 보면서 의존성 설정을 하게 됬습니다. 1. 의존성 설정 Spring boot에서 DB툴로 MyBatis를 사용하기 위해서는 총 두개의 의존성 설정을 해 주어야 합니다. 하나는 MyBatis이고 하나는 MySQL Connector JAVA 입니다. MyBatis 의존성 설정을 통해 MyBatis와 Spring Boot의 통합 설정이 자동으로 이루어지고, MyBatis의 기능을 Spring Boot 애플리케이션에서 사용할 수 있게 됩니다. 그리고 MySQL Connector JAVA 의존성 설정을 통해 java 애플리케이션에서 MySQL 데이터베..
[MySQL-MyBatis] insert후 pk를 반환하는 selectKey와 useGeneratedKey의 동시성 이슈
0. 개요 MyBatis를 쓰면서 INSERT된 행의 PK를 획득해야할 일이 자주 있습니다. 이럴때 사용하는 방법이 두 종류인데요, selectKey구문과 insert 구문의 속성인 useGeneratedKeys입니다. 이중 하나가 동시성 이슈가 있다는 말을 들어서 찾아보게 되었습니다. 1. SelectKey INSERT INTO... SELECT LAST_INSERT_ID()
[단축 URL 프로젝트 URLumberjack] - NCP DB서버 구축(MySQL 설치 및 설정)
0. 개요 Application 서버 환경 구축에 이어서 DB서버에 MySQL을 설치하고 설정해 보도록 하겠습니다. 1. 설치할 버전 확인하기 APT로 설치 apt 저장소에는 5.7버전으로, 현재 8버전까지 릴리즈 된 것에 비해 상당히 버전이 낮습니다. 참고로, 8버전은 16년도에 첫 릴리즈 되었습니다 [릴리즈 정보 확인하기] 5.7버전은 너무 낮다고 생각이 되어서, 8버전을 설치해보도록 하겠습니다. 우선 릴리즈된 버전을 확인합니다. [APT Repo MySQL 확인] 0.8.25-1로 설치하면 되겠군요. 2. MySQL APT 저장소 추가 $ wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.25-1_all.deb $ sudo dpkg -i mysql-a..
[단축 URL 프로젝트 URLumberjack] NCP Application서버 구축(JAVA, Gradle, Docker 설치)
0. 개요 Ubuntu-18.0.2환경 하에서 서버 구성요소 최신화, JAVA 17설치, Gradle설치, Docker 설치를 진행하는 글입니다. github action 구축 전 빌드 테스트를 위해 Java와 Gradle을 설치하고, 구축이후 Docker image를 실행하기 위해 Docker를 미리 설치합니다. 1. 서버 구성요소 최신화 apt-get update //업그레이드 가능한 리스트 업데데이트 sudo apt-get upgrade // 최신버전 업그레이드 2. JAVA OpenJDK17 설치 설치하기 설치는 다음의 명렁어를 입력해 진행합니다. $ apt-cache search openjdk $ apt-get install openjdk-17-jdk $ apt-get install openjd..
[NCP] Naver Cloud Platform VPN 발급 및 접속방법
0. 개요 현재 진행하는 프로젝트 서버는 NCP의 인스턴스로 구축했습니다. 서비스 도메인 접근은 이후에 public ip를 발급받아서 사용할 예정입니다. 그러나, 서버 구축을 위해 접근은 VPN을 사용하는것으로 결정했습니다. VPN 등록을 하게된 이유 vpc 서버는 월 10만원으로 비싸지만, 클래식은 1차 인증 3개 계정까지 월 9천원으로 합리적 사용 가능 2차인증은 ID-pw에 더불어 OTP 까지 설정 가능하지만, 1차로 충분하다고 생각 SSL암호화 접속 보호에 더불어 라우팅/ACG로 허용된 사용자만 접근이 가능해 보안이 우수 회사 컴퓨터, 맥북, 윈도우 데스크탑 등 접속하는 환경이 다양해 모든 pc에 pem키를 보유하는거보다 VPN접근이 더 간편 서비스 배포 전 추가적인 보안설정에 신경쓰지 않아도 됨..
[단축 URL 프로젝트 URLumberjack] NCP 인스턴스 생성
0. 개요 이번 글은 NCP로 Application 서버와 DB 서버를 구축 과정을 담은 글입니다. 1. 공통 - 인스턴스 생성 메인회면에서 오른쪽 상단의 세줄짜리 목록 아이콘을 클릭합니다. 출력된 하면에서 서비스 - 컴퓨터 - 서버를 클릭합니다. 그럼 서버 서비스에 대한 소개페이지로 이동하게 됩니다. 서버 스펙을 아직 정하지 않았거나, 고민중이시라면 해당 화면에서 서버 스펙과 요금이 친절하게 설명되어 있으니, 보고 결정하시면 되겠습니다. 서버를 생성하시려면 이용신청하기를 누르시면 됩니다. 이용 신청하기 버튼을 누르면 콘솔의 server화면으로 넘어오게 됩니다. 여기서 구축할 인스턴스를 1세대 또는 2세대를 선택해 아래의 서버생성 버튼을 누르면 됩니다. 저는 1세대 서버를 생성하도록 하겠습니다. 2. ..
[단축 URL 프로젝트 URLumberjack] - NCP 스펙 정의
0. 개요 정말 감사하게도 NCP 크레딧을 지원받을 수 있게 되었습니다. 덕분에 infra 구축에 가장 큰 난관인 비용문제를 해결 할 수 있게 되었습니다! 더불어서 이전 NCP 사용경험도 있어서 NCP로 Infra를 구축하게 되었습니다. UI/UX도 정말 깔끔하고, 한글 공식문서까지 제공되어서 정말 좋습니다. 이 글은 NCP 인프라를 구축하면서 고민한 서버 스펙에 대한 내용입니다. 1. Application 서버 Claasic 1gen Compact-g1 server 선택 이유 1차 개발단계의 목표는 서비스 개발 1차 개발목표는 우선 핵심 서비스 개발에 있습니다. 그렇기 때문에, 비용이 저렴한 작은 서버에서 시작해 이후 scale out을 하는 방향으로 가닥을 잡았습니다. 서버 이미지를 사용하면 scal..
[단축 URL 프로젝트 URLumberjack] - 기타 규칙 정의
0. 개요 서버 및 기술외에 프로젝트에 필요한 가이드라인이나 도구를 선택한 이유과 근거를 작성했습니다. 1. API 문서화 툴/프레임워크 RestDocs Swagger를 문서화 툴이라고 하기에는 조금 애매하지만, API별로 테스트도 가능하면서 API에 대한 스펙을 출력해주기에 RestDocs와 비교를 해 보았습니다. RestDocs를 선택한 이유는 다음과 같습니다. 스웨거만 사용해 봤기에, 사용해보지 않은 RestDocs에 관심이 갔습니다. 테스트코드를 작성하며 진행할 것이므로, 문서작성에 반드시 테스트코드가 필요한 RestDocs를 유지하는데 문제가 없을것이라 판단했습니다. RestDocs는 문서화를 위해 많은 클래스를 유지관리 해야 합니다. 그러나, Swagger는 프로덕션 코드가 지저분해지고, 이를..
[단축 URL 프로젝트 URLumberjack] - 기술 스택 정의
0. 개요 1. 기술 스택 Overview 1. Java 17버전 선택 이유 IT업계의 흐름을 따라가려면 높은 버전을 사용해야 한다 버전이 높아진 다는것은 코드 작성 더 간편하게, 안정성과 성능을 향상시킬 수 있도록 변화하는 것입니다. 굳이 잘 쓰고 있는데 바꿀 필요가 있나? 가 아니라, 적극적으로 학습하기 위해서 선택하였습니다. Java17은 LTS버전으로, 지원기간이 상당히 길다 java11은 26년까지 지원하며, java8은 30년까지 지원합니다. java17은 29년까지 지원으로 java8 급으로 안정적으로 사용할 수 있습니다. JAVA 출시 주기가 고정되어 명확해졌다 이제 JAVA의 출시 주기가 고정화 되어서 업데이트 지원이 필요한 시기를 안정적으로 예측할 수 있게 되었습니다. 또한 안정적으로 ..
[단축 URL 프로젝트 URLumberjack] - devOps 정의
0. 들어가며 새 프로젝트를 시작하면서 가장 먼저 정해야 할 것은 서버 스펙입니다. 이를 정하는 데 있어서는 비용, 문서(공식 문서 및 구글링 문서량), 학습 난이도 세 가지가 가장 중요한 요소로 느껴졌습니다. 물론, 이는 상황에 따라 우선순위가 달라질 수 있지만요 ㅎㅎ 프로젝트를 진행할때 서버스펙에 관련하여 고민한 내용과 선택한 이유들을 정리해 보았습니다. 1. 서버스펙 overview 2. NCP(Naver Cloud Platform) 선택 이유 Cloud 비용이 가장 큰 비용 항목 중 하나이지만, 운이 좋게도 크레딧 지원을 받을 수 있게 되었기 때문에 이 큰 문제를 해결할 수 있었습니다. 또한, aws를 사용해온 경험이 있는 제게 NCP의 UI/UX는 쉽고 편안하게 사용할 수 있었습니다. 게다가 공..
PK로 Email, 전화번호와 같은 현실세계의 식별자를 사용해도 될까?
https://jojoldu.tistory.com/672 현실 세계의 속성에 의존하지 않기 최근에 들었던 질문 중 현실 세계의 식별자를 데이터베이스 기본키로 써도 되냐는 것이 있었다. 이를테면 현실 세계에서 유일함을 보장하는 값들이다. 주민 등록 번호 전화 번호 여권 번호 이들 jojoldu.tistory.com 프로젝트 도중, 토론하게 된 내용이였습니다. 회원의 email 속성은 중복이 불가능한 유일 식별자이므로 PK로 써도 되겠다고 생각을 했었습니다. 하지만 현실세계의 식별자는 직접 제어가 불가능하며, 언제든 변경이 될 수 있는 값임을 생각을 못하고 있었네요. 전화번호 변경이 가능한 것 처럼, email 사업자(벤더)가 망하는 경우엔 회원의 email도 교체를 해줘야 하니까요!
[짧]WSL 에러( Error: 0x80040326 Error code: Wsl/Service/0x80040326)
어제 잘 쓰다가 오늘 WSL를 실행하는데 아래 에러가 뜨더라구요 Error: 0x80040326 Error code: Wsl/Service/0x80040326 Press any key to continue... 관리자 권한으로 터미널 실행 후, wsl --update 명령어로 wsl 업데이트 실행해주시면 됩니다. 업데이트 완료 전엔 실행 안되므로 조심해야 합니다. 따로 업데이트 완료 문구를 터미널로 띄워주는게 아니라, 알림센터를 통해서 업데이트 완료를 알려줍니다. 참고 : https://superuser.com/questions/1776464/ubuntu-crashes-on-windows-0x80040326-wsl-error
[짧] Docker란?
리눅스 컨테이너 기반의 오픈소스 가상화 플랫폼으로, GO언어로 작성되었다. 서비스들을 하나의 서버에 집약해 구동하여 리소스 활용도를 높아며 안정성도 챙길 수 있는 방법이 서버 가상화이다. VM VM 가상화된 하드웨어 위에 OS가 올라가는 형태로, 거의 완벽하게 Host OS와 분리된다. Host OS와 분리되는 장점이 있지만, OS위에 OS가 구동되므로 무겁고 느리다. 컨테이너 기반 가상화 컨테이너 기반 가상화는 Application 실행에 필요한 바이너리만 올린다. Host와 커널을 공유하므로, io처리가 쉬워져 성능효율이 높아진다. 컨테이너 사용 목적은 가상머신을 생성하는게 아닌, host os의 자원을 분리해 환경을 구축하는 것이다. 도커를 구축함으로써 얻는 장점 docker image를 pull해..
터미널 세션이 끊겨도 명령어를 실행하기 : nohup
nohup이란? no + hup인 합성어라고 할 수 있습니다. hup란, 터미널의 세션 logout이 발행하면 해당 터미널에서 실행된 프로세스에게 전달하는 신호입니다. 그래서 터미널을 종료하거나, 로그아웃을 해 hup 신호를 보내고, 프로세스들은 종료되게 됩니다. nohup은 프로세스들을 데몬인것처럼 동작시켜 hup 신호를 무시하도록 하는 명령어입니다. 그렇기때문에 nuhup명령어를 통해 실행한 프로세스들은 터미널의 세션 연결이 끊어지더라도 종료되지 않습니다. nohup 사용법 $ nohup [Process_NAME] & //또는 $ nohup [Command][Arg] & 단, 실행대상이 스크립트인 경우, 권한은 755 이상이여야 합니다. 백그라운드 작업확인하기 실행중인 백그라운드 명렁어 또는 작업, ..