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

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

f-lab_java

목록 보기
28/73

알고리즘

정렬이란

원하는 작업을 하기 위해 기준을 정하여 데이터를 정렬하려는 목적으로 사용한다.

o(n2)o(n^2) 효율 정렬 알고리즘

버블 정렬

  • 현재 자신과, 그 다음을 비교하여 다음 숫자가 더 작다면 서로의 위치를 바꾸는 작업을 정렬이 모두 끝날 때까지 반복하는 방법

선택 정렬

  • 가장 작아 보이는 숫자를 계속해서 앞으로 밀어주는 방식

삽입 정렬

  • 현재 위치에서 가장 작은 숫자를 적절한 위치로 이동시키는 방식

코드

def bubbleSort(data):
    for i in range(len(data)):
        for j in range(i):
            if data[j] > data[j + 1]:
                data[j], data[j + 1] = data[j + 1], data[j]
    return data

print("버블정렬")
print(bubbleSort([3, 4, 5, 2, 9, 12, 34, 2]))
print()

def selectionSort(data):
    for i in range(len(data)):
        idx = i
        for j in range(i + 1, len(data)):
            if data[idx] > data[j]:
                idx = j
        data[i], data[idx] = data[idx], data[i]
    return data

print("선택정렬")
print(selectionSort([3, 4, 5, 2, 9, 12, 34, 2]))
print()

def insertSort(data):
    for end in range(1, len(data)):
        for i in range(end, 0, -1):
            if data[i - 1] > data[i]:
                data[i - 1], data[i] = data[i], data[i - 1]
    return data

print("삽입정렬")
print(insertSort([3, 4, 5, 2, 9, 12, 34, 2]))
print()

프로젝트

@Test
@WithAnonymousUser
@DisplayName("로그인에 성공하면 HttpStatus 는 redirection 다")
void when_login_success_should_return_OK() throws Exception {

    // given
    memberService.signup(memberRequestDto);

    // when
    LoginRequestDto loginRequestDto = new LoginRequestDto(memberRequestDto.getId(), memberRequestDto.getPassword());

    // then
	  mvc.perform(post("/login")
                .content(objectMapper.writeValueAsString(loginRequestDto)))
        .andExpect(result -> {
            String attributeName = "org.springframework.security.web.context.RequestAttributeSecurityContextRepository.SPRING_SECURITY_CONTEXT";
            SecurityContext securityContext
                    = (SecurityContext) result.getRequest().getAttribute(attributeName);
            Authentication authentication = securityContext.getAuthentication();

            assertInstanceOf(UsernamePasswordAuthenticationToken.class, authentication);
            assertEquals(memberRequestDto.getId(), authentication.getPrincipal());
        })
        .andDo(print())
        .andExpect(status().is3xxRedirection());

}

위 테스트 코드를 PR 에서 받은 피드백은 아래와 같다.

이 테스트는 mockMvc를 통해 블랙박스형태의 테스트를 하고있으면서 
SecurityContext를 불러오는 화이트박스 테스트를 동시에 진행하고 있네요.

mockMvc로 테스트하실것이라면 로그인이 적용되어야만 접속 가능한 특정 URL을 조회하고, 
조회가 가능한지를 테스트해보는게 더 명확합니다.

화이트 박스 검사와 블랙 박스 검사 개념을 몰라서 두 검사를 한 테스트에서 해버렸다.

블랙박스 검사

블랙박스 검사(Black-box testing)는 소프트웨어 검사 방법 중 하나로 어떤 소프트웨어를 내부 구조나 작동 원리를 모르는 상태에서 소프트웨어의 동작을 검사하는 방법을 이르는 말이다.

화이트박스 검사

화이트박스 검사(White-box testing)는 응용 프로그램의 내부 구조와 동작을 검사하는 소프트웨어 테스트 방식으로, 블랙박스 검사와는 반대된다.

사용자의 로그인 정보로 로그인이 정상적으로 수행 검증 → 화이트박스 검사
스프링 시큐리티의 로그인 처리 내부 코드 검증 → 블랙박스 검사


Method Signature & Method Type

  1. Method Signature

    Two of the components of a method declaration comprise the method signature—the method's name and the parameter types.

    • 메서드 이름, 메서드 파라미터 리스트
    • 오버라이딩은 시그니처가 같은 메서드 사이에서만 발생한다.

    메서드_시그니처.png

    public class MemberDao {
        
        public void update(String sql) throws DataAccessException {
            System.out.println("update");
        }
    }
    public class MemberDaoMongo extends MemberDao {
        @Override
        public void update(String sql) throws IllegalStateException {
            System.out.println("mongo update");
        }
    }
    public static void main(String[] args) {
        MemberDao memberDao = new MemberDao();
        memberDao.update("update");
    
        memberDao = new MemberDaoMongo();
        memberDao.update("mongo update");
    }

    update 의 예외를 다르게 정의해도 시그니처가 같기 때문에 오버라이딩이 문제 없다.

  2. Method Type

    A method type represents the arguments and return type accepted and returned by a method handle, or the arguments and return type passed and expected by a method handle caller. Method types must be properly matched between a method handle and all its callers, and the JVM's operations enforce this matching at, specifically during calls to [MethodHandle.invokeExact] and [MethodHandle.invoke], and during execution of invokedynamic instructions.

    • return type, method type parameter, parameter type, exception
    • Method Type 이 일치해야만 Method Reference 에서 사용할 수 있다.

0개의 댓글