본문 바로가기

전체 글45

github actions를 사용하여 도커 hub 자동 배포 Github Actions(이하 Actions)는 Job을 정의하여 자동화된 작업을 수행할 수 있게 해준다. 여러 사용법이 존재하지만 Actions를 가장 대중적으로 사용하는 법 중에는 CI/CD가 있다. 그중에서도 CI를 Actions를 사용하여 자동화하는 법에 대해 알아보겠다. 도커 image를 사용한 자동화 CI(지속적인 통합)는 다음의 과정으로 진행된다. 코드를 수정하여 push 또는 pull request 이벤트를 발생한다. gradle 빌드를 한다. 2의 결과로 나온 .jar와 사전에 정의된 Dockerfile을 기준으로 도커 image를 만든다. 3의 결과를 Docker hub 또는 AWS ECR 등 공용 저장 공간에 저장한다. Spring Boot 어플리케이션은 항상 200 OK를 반환하는.. 2022. 11. 14.
sequence를 사용하여 collection을 처리해야하는 경우 대규모 collection의 처리에서 sequence를 사용하면 좋다는 이야기는 한 번쯤 들어보았을 것이다. 하지만 정확히 어느 정도의 크기의 collection을 처리할 때를 말하는 것이며 어떤 경우에 sequence가 보다 더 좋은 성능을 낼지 알고 싶어서 몇 가지 경우에 대해 확인해보겠다. collection의 크기가 큰 경우, 작은 경우 연산 과정이 복잡한 경우, 복잡하지 않은 경우 연산하는 과정에 종료 조건이 있는 경우, 종료 조건이 없는 경우 위 가정들에 대해서 collection으로 계산했을 때와 sequence로 계산했을 때 차이를 알아보며 어떤 경우에 sequence를 고려해야 하는지 알아보겠다. Lazy와 Eager 연산의 차이 연산을 하기 앞서 sequence와 collection의 .. 2022. 11. 10.
explain analyze를 사용하여 인덱스 동작 확인하기 인덱스 동작 원리 인덱스의 동작 원리는 다음 질문들을 통해 이해할 수 있다. D로 시작하는 앱 찾기 e로 끝나는 앱 찾기 중간에 a가 들어가는 앱 찾기 1번은 효과적인 인덱스 사용의 예시이다. Developer부터 시작하여 FaceTime까지 확인한 후에 더 이상의 결과가 없다고 판단할 수 있기 때문이다. 2번과 3번은 효과적이지 않은 인덱스 사용 예시이다. 2번과 3번 결과를 찾기 위해서는 처음부터 끝까지 앱을 찾아봐야 하기 때문이다. 특히 3번은 아이템의 중간중간마다 값이 존재하는지 확인해야 하므로 제일 비효율적이게 된다. 인덱스 활용 예시 아래 테이블을 기준으로 인덱스 emp_index01(first_name, gender, birth_date)을 만들어 다음에 대해 알아보겠다. 인덱스를 사용한 쿼.. 2022. 11. 8.
이대로 괜찮은가? 전문가라 불리는 사람들은 꾸준히 일을 합니다. 그렇다면 꾸준히 일을 하기만 한다면 전문가가 될 수 있을까? 이에 대해 1만 시간의 법칙을 만든 안데쉬 에릭손은 다음과 같이 말합니다. 55년 동안 걸었다고 걷는 게 점점 더 나아지고 있는 건 아닙니다. (중략) 자신이 즐기는 걸 한다고 해서 더 뛰어나게 될 것이라고 믿는 것은 미신입니다. 함께 자라기: 애자일로 가는 길 p.27 그저 묵묵하게 꾸준하게 일만 한다고 해서 전문가가 될 수 없다는 것을 말합니다. 전문성을 가지기 위해서는 끊임없는 자기 수련을 해야 합니다. 전문성 획득을 위한 자기 수련 책에서는 abc 방법을 소개합니다. a는 행동, b는 a에 대한 피드백, c는 b의 피드백이 타당한지 검증하는 과정입니다. 자기 수련의 과정을 조금 더 구체적으로.. 2022. 10. 27.
복잡한 객체 생성 with kotlin DSL DSL은 복잡한 객체, html 태그 생성, sql 쿼리 생성 등에서 많이 사용한다. spring boot를 사용하면 queryDsl을 많이 사용한다. 여기서 뒤에 붙은 dsl도 같은 의미이다. 참고 자료 Writing Kotlin DSLs with nested builder pattern kotlin in action 11장 DSL 만들기 DSL을 사용하면 흔히 표현력과 가독성이 좋아진다고 한다. 그 차이를 느껴보기 위해 같은 객체를 DSL과 일반적인 객체 구현 코드로 확인해보겠다. 다음은 DSL을 사용한 객체 생성 코드이다. >> val village1 = village { name = "기본 마을" address { street = "기본 거리" city = "기본 시티" } npcs { npc {.. 2022. 10. 19.
sealed 클래스를 사용하여 else 분기 처리 없애기 코틀린에서 when을 사용할 때 else 분기 처리를 하지 않고, 새로운 클래스 추가에도 유연하게 대처할 수 있는 방법을 설명한다. - kotlin in action 4장 클래스, 객체, 인터페이스 p.156~158 - #살아있다 #자프링외길12년차 #코프링2개월생존기 상위 클래스에 sealed 변경자를 붙이면 그 상위 클래스를 상속한 하위 클래스 정의를 제한할 수 있다. - kotlin in action p.157 하위 클래스를 제한하기 위해서 하위 클래스는 반드시 sealed 변경자가 붙은 상위 클래스 안에 중첩되어야 한다. 다음은 sealed 변경자가 붙은 상위 클래스와 하위 클래스 NewNote, NewPencil 코드이다. sealed class Item { val type: String get.. 2022. 10. 10.
공변성, 무공변성, 반공변성 in kotlin kotlin in action 책의 9장 제너릭스의 변성 개념에 대해서 학습했다. 코틀린 인 액션(yes24) 변성 개념은 List와 List와 같이 기저 타입이 같고 타입 인자가 다른 여러 타입이 서로 어떤 관계가 있는지 설명하는 개념이다. - kotlin in action p.404- 제목에서 알 수 있지만 변성에는 공변성, 무공변성, 반공변성 3가지 유형의 개념이 존재한다. 아래 코드는 변성의 개념을 설명하기 위한 코드이다. open class Animal class Cat: Animal() interface Feed { fun feed() } Animal은 동물의 최상위 클래스, Cat은 동물의 하위 클래스, Feed는 동물의 행동을 정의한 인터페이스이다. 무공변성 fun animalFeed(el.. 2022. 10. 4.
삽입 정렬은 뭐야? 개념 삽입 정렬은 다른 정렬 방식과는 다르게 정렬된 배열 A[1..n]에 정렬할 원소를 삽입할 인덱스를 계산하여 삽입하는 정렬 알고리즘입니다. 구현 방법 오름차순 정렬을 기준으로 살펴본 삽입 정렬의 구현 방법은 다음과 같습니다. 배열을 순환하며 정렬할 원소 new_item을 선택한다. new_item을 제외한 배열을 순환한다. new_item보다 큰 원소를 찾게되면 해당 원소와 new_item의 위치를 교환한다. 파이썬 구현 코드 def insertion_sort(array): for i in range(1, len(array)): # 1. prev = i - 1 new_item = array[i] while prev >= 0 and new_item < array[prev]: # 2. array[prev.. 2022. 8. 2.
선택 정렬은 뭐야? 개념 선택 정렬은 배열 A[1... n]에서 가장 작은 원소를 찾아 배열의 앞자리에 있는 A[i]와 바꾸는 것으로 원소를 넣을 위치는 결정된 상태에서 넣을 원소를 선택하는 것 알고리즘입니다. 구현 방법 오름차순을 기준으로 본 선택 정렬의 구현 방법은 다음과 같습니다. 배열을 순환하며 가장 작은 원소의 인덱스를 선택한다. 1의 결과를 정렬되지 않은 배열의 맨 앞 값과 교환한다. 배열의 길이 -1만큼 1을 반복한다. 파이썬 구현 코드 def selection_sort(array): for i in range(len(array) - 1): # 1. min_index = i for j in range(i + 1, len(array)): if array[j] < array[min_index]: min_index .. 2022. 8. 1.
버블 정렬은 뭐야? 개념 버블 정렬은 배열 A[1...n]에서 인접한 두 원소를 비교하며 조건(내림차순 또는 오름차순)에 맞게 자리를 교환하는 정렬 알고리즘입니다. 구현 방법 오름차순 정렬을 기준으로 본 버블 정렬의 구현 방법은 다음과 같습니다. 배열을 순환하며 가장 큰 원소를 배열의 끝에 위치시킨다. 원소 하나가 정렬되었기 때문에 배열의 크기를 감소시킨다. 배열의 길이만큼 1을 반복한다. 파이썬 구현 코드 def bubble_sort(number_list): for i in range(len(number_list) - 1): # 1. for j in range(1, len(number_list) - i): # 2. if number_list[j-1] > number_list[j]: # 3. number_list[j-1],.. 2022. 7. 29.
프로그래머스 76502 괄호 회전하기 괄호 회전하기 문제에 대한 설명은 다음 링크를 참고해주시기 바랍니다. 문제 설명 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 괄호 회전하기 문제는 주어진 문자열 s를 한 문자씩 회전한 결과들 중에 올바른 괄호를 가진 개수를 구하는 문제입니다. 따라서 문자열 s를 사용하여 나올 수 있는 모든 경우의 수를 탐색하는 완전 탐색 문제입니다. 따라서 문제를 해결하기 위한 순서는 다음과 같습니다. 올바른 괄호를 만들 수 있는 문자열인지 확인한다. 1의 결과가 참이라면 문자열 s를 순환하며 가능한 후보군을 배열에 저장한다. 거짓이라면 0을 반환한다. 후보군을 순환하.. 2022. 7. 28.
프로그래머스 42583 다리를 지나는 트럭 다리를 지나는 트럭 문제에 대한 설명은 다음의 링크를 참고해주시기 바랍니다. 문제 설명 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 우선, 다리를 지나는 트럭은 truck_weights로 주어진 트럭의 순서가 변경될 수 없습니다. 따라서 정해진 순서를 기반으로 모든 트럭이 다리를 건너는 최소 시간을 정답으로 구합니다. 예시는 자세한 설명을 동반하고 있어 질문하기 목록에 있는 예시 테스트 케이스 중 하나로 문제 해결 순서를 확인해보겠습니다. 질문하기 bridge_length = 5, weight = 5, truck_weights = [2, 2, 2, 2,.. 2022. 7. 22.