728x90
728x90
스프링의 애플리케이션 컨텍스트가 관리하는 객체(=Bean)는 일반적인 POJO 객체와는 중요한 차이점이 있다. 예를들어서 아래의 두 코드는 언뜻보면 비슷해보이지만, 큰 차이가 있다. public class AppConfig { public MemberService memberService() { return new MemberServiceImpl(new MemoryMemberRepository()); return new MemberServiceImpl(memberRepository()); } public OrderService orderService() { return new OrderServiceImpl(new MemoryMemberRepository(), new FixDiscountPolicy());..
트리 참고자료: https://www.youtube.com/watch?v=i5yHkP1jQmo&list=PLRx0vPvlEmdAghTr5mXQxGpHjWqSz0dgC&index=13 트리란...? 트리는 가계도와 같은 계층적인 구조를 표현할 때 사용할 수 있는 자료구조이다. 트리 관련 용어 루트 노드(root node): 부모가 없는 최상위 노드 단말 노드(leaf node): 자식이 없는 노드 크기(size): 트리에 포함된 모든 노드의 개수 깊이(depth): 루트 노드부터의 거리 높이(height): 깊이 중 최댓값 차수(degree): 각 노드의 (자식 방향) 간선 개수 트리의 특징 (알고 있으면 좋은 정보) 기본적으로 트리의 크기가 N일 때, 전체 간선의 개수는 N - 1개이다. 이진 탐색 트리..
자프링(=자바 + 스프링)진영에서는 외부의 요청을 검증하기 위해서 Validation을 많이 사용한다. 의존성 설정만해두면... (몇 버전인지 기억이 잘 안나지만 스프링부트 특정 버전 이후부터는 Validation을 따로 추가해줘야한다... 그전에는 스프링부트에 자동으로 포함됐었다 😢) Controller단에서는 DTO로 외부 요청을 받아오고 외부의 요청이 DTO에 할당되는 순간 Validation을 통해 검증이 진행된다. (순서가 정확한지는 모르겠다) 자바에서는 DTO의 필드 위에 `@`로 시작되는 애너테이션을 붙여서 처리한다. 그 사용법도 간단하고 애너테이션 각각의 네이밍이 직관적(@NotNull, @NotBlank, @Pattern, @Size etc..)이라 하나라도 사용을 해봤다면 다른 기능들도..
Lv4 미션으로 쿼리 튜닝해보는 미션이 주어졌다. 먼저 본인의 쿼리 작성 능력을 테스트해볼 겸 실습 사이트에서 아래의 쿼리를 직접 작성해보자! 200개 이상 팔린 상품명과 그 수량을 수량 기준으로 내림차순으로 보이게 하라. 많이 주문한 순으로 고객 리스트(ID, 고객명), 총수량을 구하라. 많은 돈을 지출한 순으로 고객리스트를 구하라. 위 튜토리얼(?)에 대한 나의 쿼리는 아래와 같다. (주의 성능은 1도 생각안하고 결과만 제대로 나오는 쿼리다!) 1번 쿼리 SELECT p.ProductId '상품아이디', p.ProductName '상품이름', SUM(od.Quantity) '총수량' FROM Products p JOIN OrderDetails od ON od.ProductId = p.ProductId..
순차 탐색: 리스트 안에 있는 특정한 데이터를 찾기 위해 앞에서부터 데이터를 하나씩 확인하는 방법 이진 탐색: 정렬되어 있는 리스트에서 탐색 범위를 절반씩 좁혀가며 데이터를 탐색하는 방법 이진 탐색은 시작점, 끝점, 중간점을 이용하여 탐색 범위를 설정한다. 주의할 점은 해당 알고리즘은 정렬되어있는 경우에 사용할 수 있다는 것이다. 만약 정렬이 되어있지 않은 경우에는 시간 복잡도가 '정렬 시간 복잡도' * '이분 탐색 시간 복잡도'라고 생각해야 한다. 이진 탐색의 시간 복잡도 단계마다 탐색 범위를 2로 나누는 것과 동일하다. (연산 횟수는 log(2)N에 비례한다. '()'는 밑을 의미) 다시 말해 이진 탐색은 탐색 범위를 절반씩 줄이며, 시간 복잡도는 O(logN)을 보장한다. public class B..
플로이드 워셜 알고리즘 모든 노드에서 다른 모든 노드까지의 최단 경로를 모두 계산한다. 플로이드 워셜(Floyd-Warshall) 알고리즘은 다익스트라 알고리즘과 마찬가지로 단계별로 거쳐 가는 노드를 기준으로 알고리즘을 수행한다. 다만 매 단계마다 방문하지 않은 노드 중에 최단 거리를 갖는 노드를 찾는 과정이 필요하지 않다. 플로이드 워셜은 2차원 테이블에 최단 거리 정보를 저장한다. 플로이드 워셜 알고리즘은 다이나믹 프로그래밍 유형에 속한다. 노드의 갯수가 적은 경우에서 효과적으로 사용할 수 있으며, 노드 및 간선의 개수가 많은 경우에는 일반적으로 다익스트라 알고리즘을 사용해야하는 경우가 많다. 플로이드 워셜 알고리즘 각 단계마다 특정한 노드 k를 거쳐 가는 경우를 확인한다. a에서 b로 가는 최단 거..