전체 글
Infra
2022. 12. 3.
쿠버네티스 소개
컨테이너 원래부터 리눅스는 프로세스별로 자원을 격리해서 사용하는 cgroup과 특정 디렉터리로 권한을 제한하는 chroot 등으로 격리 환경을 구축할 수 있다. 여기에 디스크의 파일 변경 사항을 레이어 형태로 저장하는 파일 시스템을 합해 컨테이너라는 개념이 탄생했다. 그리고 도커는 앞에서 언급한 기능들을 모아서 컨테이너를 손쉽게 사용할 수 있도록 한 것으로 주목받았다. 기존에는 가상화나 클라우드 컴퓨팅을 설명할 때는 가상 머신(VM)을 많이 언급했었지만 컨테이너가 널리 알려지면서 컨테이너에 많은 관심이 쏠리기 시작했다. 컨테이너에는 호스트 운영체제 위에 도커가 있고 바로 애플리케이션이 위치하는반면 가상 머신은 하이퍼바이저 위에 가상 머신마다 게스트 운영체제가 있고 그 위에 앱이 위치한다. 즉, 컨테이너가..
개발서적
2022. 1. 16.
Unit Testing - 01장 단위 테스트의 목표
2022년 (처음이자) 새롭게 입사하게 된 맘편한세상(= 맘시터) 개발팀은 매주 1회 사내 스터디를 진행하고 있다. 자율적인 참여이지만, 필참이라는 마인드로 시간이 되는 선에서는 모두 참여하려고 한다. 내가 합류한 시점에는 클린 아키텍처 책 스터디가 막 끝난 상황이었고, 새로운 도서를 선정하게 됐다. 때마침 최근에 읽고있던 '오브젝트'도 희망 서적 중 하나로 언급이되었지만, 최근 SNS상의 많은 개발자분들이 책 구성이 좋다고 언급하는 Unit Testing 책이 선정되었다! 관심이 없지는 않던터라 ( 테스트는 항상 고민해야하는 녀석이기에.. ) 기쁜 마음으로 도서를 구매하였다! 단위 테스트는 단순히 테스트를 작성하는 것보다 더 큰 범주이다. 단위 테스트에 시간을 투자할 때는 항상 최대한 이..
Spring Framework Module
2022. 1. 12.
코틀린 스프링에서의 이벤트 처리 (with 유스콘)
들어가기에 앞서서... | 해당 글은 2021 유스콘에서 발표한 자바 스프링에서의 이벤트 처리 세션에서 진행된 내용을 코틀린으로 따라해보며 정리한 글입니다. 목적 | 스프링에서 이벤트를 왜 써야하고 어떻게 써야하는지 실습해본다. 전체적인 코드는 깃헙 저장소를 참고하면 된다. `UserService쪽에 의존하는 다양한 의존성들을 어떻게 해결하면 좋을지?`를 계속 생각해보자! Spring은 Bean을 관리하기 위해서 ApplicationContext를 기본으로 가져간다. 이번에 다루게 될 Event도 Spring Bean과 똑같이 Context를 관리해주는데 이벤트 또한 ApplicationContext에서 Event를 관리하고 있다. 따라서 Event도 특별한 Bean을 주입받고 실행해주고 있다. Step..
Spring Framework Module
2021. 12. 12.
[Spring] 싱글톤 레지스트지와 Bean Scope
스프링의 애플리케이션 컨텍스트가 관리하는 객체(=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());..
알고리즘
2021. 12. 10.
Tree 자료구조
트리 참고자료: https://www.youtube.com/watch?v=i5yHkP1jQmo&list=PLRx0vPvlEmdAghTr5mXQxGpHjWqSz0dgC&index=13 트리란...? 트리는 가계도와 같은 계층적인 구조를 표현할 때 사용할 수 있는 자료구조이다. 트리 관련 용어 루트 노드(root node): 부모가 없는 최상위 노드 단말 노드(leaf node): 자식이 없는 노드 크기(size): 트리에 포함된 모든 노드의 개수 깊이(depth): 루트 노드부터의 거리 높이(height): 깊이 중 최댓값 차수(degree): 각 노드의 (자식 방향) 간선 개수 트리의 특징 (알고 있으면 좋은 정보) 기본적으로 트리의 크기가 N일 때, 전체 간선의 개수는 N - 1개이다. 이진 탐색 트리..
카테고리 없음
2021. 11. 24.
[Kotlin] - 코프링에서 Validation 사용하기
자프링(=자바 + 스프링)진영에서는 외부의 요청을 검증하기 위해서 Validation을 많이 사용한다. 의존성 설정만해두면... (몇 버전인지 기억이 잘 안나지만 스프링부트 특정 버전 이후부터는 Validation을 따로 추가해줘야한다... 그전에는 스프링부트에 자동으로 포함됐었다 😢) Controller단에서는 DTO로 외부 요청을 받아오고 외부의 요청이 DTO에 할당되는 순간 Validation을 통해 검증이 진행된다. (순서가 정확한지는 모르겠다) 자바에서는 DTO의 필드 위에 `@`로 시작되는 애너테이션을 붙여서 처리한다. 그 사용법도 간단하고 애너테이션 각각의 네이밍이 직관적(@NotNull, @NotBlank, @Pattern, @Size etc..)이라 하나라도 사용을 해봤다면 다른 기능들도..
카테고리 없음
2021. 10. 10.
우아한테크코스 Lv4 - MYSQL 최적화 미션 (학습자료 정리)
Lv4 미션으로 쿼리 튜닝해보는 미션이 주어졌다. 먼저 본인의 쿼리 작성 능력을 테스트해볼 겸 실습 사이트에서 아래의 쿼리를 직접 작성해보자! 200개 이상 팔린 상품명과 그 수량을 수량 기준으로 내림차순으로 보이게 하라. 많이 주문한 순으로 고객 리스트(ID, 고객명), 총수량을 구하라. 많은 돈을 지출한 순으로 고객리스트를 구하라. 위 튜토리얼(?)에 대한 나의 쿼리는 아래와 같다. (주의 성능은 1도 생각안하고 결과만 제대로 나오는 쿼리다!) 1번 쿼리 SELECT p.ProductId '상품아이디', p.ProductName '상품이름', SUM(od.Quantity) '총수량' FROM Products p JOIN OrderDetails od ON od.ProductId = p.ProductId..
알고리즘
2021. 9. 30.
6. 이진 탐색 알고리즘
순차 탐색: 리스트 안에 있는 특정한 데이터를 찾기 위해 앞에서부터 데이터를 하나씩 확인하는 방법 이진 탐색: 정렬되어 있는 리스트에서 탐색 범위를 절반씩 좁혀가며 데이터를 탐색하는 방법 이진 탐색은 시작점, 끝점, 중간점을 이용하여 탐색 범위를 설정한다. 주의할 점은 해당 알고리즘은 정렬되어있는 경우에 사용할 수 있다는 것이다. 만약 정렬이 되어있지 않은 경우에는 시간 복잡도가 '정렬 시간 복잡도' * '이분 탐색 시간 복잡도'라고 생각해야 한다. 이진 탐색의 시간 복잡도 단계마다 탐색 범위를 2로 나누는 것과 동일하다. (연산 횟수는 log(2)N에 비례한다. '()'는 밑을 의미) 다시 말해 이진 탐색은 탐색 범위를 절반씩 줄이며, 시간 복잡도는 O(logN)을 보장한다. public class B..
알고리즘
2021. 8. 20.
7. 최단 경로 알고리즘 - 플로이드 워셜(Floyd-Warshall)
플로이드 워셜 알고리즘 모든 노드에서 다른 모든 노드까지의 최단 경로를 모두 계산한다. 플로이드 워셜(Floyd-Warshall) 알고리즘은 다익스트라 알고리즘과 마찬가지로 단계별로 거쳐 가는 노드를 기준으로 알고리즘을 수행한다. 다만 매 단계마다 방문하지 않은 노드 중에 최단 거리를 갖는 노드를 찾는 과정이 필요하지 않다. 플로이드 워셜은 2차원 테이블에 최단 거리 정보를 저장한다. 플로이드 워셜 알고리즘은 다이나믹 프로그래밍 유형에 속한다. 노드의 갯수가 적은 경우에서 효과적으로 사용할 수 있으며, 노드 및 간선의 개수가 많은 경우에는 일반적으로 다익스트라 알고리즘을 사용해야하는 경우가 많다. 플로이드 워셜 알고리즘 각 단계마다 특정한 노드 k를 거쳐 가는 경우를 확인한다. a에서 b로 가는 최단 거..