전체 글

백문이불어일Tany

    [Issue Tracker Project] Switch - Case Refactoring

    기록 이유 이슈 내의 Milestone, Label, Assignee 를 수정하는 updateIssueRelated() 메서드에 Switch - Case 문 떡칠을 리팩토링하고 팀원인 검봉에게 공유하는 것을 깜빡하지 않기 위해 기록하게 되었다 🙂 기록 시작 ~ 리팩토링이 필요한 로직 클라이언트에서 요청한 Issue 아이디, 어떤 것을 수정할 지 결정하는 Type, 해당 Type 의 아이디를 지닌 DTO 를 사용해서 Swith - Case 분기문을 통해 Type 을 확인한 뒤, Isse 아이디에 맞는 Issue Entity 를 수정하는 로직이다. 엄청 복잡한 로직은 아니지만 분기문을 IssueService 클래스에서 없애기 위해 인터페이스 추출 기법을 활용한 리팩토링을 시도해보았다. 리팩토링 시작 먼저 전..

    2022.10.31 (월요일) ~ 2022.11.06 (일요일) 주간 및 일일 학습계획

    주간목표 2022.10.31 ~ 2022.11.06 컨디션 관리 주 3회 이상 운동 알고리즘 모의고사 진행 (화요일, 목요일) Issue Tracker 단위 테스트 마무리 !! 구름 알고리즘 먼데이 4주차 ~ 5주차 밀린 것 풀이 일일목표 2022.10.31 (월요일) Issue Tracker Service Layer Test 수정 및 추가 Label Service Test Assignee Service Test Comment Service Test Milestone Service Test 구름 알고리즘 먼데이 3주차 못 푼 문제 마저 풀이 일일목표 2022.11.01 (화요일) Issue Tracker Service Layer Test 수정 및 추가 Issue Service Test 알고리즘 스터디 진..

    [Issue Tracker Project] Issue 전체 조회 시 N + 1 발생과 개선

    기록 이유 현재 Issue Controller 조회 API 중, 모든 Issue 를 조회하는 기본적인 Read API 가 존재하는데, 평소보다 많은 목 데이터를 서버, 로컬 DB 에 넣어두고 조회하니 굉장히 느리게 조회되는 것을 알게됐다. 평소 개발 시 목 데이터를 꽤 넣고 조회하는 편이 아니라 빨리 알아채지 못했고 수정하면서 다시 상기하기 위해 기록하게 됐다 🙂 기록 시작 ~ 어떤 문제가 발생했나 ? 쉽게 말하자면, JPA 를 활용하는 개발자들이 한 번씩은 꼭 겪는 현상인 N + 1 문제가 발생했다. 아래 사진과 같이 현재 프로젝트에서 가장 중요한 Issue Entity 는 여러 Entity 와 @ManyToOne, @OneToMany 관계를 맺고있는 것을 확인할 수 있다. Issue Controlle..

    DTO 반환에 대해

    작성 이유 예전에 스프링, JPA 학습을 하며 클라이언트 응답 시 Entity 가 아닌 DTO 를 반환하는 것에 대해 알게되었다. 프로젝트를 진행하면서, 영한님 강의를 들으면서 그리고 기술 면접을 준비하면서 내가 이 부분에 대해 얼만큼 잘 알고 있는가 ? 를 되돌아보게 되었고, 정리를 좀 해야겠다 싶어서 작성하게 되었다. DTO 는 왜 사용될까 먼저 DTO 의 정의는 무엇일까 ? DTO 는 Data Transfer Object 의 약자로, 말 그대로 데이터 전송 객체라는 의미를 가지고 있다. 그림과 같은 각 계층에서 사용되며 , 특수한 로직이 없는 순수한 데이터 객체이다. 클라이언트와 Rest API 통신을 할 때 우리는 응답으로 Entity 가 아닌 DTO 를 응답해주는데, 내가 정리한 바로는 아래의 ..

    2022.10.10 (월요일) ~ 2022.10.15 (토요일) 주간 및 일일 학습계획

    주간목표 2022.10.10 ~ 2022.10.16 컨디션 관리 주 3회 이상 운동 알고리즘 모의고사 진행 (화요일, 목요일) 하루에 알고리즘 1 ~ 2문제 풀이 / 문자열 문제만 ! 구름 알고리즘 먼데이 1주차 해설 참고 및 2주차 시작 일일목표 2022.10.10 (월요일) CS 전공지식 노트 네트워크 학습완료 및 정리 알고리즘 먼데이 1주차 복습 완료 이코테 최단경로 학습 및 실전 문제 풀이 우선순위 큐 다익스트라 알고리즘 (이코테 전보 / 백준 최단경로) 플로이드 - 와샬 (이코테 미래도시) 일일목표 2022.10.11 (화요일) 스프링 관련 예상 질문 간단히 정리 알고리즘 먼데이 2주차 실시 알고리즘 모의고사 진행 자바 TPC 강의 수강 백준 문자열 추천 문제 4문제 풀이 백준 알파벳 개수 팰린..

    자바(Java) 알고리즘 문제풀이 떡볶이 떡 만들기 [이코테 / 이분탐색]

    문제 설명 오늘 동빈이는 여행 가신 부모님을 대신해 떡집 일을 하기로 했다. 오늘은 떡볶이 떡을 만드는 날이다. 동빈이네 떡볶이 떡은 재밌게도 길이가 일정하지 않다. 대신 한 봉지 안에 들어가는 떡의 총 길이는 절단기로 잘라서 맞춰준다. 절단기에 높이를 지정하면 줄지어진 떡을 한 번에 절단한다. 절단기의 높이보다 긴 떡은 절단기 높이 위의 부분이 잘릴 것이고, 낮은 떡은 잘리지 않는다. 예를 들어, 높이가 19, 14, 10, 17cm 인 떡이 나란히 있고 절단기 높이를 15cm 로 지정하면, 잘린 떡의 길이는 차례대로 4, 0, 0, 2cm 이다. 따라서 손님은 6cm 만큼의 길이를 가져갈 수 있다. 손님이 왔을 때 요청한 총 길이가 M일 때 적어도 M만큼의 떡을 얻기 위해 절단기에 설정할 수 있는 높..

    자바(Java) 알고리즘 문제풀이 부품 찾기 [이코테 / 정렬]

    문제 설명 동빈이네 전자 매장에는 부품이 N개 있다. 각 부품은 정수 형태의 고유한 번호가 있다. 어느 날 손님이 M개 종류의 부품을 대량으로 구매하겠다며 당일 날 견적서를 요청했다. 동빈이는 떄를 놓치지 않고 손님이 문의한 부품 M개 종류를 모두 확인해서 견적서를 작성해야 한다. 이때 가게 안에 부품이 모두 있는지 확인하는 프로그램을 작성하시오. 예를 들어 가게의 부품이 총 5개일 때 부품 번호가 다음과 같다고 하자. N = 5, [8, 3, 7, 9 ,2] 손님은 총 3개의 부품이 있는지 확인을 요청했는데, 그 부품의 번호는 다음과 같다. M = 3, [5, 7, 9] 이때 손님이 요청한 부품 번호의 순서대로 부품을 확인해 부품이 있으면 yes, 없으면 no 를 출력하고 구분은 공백으로 한다. 입력 ..

    자바(Java) 알고리즘 문제풀이 두 배열의 원소 교체 [이코테 / 정렬]

    문제 설명 동빈이는 N개의 원소로 구성되어 있고 배열의 원소가 모두 자연수인 두 배열 A와 B를 가지고 있다. 동빈이는 최대 K번의 바꿔치기 연산을 수행할 수 있는데, 바꿔치기 연산이란 배열 A에 있는 원소 하나와 배열 B에 있는 원소 하나를 골라서 두 원소를 서로 바꾸는 것을 말한다. 동빈이의 최종 목표는 배열 A의 모든 원소의 합이 최대가 되도록 하는 것이며, 여러분은 동빈이를 도와야 한다. N, K, 그리고 배열 A,B 의 정보가 주어졌을 때, 최대 K번의 바꿔치기 연산을 수행하여 만들 수 있는 배열 A의 모든 원소의 합의 최댓값을 출력하는 프로그램을 작성하시오. 예를 들어 N = 5, K = 3이고 배열 A = [1,2,5,4,3] , 배열 B = [5,5,6,6,5] 라고 했을 때 다음과 같이 ..

    자바(Java) 알고리즘 문제풀이 성적이 낮은 순서로 학생 출력하기 [이코테 / 정렬]

    문제 설명 N명의 학생이 있다. 학생 정보는 학생의 이름과 학생의 성적으로 구분된다. 각 학생의 이름과 성적 정보가 주어졌을 때, 성적이 낮은 순서대로 학생의 이름을 출력하는 프로그램을 작성하시오. 입력 조건 첫 번째 줄에 학생의 수 N이 입력된다. (1

    자바(Java) 알고리즘 문제풀이 위에서 아래로 [이코테 / 정렬]

    문제 설명 하나의 수열에는 다양한 수가 존재한다. 이러한 수는 크기에 상관없이 나열되어 있다. 이 수를 큰 수부터 작은 수의 순서로 정렬해야 한다. 수열을 내림차순으로 정렬하는 프로그램을 작성하시오. 입력 조건 첫 번째 줄에 수열에 속해 있는 수의 개수 N이 주어진다. (1 = 0 && arr[prev] < tmp) { arr[prev + 1] = arr[prev]; prev--; } // 탐색 종료된 지점에 현재 선택된 변수의 값을 삽입 arr[prev + 1] = tmp; } System.out.println(Arrays.toString(arr)); } }