분류 전체보기
-
조직도를 만들어보자개발/Spring(boot) 2024. 12. 8. 23:42
회사에서 기존 조직 데이터가 유연하지 못해 이를 개편하고자 했고 내가 담당하게 됬다.그래서 이번 글에서는 기존 조직 데이터의 문제, 요구사항, 내가 만든 조직 데이터, 한계점에 대해 작성해보고자 한다.1. 기존 조직 데이터의 문제먼저 사내에서 사용하던 조직 데이터는 아래 데이터와 유사하게 생겼다. 유저 테이블의 컬럼(요약)id유저 이름기타 정보조직 - 대분류조직 - 중분류조직 - 소분류내가 생각한 것 이상의 문제가 있을 수 있지만, 내가 이 데이터를 봤을 때 느낀 가장 큰 문제는 조직의 계층이 3계층으로 고정되어 있다는 점 이다.그래서 부가적으로 생기는 문제는 세 가지가 있었다. 1. 어떤 유저는 소분류 조직에 속하지 않을 수 있다.XX그룹 라는 조직이 있다고 가정하고 이는 대분류에 속한다고 생각해보자..
-
ApplicationEventPublisher와 EventListener개발/Spring(boot) 2024. 12. 1. 16:30
업무를 하던 도중 사용자의 특정 행동을 감지하고 저장하는데 두 기능을 사용하고 있어서 해당 내용에 대해 조금 더 알아보고 작성해보고자 한다. 먼저 알아보기 전 회사 코드를 보고 추측해봤던 두 코드의 기능은 다음과 같다.1. ApplicationEventPublisher는 이벤트를 Publish하고 그 이후에 행동에는 책임을 지지 않는다.2. EventListener는 원하는 이벤트가 발생했을 때 해당 이벤트를 감지하고 이후 비즈니스 로직을 처리한다. 여기까지가 추측했던 동작 방식이고 이제부터는는 실제로 해당 기능을 찾아보며 조금 더 구체적이고 새롭게 알게된 내용을 작성해보고자 한다.ApplicationEventPublisher의 내부 구조는 다음과 같다.@FunctionalInterfacepublic i..
-
Springboot Redis 세션 만료 감지하기개발/Spring(boot) 2024. 11. 24. 22:29
업무를 하던 도중 사용자의 동선을 파악하고 싶다는 요구사항이 있었다.그리고 이 글은 그 과정에서 redis가 지원해주는 기능에 대해 적어보고자 한다. 먼저 Springboot의 AOP를 사용해 유저 정보/호출 API를 저장하도록 했고,FE분께도 동일한 DB에 URL을 저장할 수 있도록 하는 API를 하나 만들어서 어느정도(?) 해결했다.해당 기능 구현을 간단히 설명하자면 아래와 같다. 1. FE측에서 직접 API를 호출해 데이터를 저장 sample 페이지에 유저가 접근했다면 FE측에서는 BE에 아래와 같이 요청을 보낸다.Requst url: https://sample.com/api/loggingType: POST{ url: https://sample.com/sample}그러면 url과 유저 정보를 가..
-
99클럽 코테 스터디 36일차 TIL + 돌 게임(백준)Study(진행중)/항해99 2024. 8. 27. 01:05
오늘의 학습 키워드 - 알고리즘공부한 내용 본인의 언어로 정리하기https://www.acmicpc.net/problem/9655아이디어를 이용해 푸는 문제였다. 풀이 과정은 다음과 같다.1. 돌이 1개라면 상근이가 무조건 이긴다.2. 돌이 2개라면 창영이가 무조건 이긴다.3. 돌이 3개라면 상근이가 무조건 이긴다.4. 돌이 4개라면 상근이가 1개를 가져가면 3번으로, 3개를 가져가면 1번으로 가므로 창영이가 무조건 이긴다.5. 돌이 5개라면 상근이가 1개를 가져가면 4번으로, 3개를 가져가면2번으로 가므로 상근이가 무조건 이긴다.2n-1. 돌이 2n-1개라면 상근이가 무조건 이긴다2n. 돌이 2n개라면 창영이가 무조건 이긴다. 라는 점화식으로 풀었다.풀이는 다음과 같다.import java.util..
-
99클럽 코테 스터디 35일차 TIL + 표 병합(프로그래머스)Study(진행중)/항해99 2024. 8. 26. 00:16
오늘의 학습 키워드 - 구현 - union-find공부한 내용 본인의 언어로 정리하기https://school.programmers.co.kr/learn/courses/30/lessons/150366여러 구현 방법이 있겠지만, union-find를 활용한 문제를 풀었따. 풀이 과정은 다음과 같다.1. UPDATE r c value- r행c열의 부모를 find 연산으로 찾은 뒤 update 2. UPDATE value1 value2- 모든 셀을 돌며 value1과 동일한 값들을 value2로 변경 3. MERGE r1 c1 r2 c2- r1, c1의 부모와 r2 c2의 부모를 find 연산으로 찾은 뒤 union(r1c1, r2c2) 4. UNMERGE r c- r c의 부모를 find 연산으로 찾..
-
99클럽 코테 스터디 34일차 TIL / 여행 경로(프로그래머스)Study(진행중)/항해99 2024. 8. 25. 02:26
오늘의 학습 키워드 - 알고리즘 - 구현 - dfs공부한 내용 본인의 언어로 정리하기https://school.programmers.co.kr/learn/courses/30/lessons/43164조금 까다롭게 문자열을 다뤄야 하는 dfs 문제를 풀었다. 풀이 과정은 다음과 같다.1. 티켓을 모두 사용해야 하므로 dfs에서 방문 처리는 티켓의 인덱스로 사용2. dfs 로직을 돌며 만약 깊이가 티켓과 동일하다면 해당 여행 경로를 list에 추가3. 알파벳 순으로 가장 먼저 나오는 경로를 사용해야 하므로 리스트를 정렬하여 0번째 인덱스 값 반환 풀이는 다음과 같다.import java.util.*;class Solution { int ticketLen; String[][] tic..
-
99클럽 코테 스터디 33일차 TIL / 단어 변환(프로그래머스)Study(진행중)/항해99 2024. 8. 24. 02:37
오늘의 학습 키워드 - 알고리즘 - 구현 - DFS공부한 내용 본인의 언어로 정리하기https://school.programmers.co.kr/learn/courses/30/lessons/43163문자열들이 주어졌을 때 처음 문자열에서 한 글자 씩 변경하여 제공된 다른 문자열로 바꾸고,이 과정을 목표 문자열까지 반복하는 문제이다. 풀이 과정은 다음과 같다.1. 모든 문자열들을 문자 배열(char[])로 변경한다2. 문자들에 대해 비교하며 dfs 과정을 진행한다 풀이는 다음과 같다.import java.util.*;class Solution { String[] words; char[][] wordChar; boolean[] visit; int answer ..
-
99클럽 코테 스터디 32일차 TIL / 아이템 줍기(프로그래머스)Study(진행중)/항해99 2024. 8. 22. 21:43
오늘의 학습 키워드 - 알고리즘 - 구현 - bfs 공부한 내용 본인의 언어로 정리하기https://school.programmers.co.kr/learn/courses/30/lessons/87694좌표를 2배로 늘리는 아이디어를 떠올리는게 까다로웠던 bfs 문제를 풀었다.아이디어만 떠올리면 이후에는 풀만했던 것 같다. 풀이 과정은 다음과 같다.1. 좌표를 2배로 늘림2. 사각형의 범위를 모두 1로 채움3. 사각형의 내부를 모두 0으로 바꿈4. bfs를 통해 1인 경로로만 최단 경로 탐색(1인 경로 = 문제 조건에서의 경로) 풀이는 다음과 같다.import java.util.*;class Solution { public int solution(int[][] rectangles, ..