본문 바로가기

🔓 영구 노트24

입력과 출력 타입이 다르면 fold를 고려해보자 함수형 프로그래밍에 대해 공부하면 map, filter, reduce, fold 등과 같은 함수들에 대해서 알 수 있습니다. 그중에서도 map과 filter는 좋은 예제들과 직관적인 사용법 덕분에 학습에 있어 큰 어려움이 없지만 reduce와 fold와 같은 함수들은 html 문자열 만들기 리스트의 합, 평균 구하기와 같은 개인적으로 살짝 부족한 예제를 설명하여 map과 filter에 비해 학습이 더 어렵습니다. 앞서 설명한 기초적인 예제 말고 조금은 더 실무적인 관점의 예제를 구현하여 fold와 map의 차이를 알아본 후에 왜 입력과 출력 타입이 다를 때 fold를 고려해볼 수 있는지 알아보겠습니다. 요구사항: 프로그래밍 언어, 선호도 ex) java, good 가 저장된 배열이 있을 때 각 언어의 선.. 2022. 12. 20.
@ParameterizedTest 를 사용하여 반복적인 테스트 작성 기능을 테스트함에 있어 하나의 변수로 검증하는 것보다는 여러 변수로 검증하는 것이 테스트의 신뢰도가 높습니다. 보통의 테스트는 함수 하나가 한번만 실행됩니다. 때문에 여러 데이터에 대해 반복적인 테스트를 작성하는 것은 어려움이 따를 수 있습니다. 하지만 Junit5에서는 @ParameterizedTest를 제공함으로써 반복적인 테스트를 쉽게 구현할 수 있게 해 줍니다. 반복적인 테스트를 위한 어떤 데이터를 사용할 것인지 정해주어야 합니다. Junit5에서는 @ValueSource, @CsvSource, @MethodSource를 제공하여 테스트에 사용할 데이터 값 세트를 정의할 수 있습니다. @ValueSource: String, Int, Long, Boolean 등 중에 하나의 타입을 선택하여 배열로 .. 2022. 12. 4.
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.
복잡한 객체 생성 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.
if문 중첩 시 간결하게 보이는 법 상태를 관리해야 하는 서비스를 제공하는 경우 예를 들어 플레이어의 상태, 주문 상태, 배송 상태 등에서는 조건문을 사용하지 않을 수 없다. 다음은 마인크래프트 모드 개발을 하던 중에 작성한 코드이다. @EventHandler public void onRightClick(PlayerInteractEvent event) { if (event.getAction() == Action.RIGHT_CLICK_BLOCK) { if (event.getItem() != null) { if (event.getItem().getItemMeta().equals(gamblingObject.getOakWood().getItemMeta())) { Player player = event.getPlayer(); ItemStack it.. 2022. 7. 6.
Completed 406 NOT_ACCEPTABLE 프로젝트를 진행하며 delete 메서드를 처리할 때에 response로 HttpStatus.OK만을 반환하였는데 이를 프론트에서 mapping 하는데 불편하다는 의견이 있어서 DefaultDeleteResponseDto라는 클래스를 만들어서 message를 넘겨주었습니다. 코드를 작성한 후에 실제로 동작하는지 확인하기 위해 프로젝트를 실행시켜보니 406 NOT_ACCEPTABLE이 발생하였고, 많은 이유들이 있겠지만 객체를 json으로 변환하지 못해서 발생하는 오류가 가장 유력했습니다. public class DefaultDeleteResponseDto { private String message; @Builder public DefaultDeleteResponseDto(String message) { .. 2022. 5. 27.
org.hibernate.TransientPropertyValueException 기존 프로젝트에 새로운 데이터베이스 테이블을 추가하고, 실제 데이터가 제대로 저장되는지 확인하는 코드를 작성한 후에 프로젝트를 실행시켜보니 다음과 같은 예외가 발생하였습니다. org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing EntityManager의 persist 함수를 통해 객체를 저장하였는데 해당 객체가 저장되는 과정에서 참조하고 있는 객체가 저장되지 않아 발생한 예외였습니다. 예외를 일으킨 코드는 다음과 같습니다. WrongQuestion wrongQuestion = WrongQuestion.bui.. 2022. 5. 23.
Embedded 사용 시 MappingException 발생 문제집 생성 관련 캡스톤 프로젝트 중에 문제의 해설을 등록하는 부분이 존재하여 문제 해설을 Commentary, 문제를 Question으로 작성하였습니다. 원래는 1대 1 맵핑을 생각하고 연관관계를 설정하였지만 테스트 코드를 작성하며 생각해본 결과 @Embedded를 사용하여 value type으로 관리하는 게 더 효율적일 것이라고 판단하여 코드를 수정하여 프로젝트를 실행해보았는데 다음과 같은 오류가 발생하였습니다. Caused by: org.hibernate.MappingException: Repeated column in mapping for entity: core.backend.question.domain.Question column: content (should be mapped with inse.. 2022. 4. 27.