Redis 세션 클러스터링 설정 (feat. Redisson)

How to Enable Session Clustering in “Low-level Spring Framework” and “Redis with Encryption”

2023년 10월 3일 · 2 분 · An Seongjin

Delimiter를 통한 다중 검색 처리

들어가며 현재 투입되어있는 프로젝트의 서비스 중에는 특정 데이터를 조회할 수 있는 화면이 있습니다. 그런데 이 화면을 사용하게되는 업무 특성상 데이터를 일일이 하나씩 조회하기가 번거롭다는 불편사항이있어 이를 한번에 다중 검색 가능하도록 수정 조치하였고, 당시 작업내용을 핵심부분만 간략하게 정리하였습니다. 기존 방식 mapper.xml <sql id="ticketSearch"> <if test="(method_info != null and method_info != '')"> <if test="method_id == 'gkId'"> AND GK_ID = #{method_info} </if> <if test="method_id == 'parentTicketId'"> AND UPPER(PRNT_TKT_ID) LIKE CONCAT('%',UPPER(REPLACE(#{method_info}, '_', '#_')),'%') ESCAPE '#' </if> <if test="method_id == 'ticketId'"> AND UPPER(TKT_ID) LIKE CONCAT('%',UPPER(REPLACE(#{method_info}, '_', '#_')),'%') ESCAPE '#' </if> <if test="method_id == 'guid'"> AND GUID LIKE CONCAT('%',#{method_info},'%') </if> </if> </sql> <select id="list" parameterType="map" resultMap="ticketVO"> SELECT 컬럼 1, 컬럼 2, 컬럼 3 FROM 테이블 A WHERE DEL_YN_FG = 'N' <include refid="ticketSearch"/> </select> ▲ 화면에서 입력한 문자열 1개를 포함하고있는 데이터를 “like” 검색을 통한 단일 조회 방식 ...

2023년 9월 25일 · 2 분 · An Seongjin

Autoscaling 적용을 위한 스케줄(@Scheduled) 로직 변경

들어가며 현재 투입되어있는 프로젝트에서는 최근 기존의 인프라 구성에서 많은 부분 전환된 일정이 있었습니다. 그 당시 Autoscaling을 적용하기 위해서 예상되는 문제점은 무엇이 있었는지, 그리고 그것을 어떻게 극복했는지 다음과 같이 정리하였습니다. 기존 환경 Autoscaling이 적용되어있지 않은 was EC2 2개 운영 해당 서버의 Spring Framework 애플리케이션 내에는 @Scheduled 어노테이션을 통한 스케줄잡 사용 일부 스케줄 관련 코드 : @Scheduled(cron = "0 30 9 ? * *", zone = "GMT+9:00") public void notifyLongTermNoUseAdmin() { if("1".equals(GkConstant.WAS_NUMBER)) { // STG, PRD 의 1번 서버인 경우에만 Batch 실행 try { List<LongTermNoUseAdminVO> notifyAdminDataList = longTermNoUseAdminSvc.getNotifyAdminDataList(); for (LongTermNoUseAdminVO voNotifyAdmin : notifyAdminDataList) { try { List<String> mailReceiverIDList = new ArrayList<>(Arrays.asList(voNotifyAdmin.getAccountId())); // 메일 수신인 리스트에 장기 미사용자의 이메일 주소만 추출해 추가 // 대상자별 mail template parameter 가 다르기 때문에 for 문을 통해 개별 메일 발송 awssesClient.sendEmail(mailReceiverIDList, "[" + ospAppConfig.getGkServerType() + "]" + MailEnum.NOTIFICATION.getMailSubject(), setMailHtmlBody(MailEnum.NOTIFICATION, voNotifyAdmin), null); LOG.info("##### SUCCESS Sending Notification Email : {}, {}", voNotifyAdmin.getSaGuid(), voNotifyAdmin.getAccountId()); } catch (Exception e) { e.printStackTrace(); LOG.info("##### FAIL Sending Notification Email : {}, {}", voNotifyAdmin.getSaGuid(), voNotifyAdmin.getAccountId()); } } LOG.info("##### SUCCESS notifyLongTermNoUseAdmin Batch"); } catch (Exception e) { e.printStackTrace(); LOG.info("##### FAIL notifyLongTermNoUseAdmin Batch"); } } } 위와 같이 “코드가 실행되는 두대의 서버 중 vm option의 특정 시스템 프로퍼티가 ‘1’로 되어있는 서버에서만 동작”하도록 조건이 설정 (if("1".equals(GkConstant.WAS_NUMBER))) 문제점 Autoscaling을 적용하게되면 서버가 동적으로 생성 및 삭제되기 때문에 어느서버가 1번 서버인지 기준이 사라지는 상황. 따라서 기존의 Scheduled 로직이 여러 서버에서 중복으로 실행되거나 혹은 전혀 실행될 수 없는 로직 ...

2023년 9월 21일 · 4 분 · An Seongjin

Open vscode with the Terminal 'code .' command

명령어를 통해 Visual Studio Code로 특정 경로 열기 터미널에서 작업을 하다보면 종종 특정 경로를 “Visual Studio Code”로 바로 열고싶을 때가 있다. 이럴때 사용할 수 있는 방법으로, 터미널에서 code . 명령을 통해서 현재 위치를 vscode로 열거나 code ~/열고싶은 디렉토리 경로 명령으로 열 수 있는데, 이 커맨드를 사용하기 위해서는 다음과 같은 과정이 필요하다. ‘code’ 명령 설치 Visual Studio Code 열고 cmd + shift + p code 입력 후 Shell Command: Install ‘code’ command in PATH 클릭 ...

2023년 8월 3일 · 1 분 · An Seongjin

[JS] input box 사용자 편의성에 대한 고민

Thinking about user usability for ‘input box’

2023년 8월 1일 · 3 분 · An Seongjin

[AWS] 콘솔과 CLI 접속시 특정 IP 외 접근 차단 정책

Policy to block certain IP access to the console or CLI

2023년 7월 26일 · 1 분 · An Seongjin

[JS] document.cookie 사용 이슈 및 해결 방법

document.cookie 들어가며 Frontend에서 Cookie를 다룰 때, 일반적으로 javascript의 document.cookie 를 통해 get, set, delete 할 수 있다. 이러한 cookie는 같은 브라우저 내에서 값을 저장, 전달, 공유할 수 있다는 점에서 유용하게 사용된다. 현재 투입되어있는 프로젝트에서도 document.cookie로 쿠키가 관리되고있으며, 다음과 같은 용도로 사용되고있다. 다른 화면으로 파라미터를 넘기기 위해 뒤로가기 시 이전의 검색조건 값을 다시 불러오기 위해 window.open 을 통한 팝업 창에서 부모 창으로 값을 전달하기 위해 문제점 이러한 document.cookie를 단순하게 사용하기에는 한 가지 문제가 있었다. 사용자가 목록페이지에서 “각기 다른 여러 글”을 Ctrl을 누른채 클릭하여 새로운 탭으로 띄울때, 그리고 이 과정이 짧은 시간에 이루어질때 몇가지 문제가 발생했다. A, B, C 글을 짧은시간에 ‘거의’ 동시에 띄울경우 A, B, C 글에 대한 각각의 탭이 열리는게 아닌, C의 글만 3개가 띄워진 것. 이는 A탭이 열린 직 후 A에 대한 파라미터를 담은 쿠키를 조회하기 전, C에 대한 쿠키로 덮어쓰기되어 발생된 현상이었다. ...

2023년 7월 21일 · 5 분 · An Seongjin

[DB] redis-cli 명령어 종류 및 자료구조 정리

‘Commands used in Redis and summary of ‘data structure’

2023년 7월 14일 · 6 분 · An Seongjin

[AWS] ElastiCache for Redis 생성 및 접속

📌테스트 환경 : Mac OS M1 Redis 클러스터 생성 설정값 ‘클러스터 모드’ 비활성화 AWS ElastiCache for Redis 생성시 default로 잡히는 포트는 6379 그러나 보안을 위해 default 포트는 피해서 6480으로 설정 암호화는 ‘저장 중 암호화, 전송 중 암호화’ 모두 활성화하여 생성 Redis 접근 Redis 접근 조건 로컬에서 AWS Redis에 cli로 접근하기 위해서는 “로컬 → Redis”로 다이렉트로 접근할 수 없음 외부 접근 비허용. 같은 VPC 내부의 인스턴스를 통해서만 접근할 수 있음 이러한 특징 때문에 로컬에서 Redis에 접속하기 위해서는 Bastion Host가 필요 ...

2023년 7월 10일 · 3 분 · An Seongjin

[AWS] ElastiCache for Redis 구성요소

Components of ‘ElastiCache for Redis’

2023년 7월 5일 · 2 분 · An Seongjin