Null Object Pattern
널 오브젝트 패턴이란 아래 그림과 같이 Interface를 만들고 상속받는 클래스를 두가지로 만들어 하나는 Null 이 아닌 객체로, 하나는 Null 일때의 객체를 만든다. 이후 User가 Null 일 경우 NullMember 객체내에서 null을 반환하지 않고 처리할 수 있도록 메서드를 정의해둔다. public interface Us...
널 오브젝트 패턴이란 아래 그림과 같이 Interface를 만들고 상속받는 클래스를 두가지로 만들어 하나는 Null 이 아닌 객체로, 하나는 Null 일때의 객체를 만든다. 이후 User가 Null 일 경우 NullMember 객체내에서 null을 반환하지 않고 처리할 수 있도록 메서드를 정의해둔다. public interface Us...
코드 : https://github.com/sykimtropical/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 레코드 등록 smt...
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) 정보(I...
인터넷이 자주 끊긴다던지 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라는 객체를 각각 모듈이 가지고있기 때문에 중복되는 코드가 많으며, 유지보수 시 ...
Generic이란? JDK 1.5 부터 지원된 기능으로 클래스나 메서드에서 사용할 내부 데이터 타입을 컴파일 시 미리 지정 할 수 있는 방법이다. 예를 들어 ArrayList<E> 는 ArrayList의 요소 타입을 제네릭으로 처리하기 때문에 요소에 String, Integer 또는 커스텀 객체 등 데이터 타입을 다양하게 담을 수 있다....
네이버 클라우드 쿠버네티스 서비스를 이용중에 쿠버네티스 버전 업데이트를 진행하던 중 작업중인 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/sykimtropical/annotation-loggin-aop.git {:target=”_blank”} 사용자가 웹사이트에서 어떤 동작을 요청하였는지 로그를 수집하고 싶었다. AOP 또는 Filter에서 어떤 클래스, 메서드를 실행하였는지 일일이 확인하여 텍스트로 변환 하는 건 너무 번잡해 보여 Cu...
💡키워드 • Spring boot Warm up • cold start 현상 Tomcat, Spring Boot 등의 어플리케이션을 실행 후 최초로 REST API 요청 시 Response Time의 딜레이가 많이 긴것을 확인할 수 있다. 이유 JVM 프로세스가 지연로딩 방식을 기반으로 하기 때문에 최초의 한번 요청할때 로드되는 과정 때...