[F-Lab 챌린지 38일차 TIL]

성수데브리·2023년 8월 4일
0

f-lab_java

목록 보기
30/73

알고리즘

  • 정렬의 조건을 변경한다는 것은 핵심으로 보는 데이터가 무엇인지를 재정의한다는 사실

cmp_to_key(func)

functools.cmp_to_key(func)
Transform an old-style comparison function to a key function. Used with tools that accept key functions (such as sorted(), min(), max(), heapq.nlargest(), heapq.nsmallest(), itertools.groupby()). This function is primarily used as a transition tool for programs being converted from Python 2 which supported the use of comparison functions.

A comparison function is any callable that accepts two arguments, compares them, and returns a negative number for less-than, zero for equality, or a positive number for greater-than. A key function is a callable that accepts one argument and returns another value to be used as the sort key.

Example:
sorted(iterable, key=cmp_to_key(locale.strcoll)) # locale-aware sort order
For sorting examples and a brief sorting tutorial, see Sorting HOW TO. New in version 3.2.

문제

이런 풀이법은 어떻게 생각해내는지… 대단하다

def solution2(numbers):
    numbers = [str(x) for x in numbers]
    numbers.sort(key=lambda x: x * 3, reverse=True)

    result = ''.join(numbers)

    if '0' * len(numbers) == result:
        return '0'

    return result

정렬의 의미

사람

  • 관심 있는 데이터를 특정 기준으로 나열하여 정보를 습득하고, 나아가 하나의 데이터를 다른 관점으로 보는 방법을 익히는 것

컴퓨터

  • 기준을 정해 데이터를 나열하는 목적으로 사용하지만, 엄밀히 말하면 더 빠른 탐색을 위해 사용해야 하는 필수적인 과정

이진탐색

  • 정렬된 데이터에서 탐색 시간은 O(logN)O(logN)
  • 탐색 범위가 1/2 씩 줄어든다.
  • 필요 없는 부분은 탐색하지 않는 것
  • bisect_left, bisect_right
    mylist = [1, 2, 3, 3, 3, 7, 9, 11, 33]
    x = 3
    print(f'bisect_left: {bisect_left(mylist, x)}')
    print(f'bisect_left: {bisect_right(mylist, x)}')
    def bisect_right(a, x, lo=0, hi=None):
        """Return the index where to insert item x in list a, assuming a is sorted.
    
        The return value i is such that all e in a[:i] have e <= x, and all e in
        a[i:] have e > x.  So if x already appears in the list, a.insert(x) will
        insert just after the rightmost x already there.
    
        Optional args lo (default 0) and hi (default len(a)) bound the
        slice of a to be searched.
        """
    
        if lo < 0:
            raise ValueError('lo must be non-negative')
        if hi is None:
            hi = len(a)
        while lo < hi:
            mid = (lo+hi)//2
            # Use __lt__ to match the logic in list.sort() and in heapq
            **if x < a[mid]: 
    					hi = mid
            else: 
    					lo = mid+1**
        return lo
    정렬된 배열 내에서 찾고자 하는 숫자가 중복으로 존재한다면 방향을 지정해줘야 한다.
    def bisect_left(a, x, lo=0, hi=None):
        """Return the index where to insert item x in list a, assuming a is sorted.
    
        The return value i is such that all e in a[:i] have e < x, and all e in
        a[i:] have e >= x.  So if x already appears in the list, a.insert(x) will
        insert just before the leftmost x already there.
    
        Optional args lo (default 0) and hi (default len(a)) bound the
        slice of a to be searched.
        """
    
        if lo < 0:
            raise ValueError('lo must be non-negative')
        if hi is None:
            hi = len(a)
        while lo < hi:
            mid = (lo+hi)//2
            # Use __lt__ to match the logic in list.sort() and in heapq
            **if a[mid] < x: 
    					lo = mid+1
            else: 
    					hi = mid**
        return lo

    탐색 문제의 핵심

    • 기준을 잡는 것

프로젝트

PR

이후에 테스트를 좀 더 확장하시게 된다면 회원과 관련한 테스트도 다른 테스트 클래스에서 호출하고 싶으실거에요. 하지만 JUnit 5기반의 테스트는 static method를 테스트로 지정할 수 없습니다. 그렇기때문에 별도 TestHelper 클래스에 Test관련 로직을 만들고, 테스트에서는 이 static helper 메소드를 호출하여 검증하는 형식으로 변경하기도 합니다.

이렇게 별도 테스트 유틸에 관련 로직을 만들어두면 다른 테스트 클래스에서도 동일한 로직을 호출할 수 있게되고 이는 테스트를 재사용할 수 있게 되는 장점도 생깁니다.

유지보수하고 재사용하기 용이한 테스트를 만드는건 항상 고민해보셨으면 좋겠습니다~

Testing with JUnit

Java Helper vs. Utility Classes | Baeldung

공부 : 토비의 스프링 6장 후반부

AOP 적용기술

  1. 프록시를 이용한 AOP

  2. 바이트코드 생성과 조작을 통한 AOP

    장점

    • 바이트코드를 조작해서 오브젝트 자체를 수정하면 AOP를 바로 적용할 수 있음
    • 훨씬 유연한 AOP 적용 가능

트랜잭션 속성

트랜잭션이란 최소 작업 단위로서 트랜잭션이 시작되면 전체 작업이 커밋되거나 롤백되어야 한다.
이 트랜잭션 동작 방식을 제어하는 방법이 있다.

TransactionDefinition 은 네가지 트랜잭션 속성을 정의하고 있다.

트랜잭션 전파

트랜잭션의 경계에서 이미 진행 중인 트랜잭션이 있을 때 또는 없을 때 어떻게 동작할 것인가를 결정하는 방식을 말한다.

파란색 영역처럼 진행중인 트랜잭션이 있고, 노란색 영역처럼 독자적인 트랜잭션 경계를 가진 코드가 있을 때
이미 진행중인 트랜잭션이 어떻게 영향을 미칠 수 있는가를 정의한 것이 트랜잭션 전파 속성이다.

  • PROPAGATION_REQUIRED

    • 가장 많이 사용되는 트랜잭션 전파 속성
    • 진행 중인 트랜잭션이 없으면 새로 시작하고, 이미 시작된 트랜잭션이 있으면 이에 참여한다.
  • PROPAGATION_REQUIRES_NEW

    • 항상 새로운 트랜잭션을 시작한다.
    • 독립적인 트랜잭션이 보장돼야 하는 코드에 적용할 수 있다.
  • PROPAGATION_NOT_SUPPORTED

    • 트랜잭션 없이 동작하도록 만들 수 있다.

격리수준

모든 트랜잭션이 순처적으로 진행돼면 좋지만 성능이 크게 떨어지므로 적절하게 격리 수준을 조정해서 가능한 한 많은 트랜잭션을 통시에 진행시키면서 문제가 발생하지 않게 하는 제어가 필요하다.

제한시간

트랜잭션을 수행하는 제한시간 설정

읽기전용

트랜잭션 내에서 데이터 조작하는 시도를 막아줄 수 있으며 성능 향상도 된다.

0개의 댓글