전체 글
-
Facade 패턴을 통해 코드의 복잡함을 숨겨서 간단해 보이도록 해보자Design Patterns 2023. 11. 8. 17:02
들어가기 전 이전 글 이전 과정은 뇌를 빼고 작성했던 코드를 리팩토링 하는 과정을 거쳐봤다. 해당 글에서는 3가지 일을 맡고 계신 비즈니스 로직의 한 메소드를 디자인 패턴을 통해 간단하게 보이도록 해줄 예정이다. Facade 디자인 패턴 복잡한 로직을 하나로 합쳐서 외부에서는 간단하게 사용할 수 있도록 만드는 것이다. 즉 복잡한 로직을 하나의 인터페이스로 정리해 주는 것이다. 장점은? 복잡한 시스템을 단순화하여 클라이언트가 쉽게 이해하고 사용할 수 있다. 각 도메인 로직에 대한 독립성을 높여 유지보수와 확장성을 향상시킬 수 있다. 도메인 서비스 간의 느슨한 결합을 통해 시스템 변경에 대한 클라이언트의 영향을 최소화한다. 단점은? Facade 패턴을 구현한 클래스가 너무 많은 책임을 가지게 되면 복잡성이 ..
-
Docker 컨테이너 환경에서 Eureka Client 등록시 ip 문제Spring/Trouble Shooting 2023. 11. 7. 00:41
문제 상황 Eureka 클라이언트를 등록하고 Spring Cloud Gateway를 통해 로드 밸런싱 처리를 하도록 설정해뒀다. 하지만 로드밸런싱 처리는 되지 않았고 직접 ip 주소를 통해 요청을 할 때는 정상적으로 요청이 전달되고, Eureka Server에 등록된 클라이언트의 목록에는 이상이 없었다. 원인은? 문제는 Eureka Client가 등록될 때 클라이언트들이 외부 ip 기준으로 등록되는 것이 아니라, 내부 ip를 기준으로 등록되어 문제가 발생하는 것이였다. 원인은 배포 환경을 Docker를 통해 진행했는데, Eureka Client의 경우 컨테이너 환경에서 배포가 될 경우 알아서 실제 배포되는 ip로 등록되는 것이 아닌 내부 ip를 기준으로 등록되는 것이였다. 알아낸 방법 이를 알아낸 방법은..
-
H2-Console 접속 문제 해결Spring/Trouble Shooting 2023. 11. 6. 20:35
문제 상황 위와 같이 내장 H2 DB를 사용하여 접속하려 하는데 문제가 발생했다. 개발자 도구를 통해서 확인해보면X-Frame-Options이 문제인 것을 알 수있다. 해결 방법 public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { return http ... .headers(headers -> headers.frameOptions(FrameOptionsConfig::disable)) ... .build(); } 최근 Security 버전이 변경되면서 함수형으로 선언하도록 바뀌었다. 따라서 위와 같이 선언해줘야 한다.
-
[LeetCode/JAVA] 133. Clone GraphETC/Algorithm 2023. 9. 15. 14:57
문제 주어진 그래프를 복사를 하는 문제이다. 풀이 DFS를 통해 전체를 복사하여 HashMap에 저장하고 복사하여 풀이하였다. 코드 class Solution { private HashMap visited = new HashMap (); public Node cloneGraph(Node node) { if (node == null) return null; if (visited.containsKey(node)) return visited.get(node); Node cloneNode = new Node(node.val, new ArrayList()); visited.put(node, cloneNode); for (Node neighbor: node.neighbors) { cloneNode.neighbors..
-
[LeetCode/JAVA] 208. Implement Trie (Prefix Tree)ETC/Algorithm 2023. 9. 12. 01:35
문제 trie라는 트리 데이터 구조를 구현하는 문제이다. Trie() 는 trie 객체의 시작을 구현해야하고, insert()는 word라는 문자열을 trie 트리에 입력을 구현, search()는 문자열 word가 trie에 존재하는지를 구현하고, startsWith()는 접두사 문자열 prefix가 주어질 때 접두사가 일치하는 단어가 존재하는지를 구현해야한다. 풀이 일단 해당 문제는 소문자로만 이루어진 문자열을 활용해서 String을 char로 변환해서 트리 노드에 하나씩 저장하는 방식을 먼저 구현해야했다. 그리고 노드를 타고 하위 노드로 내려갔을 때, 해당하는 단어가 단순한 문자열의 나열인지 실제 단어인지를 판단 할 수 있어야 했다. 왜냐하면 예시를 보면 apple이라는 단어가 insert 되어있고..
-
[LeetCode/JAVA] 230. Kth Smallest Element in a BSTETC/Algorithm 2023. 9. 7. 19:37
문제 이진 탐색 트리가 주어질 때, 정수 K가 주어지고 이진 탐색 트리에서 K번째로 작은 노드의 값을 출력하는 문제이다. 풀이 이전 최소 차이값을 찾는 문제와 동일하다. 중위 탐색을 사용하면 오름차순으로 조회가 가능하기 때문에, 제일 왼쪽 루트부터 시작해서 count를 증가시키면서 주어진 k와 같을 때 result에 값을 저장하고 반환하면 되는 문제다. 코드 public class Solution { int count = 0; int result = 0; public int kthSmallest(TreeNode root, int k) { inorder(root, k); return result; } private void inorder(TreeNode root, int k) { if (root == nu..
-
[LeetCode/JAVA] 530. Minimum Absolute Difference in BSTETC/Algorithm 2023. 9. 7. 19:17
문제 이진 탐색 트리(BST)가 주어질 때, 트리의 두 노드간 가장 작은 차이를 찾고 그 값의 절대값을 반환하는 문제이다. 풀이 가장 먼저 이진 탐색 트리라는 형태를 생각했을 때, 노드 구조가 왼쪽은 작은 값 오른쪽은 큰 값 중간은 왼쪽과 오른쪽 값의 중간이다. 가장 작은 값을 찾기 위해서는 트리의 전체를 순환해야 찾을 수 있다고 판단하고, 어떻게 돌아야 차이를 찾을 수 있을까 고민했을 때 중위 탐색을 하면 왼쪽 -> 중간 -> 오른쪽 순으로 탐색하는 점을 생각했다. 이렇게 될 경우 예시 1의 경우 시작을 1로하여 순서대로 1-2-3-4-6 순으로 진행하게 될 것이므로 오름차순으로 조회가 가능하다. 코드 public class Solution { Integer prev = null; Integer min..
-
[LeetCode/JAVA] 162. Find Peak ElementETC/Algorithm 2023. 9. 3. 15:33
문제 주변 보다 큰 요소를 peak 요소라 부르는데, 이 peak이라는 요소의 아무 인덱스나 반환하는 문제이다. 여기서 O(log n)을 만족하는 알고리즘을 사용해야한다. 풀이 배열의 요소의 주변은 왼쪽 오른쪽으로 생각할 수 있다. 이 둘 보다 클 때 peak이라는 요소가 되므로 이에 알맞는 알고리즘을 선택해야했고, 이분 탐색(bineary search) 알고리즘을 사용해서 풀이할 것이다. 시작은 배열의 시작 0과 끝 nums.length - 1 에서 부터 시작할 것이다. 배열의 중간을 구하기 위해 ( 왼쪽 인덱스 + 오른쪽 인덱스 ) / 2 를 계산하여 중간 인덱스 값을 구하고, 이 중간 인덱스의 위치한 nums의 요소를 오른쪽 요소와 비교한다. 만약 중간 값이 작다는 것은 오른쪽 값이 더 크므로, 왼..