분류 전체보기
-
프로그래머스 양과늑대PS 2024. 9. 30. 20:34
https://school.programmers.co.kr/learn/courses/30/lessons/92343 프로그래머스코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.programmers.co.kr 문제 설명2진 트리 모양 초원의 각 노드에 늑대와 양이 한 마리씩 놓여 있습니다. 이 초원의 루트 노드에서 출발하여 각 노드를 돌아다니며 양을 모으려 합니다. 각 노드를 방문할 때 마다 해당 노드에 있던 양과 늑대가 당신을 따라오게 됩니다. 이때, 늑대는 양을 잡아먹을 기회를 노리고 있으며, 당신이 모은 양의 수보다 늑대의 수가 같거나 더 많아지면 바로 모든 양을 잡아먹어 버립니다. 당신은 중간에 양..
-
JOOQ 테스트 환경 분리하기개발 2024. 9. 25. 16:07
jooq는 DSL을 사용하여 자바 코드를 쿼리로 변환하여 데이터베이스 작업을 한다.여기서 사용되는 DSL 코드는 실제 데이터베이스의 테이블 정보를 컴파일 시점에 읽고 생성하여 런타임 시에 사용되는 구조이다.프로젝트를 진행하며 테스트 환경 분리가 필요했다.기존의 테스트는 데이터베이스를 사용하는 테스트를 진행하기 위해서는 실제 데이터베이스를 실행해야하는 수고스러움이 있었다. 만약 데이터베이스를 실행하지 않고 테스트를 실행하면 DSL 코드를 생성할 테이블 정보를 읽지 못해 에러가 발생한다. 이를 해결하고자 testContainer 를 도입하여 테스트 환경에서 컨테이너를 띄워 테스트의 환경을 격리 시키기로 했다.문제점jooq 는 위 설명처럼 빌드 시 데이터베이스에 접근해 메타데이터를 기반으로 DSL 코드를 생성..
-
메인 기능, 부가 기능 분리 그리고 Transactional outbox pattern개발 2024. 9. 4. 17:16
도서 공유 프로젝트를 진행하며 겪은 문제들과 이를 해결해나가는 과정을 담은 글입니다.도서의 상태가 변경되면 해당 도서를 팔로우 하고 있던 사용자들에게 알림을 보내는 기능이 있다.도서의 상태를 변경하는 메인 기능.도서를 팔로우 하던 사용자들에게 알림을 주는 부가 기능.하나의 클래스에서 처리하던 기능을 두 가지의 기능으로 분리하고자 했다. 분리를 하는 이유메인 기능과 부가 기능이 같이 있어 코드의 의도를 파악하기에 어렵다.부가 기능의 변경으로 메인 기능이 변경되어야 할 상황이 발생할 수 있다.하나의 클래스는 하나의 책임만을 지는 것이 원칙이다. 로버트 마틴은 하나의 클래스는 하나의 액터만을 책임져야 하며, 이를 단일 책임 원칙이라고 한다.현재의 기능은 도서의 소유자, 도서를 팔로우하고 있는 사용자. 즉 액터..
-
Stack, Queue 구현Data Structure,Algorithm 2024. 8. 30. 00:28
Stack 이란 ?Stack 은 후입선출(Last in First Out) 구조로 나중에 들어온 값이 먼저 나가게 되는 박스형 구조입니다.Java 에서 Stack 은 Stack 클래스를 사용할 수 있습니다.Java 에서 제공하는 Stack 클래스는 Stack 내 원소에 접근하는 연산에 synchronized 키워드가 붙어있습니다.즉 멀티스레드 환경에서 안전하게 사용할 수 있지만 코딩테스트 환경에서는 멀티스레드 환경이 아니기에 이를 고려할 필요가 없습니다.따라서 코딩테스트나 단일 스레드 환경에서는 Stack 클래스가 아닌 ArrayDeque 을 사용해서 Stack 처럼 사용하는 것이 권장됩니다. 구현한 메서드는 다음과 같습니다.push : 원소를 Stack에 삽입pop : Stack의 가장 위에 위치한 원..
-
자바와 코틀린Java 2024. 8. 29. 21:49
최근 코틀린의 Kotest 로 작성된 테스트 코드를 보고 코드가 간결하고 깔끔하다고 생각되어 한번 공부해보고 싶단 생각이 들었습니다.https://developers.hyundaimotorgroup.com/blog/137 Kotest를 통한 Kotlin Spring에서의 테스트 코드 작성Kotest를 통한 Kotlin Spring에서의 테스트 코드 작성developers.hyundaimotorgroup.com 그래서 코틀린 공식문서를 참고하여 자바와 코틀린 문법의 차이를 위주로 정리했습니다.컴파일Java와 Kotiln 은 각각의 컴파일러가 .java, .kt 파일을 JVM 이 실행할 수 있는 .class 파일로 만든다.Java, Kotiln 같이 사용한 프로젝트를 컴파일 한다면 다음과 같은 과정이 일어난..
-
테스트하기 안 좋은 코드 리팩토링하기개발 2024. 8. 20. 21:04
삼성청년SW아카데미 11기에서 진행한 도서 공유 프로젝트가 마무리 되었습니다. 프로젝트가 마무리 되었으니 문제점이라고 생각한 부분을 리팩토링을 하였습니다. 리팩토링의 목표는 테스트 하기 좋지 않은 코드를 테스트하기 좋은 코드로 바꾸는 것이었습니다. 💡 테스트하기 좋지 않은 코드란?테스트 코드는 항상 같은 결과를 return 하는 멱등성이 보장되어야 합니다.만약 Rental을 생성하는 테스트 코드를 작성했는데, 이 코드에 멱등성이 보장되지 않은 코드가 있고,이 코드로 인해 어떤 경우에는 테스트가 성공하고, 어떤 경우에는 테스트가 실패한다면 이는 테스트로서의 기능을 못하고 있는 것입니다.따라서 멱등성을 보장하지 못하는 코드는 테스트 비용을 지불하여 멱등성을 보장해주어야 합니다.이때의 방법은 Mocking,..
-
커버링 인덱스로 뷰 쿼리 개선하기DB 2024. 8. 13. 19:03
현재 진행중인 도서 공유 서비스에는 포인트라는 것이 존재합니다.포인트는 서비스 내에서 사용할 수 있는 현금과 비슷한 느낌으로 포인트를 사용하여 책을 대여할 수 있습니다.실제 운영하는 서비스에서는 돈과 관련된 데이터에 오류가 발생하면 이는 곧바로 회사의 손실로 직결되는 중요한 데이터입니다.따라서 데이터 정합성을 유지하기 위해 다음과 같이 설계했습니다.회원의 포인트 변화는 포인트 이력과 변화량을 테이블에 저장포인트를 사용해야할 시점에 포인트 이력 테이블의 변화량을 계산하여 현재의 포인트를 조회 뷰에서 사용될 쿼리테스트를 진행할 51348 아이디에는 50만건의 더미 데이터 이력을 삽입했습니다.select pv1_0.user_id,pv1_0.total_point from ( SELECT u.id AS user_..
-
쿼리 개선기DB 2024. 8. 12. 21:03
삼성SW아카데미 11기에선 현재 3개의 프로젝트 중 첫번째 프로젝트인 공통프로젝트를 진행중입니다.저희 팀은 도서 인프라 취약지역 사람들을 위한 도서 공유 서비스를 기획하고 개발중입니다.메인 기능이기도 한 등록도서를 조회하는 기능에서 쿼리 성능이 저하되는 상황이 발생했습니다.문제 해결 과정에 대한 이해를 돕기 위해 간단한 ERD를 그려보았습니다.테이블에는 2백만건의 더미 데이터를 삽입하고 테스트를 진행했습니다. 문제의 쿼리 - Offset 페이징offset 페이징 방식은 offset 사이즈를 건너뛰어 limit 사이즈만큼의 데이터를 가져오는 방식을 뜻합니다.정확히 말하자면 offset 사이즈만큼을 건너뛰는 것이 아니라 offset 사이즈만큼 앞에서부터 읽어가며 필요한 데이터를 찾아가는 것입니다. 따라서 데..