Google OAuth2
Git : https://github.com/handsome-tiger-789/google-oauth2 이 글에선 간단하게 OAuth2 를 이용한 로그인 프로세스를 구현해보고자 한다. OAuth2를 위한 라이브러리 사용과 전체적인 통신 흐름만 다루기 때문에 구체적인 오류 핸들링은 다루지 않는다. Google Cloud Console 설정 ...
Git : https://github.com/handsome-tiger-789/google-oauth2 이 글에선 간단하게 OAuth2 를 이용한 로그인 프로세스를 구현해보고자 한다. OAuth2를 위한 라이브러리 사용과 전체적인 통신 흐름만 다루기 때문에 구체적인 오류 핸들링은 다루지 않는다. Google Cloud Console 설정 ...
얼마 전 설치한 openclaw를 통해 Geeknews 사이트 브리핑을 정리해서 받고있다. 보던 중 흥미로운 내용이 있어 잊지 않기 위해 개념만 작성하려 한다. 기사 출처 : https://news.hada.io/topic?id=26773 54GB 이미지를 8GB로 줄인다는 문구가 너무 충격적이라 안볼수가 없었다.. 뭐 내용은 말 ...
git : https://github.com/handsome-tiger-789/graphql-demo GraphQL 왜 써야하는가? MSA 구조가 많아지면서 프론트엔드에서 호출 해야하는 end point가 다양해지기 시작했다. 백엔드 입장에서도 API가 많아지거나 하나의 API에 담아주는 데이터가 많아지면서 네트워크에서 오고가는 데이터의 양이 많...
최근 핫한 openclaw 를 찍먹해보기 위해 안전한 Docker 환경에 설치해보자. 설치환경 Mac (M3) Docker Gemini (무료계정) Discord 연동 혹시 몰라 구글계정, 디스코드 계정 모두 새로 생성했다. Google API Key 발급 gemini 무료 계정의 API 키를 연동하기 위해 Google...
DB는 ERD 를 얼마나 잘 작성하고 유지보수 하느냐가 매우 중요하다. 그만큼 한 눈에 파악하기 쉬워야하기도 하지만 실시간 공유와 히스토리 파악이 중요하다고 생각한다. 유료 ERD 프로그램도 있고 DB 툴에서 제공하는 프로그램도 있으나 오늘은 개발툴에서 프로젝트별로 확인 가능한 플러그인을 소개하고자 한다. 설치 IntelliJ 와 ...
Gemini CLI 는 무료 구간 사용이 가능하기에 설치해보았다. mac 에서 터미널에 npm install -g @google/gemini-cli 명령어를 통해 간단하게 설치 설치 완료 후 gemini --version 을 통해 설치된 버전 확인 가능 설치가 정상적으로 됐다면 gemini 를 입력해 호출하면 로그인 수단을 선택할 수 있...
좋은 기회로 claude 를 잠깐 사용해볼 기회가 생겼다 claude cli 는 무료 버전이 존재하지 않아 아직 테스트 해보지 않았다. 설치는 맥에서 매우 간단 node 와 npm 이 설치 되어 있어야 하며, 버전이 낮을 경우 claude-code 설치 중 몇 버전으로 설치하라고 친절히 알려줌 npm install -g @anthropi...
널 오브젝트 패턴이란 아래 그림과 같이 Interface를 만들고 상속받는 클래스를 두가지로 만들어 하나는 Null 이 아닌 객체로, 하나는 Null 일때의 객체를 만든다. 이후 User가 Null 일 경우 NullMember 객체내에서 null을 반환하지 않고 처리할 수 있도록 메서드를 정의해둔다. public interface Us...
https://github.com/aquasecurity/trivy 최신버전 설치 후 컨테이너 이미지, 클러스터 등 CVE 점검 가능 작성일 : 2025/05/23 기준 CSAP 인증에서도 컨테이너 이미지 점검 툴이 따로 없어 Trivy 를 이용해 점검 진행 이미지 점검 방법 : https://trivy.dev/docs/latest/guide/...
Repository(=Dao)가 아닌 Service에 @Transactional 어노테이션을 걸었으면 Exception 발생 시 Rollback을 해줘야하는거 아닌가?? @Service public class MyServiceImpl extends MyService { @Override @Transactional public Res...
NKS에서 쿠버네티스 버전을 업데이트 하고자 새 버전의 node를 먼저 생성하고 기존 버전의 노드를 drain 하는 방법을 이용하고 있다. 근데 drain 시 기존 노드의 POD가 새 노드에 배포가 완료되기 전에 삭제되는 바람에 다른 노드에도 서비스가 존재하지 않다면 접속 장애가 발생한다. 이를 막기 위해 PodDisruptionBudget(P...
서론 스프링은 다양한 스코프를 지원한다. singleton : 기본 스코프로 컨테이너의 시작-종료 까지 유지되는 가장 넓은 범위의 스코프 prototype : 해당 타입 빈의 생성과 의존관계 주입 까지만 관여하고 더는 관리하지 않는 가장 짧은 범위의 스코프로 항상 새로운 인스턴스를 생성해서 반환 웹 스코프 reqeus...
코드 : https://github.com/handsome-tiger-789/entity-builder 필수 값 제한의 필요성 Builder 패턴을 이용하여 객체 생성 시 필수 값을 지정하기 전에 왜 꼭 제한을 해야 하는가 생각 해봐야 한다. 실무에서 작업을 하면 프로젝트를 한 명만 작업하는 경우 또는 그 프로젝트의 시작과 끝을 한 명이 맺는 경...
자바에서 커넥션이나 스트림 같은 자원은 사용 후 해제를 해주지 않으면 성능 문제가 발생할 수 있다. (이전에 PreparedStatement 를 사용하면서 자원 해제 누락으로 인해 커넥션 풀에서 커넥션이 하나씩 감소하는 경험을 해본 적 있음) 기존 try-catch-finally 를 이용한 자원 해제 예시 BufferedReader br = nul...
DevOps 우선 DevOps를 먼저 살펴본다. Dev + Ops 의 합성어로 Development(개발) + Operations(운영) 을 결합한 개발 방법론이다. 이미지 출처 DevOps를 도입하게 되면 개발-배포-운영간 단절되어있던 과정을 하나의 과정으로 묶을 수 있게된다. 장점이라면 클라우드 환경 또는 서버 대수가 다수라면 배포 과...
NKS 버전 업데이트로 인해 WorkerNode를 최신 버전으로 신규 생성 후 drain 작업 신규 WorkerNode에서 Argocd 실행 시 오류 발생 ※ argocd-dex-server-{uuid} 포드 생성 오류 argocd-controller-0, argocd-server 0/1 Running 분명 오류 없이 Running 상태로 진입 ...
솔루션을 ibatis에서 mybatis로 변경 후 connection pool 이 특정 시점에 줄어드는 이슈를 확인 한 적이 있다. 확인해보니 SqlSession객체를 이용해 작성되었는데, mybatis는 ibatis와 달리 자원해제 close() 메서드를 직접 호출해주는데 일부 finally 구문에 누락된 부분이 존재했기 때문이다. mybatis가...
서비스를 운영 하면서 로깅으로 인한 속도 저하를 직접 체감할 일이 많았다. 빠른 속도로 데이터를 발송하고 많은 양의 데이터를 수신하다 보니 오류 추적을 위해 남겨둔 로그 때문에 속도가 저하되는 경우가 생긴 것이다. 로깅 퍼포먼스를 확인하기 위해 서치와 테스트를 진행했다. 아래 글을 참고하여 테스트 해봤다. https://dveamer.github....
SPF 레코드 등록 도메인의 txt 레코드를 조회하여 IP를 확인한다. DNS 관리자 TXT 레코드에 v=spf1 ip4:{메일발송 IP} ~all 형태로 등록한다. 등록 후 시간이 좀 지난 뒤 터미널에서 nslookup set type=txt 도메인 순으로 입력 시 등록한 IP가 조회되면 정상적으로 등록 된 것. A 레코드 등...
cors는 응답헤더에 client 서버 도메인을 허용한다는 내용이 없으면 발생한다. 즉, response 헤더에 client 도메인을 포함해주면 해결된다. res.setHeader('Access-Control-Allow-origin', '허용할 도메인'); Node.js에서 Express를 사용하여 CORS를 동적으로 허용하는 방법 npm ...
winston을 이용해 생성하는 log파일의 권한을 설정 할 수 있다. 아래 글 참조 https://github.com/winstonjs/winston-daily-rotate-file/issues/184 var transport = new (winston.transports.DailyRotateFile)({ filename: './logs/...
이메일 SMTP 발송 순서 및 테스트 이메일을 발송 할 수 있는 방법은 SMTP, POP3, IMAP 방식이 존재한다. 이 글에서는 SMTP 프로토콜을 이용해 발송하는걸 다룬다. SMTP는 Simple Mail Transfer Protocol 의 약자이다. 큰 흐름은 아래와 같다. 수신자 이메일의 도메인을 통해 메일 수신서버(mx) 정보(IP...
인터넷이 자주 끊긴다던지 IP 관련 문제(충돌 등)가 생기는 것 같을 경우 아래 명령어 수행 가능 IP 초기화 ipconfig /release IP 갱신 ipconfig /renew
사설 솔루션 패치 작업을 하러 나가면 서버와 네트워크 구성이 외근지마다 다르다. 처음 패치를 다니면서 가장 어려웠던건 설치, 기동이 아닌 이 네트워크 관련 이슈였다. 네트워크 관련 지식이 없다시피 하여 삽질도 여러번 했다. 가장 많이 나는 이슈들은 - WAS가 정상 기동 되었음에도 클라이언트의 컴퓨터에서는 WAS 에 접속 불가 - FCM 과 ...
linux 서버에서 Tomcat의 포트를 80으로 수정 후 실행 시 80포트 관련하여 permission denied 가 뜨는 경우가 있다. root 계정이 아닌 일반 사용자 계정으로 시도 했을 때 만날 수 있는 오류인데, linux에서는 특정 포트 구간은 일반 사용자 권한의 접근이 제한되어있다. Linux 0~1023 포트 실행 권한 포트 번호...
CSAP 인증을 준비하면서 사내 개발망과 비개발망의 네트워크 분리가 필요했다. TP-Link 관리자 툴을 이용해 작업하는데 네트워크 지식이 부족해 아래 글을 보면서 우선 공부했다. 출처 : https://hello-backend.tistory.com/m/176 네트워크 대역 같은 대역대는 별도의 작업 없이 서로간 통신이 가능하다. 다른대...
공인 IP 전 세계에서 유일한 IP 주소를 가지고 있으며, 외부에 공개되어 있어 다른 PC로부터의 접근이 가능하다. SK, KT, LG 등의 통신사를 통해 사용하는 인터넷망을 공인 IP라고 한다. 브라우저에서 findip.kr URL을 통해 내 공인IP를 확인할 수 있다. 사설 IP 가정이나 회사 내에서 다시 할당된 네트워크 I...
멀티모듈이란? 멀티모듈이란 하나의 단일 프로젝트를 여러개의 모듈로 분리해서 구성하는 기법이다. 각 모듈은 개별적으로 컴파일되어 라이브러리 또는 실행가능한 파일로 생성된다. 기존 싱글 모듈로 구성된 프로젝트의 경우 아래와 같은 구조를 가지고 있다. Member라는 객체를 각각 모듈이 가지고있기 때문에 중복되는 코드가 많으며, 유지보수 시 ...
@GetMapping("/user") 라는 URL을 하나 만들었을 경우 http://test.com/user/ 로 요청 하면 페이지를 찾을 수 없는 오류가 발생한다. spring boot 기준 3 이전까지는 기본적으로 매칭해주었으나, 3 부터는 매칭되지 않는 설정이 기본이다. 해결방법 trailing slash path까지 작성...
POD에 NAS 또는 호스트 디스크를 마운트 할 때 POD명으로 폴더를 생성하고 싶다. 기존 mount 방식 : 호스트서버 : /file POD (1) : /home/app/file POD (2) : /home/app/file 각 POD가 test.log 파일을 쓰면 /file/test.log 파일 1개로 작성된다. 각 pod별...
Generic이란? JDK 1.5 부터 지원된 기능으로 클래스나 메서드에서 사용할 내부 데이터 타입을 컴파일 시 미리 지정 할 수 있는 방법이다. 예를 들어 ArrayList<E> 는 ArrayList의 요소 타입을 제네릭으로 처리하기 때문에 요소에 String, Integer 또는 커스텀 객체 등 데이터 타입을 다양하게 담을 수 있다....
방화벽 설정 : https://www.tp-link.com/kr/support/faq/2026/) WAN : Wide Area Network의 약자로 멀리 떨어진 지역을 서로 연결하는 네트워크 구축 LAN : Local Area Network의 약자로 한정된 지역에서의 네트워크 구축 즉, 인터넷에 접속하는 것은 WAN 이라고 생각하면 됨...
네이버 클라우드 쿠버네티스 서비스를 이용중에 쿠버네티스 버전 업데이트를 진행하던 중 작업중인 POD가 삭제되는 문제가 발생했다. 콘솔에서 제공되는 업데이트 방식은 2가지 존재한다. ex) 기존 사용 노드 2대 일 때 노드풀 업데이트추가 증가 노드 개수를 2, 서비스 불가 가능 노드 개수 0 으로 진행 할 경우 기존 노드풀에서 새로운 버전의 워...
스트림이란? java8 부터 추가된 기능으로 데이터의 흐름에서 원하는 조건을 거는 filter, 필터링된 값을 담는 map, 최종 결과물 만들기(Collect) 를 수행한다. 이전에도 외부반복자(for, while 등)를 이용하여 위 행위가 가능했으나, 스트림은 내부반복자를 이용하기 때문에 병렬처리가 쉬워지며 코드가 간결해진다. 스트림 단계 스...
람다식 사용 방법 전제 조건 단 한개의 추상 메서드만 가지는 인터페이스 필요 interface public interface MaxNumber { int getMax(int num1, int num2); } AS-IS MaxNumber maxNumber = new MaxNumber() { @Override public int getMax(i...
Oracle varchar2(10) 은 10 byte를 의미한다. oracle에서 영어는 1byte, 한글은 2byte 이기 때문에 그동안 막연하게 한글이 들어가는 컬럼은 100자 -> varchar2(200) 으로 생성해왔다. -- 테스트용 테이블 생성 CREATE TABLE test( name varchar2(10) ); -- 한글 ...
모의침투 결과 불필요한 HTTP Method가 허용되어 있어 이에 대한 조치가 필요했다. 보통 WEB이나 WAS 설정파일을 건드려 제한 할 수 있으나, Spring Boot로 내장 WAS 를 사용중이며, Undertow를 사용중에 있어 이 환경의 설정을 처리하고 기록했다. 불필요한 메소드 사용 확인 cmd 창에서 아래 명령어를 통해 허용된...
Win+R 단축키를 이용해 실행 창 띄운 후 아래 명령어 실행 %systemroot%\system32\f12\IEChooser.exe 디버그 할 대상 선택하면 제대로 된 개발자 도구가 열린다.
JUnit 을 활용하여 단위 테스트를 구축하고, 유지보수 자동 빌드 시 수정된 소스로 인한 기존 서비스에 영향이 없는지를 시스템 화 하고 싶다. 자바와 ‘JUnit을 활용한 실용주의 단위 테스트’ 책과 JUnit 버전 문제로 구글에서 따로 서치한 내용을 함께 서술했다. JUnit5 설정 build.gradle 에 아래 내용 추가 testImple...
기존 URL은 행위가 포함되어 있었다. (Restful URL 규칙 위반) ex) /000ResultList.do , /000ResultDetail.do /000Send.do… URL 길이를 줄이고, HTTP 메서드를 적극 활용하여 URL에서 행위에 대한 내용을 삭제하고자 공부하여 새로 만드는 솔루션에 적용해보았다. Restful 이란? Rest ...
새로운 버전을 배포할 때, Deployment는 최신 버전을 먼저 실행하고, 실행이 완료되면 이전 버전의 파드를 삭제한다. 그러나 최신 버전의 파드는 정상적으로 실행됐지만 boot가 아직 준비상태가 아닌데 이전 버전의 파드가 삭제되면 최신 버전의 파드가 준비상태가 될 때 까지 접속 장애가 나타난다. boot가 준비 상태가 되어야만 파드가 실행 완료...
JWT를 적용하게 된 배경 기존에 개발했던 솔루션은 온프레미스 서버에 구축되는 솔루션이었기에 JWT와 같은 구현이 따로 필요하지 않았다. Spring Security를 이용해 세션으로 사용자 인증을 진행하였으며, 다중화된 서버는 L4장비에서 Hash 방식등을 이용하거나 톰캣 세션 클러스터링을 구현하였기 때문에 문제가 되지 않았다. 그러나 클라우드 서...
기존 Session 처리방식 이전에 JWT를 사용하지 않았다면 사용자의 로그인 정보는 Session을 이용하여 처리했을 것이다. Spring Security를 통해 로그인 된 사용자의 정보를 가져온다던지, session.getAttribute("로그인한 유저 정보"); 를 가져온다면 session을 이용하는 것이다. 세션을 이용한다면 로그인 ...
코드 : https://github.com/handsome-tiger-789/annotation-loggin-aop.git 사용자가 웹사이트에서 어떤 동작을 요청하였는지 로그를 수집하고 싶었다. AOP 또는 Filter에서 어떤 클래스, 메서드를 실행하였는지 일일이 확인하여 텍스트로 변환 하는 건 너무 번잡해 보여 CustomAnnotation...
crictl은 Kubernetes의 Container Runtime Interface (CRI)를 위한 커맨드 라인 도구 중 하나입니다. (기존엔 kubernetes에서 사용하던 기본 컨테이너는 docker였으나 docker가 표준을 지키지 않는 문제로 인해 특정 버전부터 containerd로 변경되었습니다.) crictl은 컨테이너와 관련된 다...
자주 사용하는 명령어 docker 사용하지 않는 모든 자원 삭제(강제) : docker system prune -a -f 사용하지 않는 이미지 삭제 : docker image prune 컨테이너에서 사용하지 않는 모든 볼륨 삭제 : docker volume prune 현재 사용하지 않는 리소스 삭제 : docker system prun...
Spring Boot 어플리케이션에서 thymeleaf를 써야하는 이유 : JSP의 제약사항 때문이다. JAR로 빌드하여 Spring boot 내장 톰캣으로 실행할 경우에는 “Whitelabel Error Page” 오류가 뜬다. Spring Boot + jsp 자체에는 문제가 없으나, jar로 빌드할 경우에 jsp는 지원되지 않는다. ...
💡키워드 • Spring boot Warm up • cold start 현상 Tomcat, Spring Boot 등의 어플리케이션을 실행 후 최초로 REST API 요청 시 Response Time의 딜레이가 많이 긴것을 확인할 수 있다. 이유 JVM 프로세스가 지연로딩 방식을 기반으로 하기 때문에 최초의 한번 요청할때 로드되는 과정 때...
서비스 소개 링크 : https://www.gov-ncloud.com/v2/product/networking/natGateway 용도 : 클라우드 플랫폼 내 서버가 외부로 아웃바운드 될 때 미리 할당받은 공인 IP를 가지고 통신할 수 있다. 아웃바운드 통신에 고정된 공인IP가 필요한 경우 위 서비스를 이용하면 된다.
서비스 소개 링크 : https://www.gov-ncloud.com/v2/product/networking/loadBalancer 용도 : VPC 내 서버 사이 로드밸런싱 기능을 제공한다. NKS 서비스 이용 시 ingress 를 생성하면 자동으로 LB가 생성되었다. 트러블슈팅 ingress 삭제 시 공인IP가 삭제되지 ...
📜 온프레미스 환경에서는 로그를 로컬 서버의 log 경로에 파일로 수집하여왔다. 로그 확인이 필요하면 서버에서 해당 날짜의 로그 파일을 열어 보는게 가능했다. 클라우드 서버에서는 서버가 분산처리 되어있다. 개수가 여러개라도 하나씩 들어가서 파일을 찾아 볼 수 있다면 그것은 가능하다. 하지만 Auto-Scaling을 염두해두었다면, 내가 모르...
테스트 서버를 쿠버네티스 클러스터로 구성해보자. 쿠버네티스 클러스터 구성을 보면 알겠지만 master 노드가 필수적으로 1대 필요하고, 실제 POD를 배포할 worker 노드가 필요하다. 때문에 최소 2대, POD가 각 워커노드에 잘 배포되는지를 보려면 3대의 테스트 서버가 필요하다. master, worker node 전체 수행 패키지 우...